diff --git a/SUPPORT_CENTER_SETUP.md b/SUPPORT_CENTER_SETUP.md
new file mode 100644
index 00000000..f5444ca8
--- /dev/null
+++ b/SUPPORT_CENTER_SETUP.md
@@ -0,0 +1,452 @@
+# Support Center Implementation - Complete Setup Guide
+
+## Overview
+
+The Enterprise Support Center has been successfully implemented! This comprehensive system allows users to:
+
+1. **Submit Support Tickets** - Create and track support requests
+2. **Browse Knowledge Base** - Search and read helpful articles
+3. **Check Ticket Status** - Monitor ticket progress using ticket numbers
+4. **No Authentication Required** - Public access to support features
+
+---
+
+## ✅ What's Been Implemented
+
+### Backend (Django)
+
+#### 1. **Models** (`backend/support/models.py`)
+- `TicketStatus` - Track ticket lifecycle (Open, In Progress, Resolved, etc.)
+- `TicketPriority` - Priority levels (Low, Medium, High, Critical) with SLA hours
+- `TicketCategory` - Organize tickets by category
+- `SupportTicket` - Main ticket model with auto-generated ticket numbers
+- `TicketMessage` - Conversation history on tickets
+- `TicketActivity` - Audit trail of all changes
+- `KnowledgeBaseCategory` - KB article categories
+- `KnowledgeBaseArticle` - Help articles with view counts and feedback
+- `SupportSettings` - Configurable support center settings
+
+#### 2. **API Endpoints** (`backend/support/views.py`)
+
+**Tickets:**
+- `POST /api/support/tickets/` - Create new ticket
+- `GET /api/support/tickets/` - List tickets
+- `POST /api/support/tickets/check-status/` - Check status by ticket number
+- `POST /api/support/tickets/{id}/add-message/` - Add message to ticket
+
+**Categories & Settings:**
+- `GET /api/support/categories/` - List ticket categories
+- `GET /api/support/statuses/` - List ticket statuses
+- `GET /api/support/priorities/` - List priorities
+
+**Knowledge Base:**
+- `GET /api/support/knowledge-base/` - List articles (with search)
+- `GET /api/support/knowledge-base/{slug}/` - Get article details
+- `GET /api/support/knowledge-base/featured/` - Featured articles
+- `POST /api/support/knowledge-base/{slug}/mark-helpful/` - Rate article
+
+#### 3. **Admin Panel** (`backend/support/admin.py`)
+Full Django admin integration for managing:
+- Tickets with inline messages and activities
+- Categories, statuses, and priorities
+- Knowledge base articles and categories
+- Support settings
+
+#### 4. **Management Command**
+```bash
+python manage.py populate_support_data
+```
+Populates initial data:
+- 5 ticket statuses
+- 4 priority levels
+- 6 ticket categories
+- 6 KB categories
+- 6 sample KB articles
+
+---
+
+### Frontend (Next.js/React)
+
+#### 1. **Page Route**
+- `/support-center` - Main support center page
+
+#### 2. **Components** (`components/pages/support/`)
+
+**Main Components:**
+- `SupportCenterHero.tsx` - Hero section with feature highlights
+- `SupportCenterContent.tsx` - Tabbed interface container
+- `CreateTicketForm.tsx` - Ticket submission form
+- `TicketStatusCheck.tsx` - Check ticket progress
+- `KnowledgeBase.tsx` - Browse and search articles
+- `KnowledgeBaseArticleModal.tsx` - Article detail modal
+
+#### 3. **API Services** (`lib/api/supportService.ts`)
+TypeScript API client with functions for:
+- Creating tickets
+- Checking status
+- Managing KB articles
+- All CRUD operations
+
+#### 4. **Custom Hooks** (`lib/hooks/useSupport.ts`)
+React hooks for data fetching:
+- `useTicketCategories()`
+- `useKnowledgeBaseCategories()`
+- `useFeaturedArticles()`
+- `useKnowledgeBaseArticle(slug)`
+- And more...
+
+#### 5. **Styling** (`public/styles/pages/_support-center.scss`)
+Complete, modern styling including:
+- Gradient hero section
+- Tabbed interface
+- Responsive forms
+- Article cards and modals
+- Loading and error states
+- Mobile-responsive design
+
+---
+
+## 🚀 Getting Started
+
+### Backend Setup
+
+1. **Navigate to backend:**
+```bash
+cd backend
+```
+
+2. **Database is already migrated and populated!** ✅
+ - Migrations applied
+ - Initial data loaded
+
+3. **Start Django server:**
+```bash
+../venv/bin/python manage.py runserver
+```
+
+4. **Access Admin Panel:**
+ - URL: http://localhost:8000/admin
+ - Create a superuser if needed:
+ ```bash
+ ../venv/bin/python manage.py createsuperuser
+ ```
+
+### Frontend Setup
+
+1. **Navigate to project root:**
+```bash
+cd /home/gnx/Desktop/GNX-WEB/gnx-react
+```
+
+2. **Install dependencies (if not already):**
+```bash
+npm install
+```
+
+3. **Start development server:**
+```bash
+npm run dev
+```
+
+4. **Access Support Center:**
+ - URL: http://localhost:3000/support-center
+
+---
+
+## 🎯 Key Features
+
+### 1. Submit Tickets
+- **Form Fields:**
+ - Personal info (name, email, phone, company)
+ - Issue type (technical, billing, feature request, etc.)
+ - Category selection
+ - Subject and detailed description
+
+- **Auto-Generated Ticket Numbers:**
+ - Format: `TKT-YYYYMMDD-XXXXX`
+ - Example: `TKT-20251007-A3B9C`
+
+- **Success Confirmation:**
+ - Displays ticket number
+ - Guidance to save for tracking
+
+### 2. Knowledge Base
+- **Search Functionality:**
+ - Real-time search across articles
+ - Search by title, content, keywords
+
+- **Category Browser:**
+ - 6 pre-populated categories
+ - Color-coded icons
+ - Article count per category
+
+- **Featured Articles:**
+ - Highlighted important articles
+ - View counts
+ - Helpful/not helpful ratings
+
+- **Article Modal:**
+ - Full article content
+ - Rich text support
+ - Feedback buttons
+ - Article metadata
+
+### 3. Ticket Status Checker
+- **Check by Ticket Number:**
+ - Enter ticket number
+ - View complete ticket details
+
+- **Displays:**
+ - Current status with color coding
+ - Priority level
+ - Creation and update dates
+ - Full description
+ - Message history
+ - Activity timeline
+
+### 4. Navigation Update
+- **Navbar Button Changed:**
+ - Old: "Get Started" → `/contact-us`
+ - New: "Support Center" → `/support-center`
+
+---
+
+## 📊 Database Schema
+
+### Pre-Populated Data
+
+**Ticket Statuses:**
+- Open (Blue)
+- In Progress (Orange)
+- Pending Response (Purple)
+- Resolved (Green)
+- Closed (Gray)
+
+**Priorities:**
+- Critical (4 hours SLA)
+- High (24 hours SLA)
+- Medium (48 hours SLA)
+- Low (72 hours SLA)
+
+**Ticket Categories:**
+- Technical Support
+- Billing & Payments
+- Account Management
+- Product Inquiry
+- Bug Reports
+- Feature Requests
+
+**Knowledge Base Categories:**
+- Getting Started
+- Account & Billing
+- Technical Documentation
+- Troubleshooting
+- Security & Privacy
+- Best Practices
+
+**Sample Articles:**
+- How to Get Started with Our Platform
+- Understanding Your Billing Cycle
+- API Documentation Overview
+- Common Login Issues and Solutions
+- How to Update Your Payment Method
+- Security Best Practices
+
+---
+
+## 🔧 Configuration
+
+### API Base URL
+Located in: `lib/config/api.ts`
+- Default: `http://localhost:8000/api`
+
+### Django Settings
+Support app added to `INSTALLED_APPS` in `backend/gnx/settings.py`
+
+### URLs
+Support endpoints registered in `backend/gnx/urls.py`:
+```python
+path('support/', include('support.urls')),
+```
+
+---
+
+## 🎨 UI/UX Features
+
+### Design Elements
+- **Modern Gradient Hero** - Dark theme with gold accents
+- **Tabbed Interface** - Easy navigation between features
+- **Responsive Design** - Mobile-first approach
+- **Loading States** - Spinners for async operations
+- **Error Handling** - User-friendly error messages
+- **Success Feedback** - Confirmation messages
+- **Color-Coded Status** - Visual ticket status indicators
+
+### Animations
+- GSAP scroll animations on hero
+- Smooth tab transitions
+- Modal fade-in/slide-up effects
+- Hover effects on cards and buttons
+
+---
+
+## 📝 Usage Examples
+
+### Create a Ticket (API)
+```javascript
+import { createTicket } from '@/lib/api/supportService';
+
+const ticketData = {
+ title: "Login issues on mobile app",
+ description: "Cannot login using my credentials...",
+ ticket_type: "technical",
+ user_name: "John Doe",
+ user_email: "john@example.com",
+ user_phone: "+1234567890",
+ company: "Acme Corp",
+ category: 1 // Technical Support
+};
+
+const ticket = await createTicket(ticketData);
+console.log(ticket.ticket_number); // TKT-20251007-A3B9C
+```
+
+### Check Ticket Status (API)
+```javascript
+import { checkTicketStatus } from '@/lib/api/supportService';
+
+const ticket = await checkTicketStatus('TKT-20251007-A3B9C');
+console.log(ticket.status_name); // "Open"
+```
+
+### Search Knowledge Base (API)
+```javascript
+import { getKnowledgeBaseArticles } from '@/lib/api/supportService';
+
+const articles = await getKnowledgeBaseArticles('login');
+articles.forEach(article => {
+ console.log(article.title);
+});
+```
+
+---
+
+## 🔐 Security Notes
+
+- **Public Access:** All endpoints are public (no authentication required)
+- **Ticket Numbers:** Randomly generated to prevent guessing
+- **Internal Notes:** Hidden from public API responses
+- **Rate Limiting:** Recommended for production deployment
+
+---
+
+## 🚀 Future Enhancements
+
+Potential additions for future development:
+
+- [ ] **Live Chat Integration** - Real-time customer support
+- [ ] **File Attachments** - Upload files with tickets
+- [ ] **Email Notifications** - Automated ticket updates
+- [ ] **Ticket Assignment** - Auto-routing to support agents
+- [ ] **SLA Alerts** - Breach notifications
+- [ ] **Analytics Dashboard** - Support metrics and reports
+- [ ] **Multi-language Support** - Internationalization
+- [ ] **Webhook Notifications** - Integration with external systems
+- [ ] **Customer Portal** - User authentication for ticket management
+- [ ] **Advanced Search** - Filters, sorting, faceted search
+
+---
+
+## 📞 Testing the Implementation
+
+### Test Ticket Creation:
+1. Go to http://localhost:3000/support-center
+2. Click "Submit a Ticket" tab
+3. Fill out the form
+4. Submit and note the ticket number
+
+### Test Status Check:
+1. Click "Check Ticket Status" tab
+2. Enter the ticket number from above
+3. View complete ticket details
+
+### Test Knowledge Base:
+1. Click "Knowledge Base" tab
+2. Browse categories or use search
+3. Click an article to view details
+4. Rate article as helpful/not helpful
+
+### Test Admin Panel:
+1. Go to http://localhost:8000/admin
+2. Navigate to Support section
+3. View/edit tickets, categories, articles
+
+---
+
+## 📄 File Structure
+
+```
+gnx-react/
+├── app/
+│ └── support-center/
+│ └── page.tsx # Main support page
+├── components/
+│ └── pages/
+│ └── support/
+│ ├── SupportCenterHero.tsx
+│ ├── SupportCenterContent.tsx
+│ ├── CreateTicketForm.tsx
+│ ├── TicketStatusCheck.tsx
+│ ├── KnowledgeBase.tsx
+│ └── KnowledgeBaseArticleModal.tsx
+├── lib/
+│ ├── api/
+│ │ └── supportService.ts # API client
+│ └── hooks/
+│ └── useSupport.ts # React hooks
+├── public/
+│ └── styles/
+│ └── pages/
+│ └── _support-center.scss # Styles
+└── backend/
+ └── support/
+ ├── models.py # Database models
+ ├── serializers.py # API serializers
+ ├── views.py # API views
+ ├── urls.py # URL routing
+ ├── admin.py # Admin config
+ ├── management/
+ │ └── commands/
+ │ └── populate_support_data.py
+ └── README.md # Module docs
+```
+
+---
+
+## ✨ Summary
+
+The Enterprise Support Center is now fully operational with:
+
+✅ **Backend:** Complete Django REST API with 8 models and full CRUD operations
+✅ **Frontend:** Modern React/Next.js interface with 6 components
+✅ **Database:** Migrated and populated with sample data
+✅ **Styling:** Beautiful, responsive SCSS styles
+✅ **Navigation:** Updated navbar button
+✅ **Documentation:** Comprehensive README and guides
+
+**You're ready to provide enterprise-level support to your customers!** 🎉
+
+---
+
+## 🆘 Need Help?
+
+If you encounter any issues:
+
+1. Check that both Django and Next.js servers are running
+2. Verify the API base URL in `lib/config/api.ts`
+3. Check browser console for errors
+4. Review Django logs for backend issues
+5. Ensure all migrations are applied
+
+Enjoy your new Support Center! 🚀
+
diff --git a/gnx-react/app/career/[slug]/page.tsx b/gnx-react/app/career/[slug]/page.tsx
index ee267e44..f4143328 100644
--- a/gnx-react/app/career/[slug]/page.tsx
+++ b/gnx-react/app/career/[slug]/page.tsx
@@ -1,15 +1,73 @@
+"use client";
+
+import { useParams } from "next/navigation";
import Header from "@/components/shared/layout/header/Header";
import JobSingle from "@/components/pages/career/JobSingle";
import Footer from "@/components/shared/layout/footer/Footer";
import CareerScrollProgressButton from "@/components/pages/career/CareerScrollProgressButton";
import CareerInitAnimations from "@/components/pages/career/CareerInitAnimations";
+import { useJob } from "@/lib/hooks/useCareer";
+
+const JobPage = () => {
+ const params = useParams();
+ const slug = params?.slug as string;
+ const { job, loading, error } = useJob(slug);
+
+ if (loading) {
+ return (
+
-
+
@@ -18,4 +76,4 @@ const page = () => {
);
};
-export default page;
+export default JobPage;
diff --git a/gnx-react/app/support-center/page.tsx b/gnx-react/app/support-center/page.tsx
new file mode 100644
index 00000000..76f8e870
--- /dev/null
+++ b/gnx-react/app/support-center/page.tsx
@@ -0,0 +1,25 @@
+import Header from "@/components/shared/layout/header/Header";
+import Footer from "@/components/shared/layout/footer/Footer";
+import SupportCenterHero from "@/components/pages/support/SupportCenterHero";
+import SupportCenterContent from "@/components/pages/support/SupportCenterContent";
+
+export const metadata = {
+ title: "Enterprise Support Center | GNX Software Solutions",
+ description: "Get expert support with our comprehensive Enterprise Support Center. Submit tickets, browse knowledge base, and track your support requests.",
+};
+
+const SupportCenterPage = () => {
+ return (
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SupportCenterPage;
+
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py b/gnx-react/backend/career/__init__.py
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py
rename to gnx-react/backend/career/__init__.py
diff --git a/gnx-react/backend/career/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/career/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..dca1b07d
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/admin.cpython-312.pyc b/gnx-react/backend/career/__pycache__/admin.cpython-312.pyc
new file mode 100644
index 00000000..ff404e4b
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/apps.cpython-312.pyc b/gnx-react/backend/career/__pycache__/apps.cpython-312.pyc
new file mode 100644
index 00000000..e02ff24a
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/email_service.cpython-312.pyc b/gnx-react/backend/career/__pycache__/email_service.cpython-312.pyc
new file mode 100644
index 00000000..2a109d57
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/email_service.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/models.cpython-312.pyc b/gnx-react/backend/career/__pycache__/models.cpython-312.pyc
new file mode 100644
index 00000000..3e470315
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/serializers.cpython-312.pyc b/gnx-react/backend/career/__pycache__/serializers.cpython-312.pyc
new file mode 100644
index 00000000..d03ebcce
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/serializers.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/urls.cpython-312.pyc b/gnx-react/backend/career/__pycache__/urls.cpython-312.pyc
new file mode 100644
index 00000000..b9bb996b
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/__pycache__/views.cpython-312.pyc b/gnx-react/backend/career/__pycache__/views.cpython-312.pyc
new file mode 100644
index 00000000..83913e32
Binary files /dev/null and b/gnx-react/backend/career/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/admin.py b/gnx-react/backend/career/admin.py
new file mode 100644
index 00000000..85c438fb
--- /dev/null
+++ b/gnx-react/backend/career/admin.py
@@ -0,0 +1,149 @@
+from django.contrib import admin
+from django.utils.html import format_html
+from .models import JobPosition, JobApplication
+
+
+@admin.register(JobPosition)
+class JobPositionAdmin(admin.ModelAdmin):
+ list_display = [
+ 'title',
+ 'department',
+ 'location',
+ 'open_positions',
+ 'employment_type',
+ 'status_badge',
+ 'featured',
+ 'posted_date',
+ 'applications_count'
+ ]
+ list_filter = ['status', 'employment_type', 'location_type', 'featured', 'department', 'posted_date']
+ search_fields = ['title', 'department', 'location', 'short_description']
+ prepopulated_fields = {'slug': ('title',)}
+ readonly_fields = ['posted_date', 'updated_date', 'applications_count']
+
+ fieldsets = (
+ ('Basic Information', {
+ 'fields': ('title', 'slug', 'department', 'status', 'featured', 'priority')
+ }),
+ ('Employment Details', {
+ 'fields': ('employment_type', 'location_type', 'location', 'open_positions', 'experience_required')
+ }),
+ ('Salary Information', {
+ 'fields': ('salary_min', 'salary_max', 'salary_currency', 'salary_period', 'salary_additional')
+ }),
+ ('Job Description', {
+ 'fields': ('short_description', 'about_role')
+ }),
+ ('Requirements & Qualifications', {
+ 'fields': ('requirements', 'responsibilities', 'qualifications', 'bonus_points', 'benefits'),
+ 'classes': ('collapse',)
+ }),
+ ('Dates', {
+ 'fields': ('start_date', 'deadline', 'posted_date', 'updated_date')
+ }),
+ )
+
+ def status_badge(self, obj):
+ colors = {
+ 'active': 'green',
+ 'closed': 'red',
+ 'draft': 'orange'
+ }
+ return format_html(
+ '
{} ',
+ colors.get(obj.status, 'black'),
+ obj.get_status_display()
+ )
+ status_badge.short_description = 'Status'
+
+ def applications_count(self, obj):
+ count = obj.applications.count()
+ return format_html(
+ '
{} application(s) ',
+ count
+ )
+ applications_count.short_description = 'Applications'
+
+
+@admin.register(JobApplication)
+class JobApplicationAdmin(admin.ModelAdmin):
+ list_display = [
+ 'full_name',
+ 'email',
+ 'job',
+ 'status_badge',
+ 'applied_date',
+ 'resume_link'
+ ]
+ list_filter = ['status', 'job', 'applied_date']
+ search_fields = ['first_name', 'last_name', 'email', 'job__title']
+ readonly_fields = ['applied_date', 'updated_date', 'resume_link']
+
+ fieldsets = (
+ ('Job Information', {
+ 'fields': ('job', 'status')
+ }),
+ ('Applicant Information', {
+ 'fields': ('first_name', 'last_name', 'email', 'phone')
+ }),
+ ('Professional Information', {
+ 'fields': ('current_position', 'current_company', 'years_of_experience')
+ }),
+ ('Application Details', {
+ 'fields': ('cover_letter', 'resume', 'resume_link', 'portfolio_url')
+ }),
+ ('Social Links', {
+ 'fields': ('linkedin_url', 'github_url', 'website_url'),
+ 'classes': ('collapse',)
+ }),
+ ('Availability & Salary', {
+ 'fields': ('available_from', 'notice_period', 'expected_salary', 'salary_currency'),
+ 'classes': ('collapse',)
+ }),
+ ('Metadata', {
+ 'fields': ('applied_date', 'updated_date', 'consent', 'notes')
+ }),
+ )
+
+ def status_badge(self, obj):
+ colors = {
+ 'new': 'blue',
+ 'reviewing': 'orange',
+ 'shortlisted': 'purple',
+ 'interviewed': 'teal',
+ 'accepted': 'green',
+ 'rejected': 'red'
+ }
+ return format_html(
+ '
{} ',
+ colors.get(obj.status, 'black'),
+ obj.get_status_display()
+ )
+ status_badge.short_description = 'Status'
+
+ def resume_link(self, obj):
+ if obj.resume:
+ return format_html(
+ '
Download Resume ',
+ obj.resume.url
+ )
+ return '-'
+ resume_link.short_description = 'Resume'
+
+ actions = ['mark_as_reviewing', 'mark_as_shortlisted', 'mark_as_rejected']
+
+ def mark_as_reviewing(self, request, queryset):
+ queryset.update(status='reviewing')
+ self.message_user(request, f'{queryset.count()} application(s) marked as reviewing.')
+ mark_as_reviewing.short_description = 'Mark as Reviewing'
+
+ def mark_as_shortlisted(self, request, queryset):
+ queryset.update(status='shortlisted')
+ self.message_user(request, f'{queryset.count()} application(s) marked as shortlisted.')
+ mark_as_shortlisted.short_description = 'Mark as Shortlisted'
+
+ def mark_as_rejected(self, request, queryset):
+ queryset.update(status='rejected')
+ self.message_user(request, f'{queryset.count()} application(s) marked as rejected.')
+ mark_as_rejected.short_description = 'Mark as Rejected'
+
diff --git a/gnx-react/backend/career/apps.py b/gnx-react/backend/career/apps.py
new file mode 100644
index 00000000..71fe4fa5
--- /dev/null
+++ b/gnx-react/backend/career/apps.py
@@ -0,0 +1,7 @@
+from django.apps import AppConfig
+
+
+class CareerConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'career'
+
diff --git a/gnx-react/backend/career/email_service.py b/gnx-react/backend/career/email_service.py
new file mode 100644
index 00000000..f511faff
--- /dev/null
+++ b/gnx-react/backend/career/email_service.py
@@ -0,0 +1,110 @@
+from django.core.mail import EmailMultiAlternatives
+from django.template.loader import render_to_string
+from django.conf import settings
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class CareerEmailService:
+ """Service for handling career-related emails"""
+
+ def send_application_confirmation(self, application):
+ """
+ Send confirmation email to applicant
+ """
+ try:
+ subject = f"Application Received - {application.job.title}"
+ from_email = settings.DEFAULT_FROM_EMAIL
+ to_email = [application.email]
+
+ # Create context for email template
+ context = {
+ 'applicant_name': application.full_name,
+ 'job_title': application.job.title,
+ 'job_location': application.job.location,
+ 'application_date': application.applied_date,
+ }
+
+ # Render email templates
+ text_content = render_to_string('career/application_confirmation.txt', context)
+ html_content = render_to_string('career/application_confirmation.html', context)
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_content,
+ from_email=from_email,
+ to=to_email
+ )
+ email.attach_alternative(html_content, "text/html")
+
+ # Send email
+ email.send(fail_silently=False)
+
+ logger.info(f"Confirmation email sent to {application.email}")
+ return True
+
+ except Exception as e:
+ logger.error(f"Failed to send confirmation email: {str(e)}", exc_info=True)
+ return False
+
+ def send_application_notification_to_admin(self, application):
+ """
+ Send notification email to company about new application
+ """
+ try:
+ subject = f"New Job Application: {application.job.title} - {application.full_name}"
+ from_email = settings.DEFAULT_FROM_EMAIL
+ to_email = [settings.COMPANY_EMAIL]
+
+ # Create context for email template
+ context = {
+ 'applicant_name': application.full_name,
+ 'applicant_email': application.email,
+ 'applicant_phone': application.phone,
+ 'job_title': application.job.title,
+ 'current_position': application.current_position,
+ 'current_company': application.current_company,
+ 'years_of_experience': application.years_of_experience,
+ 'cover_letter': application.cover_letter,
+ 'portfolio_url': application.portfolio_url,
+ 'linkedin_url': application.linkedin_url,
+ 'github_url': application.github_url,
+ 'website_url': application.website_url,
+ 'expected_salary': application.expected_salary,
+ 'salary_currency': application.salary_currency,
+ 'available_from': application.available_from,
+ 'notice_period': application.notice_period,
+ 'application_date': application.applied_date,
+ 'resume_url': application.resume.url if application.resume else None,
+ }
+
+ # Render email templates
+ text_content = render_to_string('career/application_notification.txt', context)
+ html_content = render_to_string('career/application_notification.html', context)
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_content,
+ from_email=from_email,
+ to=to_email,
+ reply_to=[application.email]
+ )
+ email.attach_alternative(html_content, "text/html")
+
+ # Attach resume if available
+ if application.resume:
+ email.attach_file(application.resume.path)
+
+ # Send email
+ email.send(fail_silently=False)
+
+ logger.info(f"Admin notification email sent for application from {application.email}")
+ return True
+
+ except Exception as e:
+ logger.error(f"Failed to send admin notification email: {str(e)}", exc_info=True)
+ return False
+
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py b/gnx-react/backend/career/management/__init__.py
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py
rename to gnx-react/backend/career/management/__init__.py
diff --git a/gnx-react/backend/career/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/career/management/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..4348b5b7
Binary files /dev/null and b/gnx-react/backend/career/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py b/gnx-react/backend/career/management/commands/__init__.py
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py
rename to gnx-react/backend/career/management/commands/__init__.py
diff --git a/gnx-react/backend/career/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/career/management/commands/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..3c7c87fa
Binary files /dev/null and b/gnx-react/backend/career/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/management/commands/__pycache__/populate_jobs.cpython-312.pyc b/gnx-react/backend/career/management/commands/__pycache__/populate_jobs.cpython-312.pyc
new file mode 100644
index 00000000..a3da7da6
Binary files /dev/null and b/gnx-react/backend/career/management/commands/__pycache__/populate_jobs.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/management/commands/populate_jobs.py b/gnx-react/backend/career/management/commands/populate_jobs.py
new file mode 100644
index 00000000..22436bfa
--- /dev/null
+++ b/gnx-react/backend/career/management/commands/populate_jobs.py
@@ -0,0 +1,305 @@
+from django.core.management.base import BaseCommand
+from career.models import JobPosition
+
+
+class Command(BaseCommand):
+ help = 'Populate database with sample job positions'
+
+ def handle(self, *args, **kwargs):
+ self.stdout.write('Creating sample job positions...')
+
+ jobs_data = [
+ {
+ 'title': 'UI/UX Designer',
+ 'department': 'Design',
+ 'employment_type': 'full-time',
+ 'location_type': 'remote',
+ 'location': 'Remote',
+ 'open_positions': 2,
+ 'experience_required': '3+ years',
+ 'salary_min': 1500,
+ 'salary_max': 2500,
+ 'salary_currency': 'USD',
+ 'salary_period': 'per month',
+ 'salary_additional': '+ VAT (B2B) + bonuses',
+ 'short_description': 'Join our design team to create beautiful and intuitive user experiences.',
+ 'about_role': 'We are looking for a talented UI/UX Designer who is passionate about creating exceptional user experiences. You will work closely with our product and engineering teams to design and implement user-friendly interfaces for our web and mobile applications.',
+ 'requirements': [
+ 'At least 3 years of commercial UI/UX design experience',
+ 'Strong portfolio showcasing web/UI projects',
+ 'Fluent English in verbal and written communication',
+ 'Proficiency in design tools (Sketch, Figma, or Adobe XD)',
+ 'Understanding of responsive design principles',
+ 'Experience with user research and usability testing',
+ ],
+ 'responsibilities': [
+ 'Create wireframes, prototypes, and high-fidelity designs',
+ 'Conduct user research and usability testing',
+ 'Collaborate with developers to implement designs',
+ 'Maintain and evolve design systems',
+ 'Present design concepts to stakeholders',
+ ],
+ 'qualifications': [
+ 'Portfolio demonstrating strong UI/UX design skills',
+ 'Experience with design systems',
+ 'Knowledge of HTML/CSS basics',
+ 'Understanding of accessibility standards',
+ ],
+ 'bonus_points': [
+ 'Experience with motion design',
+ 'Knowledge of front-end development',
+ 'Illustration skills',
+ 'Experience with design tokens',
+ ],
+ 'benefits': [
+ 'Remote work flexibility',
+ 'Competitive salary package',
+ 'Professional development budget',
+ 'Latest design tools and software',
+ 'Health insurance',
+ 'Flexible working hours',
+ ],
+ 'start_date': 'ASAP',
+ 'status': 'active',
+ 'featured': True,
+ 'priority': 10,
+ },
+ {
+ 'title': 'Senior Full Stack Developer',
+ 'department': 'Engineering',
+ 'employment_type': 'full-time',
+ 'location_type': 'hybrid',
+ 'location': 'Hybrid / Remote',
+ 'open_positions': 3,
+ 'experience_required': '5+ years',
+ 'salary_min': 3000,
+ 'salary_max': 5000,
+ 'salary_currency': 'USD',
+ 'salary_period': 'per month',
+ 'salary_additional': '+ Annual bonus + Stock options',
+ 'short_description': 'Build scalable applications with cutting-edge technologies.',
+ 'about_role': 'We are seeking an experienced Full Stack Developer to join our engineering team. You will be responsible for developing and maintaining our web applications using modern technologies and best practices.',
+ 'requirements': [
+ '5+ years of full-stack development experience',
+ 'Strong proficiency in React, Next.js, and TypeScript',
+ 'Experience with Python/Django or Node.js',
+ 'Solid understanding of RESTful APIs and GraphQL',
+ 'Experience with SQL and NoSQL databases',
+ 'Familiarity with cloud platforms (AWS, GCP, or Azure)',
+ ],
+ 'responsibilities': [
+ 'Develop and maintain web applications',
+ 'Write clean, maintainable, and efficient code',
+ 'Participate in code reviews',
+ 'Collaborate with cross-functional teams',
+ 'Optimize applications for performance',
+ 'Mentor junior developers',
+ ],
+ 'qualifications': [
+ 'Bachelor\'s degree in Computer Science or related field',
+ 'Strong problem-solving skills',
+ 'Experience with version control (Git)',
+ 'Good understanding of software development lifecycle',
+ ],
+ 'bonus_points': [
+ 'Experience with Docker and Kubernetes',
+ 'Knowledge of CI/CD pipelines',
+ 'Contributions to open-source projects',
+ 'Experience with microservices architecture',
+ ],
+ 'benefits': [
+ 'Competitive salary with stock options',
+ 'Flexible work arrangements',
+ 'Latest MacBook Pro or custom PC',
+ 'Learning and development budget',
+ 'Health and dental insurance',
+ 'Gym membership',
+ ],
+ 'start_date': 'Within 1 month',
+ 'status': 'active',
+ 'featured': True,
+ 'priority': 9,
+ },
+ {
+ 'title': 'Digital Marketing Manager',
+ 'department': 'Marketing',
+ 'employment_type': 'full-time',
+ 'location_type': 'on-site',
+ 'location': 'New York, NY',
+ 'open_positions': 1,
+ 'experience_required': '4+ years',
+ 'salary_min': 2500,
+ 'salary_max': 4000,
+ 'salary_currency': 'USD',
+ 'salary_period': 'per month',
+ 'short_description': 'Lead our digital marketing efforts and grow our online presence.',
+ 'about_role': 'We are looking for a creative and data-driven Digital Marketing Manager to lead our marketing initiatives. You will be responsible for developing and executing marketing strategies to increase brand awareness and drive customer acquisition.',
+ 'requirements': [
+ '4+ years of digital marketing experience',
+ 'Proven track record of successful marketing campaigns',
+ 'Strong understanding of SEO, SEM, and social media marketing',
+ 'Experience with marketing automation tools',
+ 'Excellent analytical and communication skills',
+ 'Data-driven mindset with strong analytical abilities',
+ ],
+ 'responsibilities': [
+ 'Develop and execute digital marketing strategies',
+ 'Manage social media channels and campaigns',
+ 'Oversee content marketing initiatives',
+ 'Analyze campaign performance and ROI',
+ 'Manage marketing budget',
+ 'Collaborate with sales and product teams',
+ ],
+ 'qualifications': [
+ 'Bachelor\'s degree in Marketing or related field',
+ 'Experience with Google Analytics and marketing tools',
+ 'Strong project management skills',
+ 'Creative thinking and problem-solving abilities',
+ ],
+ 'bonus_points': [
+ 'Experience with B2B marketing',
+ 'Knowledge of marketing automation platforms',
+ 'Video production skills',
+ 'Experience with influencer marketing',
+ ],
+ 'benefits': [
+ 'Competitive salary package',
+ 'Marketing conferences and events budget',
+ 'Professional development opportunities',
+ 'Health insurance',
+ 'Paid time off',
+ ],
+ 'start_date': 'ASAP',
+ 'status': 'active',
+ 'featured': False,
+ 'priority': 7,
+ },
+ {
+ 'title': 'Data Analyst',
+ 'department': 'Analytics',
+ 'employment_type': 'full-time',
+ 'location_type': 'remote',
+ 'location': 'Remote',
+ 'open_positions': 2,
+ 'experience_required': '2+ years',
+ 'salary_min': 2000,
+ 'salary_max': 3500,
+ 'salary_currency': 'USD',
+ 'salary_period': 'per month',
+ 'short_description': 'Turn data into actionable insights to drive business decisions.',
+ 'about_role': 'We are seeking a Data Analyst to join our analytics team. You will be responsible for analyzing complex datasets, creating reports, and providing insights to support business decision-making.',
+ 'requirements': [
+ '2+ years of data analysis experience',
+ 'Proficiency in SQL and data visualization tools',
+ 'Experience with Python or R for data analysis',
+ 'Strong statistical and analytical skills',
+ 'Ability to communicate insights to non-technical stakeholders',
+ ],
+ 'responsibilities': [
+ 'Analyze large datasets to identify trends and patterns',
+ 'Create dashboards and reports',
+ 'Collaborate with stakeholders to understand data needs',
+ 'Perform statistical analysis',
+ 'Present findings to leadership team',
+ ],
+ 'qualifications': [
+ 'Bachelor\'s degree in Statistics, Mathematics, or related field',
+ 'Experience with Tableau, Power BI, or similar tools',
+ 'Strong attention to detail',
+ 'Excellent problem-solving skills',
+ ],
+ 'bonus_points': [
+ 'Experience with machine learning',
+ 'Knowledge of big data technologies',
+ 'Experience with A/B testing',
+ ],
+ 'benefits': [
+ 'Remote work',
+ 'Competitive compensation',
+ 'Learning and development budget',
+ 'Health insurance',
+ 'Flexible hours',
+ ],
+ 'start_date': 'Within 2 weeks',
+ 'status': 'active',
+ 'featured': False,
+ 'priority': 6,
+ },
+ {
+ 'title': 'Product Manager',
+ 'department': 'Product',
+ 'employment_type': 'full-time',
+ 'location_type': 'hybrid',
+ 'location': 'San Francisco, CA / Remote',
+ 'open_positions': 1,
+ 'experience_required': '5+ years',
+ 'salary_min': 4000,
+ 'salary_max': 6000,
+ 'salary_currency': 'USD',
+ 'salary_period': 'per month',
+ 'salary_additional': '+ Stock options + Annual bonus',
+ 'short_description': 'Lead product strategy and development for our flagship products.',
+ 'about_role': 'We are looking for an experienced Product Manager to drive the vision and execution of our products. You will work closely with engineering, design, and marketing teams to deliver exceptional products that delight our customers.',
+ 'requirements': [
+ '5+ years of product management experience',
+ 'Proven track record of successful product launches',
+ 'Strong understanding of agile methodologies',
+ 'Excellent communication and leadership skills',
+ 'Data-driven decision-making approach',
+ 'Experience with product analytics tools',
+ ],
+ 'responsibilities': [
+ 'Define product vision and strategy',
+ 'Create and maintain product roadmap',
+ 'Gather and prioritize requirements',
+ 'Work with engineering team on implementation',
+ 'Conduct market research and competitive analysis',
+ 'Analyze product metrics and user feedback',
+ ],
+ 'qualifications': [
+ 'Bachelor\'s degree (MBA preferred)',
+ 'Strong analytical and problem-solving skills',
+ 'Experience with product management tools',
+ 'Understanding of UX principles',
+ ],
+ 'bonus_points': [
+ 'Technical background',
+ 'Experience in SaaS products',
+ 'Knowledge of growth strategies',
+ ],
+ 'benefits': [
+ 'Competitive salary with equity',
+ 'Hybrid work model',
+ 'Professional development budget',
+ 'Health and wellness benefits',
+ 'Team offsites and events',
+ ],
+ 'start_date': 'Within 1 month',
+ 'status': 'active',
+ 'featured': True,
+ 'priority': 8,
+ },
+ ]
+
+ created_count = 0
+ for job_data in jobs_data:
+ job, created = JobPosition.objects.get_or_create(
+ slug=job_data['title'].lower().replace(' ', '-').replace('/', '-'),
+ defaults=job_data
+ )
+ if created:
+ created_count += 1
+ self.stdout.write(
+ self.style.SUCCESS(f'✓ Created job: {job.title}')
+ )
+ else:
+ self.stdout.write(
+ self.style.WARNING(f'- Job already exists: {job.title}')
+ )
+
+ self.stdout.write(
+ self.style.SUCCESS(
+ f'\nSuccessfully created {created_count} job position(s)!'
+ )
+ )
+
diff --git a/gnx-react/backend/career/migrations/0001_initial.py b/gnx-react/backend/career/migrations/0001_initial.py
new file mode 100644
index 00000000..e5701985
--- /dev/null
+++ b/gnx-react/backend/career/migrations/0001_initial.py
@@ -0,0 +1,88 @@
+# Generated by Django 4.2.7 on 2025-10-07 14:45
+
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='JobPosition',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(help_text='Job title', max_length=255)),
+ ('slug', models.SlugField(blank=True, max_length=255, unique=True)),
+ ('department', models.CharField(blank=True, help_text='Department or category', max_length=100)),
+ ('employment_type', models.CharField(choices=[('full-time', 'Full Time'), ('part-time', 'Part Time'), ('contract', 'Contract'), ('internship', 'Internship'), ('remote', 'Remote')], default='full-time', max_length=20)),
+ ('location_type', models.CharField(choices=[('remote', 'Remote'), ('on-site', 'On-site'), ('hybrid', 'Hybrid')], default='remote', max_length=20)),
+ ('location', models.CharField(default='Remote', help_text='Work location', max_length=255)),
+ ('open_positions', models.PositiveIntegerField(default=1, help_text='Number of open positions')),
+ ('experience_required', models.CharField(blank=True, help_text='e.g., 3+ years', max_length=100)),
+ ('salary_min', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)),
+ ('salary_max', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)),
+ ('salary_currency', models.CharField(default='USD', max_length=10)),
+ ('salary_period', models.CharField(default='per month', help_text='e.g., per month, per year', max_length=20)),
+ ('salary_additional', models.TextField(blank=True, help_text='Additional salary info like bonuses, benefits')),
+ ('short_description', models.TextField(blank=True, help_text='Brief description for listing page')),
+ ('about_role', models.TextField(blank=True, help_text='About this role / Who we are')),
+ ('requirements', models.JSONField(blank=True, default=list, help_text='List of requirements')),
+ ('responsibilities', models.JSONField(blank=True, default=list, help_text='List of responsibilities')),
+ ('qualifications', models.JSONField(blank=True, default=list, help_text='List of qualifications')),
+ ('bonus_points', models.JSONField(blank=True, default=list, help_text='Nice to have skills')),
+ ('benefits', models.JSONField(blank=True, default=list, help_text='What you get')),
+ ('start_date', models.CharField(default='ASAP', help_text='Expected start date', max_length=100)),
+ ('posted_date', models.DateTimeField(auto_now_add=True)),
+ ('updated_date', models.DateTimeField(auto_now=True)),
+ ('deadline', models.DateTimeField(blank=True, help_text='Application deadline', null=True)),
+ ('status', models.CharField(choices=[('active', 'Active'), ('closed', 'Closed'), ('draft', 'Draft')], default='active', max_length=20)),
+ ('featured', models.BooleanField(default=False, help_text='Feature this job on homepage')),
+ ('priority', models.IntegerField(default=0, help_text='Higher number = higher priority in listing')),
+ ],
+ options={
+ 'verbose_name': 'Job Position',
+ 'verbose_name_plural': 'Job Positions',
+ 'ordering': ['-priority', '-posted_date'],
+ },
+ ),
+ migrations.CreateModel(
+ name='JobApplication',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('first_name', models.CharField(max_length=100)),
+ ('last_name', models.CharField(max_length=100)),
+ ('email', models.EmailField(max_length=254)),
+ ('phone', models.CharField(blank=True, max_length=20)),
+ ('current_position', models.CharField(blank=True, help_text='Current job title', max_length=255)),
+ ('current_company', models.CharField(blank=True, max_length=255)),
+ ('years_of_experience', models.CharField(blank=True, max_length=50)),
+ ('cover_letter', models.TextField(blank=True, help_text='Cover letter or message')),
+ ('resume', models.FileField(help_text='Upload your resume (PDF, DOC, DOCX)', upload_to='career/resumes/%Y/%m/', validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['pdf', 'doc', 'docx'])])),
+ ('portfolio_url', models.URLField(blank=True, help_text='Link to portfolio or LinkedIn')),
+ ('linkedin_url', models.URLField(blank=True)),
+ ('github_url', models.URLField(blank=True)),
+ ('website_url', models.URLField(blank=True)),
+ ('available_from', models.DateField(blank=True, help_text='When can you start?', null=True)),
+ ('notice_period', models.CharField(blank=True, help_text='Notice period if applicable', max_length=100)),
+ ('expected_salary', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True)),
+ ('salary_currency', models.CharField(default='USD', max_length=10)),
+ ('status', models.CharField(choices=[('new', 'New'), ('reviewing', 'Reviewing'), ('shortlisted', 'Shortlisted'), ('interviewed', 'Interviewed'), ('accepted', 'Accepted'), ('rejected', 'Rejected')], default='new', max_length=20)),
+ ('applied_date', models.DateTimeField(auto_now_add=True)),
+ ('updated_date', models.DateTimeField(auto_now=True)),
+ ('notes', models.TextField(blank=True, help_text='Internal notes (not visible to applicant)')),
+ ('consent', models.BooleanField(default=False, help_text='Consent to data processing')),
+ ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='applications', to='career.jobposition')),
+ ],
+ options={
+ 'verbose_name': 'Job Application',
+ 'verbose_name_plural': 'Job Applications',
+ 'ordering': ['-applied_date'],
+ },
+ ),
+ ]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/REQUESTED b/gnx-react/backend/career/migrations/__init__.py
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/REQUESTED
rename to gnx-react/backend/career/migrations/__init__.py
diff --git a/gnx-react/backend/career/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/backend/career/migrations/__pycache__/0001_initial.cpython-312.pyc
new file mode 100644
index 00000000..8e20cd97
Binary files /dev/null and b/gnx-react/backend/career/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/career/migrations/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..c495a856
Binary files /dev/null and b/gnx-react/backend/career/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/career/models.py b/gnx-react/backend/career/models.py
new file mode 100644
index 00000000..10abcd40
--- /dev/null
+++ b/gnx-react/backend/career/models.py
@@ -0,0 +1,166 @@
+from django.db import models
+from django.utils.text import slugify
+from django.core.validators import FileExtensionValidator
+
+
+class JobPosition(models.Model):
+ """Model for job positions/openings"""
+
+ EMPLOYMENT_TYPE_CHOICES = [
+ ('full-time', 'Full Time'),
+ ('part-time', 'Part Time'),
+ ('contract', 'Contract'),
+ ('internship', 'Internship'),
+ ('remote', 'Remote'),
+ ]
+
+ LOCATION_TYPE_CHOICES = [
+ ('remote', 'Remote'),
+ ('on-site', 'On-site'),
+ ('hybrid', 'Hybrid'),
+ ]
+
+ STATUS_CHOICES = [
+ ('active', 'Active'),
+ ('closed', 'Closed'),
+ ('draft', 'Draft'),
+ ]
+
+ # Basic Information
+ title = models.CharField(max_length=255, help_text="Job title")
+ slug = models.SlugField(max_length=255, unique=True, blank=True)
+ department = models.CharField(max_length=100, blank=True, help_text="Department or category")
+
+ # Employment Details
+ employment_type = models.CharField(
+ max_length=20,
+ choices=EMPLOYMENT_TYPE_CHOICES,
+ default='full-time'
+ )
+ location_type = models.CharField(
+ max_length=20,
+ choices=LOCATION_TYPE_CHOICES,
+ default='remote'
+ )
+ location = models.CharField(max_length=255, default='Remote', help_text="Work location")
+
+ # Position Details
+ open_positions = models.PositiveIntegerField(default=1, help_text="Number of open positions")
+ experience_required = models.CharField(max_length=100, blank=True, help_text="e.g., 3+ years")
+
+ # Salary Information
+ salary_min = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
+ salary_max = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
+ salary_currency = models.CharField(max_length=10, default='USD')
+ salary_period = models.CharField(max_length=20, default='per month', help_text="e.g., per month, per year")
+ salary_additional = models.TextField(blank=True, help_text="Additional salary info like bonuses, benefits")
+
+ # Job Description
+ short_description = models.TextField(blank=True, help_text="Brief description for listing page")
+ about_role = models.TextField(blank=True, help_text="About this role / Who we are")
+ requirements = models.JSONField(default=list, blank=True, help_text="List of requirements")
+ responsibilities = models.JSONField(default=list, blank=True, help_text="List of responsibilities")
+ qualifications = models.JSONField(default=list, blank=True, help_text="List of qualifications")
+ bonus_points = models.JSONField(default=list, blank=True, help_text="Nice to have skills")
+ benefits = models.JSONField(default=list, blank=True, help_text="What you get")
+
+ # Dates and Status
+ start_date = models.CharField(max_length=100, default='ASAP', help_text="Expected start date")
+ posted_date = models.DateTimeField(auto_now_add=True)
+ updated_date = models.DateTimeField(auto_now=True)
+ deadline = models.DateTimeField(null=True, blank=True, help_text="Application deadline")
+ status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
+
+ # SEO and Metadata
+ featured = models.BooleanField(default=False, help_text="Feature this job on homepage")
+ priority = models.IntegerField(default=0, help_text="Higher number = higher priority in listing")
+
+ class Meta:
+ ordering = ['-priority', '-posted_date']
+ verbose_name = 'Job Position'
+ verbose_name_plural = 'Job Positions'
+
+ def __str__(self):
+ return f"{self.title} ({self.open_positions} positions)"
+
+ def save(self, *args, **kwargs):
+ if not self.slug:
+ self.slug = slugify(self.title)
+ # Ensure unique slug
+ original_slug = self.slug
+ counter = 1
+ while JobPosition.objects.filter(slug=self.slug).exists():
+ self.slug = f"{original_slug}-{counter}"
+ counter += 1
+ super().save(*args, **kwargs)
+
+
+class JobApplication(models.Model):
+ """Model for job applications"""
+
+ STATUS_CHOICES = [
+ ('new', 'New'),
+ ('reviewing', 'Reviewing'),
+ ('shortlisted', 'Shortlisted'),
+ ('interviewed', 'Interviewed'),
+ ('accepted', 'Accepted'),
+ ('rejected', 'Rejected'),
+ ]
+
+ # Related Job
+ job = models.ForeignKey(JobPosition, on_delete=models.CASCADE, related_name='applications')
+
+ # Applicant Information
+ first_name = models.CharField(max_length=100)
+ last_name = models.CharField(max_length=100)
+ email = models.EmailField()
+ phone = models.CharField(max_length=20, blank=True)
+
+ # Professional Information
+ current_position = models.CharField(max_length=255, blank=True, help_text="Current job title")
+ current_company = models.CharField(max_length=255, blank=True)
+ years_of_experience = models.CharField(max_length=50, blank=True)
+
+ # Application Details
+ cover_letter = models.TextField(blank=True, help_text="Cover letter or message")
+ resume = models.FileField(
+ upload_to='career/resumes/%Y/%m/',
+ validators=[FileExtensionValidator(allowed_extensions=['pdf', 'doc', 'docx'])],
+ help_text="Upload your resume (PDF, DOC, DOCX)"
+ )
+ portfolio_url = models.URLField(blank=True, help_text="Link to portfolio or LinkedIn")
+
+ # Additional Information
+ linkedin_url = models.URLField(blank=True)
+ github_url = models.URLField(blank=True)
+ website_url = models.URLField(blank=True)
+
+ # Availability
+ available_from = models.DateField(null=True, blank=True, help_text="When can you start?")
+ notice_period = models.CharField(max_length=100, blank=True, help_text="Notice period if applicable")
+
+ # Salary Expectations
+ expected_salary = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
+ salary_currency = models.CharField(max_length=10, default='USD')
+
+ # Application Metadata
+ status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='new')
+ applied_date = models.DateTimeField(auto_now_add=True)
+ updated_date = models.DateTimeField(auto_now=True)
+ notes = models.TextField(blank=True, help_text="Internal notes (not visible to applicant)")
+
+ # Privacy
+ consent = models.BooleanField(default=False, help_text="Consent to data processing")
+
+ class Meta:
+ ordering = ['-applied_date']
+ verbose_name = 'Job Application'
+ verbose_name_plural = 'Job Applications'
+
+ def __str__(self):
+ return f"{self.first_name} {self.last_name} - {self.job.title}"
+
+ @property
+ def full_name(self):
+ return f"{self.first_name} {self.last_name}"
+
diff --git a/gnx-react/backend/career/serializers.py b/gnx-react/backend/career/serializers.py
new file mode 100644
index 00000000..ca6ed8da
--- /dev/null
+++ b/gnx-react/backend/career/serializers.py
@@ -0,0 +1,131 @@
+from rest_framework import serializers
+from .models import JobPosition, JobApplication
+
+
+class JobPositionListSerializer(serializers.ModelSerializer):
+ """Serializer for job position list view"""
+
+ class Meta:
+ model = JobPosition
+ fields = [
+ 'id',
+ 'title',
+ 'slug',
+ 'department',
+ 'employment_type',
+ 'location_type',
+ 'location',
+ 'open_positions',
+ 'short_description',
+ 'salary_min',
+ 'salary_max',
+ 'salary_currency',
+ 'salary_period',
+ 'posted_date',
+ 'status',
+ 'featured',
+ ]
+
+
+class JobPositionDetailSerializer(serializers.ModelSerializer):
+ """Serializer for job position detail view"""
+
+ class Meta:
+ model = JobPosition
+ fields = [
+ 'id',
+ 'title',
+ 'slug',
+ 'department',
+ 'employment_type',
+ 'location_type',
+ 'location',
+ 'open_positions',
+ 'experience_required',
+ 'salary_min',
+ 'salary_max',
+ 'salary_currency',
+ 'salary_period',
+ 'salary_additional',
+ 'short_description',
+ 'about_role',
+ 'requirements',
+ 'responsibilities',
+ 'qualifications',
+ 'bonus_points',
+ 'benefits',
+ 'start_date',
+ 'posted_date',
+ 'updated_date',
+ 'deadline',
+ 'status',
+ ]
+
+
+class JobApplicationSerializer(serializers.ModelSerializer):
+ """Serializer for job application submission"""
+
+ job_title = serializers.CharField(source='job.title', read_only=True)
+
+ class Meta:
+ model = JobApplication
+ fields = [
+ 'id',
+ 'job',
+ 'job_title',
+ 'first_name',
+ 'last_name',
+ 'email',
+ 'phone',
+ 'current_position',
+ 'current_company',
+ 'years_of_experience',
+ 'cover_letter',
+ 'resume',
+ 'portfolio_url',
+ 'linkedin_url',
+ 'github_url',
+ 'website_url',
+ 'available_from',
+ 'notice_period',
+ 'expected_salary',
+ 'salary_currency',
+ 'consent',
+ 'applied_date',
+ ]
+ read_only_fields = ['id', 'applied_date', 'job_title']
+
+ def validate_resume(self, value):
+ """Validate resume file size"""
+ if value.size > 5 * 1024 * 1024: # 5MB
+ raise serializers.ValidationError("Resume file size cannot exceed 5MB")
+ return value
+
+ def validate_consent(self, value):
+ """Ensure user has given consent"""
+ if not value:
+ raise serializers.ValidationError("You must consent to data processing to apply")
+ return value
+
+
+class JobApplicationListSerializer(serializers.ModelSerializer):
+ """Serializer for listing job applications (admin view)"""
+
+ job_title = serializers.CharField(source='job.title', read_only=True)
+ full_name = serializers.CharField(read_only=True)
+
+ class Meta:
+ model = JobApplication
+ fields = [
+ 'id',
+ 'job',
+ 'job_title',
+ 'full_name',
+ 'email',
+ 'phone',
+ 'status',
+ 'applied_date',
+ 'resume',
+ ]
+ read_only_fields = fields
+
diff --git a/gnx-react/backend/career/templates/career/application_confirmation.html b/gnx-react/backend/career/templates/career/application_confirmation.html
new file mode 100644
index 00000000..ed2afe44
--- /dev/null
+++ b/gnx-react/backend/career/templates/career/application_confirmation.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
Dear {{ applicant_name }} ,
+
+
Thank you for applying for the {{ job_title }} position at GNX!
+
+
We have received your application and our team will review it carefully. We appreciate your interest in joining our team.
+
+
+
Application Details
+
+ Position: {{ job_title }}
+ Location: {{ job_location }}
+ Applied on: {{ application_date|date:"F d, Y" }}
+
+
+
+
What happens next?
+
Our hiring team will review your application and resume. If your qualifications match our requirements, we will contact you within 1-2 weeks to discuss the next steps.
+
+
If you have any questions, please don't hesitate to reach out to us.
+
+
Best regards,The GNX Team
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/career/templates/career/application_confirmation.txt b/gnx-react/backend/career/templates/career/application_confirmation.txt
new file mode 100644
index 00000000..3fff28da
--- /dev/null
+++ b/gnx-react/backend/career/templates/career/application_confirmation.txt
@@ -0,0 +1,22 @@
+Dear {{ applicant_name }},
+
+Thank you for applying for the {{ job_title }} position at GNX!
+
+We have received your application and our team will review it carefully. We appreciate your interest in joining our team.
+
+Application Details:
+- Position: {{ job_title }}
+- Location: {{ job_location }}
+- Applied on: {{ application_date|date:"F d, Y" }}
+
+What happens next?
+Our hiring team will review your application and resume. If your qualifications match our requirements, we will contact you within 1-2 weeks to discuss the next steps.
+
+If you have any questions, please don't hesitate to reach out to us.
+
+Best regards,
+The GNX Team
+
+---
+This is an automated message. Please do not reply to this email.
+
diff --git a/gnx-react/backend/career/templates/career/application_notification.html b/gnx-react/backend/career/templates/career/application_notification.html
new file mode 100644
index 00000000..8daf0b09
--- /dev/null
+++ b/gnx-react/backend/career/templates/career/application_notification.html
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
👤 Applicant Information
+
+ Name: {{ applicant_name }}
+
+
+ {% if applicant_phone %}
+
+ Phone: {{ applicant_phone }}
+
+ {% endif %}
+
+
+
+
💼 Professional Information
+ {% if current_position %}
+
+ Current Position: {{ current_position }}
+
+ {% endif %}
+ {% if current_company %}
+
+ Current Company: {{ current_company }}
+
+ {% endif %}
+ {% if years_of_experience %}
+
+ Years of Experience: {{ years_of_experience }}
+
+ {% endif %}
+
+
+
+
📋 Application Details
+
+ Position Applied: {{ job_title }}
+
+
+ Application Date: {{ application_date|date:"F d, Y at h:i A" }}
+
+ {% if expected_salary %}
+
+ Expected Salary: {{ expected_salary }} {{ salary_currency }}
+
+ {% endif %}
+ {% if available_from %}
+
+ Available From: {{ available_from|date:"F d, Y" }}
+
+ {% endif %}
+ {% if notice_period %}
+
+ Notice Period: {{ notice_period }}
+
+ {% endif %}
+
+
+ {% if portfolio_url or linkedin_url or github_url or website_url %}
+
+ {% endif %}
+
+ {% if cover_letter %}
+
+
✉️ Cover Letter
+
{{ cover_letter }}
+
+ {% endif %}
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/career/templates/career/application_notification.txt b/gnx-react/backend/career/templates/career/application_notification.txt
new file mode 100644
index 00000000..a3e012de
--- /dev/null
+++ b/gnx-react/backend/career/templates/career/application_notification.txt
@@ -0,0 +1,48 @@
+New Job Application Received
+
+A new application has been submitted for the {{ job_title }} position.
+
+Applicant Information:
+--------------------
+Name: {{ applicant_name }}
+Email: {{ applicant_email }}
+Phone: {{ applicant_phone }}
+
+Professional Information:
+-----------------------
+Current Position: {{ current_position }}
+Current Company: {{ current_company }}
+Years of Experience: {{ years_of_experience }}
+
+Application Details:
+------------------
+Applied for: {{ job_title }}
+Application Date: {{ application_date|date:"F d, Y at h:i A" }}
+
+{% if expected_salary %}
+Expected Salary: {{ expected_salary }} {{ salary_currency }}
+{% endif %}
+
+{% if available_from %}
+Available From: {{ available_from|date:"F d, Y" }}
+{% endif %}
+
+{% if notice_period %}
+Notice Period: {{ notice_period }}
+{% endif %}
+
+Links:
+------
+{% if portfolio_url %}Portfolio: {{ portfolio_url }}{% endif %}
+{% if linkedin_url %}LinkedIn: {{ linkedin_url }}{% endif %}
+{% if github_url %}GitHub: {{ github_url }}{% endif %}
+{% if website_url %}Website: {{ website_url }}{% endif %}
+
+Cover Letter:
+------------
+{{ cover_letter }}
+
+---
+Resume is attached to this email.
+Please log in to the admin panel to review the full application.
+
diff --git a/gnx-react/backend/career/tests.py b/gnx-react/backend/career/tests.py
new file mode 100644
index 00000000..0b4501e2
--- /dev/null
+++ b/gnx-react/backend/career/tests.py
@@ -0,0 +1,4 @@
+from django.test import TestCase
+
+# Create your tests here.
+
diff --git a/gnx-react/backend/career/urls.py b/gnx-react/backend/career/urls.py
new file mode 100644
index 00000000..1c50d1dd
--- /dev/null
+++ b/gnx-react/backend/career/urls.py
@@ -0,0 +1,12 @@
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+from .views import JobPositionViewSet, JobApplicationViewSet
+
+router = DefaultRouter()
+router.register(r'jobs', JobPositionViewSet, basename='job')
+router.register(r'applications', JobApplicationViewSet, basename='application')
+
+urlpatterns = [
+ path('', include(router.urls)),
+]
+
diff --git a/gnx-react/backend/career/views.py b/gnx-react/backend/career/views.py
new file mode 100644
index 00000000..786f5db3
--- /dev/null
+++ b/gnx-react/backend/career/views.py
@@ -0,0 +1,133 @@
+from rest_framework import viewsets, status, filters
+from rest_framework.decorators import action
+from rest_framework.response import Response
+from rest_framework.permissions import AllowAny, IsAdminUser
+from django_filters.rest_framework import DjangoFilterBackend
+from django.shortcuts import get_object_or_404
+import logging
+
+from .models import JobPosition, JobApplication
+from .serializers import (
+ JobPositionListSerializer,
+ JobPositionDetailSerializer,
+ JobApplicationSerializer,
+ JobApplicationListSerializer
+)
+from .email_service import CareerEmailService
+
+logger = logging.getLogger(__name__)
+
+
+class JobPositionViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for job positions
+ GET /api/career/jobs/ - List all active job positions
+ GET /api/career/jobs/{slug}/ - Get job position by slug
+ """
+
+ queryset = JobPosition.objects.filter(status='active')
+ permission_classes = [AllowAny]
+ lookup_field = 'slug'
+ filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
+ filterset_fields = ['department', 'employment_type', 'location_type', 'featured']
+ search_fields = ['title', 'department', 'location', 'short_description']
+ ordering_fields = ['posted_date', 'priority', 'title']
+ ordering = ['-priority', '-posted_date']
+
+ def get_serializer_class(self):
+ if self.action == 'retrieve':
+ return JobPositionDetailSerializer
+ return JobPositionListSerializer
+
+ @action(detail=False, methods=['get'])
+ def featured(self, request):
+ """Get featured job positions"""
+ featured_jobs = self.queryset.filter(featured=True)
+ serializer = self.get_serializer(featured_jobs, many=True)
+ return Response(serializer.data)
+
+ @action(detail=True, methods=['get'])
+ def applications_count(self, request, slug=None):
+ """Get number of applications for a job"""
+ job = self.get_object()
+ count = job.applications.count()
+ return Response({'count': count})
+
+
+class JobApplicationViewSet(viewsets.ModelViewSet):
+ """
+ ViewSet for job applications
+ POST /api/career/applications/ - Submit a job application
+ GET /api/career/applications/ - List applications (admin only)
+ """
+
+ queryset = JobApplication.objects.all()
+ serializer_class = JobApplicationSerializer
+ filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
+ filterset_fields = ['job', 'status']
+ search_fields = ['first_name', 'last_name', 'email', 'job__title']
+ ordering_fields = ['applied_date', 'status']
+ ordering = ['-applied_date']
+
+ def get_permissions(self):
+ """
+ Allow anyone to create (submit) applications
+ Only admins can list/view/update/delete applications
+ """
+ if self.action == 'create':
+ return [AllowAny()]
+ return [IsAdminUser()]
+
+ def get_serializer_class(self):
+ if self.action == 'list':
+ return JobApplicationListSerializer
+ return JobApplicationSerializer
+
+ def create(self, request, *args, **kwargs):
+ """Submit a job application"""
+ serializer = self.get_serializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+
+ try:
+ # Save the application
+ application = serializer.save()
+
+ # Send email notifications
+ email_service = CareerEmailService()
+ email_service.send_application_confirmation(application)
+ email_service.send_application_notification_to_admin(application)
+
+ logger.info(f"New job application received: {application.full_name} for {application.job.title}")
+
+ return Response(
+ {
+ 'message': 'Application submitted successfully',
+ 'data': serializer.data
+ },
+ status=status.HTTP_201_CREATED
+ )
+ except Exception as e:
+ logger.error(f"Error submitting job application: {str(e)}", exc_info=True)
+ return Response(
+ {'error': 'Failed to submit application. Please try again.'},
+ status=status.HTTP_500_INTERNAL_SERVER_ERROR
+ )
+
+ @action(detail=True, methods=['post'])
+ def update_status(self, request, pk=None):
+ """Update application status"""
+ application = self.get_object()
+ new_status = request.data.get('status')
+
+ if new_status not in dict(JobApplication.STATUS_CHOICES):
+ return Response(
+ {'error': 'Invalid status'},
+ status=status.HTTP_400_BAD_REQUEST
+ )
+
+ application.status = new_status
+ application.save()
+
+ serializer = self.get_serializer(application)
+ return Response(serializer.data)
+
diff --git a/gnx-react/backend/db.sqlite3 b/gnx-react/backend/db.sqlite3
index 39c413e7..fc426836 100644
Binary files a/gnx-react/backend/db.sqlite3 and b/gnx-react/backend/db.sqlite3 differ
diff --git a/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc b/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc
index 65b961f4..16c77a4e 100644
Binary files a/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc and b/gnx-react/backend/gnx/__pycache__/settings.cpython-312.pyc differ
diff --git a/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc b/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc
index 5f5aef48..b4089c00 100644
Binary files a/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc and b/gnx-react/backend/gnx/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/backend/gnx/settings.py b/gnx-react/backend/gnx/settings.py
index d505a15c..e24623c6 100644
--- a/gnx-react/backend/gnx/settings.py
+++ b/gnx-react/backend/gnx/settings.py
@@ -50,6 +50,8 @@ INSTALLED_APPS = [
'contact',
'services',
'about',
+ 'career',
+ 'support',
]
MIDDLEWARE = [
@@ -197,6 +199,12 @@ EMAIL_TIMEOUT = config('EMAIL_TIMEOUT', default=30, cast=int)
# Company email for contact form notifications
COMPANY_EMAIL = config('COMPANY_EMAIL')
+# Support email for ticket notifications
+SUPPORT_EMAIL = config('SUPPORT_EMAIL', default=config('COMPANY_EMAIL'))
+
+# Site URL for email links
+SITE_URL = config('SITE_URL', default='http://localhost:3000')
+
# Email connection settings for production reliability
EMAIL_CONNECTION_TIMEOUT = config('EMAIL_CONNECTION_TIMEOUT', default=10, cast=int)
EMAIL_READ_TIMEOUT = config('EMAIL_READ_TIMEOUT', default=10, cast=int)
diff --git a/gnx-react/backend/gnx/urls.py b/gnx-react/backend/gnx/urls.py
index d1e5e0e5..e412b2c8 100644
--- a/gnx-react/backend/gnx/urls.py
+++ b/gnx-react/backend/gnx/urls.py
@@ -49,6 +49,8 @@ urlpatterns = [
path('contact/', include('contact.urls')),
path('services/', include('services.urls')),
path('about/', include('about.urls')),
+ path('career/', include('career.urls')),
+ path('support/', include('support.urls')),
])),
]
diff --git a/gnx-react/backend/logs/django.log b/gnx-react/backend/logs/django.log
index 58ad7731..009f3e72 100644
--- a/gnx-react/backend/logs/django.log
+++ b/gnx-react/backend/logs/django.log
@@ -15796,3 +15796,1330 @@ INFO 2025-09-25 21:43:57,782 basehttp 218049 129657173178048 "GET /api/services/
INFO 2025-09-25 21:43:57,798 basehttp 218049 129657173178048 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
INFO 2025-09-25 21:43:57,971 basehttp 218049 129657173178048 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
INFO 2025-09-25 21:43:57,983 basehttp 218049 129657173178048 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:58:19,887 autoreload 6832 134941741221312 Watching for file changes with StatReloader
+INFO 2025-09-26 07:59:15,914 autoreload 8231 131846501410240 Watching for file changes with StatReloader
+INFO 2025-09-26 07:59:22,677 basehttp 8231 131846318839488 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-09-26 07:59:22,705 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:22,714 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:22,767 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:22,771 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:24,602 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:24,610 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:24,635 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:24,689 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:32,475 basehttp 8231 131846318839488 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-09-26 07:59:32,475 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:32,476 basehttp 8231 131846327232192 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-09-26 07:59:32,497 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:32,526 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,526 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,629 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,633 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,636 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,638 basehttp 8231 131846318839488 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,826 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:32,839 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,844 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:32,866 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,924 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,958 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:32,984 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:33,007 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:33,011 basehttp 8231 131846092351168 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-09-26 07:59:36,030 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:36,039 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:36,358 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:36,368 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:40,736 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:40,812 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:41,121 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:41,175 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:42,862 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:42,884 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:42,889 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:42,919 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:42,921 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,037 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,039 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,041 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,172 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:43,191 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,196 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:43,211 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,283 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,310 basehttp 8231 131846100743872 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,317 basehttp 8231 131846092351168 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-09-26 07:59:43,327 basehttp 8231 131846335624896 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:43,336 basehttp 8231 131846327232192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-26 07:59:44,641 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:44,650 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:44,740 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:44,749 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:45,079 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:45,096 basehttp 8231 131846327232192 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:45,158 basehttp 8231 131846100743872 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-26 07:59:45,168 basehttp 8231 131846335624896 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:06,881 autoreload 23071 133040076232128 Watching for file changes with StatReloader
+WARNING 2025-09-27 22:20:12,393 log 23071 133039977920192 Not Found: /
+WARNING 2025-09-27 22:20:12,393 basehttp 23071 133039977920192 "GET / HTTP/1.1" 404 2679
+INFO 2025-09-27 22:20:17,235 basehttp 23071 133039977920192 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:20,434 basehttp 23071 133039977920192 "GET /swagger/ HTTP/1.1" 200 2154
+INFO 2025-09-27 22:20:26,031 basehttp 23071 133039977920192 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-09-27 22:20:26,040 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:26,047 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:26,094 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:26,144 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:49,068 basehttp 23071 133039977920192 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-09-27 22:20:49,083 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:49,105 basehttp 23071 133039977920192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,108 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:49,181 basehttp 23071 133039977920192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,185 basehttp 23071 133039883540160 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,201 basehttp 23071 133039900325568 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,255 basehttp 23071 133039883540160 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,260 basehttp 23071 133039977920192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,399 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:49,417 basehttp 23071 133039883540160 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,417 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:20:49,433 basehttp 23071 133039977920192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,451 basehttp 23071 133039883540160 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,508 basehttp 23071 133039900325568 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,549 basehttp 23071 133039875147456 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-09-27 22:20:49,584 basehttp 23071 133039900325568 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,585 basehttp 23071 133039977920192 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-27 22:20:49,606 basehttp 23071 133039875147456 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-09-27 22:20:51,088 basehttp 23071 133039875147456 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-09-27 22:21:13,941 basehttp 23071 133039875147456 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:14,044 basehttp 23071 133039891932864 "GET /api/services/restful-api-development/ HTTP/1.1" 200 3414
+INFO 2025-09-27 22:21:14,289 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:14,322 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:14,649 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:14,670 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:23,062 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:23,070 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:23,395 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-27 22:21:23,407 basehttp 23071 133039900325568 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:01,683 basehttp 6461 136432425367232 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-09-30 21:51:01,696 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:01,754 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:01,805 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:01,854 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:32,330 basehttp 6461 136432416974528 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-09-30 21:51:32,338 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:32,354 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:32,363 basehttp 6461 136432408581824 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,400 basehttp 6461 136432416974528 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,400 basehttp 6461 136432408581824 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,492 basehttp 6461 136432408581824 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,515 basehttp 6461 136432416974528 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,515 basehttp 6461 136432425367232 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,638 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:32,654 basehttp 6461 136432408581824 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,660 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:32,674 basehttp 6461 136432416974528 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,696 basehttp 6461 136432408581824 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,768 basehttp 6461 136432425367232 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,810 basehttp 6461 136432416974528 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,815 basehttp 6461 136432425367232 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-09-30 21:51:32,816 basehttp 6461 136432400189120 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-09-30 21:51:35,191 basehttp 6461 136432400189120 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-09-30 21:51:37,074 basehttp 6461 136432400189120 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-09-30 21:51:48,296 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:48,307 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:48,611 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:48,621 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,137 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,149 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,205 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,264 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,521 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,538 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,595 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:52,647 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:54,176 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:54,186 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:54,506 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:51:54,518 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:10,673 basehttp 6461 136432425367232 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-09-30 21:56:10,686 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:10,759 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:10,813 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:10,867 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:37,471 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:37,485 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:37,794 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:37,833 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:44,809 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:56:44,829 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:04,535 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:04,577 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:04,900 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:04,924 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:09,511 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:09,567 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:09,897 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:09,936 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:27,691 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:27,713 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:33,887 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:33,910 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:48,646 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:48,670 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:54,464 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:57:54,487 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:03,628 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:03,638 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:03,709 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:03,756 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:04,013 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:04,025 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:04,081 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:58:04,134 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:59:52,209 basehttp 6461 136432408581824 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-09-30 21:59:52,312 basehttp 6461 136432416974528 "GET /api/services/restful-api-development/ HTTP/1.1" 200 3414
+INFO 2025-09-30 21:59:52,601 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:59:52,651 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:59:52,980 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-09-30 21:59:53,004 basehttp 6461 136432425367232 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:39:49,819 autoreload 33003 127585909220800 Watching for file changes with StatReloader
+INFO 2025-10-07 10:40:14,159 basehttp 33003 127585740650176 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-10-07 10:40:14,173 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:40:14,182 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:40:14,236 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:40:14,290 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:41:01,816 basehttp 33003 127585740650176 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-10-07 10:41:01,830 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:41:01,854 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:41:01,855 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:01,873 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:01,943 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,013 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,113 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,113 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,187 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:41:02,254 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,257 basehttp 33003 127585740650176 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,267 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,276 basehttp 33003 127585358968512 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,284 basehttp 33003 127585707079360 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,295 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:41:02,301 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:41:02,314 basehttp 33003 127585350575808 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 10:41:02,344 basehttp 33003 127585350575808 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 10:41:45,193 basehttp 33003 127585350575808 "GET /admin/ HTTP/1.1" 302 0
+INFO 2025-10-07 10:41:45,227 basehttp 33003 127585350575808 "GET /admin/login/?next=/admin/ HTTP/1.1" 200 4181
+INFO 2025-10-07 10:41:45,308 basehttp 33003 127585350575808 "GET /static/admin/css/base.css HTTP/1.1" 200 21207
+INFO 2025-10-07 10:41:45,309 basehttp 33003 127585342183104 "GET /static/admin/css/dark_mode.css HTTP/1.1" 200 2929
+INFO 2025-10-07 10:41:45,313 basehttp 33003 127585325397696 "GET /static/admin/css/nav_sidebar.css HTTP/1.1" 200 2694
+INFO 2025-10-07 10:41:45,314 basehttp 33003 127585317004992 "GET /static/admin/js/nav_sidebar.js HTTP/1.1" 200 3063
+INFO 2025-10-07 10:41:45,315 basehttp 33003 127585342183104 "GET /static/admin/css/responsive.css HTTP/1.1" 200 18533
+INFO 2025-10-07 10:41:45,316 basehttp 33003 127585333790400 "GET /static/admin/js/theme.js HTTP/1.1" 200 1943
+INFO 2025-10-07 10:41:45,316 basehttp 33003 127585308612288 "GET /static/admin/css/login.css HTTP/1.1" 200 958
+INFO 2025-10-07 10:41:47,795 basehttp 33003 127585350575808 "POST /admin/login/?next=/admin/ HTTP/1.1" 200 4342
+INFO 2025-10-07 10:41:52,552 basehttp 33003 127585350575808 "POST /admin/login/?next=/admin/ HTTP/1.1" 200 4344
+INFO 2025-10-07 10:42:07,474 basehttp 33003 127585350575808 "POST /admin/login/?next=/admin/ HTTP/1.1" 200 4362
+INFO 2025-10-07 10:42:33,495 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,510 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,588 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,598 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,925 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,937 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:33,991 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:34,005 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:35,595 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:35,615 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:35,619 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,635 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,726 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,737 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,765 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,776 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,919 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:35,943 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:35,944 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:35,963 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:36,029 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:36,047 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:36,065 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:36,080 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:36,908 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:36,920 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:36,981 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:36,991 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:37,306 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:37,315 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:37,392 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:37,402 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:38,698 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:38,717 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:38,717 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,734 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,808 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,826 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,845 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,863 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:38,977 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:38,989 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:39,002 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:39,029 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:39,040 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:39,114 basehttp 33003 127585715472064 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:39,146 basehttp 33003 127585732257472 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:39,149 basehttp 33003 127585723864768 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 10:42:43,333 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,342 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,427 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,436 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,742 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,759 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,845 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:42:43,857 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:44:31,359 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:44:31,370 basehttp 33003 127585715472064 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:44:31,389 basehttp 33003 127585732257472 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 10:44:31,417 basehttp 33003 127585723864768 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:05,438 autoreload 43012 124130416244160 Watching for file changes with StatReloader
+INFO 2025-10-07 11:54:33,008 basehttp 43012 124130246522560 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-10-07 11:54:33,008 basehttp 43012 124130238129856 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-10-07 11:54:33,024 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:33,027 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:33,078 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:33,083 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:59,664 basehttp 43012 124130246522560 "OPTIONS /api/about/page/ HTTP/1.1" 200 0
+INFO 2025-10-07 11:54:59,679 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:59,695 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:54:59,698 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:54:59,755 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:54:59,829 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:54:59,877 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:54:59,887 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:54:59,945 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,032 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:00,120 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,132 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,134 basehttp 43012 124130221344448 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,145 basehttp 43012 124130204559040 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,149 basehttp 43012 124130212951744 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,166 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:00,172 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:00,258 basehttp 43012 124129856452288 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 11:55:05,446 basehttp 43012 124130246522560 "OPTIONS /api/services/ HTTP/1.1" 200 0
+INFO 2025-10-07 11:55:05,460 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,460 basehttp 43012 124130229737152 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,471 basehttp 43012 124130238129856 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,475 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,759 basehttp 43012 124130238129856 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,768 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,777 basehttp 43012 124130246522560 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,781 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:05,850 basehttp 43012 124129856452288 "GET /media/services/images/cross-platform-mobile-app.webp HTTP/1.1" 200 160008
+INFO 2025-10-07 11:55:28,802 basehttp 43012 124129856452288 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:29,003 basehttp 43012 124129856452288 "GET /api/services/cross-platform-mobile-app/ HTTP/1.1" 200 3630
+INFO 2025-10-07 11:55:29,291 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:29,320 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:29,678 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:29,706 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:49,430 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:49,448 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:49,451 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,478 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,552 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,582 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,600 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,617 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,761 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:49,784 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,784 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:55:49,805 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,864 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,887 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,923 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:55:49,927 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 11:56:07,593 basehttp 43012 124129856452288 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 11:56:10,222 basehttp 43012 124129856452288 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 11:56:37,025 basehttp 43012 124129856452288 "GET /api/services/restful-api-development/ HTTP/1.1" 200 3414
+INFO 2025-10-07 11:56:37,184 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:37,212 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:37,554 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:37,576 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:37,710 basehttp 43012 124129848059584 "GET /api/services/ HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:45,603 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:45,614 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:45,689 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:45,697 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:46,029 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:46,040 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:46,108 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 11:56:46,126 basehttp 43012 124130246522560 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:02:49,067 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:02:49,081 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:02:49,085 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,101 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,169 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,238 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,308 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,377 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:02:49,394 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,399 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:02:49,536 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,537 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,568 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,605 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,624 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:02:49,624 basehttp 43012 124130246522560 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,457 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:03:42,477 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,480 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:03:42,502 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,567 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,640 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,643 basehttp 43012 124130204559040 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 14:03:42,667 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:03:42,685 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:04:11,763 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:11,773 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:12,120 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:12,132 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:30,498 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:30,572 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:30,903 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:04:30,949 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:00,260 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:00,287 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:17,170 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:17,196 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:21,442 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:21,463 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:24,855 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:24,897 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:25,206 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:25,216 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,207 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,223 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,273 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,328 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,554 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,565 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,626 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:27,682 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:29,107 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:29,124 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:29,135 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,153 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,231 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,291 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,348 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,407 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,461 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:29,483 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:29,495 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,565 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,632 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,649 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,694 basehttp 43012 124130204559040 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 14:17:29,710 basehttp 43012 124130238129856 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:29,724 basehttp 43012 124130229737152 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 14:17:33,928 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:34,017 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:34,347 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:34,405 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:56,262 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:56,328 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:56,658 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:17:56,713 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:18:50,013 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:18:50,023 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:18:50,357 basehttp 43012 124130238129856 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:18:50,369 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:35:36,867 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:35:36,950 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:35:37,288 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:35:37,335 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:43,815 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:43,866 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:46,537 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:46,623 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:46,959 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:38:47,032 basehttp 43012 124130229737152 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:40:30,490 autoreload 43012 124130416244160 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading.
+INFO 2025-10-07 14:40:31,103 autoreload 59780 135351328568768 Watching for file changes with StatReloader
+INFO 2025-10-07 14:40:50,943 autoreload 59780 135351328568768 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading.
+INFO 2025-10-07 14:40:51,506 autoreload 59923 125468957013440 Watching for file changes with StatReloader
+INFO 2025-10-07 14:41:41,298 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,308 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,382 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,431 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,737 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,749 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,825 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:41:41,874 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:43:35,968 basehttp 59923 125468778948288 "OPTIONS /career/jobs/ HTTP/1.1" 200 0
+INFO 2025-10-07 14:43:35,983 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+WARNING 2025-10-07 14:43:35,990 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:35,991 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+INFO 2025-10-07 14:43:36,025 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+WARNING 2025-10-07 14:43:36,041 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:36,041 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+WARNING 2025-10-07 14:43:36,366 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:36,368 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+INFO 2025-10-07 14:43:36,373 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+WARNING 2025-10-07 14:43:36,407 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:36,407 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+INFO 2025-10-07 14:43:36,414 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:43:48,697 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+WARNING 2025-10-07 14:43:48,705 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:48,706 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+WARNING 2025-10-07 14:43:48,719 log 59923 125468778948288 Not Found: /career/jobs/
+WARNING 2025-10-07 14:43:48,720 basehttp 59923 125468778948288 "GET /career/jobs/ HTTP/1.1" 404 2733
+INFO 2025-10-07 14:43:48,724 basehttp 59923 125468787340992 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:44:04,496 autoreload 59923 125468957013440 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading.
+INFO 2025-10-07 14:44:05,156 autoreload 60618 137460207687104 Watching for file changes with StatReloader
+INFO 2025-10-07 14:44:10,489 basehttp 60618 137460109539008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:44:10,524 basehttp 60618 137460109539008 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+WARNING 2025-10-07 14:44:10,531 log 60618 137460025652928 Not Found: /career/jobs/
+WARNING 2025-10-07 14:44:10,532 log 60618 137460017260224 Not Found: /career/jobs/
+WARNING 2025-10-07 14:44:10,533 basehttp 60618 137460025652928 "GET /career/jobs/ HTTP/1.1" 404 2733
+WARNING 2025-10-07 14:44:10,533 basehttp 60618 137460017260224 "GET /career/jobs/ HTTP/1.1" 404 2733
+INFO 2025-10-07 14:46:18,081 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:46:18,084 basehttp 60618 137460017260224 "OPTIONS /api/career/jobs/ HTTP/1.1" 200 0
+INFO 2025-10-07 14:46:18,101 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:46:18,132 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 52
+INFO 2025-10-07 14:46:18,185 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 52
+INFO 2025-10-07 14:47:07,896 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:07,915 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:47:07,920 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:07,931 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:47:32,277 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:32,302 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:32,303 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:47:32,318 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:47:42,945 basehttp 60618 137460017260224 "OPTIONS /api/career/jobs/data-analyst/ HTTP/1.1" 200 0
+INFO 2025-10-07 14:47:42,946 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:42,962 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:42,966 basehttp 60618 137460017260224 "GET /api/career/jobs/data-analyst/ HTTP/1.1" 200 1714
+INFO 2025-10-07 14:47:43,021 basehttp 60618 137460025652928 "GET /api/career/jobs/data-analyst/ HTTP/1.1" 200 1714
+INFO 2025-10-07 14:47:43,276 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:47:43,279 basehttp 60618 137460025652928 "GET /api/career/jobs/data-analyst/ HTTP/1.1" 200 1714
+INFO 2025-10-07 14:47:43,291 basehttp 60618 137460025652928 "GET /api/career/jobs/data-analyst/ HTTP/1.1" 200 1714
+INFO 2025-10-07 14:47:43,295 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:33,132 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:33,134 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:48:33,199 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:48:33,203 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:33,538 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:48:33,545 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:33,595 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:33,602 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:48:36,401 basehttp 60618 137460017260224 "OPTIONS /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 0
+INFO 2025-10-07 14:48:36,409 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:36,413 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:48:36,422 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:36,460 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:48:36,715 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:48:36,723 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:48:36,731 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:48:36,736 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:50:27,597 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:50:27,616 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:50:27,620 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:50:27,628 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:52:23,073 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:52:23,082 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:52:23,093 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:52:23,133 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:52:25,680 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:52:25,681 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:52:25,696 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:52:25,696 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:52:26,000 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:52:26,000 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:52:26,016 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:52:26,019 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:53:20,502 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:53:20,516 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:53:20,525 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:53:20,529 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:54:30,190 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:54:30,199 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:54:30,208 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:54:30,213 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 14:57:01,583 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:57:01,583 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:01,657 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:01,658 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:57:01,979 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:01,983 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:57:02,031 basehttp 60618 137460017260224 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 14:57:02,035 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:07,075 basehttp 60618 137460017260224 "OPTIONS /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 0
+INFO 2025-10-07 14:57:07,079 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:07,106 basehttp 60618 137460017260224 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 14:57:07,120 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:07,163 basehttp 60618 137460017260224 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 14:57:07,384 basehttp 60618 137460017260224 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 14:57:07,389 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:57:07,400 basehttp 60618 137460017260224 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 14:57:07,406 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:59:43,704 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:59:43,714 basehttp 60618 137460017260224 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 14:59:43,732 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 14:59:43,766 basehttp 60618 137460025652928 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 15:00:26,510 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:00:26,525 basehttp 60618 137460025652928 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 15:00:26,534 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:00:26,538 basehttp 60618 137460025652928 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 15:04:34,949 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:04:34,961 basehttp 60618 137460025652928 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 15:04:34,973 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:04:34,974 basehttp 60618 137460025652928 "GET /api/career/jobs/senior-full-stack-developer/ HTTP/1.1" 200 1982
+INFO 2025-10-07 15:05:15,199 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:15,207 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:15,276 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:15,282 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:15,596 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:15,599 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:15,640 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:15,643 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:17,932 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:17,939 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:18,261 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:18,269 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:19,308 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:19,309 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:19,359 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:19,363 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:19,696 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:19,696 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:19,773 basehttp 60618 137460025652928 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 15:05:19,778 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:46,188 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:46,198 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:46,199 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:05:46,209 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:05:46,495 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:05:46,496 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:05:46,506 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:05:46,511 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:07:01,339 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:07:01,343 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:07:01,355 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:07:01,359 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:08:21,319 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:08:21,338 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:08:21,339 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:08:21,352 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:12:31,607 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:12:31,620 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:12:31,629 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:12:31,634 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:34:29,241 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:34:29,255 basehttp 60618 137460017260224 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:34:29,258 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:34:29,303 basehttp 60618 137460025652928 "GET /api/career/jobs/ui-ux-designer/ HTTP/1.1" 200 1946
+INFO 2025-10-07 15:35:33,190 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,210 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,222 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,278 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,545 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,565 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,618 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:35:33,630 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:38:18,639 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:38:47,429 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:38:47,440 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:38:47,762 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:38:47,772 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:04,908 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:04,927 basehttp 60618 137460017260224 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:04,930 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:04,946 basehttp 60618 137460017260224 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,009 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,072 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,144 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,219 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,222 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:05,231 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:05,279 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,355 basehttp 60618 137460017260224 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,372 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,437 basehttp 60618 137460008867520 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 15:39:05,449 basehttp 60618 137460017260224 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,486 basehttp 60618 137460017260224 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,497 basehttp 60618 137460025652928 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 15:39:05,505 basehttp 60618 137460008867520 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 15:39:06,479 basehttp 60618 137460008867520 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 15:39:10,474 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,484 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,566 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,577 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,896 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,907 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,958 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:10,967 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:31,353 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:31,366 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:31,407 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:39:31,460 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:41:04,806 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:41:04,814 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:41:04,851 basehttp 60618 137460017260224 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:41:04,905 basehttp 60618 137460025652928 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:42:23,873 autoreload 60618 137460207687104 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading.
+INFO 2025-10-07 15:42:24,496 autoreload 75367 128999879267776 Watching for file changes with StatReloader
+INFO 2025-10-07 15:42:32,035 autoreload 75367 128999879267776 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading.
+INFO 2025-10-07 15:42:32,654 autoreload 75406 140669356955072 Watching for file changes with StatReloader
+INFO 2025-10-07 15:42:44,096 autoreload 75406 140669356955072 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/views.py changed, reloading.
+INFO 2025-10-07 15:42:44,710 autoreload 75471 132239043405248 Watching for file changes with StatReloader
+INFO 2025-10-07 15:50:55,028 autoreload 75471 132239043405248 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/admin.py changed, reloading.
+INFO 2025-10-07 15:50:55,825 autoreload 76791 140372188575168 Watching for file changes with StatReloader
+WARNING 2025-10-07 15:51:31,190 log 76791 140372013479616 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:51:31,203 basehttp 76791 140372013479616 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:51:31,216 log 76791 140371979908800 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:51:31,220 basehttp 76791 140371979908800 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:51:31,246 basehttp 76791 140372005086912 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:51:31,247 basehttp 76791 140371996694208 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:51:31,250 basehttp 76791 140372091074240 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:51:31,255 basehttp 76791 140371988301504 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+WARNING 2025-10-07 15:51:47,950 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:51:47,952 log 76791 140371996694208 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:51:47,952 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:51:47,955 basehttp 76791 140371996694208 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:51:49,721 basehttp 76791 140371988301504 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:51:49,729 basehttp 76791 140372091074240 "GET /api/support/categories/ HTTP/1.1" 200 1353
+INFO 2025-10-07 15:51:49,741 basehttp 76791 140371996694208 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:51:49,742 basehttp 76791 140372005086912 "GET /api/support/categories/ HTTP/1.1" 200 1353
+WARNING 2025-10-07 15:52:00,623 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:00,625 log 76791 140371988301504 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:00,629 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:52:00,635 basehttp 76791 140371988301504 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:52:00,661 basehttp 76791 140371996694208 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:52:00,661 basehttp 76791 140372091074240 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+WARNING 2025-10-07 15:52:34,451 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:34,455 log 76791 140372091074240 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:34,457 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:52:34,457 basehttp 76791 140372091074240 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:52:36,284 basehttp 76791 140372091074240 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:52:36,288 basehttp 76791 140371996694208 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:52:36,288 basehttp 76791 140372005086912 "GET /api/support/categories/ HTTP/1.1" 200 1353
+INFO 2025-10-07 15:52:36,293 basehttp 76791 140371988301504 "GET /api/support/categories/ HTTP/1.1" 200 1353
+WARNING 2025-10-07 15:52:59,908 log 76791 140371988301504 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:59,910 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:52:59,925 basehttp 76791 140371988301504 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:52:59,926 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:52:59,950 basehttp 76791 140371996694208 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:52:59,956 basehttp 76791 140372091074240 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+WARNING 2025-10-07 15:53:14,950 log 76791 140371988301504 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:53:14,952 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:53:14,953 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:53:14,954 basehttp 76791 140371988301504 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:53:15,814 basehttp 76791 140372005086912 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:53:15,814 basehttp 76791 140372091074240 "GET /api/support/categories/ HTTP/1.1" 200 1353
+INFO 2025-10-07 15:53:15,823 basehttp 76791 140371988301504 "GET /api/support/categories/ HTTP/1.1" 200 1353
+INFO 2025-10-07 15:53:15,825 basehttp 76791 140371996694208 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:54:06,415 basehttp 76791 140372091074240 "GET /api/support/tickets/stats/ HTTP/1.1" 200 220
+INFO 2025-10-07 15:54:06,423 basehttp 76791 140371988301504 "GET /api/support/priorities/ HTTP/1.1" 200 778
+INFO 2025-10-07 15:54:06,424 basehttp 76791 140372005086912 "GET /api/support/categories/ HTTP/1.1" 200 1353
+WARNING 2025-10-07 15:54:11,949 log 76791 140372091074240 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:54:11,952 basehttp 76791 140372091074240 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:54:11,951 log 76791 140371988301504 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:54:11,952 basehttp 76791 140371988301504 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:54:13,958 log 76791 140372005086912 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:54:13,958 basehttp 76791 140372005086912 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+WARNING 2025-10-07 15:54:15,558 log 76791 140372091074240 Unauthorized: /api/support/tickets/my_tickets/
+WARNING 2025-10-07 15:54:15,559 basehttp 76791 140372091074240 "GET /api/support/tickets/my_tickets/ HTTP/1.1" 401 35
+INFO 2025-10-07 15:54:24,835 autoreload 76791 140372188575168 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/admin.py changed, reloading.
+INFO 2025-10-07 15:54:25,602 autoreload 77819 139935529444800 Watching for file changes with StatReloader
+INFO 2025-10-07 15:55:49,109 autoreload 78251 128542839403968 Watching for file changes with StatReloader
+INFO 2025-10-07 15:56:29,137 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,146 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,204 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,207 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,565 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,580 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,644 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 15:56:29,657 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:11,396 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:11,402 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 16:15:11,423 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 16:15:11,423 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:11,742 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 16:15:11,747 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:11,803 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 16:15:11,806 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:15,640 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:15,655 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:15,967 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:15,979 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,103 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,115 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,211 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,223 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,567 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,578 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,641 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:15:24,696 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:43:30,291 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:43:30,314 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:43:30,318 basehttp 77819 139935361267392 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,347 basehttp 77819 139935260600000 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,357 basehttp 77819 139935361267392 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,371 basehttp 77819 139935260600000 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,435 basehttp 77819 139935352874688 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,443 basehttp 77819 139935361267392 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,566 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:43:30,585 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 16:43:30,588 basehttp 77819 139935260600000 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,606 basehttp 77819 139935361267392 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,624 basehttp 77819 139935260600000 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,711 basehttp 77819 139935352874688 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,712 basehttp 77819 139935361267392 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:30,716 basehttp 77819 139935243814592 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 16:43:30,729 basehttp 77819 139935352874688 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 16:43:32,015 basehttp 77819 139935243814592 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 16:43:33,555 basehttp 77819 139935243814592 "GET /media/about/journey/5106554_2658378_z7vMnMV.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 17:53:34,034 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:34,046 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:34,358 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:34,369 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:36,090 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:36,099 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:36,176 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:36,179 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:36,502 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:36,507 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:36,551 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:36,555 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:41,680 basehttp 77819 139935352874688 "OPTIONS /api/career/jobs/product-manager/ HTTP/1.1" 200 0
+INFO 2025-10-07 17:53:41,680 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:41,697 basehttp 77819 139935361267392 "GET /api/career/jobs/product-manager/ HTTP/1.1" 200 1867
+INFO 2025-10-07 17:53:41,701 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:41,743 basehttp 77819 139935361267392 "GET /api/career/jobs/product-manager/ HTTP/1.1" 200 1867
+INFO 2025-10-07 17:53:42,000 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:42,004 basehttp 77819 139935361267392 "GET /api/career/jobs/product-manager/ HTTP/1.1" 200 1867
+INFO 2025-10-07 17:53:42,018 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:42,018 basehttp 77819 139935361267392 "GET /api/career/jobs/product-manager/ HTTP/1.1" 200 1867
+INFO 2025-10-07 17:53:57,809 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:57,814 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:57,887 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:57,893 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:58,205 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:53:58,205 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:58,263 basehttp 77819 139935352874688 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 17:53:58,265 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,329 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,343 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,510 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,519 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,825 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,843 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,965 basehttp 77819 139935352874688 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:54:31,976 basehttp 77819 139935361267392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 17:58:56,912 autoreload 77819 139935529444800 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading.
+INFO 2025-10-07 17:58:57,543 autoreload 93825 124312233055680 Watching for file changes with StatReloader
+INFO 2025-10-07 18:05:22,248 autoreload 93825 124312233055680 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading.
+INFO 2025-10-07 18:05:22,727 autoreload 95064 139851809834432 Watching for file changes with StatReloader
+INFO 2025-10-07 18:08:47,637 autoreload 95064 139851809834432 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/urls.py changed, reloading.
+INFO 2025-10-07 18:08:48,369 autoreload 95567 136195042825664 Watching for file changes with StatReloader
+INFO 2025-10-07 18:09:36,222 basehttp 95567 136194872571584 "OPTIONS /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 0
+INFO 2025-10-07 18:09:36,239 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:09:36,290 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:26:13,119 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:26:13,133 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:21,156 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:21,179 basehttp 95567 136194864178880 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,179 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:21,200 basehttp 95567 136194864178880 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,260 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,320 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,383 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,442 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,459 basehttp 95567 136194864178880 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:21,469 basehttp 95567 136194864178880 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:21,505 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,592 basehttp 95567 136194864178880 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,594 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,697 basehttp 95567 136194855786176 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,704 basehttp 95567 136194872571584 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,707 basehttp 95567 136194864178880 "GET /api/about/page/ HTTP/1.1" 200 5073
+INFO 2025-10-07 18:27:21,761 basehttp 95567 136194847393472 "GET /media/about/services/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 18:27:22,863 basehttp 95567 136194847393472 "GET /media/about/process/5106554_2658378.jpg HTTP/1.1" 200 512913
+INFO 2025-10-07 18:27:27,884 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:27,896 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:27,896 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:27,907 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:28,224 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:28,225 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:28,233 basehttp 95567 136194855786176 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:28,237 basehttp 95567 136194864178880 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:34,197 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:34,200 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:34,213 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:34,216 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:35,613 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:35,623 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:27:35,633 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:27:35,637 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:01,894 autoreload 98742 131298669262272 Watching for file changes with StatReloader
+INFO 2025-10-07 18:28:16,219 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:16,219 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:16,232 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:16,235 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:21,503 basehttp 95567 136194872571584 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:21,510 basehttp 95567 136194839000768 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:21,529 basehttp 95567 136194847393472 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:21,536 basehttp 95567 136194864178880 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:21,538 basehttp 95567 136194855786176 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:21,538 basehttp 95567 136194486695616 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:29,462 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:29,493 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:29,507 basehttp 95567 136194872571584 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:29,508 basehttp 95567 136194855786176 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:33,747 basehttp 95567 136194855786176 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:33,751 basehttp 95567 136194872571584 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:33,758 basehttp 95567 136194864178880 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:33,760 basehttp 95567 136194839000768 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:33,765 basehttp 95567 136194847393472 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:33,767 basehttp 95567 136194486695616 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:39,577 basehttp 95567 136194872571584 "GET /api/support/knowledge-base/security-best-practices/ HTTP/1.1" 200 1183
+INFO 2025-10-07 18:28:39,585 basehttp 95567 136194855786176 "GET /api/support/knowledge-base/security-best-practices/ HTTP/1.1" 200 1183
+INFO 2025-10-07 18:28:42,905 basehttp 95567 136194864178880 "OPTIONS /api/support/knowledge-base/security-best-practices/mark-helpful/ HTTP/1.1" 200 0
+INFO 2025-10-07 18:28:42,918 basehttp 95567 136194872571584 "POST /api/support/knowledge-base/security-best-practices/mark-helpful/ HTTP/1.1" 200 41
+INFO 2025-10-07 18:28:47,181 basehttp 95567 136194855786176 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:47,184 basehttp 95567 136194864178880 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:47,199 basehttp 95567 136194855786176 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:47,204 basehttp 95567 136194872571584 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:28:47,940 basehttp 95567 136194478302912 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:28:48,916 basehttp 95567 136194864178880 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:48,923 basehttp 95567 136194486695616 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:48,928 basehttp 95567 136194872571584 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:28:48,933 basehttp 95567 136194847393472 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:28:48,940 basehttp 95567 136194839000768 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:48,942 basehttp 95567 136194855786176 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:28:50,281 basehttp 95567 136194872571584 "GET /api/support/knowledge-base/security-best-practices/ HTTP/1.1" 200 1183
+INFO 2025-10-07 18:28:50,283 basehttp 95567 136194864178880 "GET /api/support/knowledge-base/security-best-practices/ HTTP/1.1" 200 1183
+INFO 2025-10-07 18:29:09,857 basehttp 95567 136194855786176 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:29:09,861 basehttp 95567 136194872571584 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:29:09,873 basehttp 95567 136194864178880 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:29:09,876 basehttp 95567 136194855786176 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:29:12,127 basehttp 95567 136194864178880 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:29:12,132 basehttp 95567 136194872571584 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:29:12,147 basehttp 95567 136194847393472 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:29:12,151 basehttp 95567 136194855786176 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:29:12,157 basehttp 95567 136194486695616 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:29:12,160 basehttp 95567 136194839000768 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:29:33,125 autoreload 95567 136195042825664 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/urls.py changed, reloading.
+INFO 2025-10-07 18:29:33,726 autoreload 99512 135629583168960 Watching for file changes with StatReloader
+INFO 2025-10-07 18:29:42,085 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/api-documentation-overview/ HTTP/1.1" 200 1049
+INFO 2025-10-07 18:29:42,088 basehttp 99512 135629404890816 "GET /api/support/knowledge-base/api-documentation-overview/ HTTP/1.1" 200 1049
+INFO 2025-10-07 18:29:45,426 basehttp 99512 135629413283520 "OPTIONS /api/support/knowledge-base/api-documentation-overview/mark-helpful/ HTTP/1.1" 200 0
+INFO 2025-10-07 18:29:45,440 basehttp 99512 135629404890816 "POST /api/support/knowledge-base/api-documentation-overview/mark-helpful/ HTTP/1.1" 200 41
+INFO 2025-10-07 18:30:06,184 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/?search=a HTTP/1.1" 200 2589
+INFO 2025-10-07 18:30:06,256 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/?search=ap HTTP/1.1" 200 469
+INFO 2025-10-07 18:30:07,303 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/?search=a HTTP/1.1" 200 2589
+INFO 2025-10-07 18:30:07,600 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:30:21,267 basehttp 99512 135629413283520 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,284 basehttp 99512 135629413283520 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,341 basehttp 99512 135629413283520 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,341 basehttp 99512 135629404890816 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,640 basehttp 99512 135629404890816 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,653 basehttp 99512 135629413283520 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,711 basehttp 99512 135629404890816 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:21,722 basehttp 99512 135629413283520 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:23,480 basehttp 99512 135629404890816 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:23,499 basehttp 99512 135629413283520 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:30:23,507 basehttp 99512 135629404890816 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:23,516 basehttp 99512 135629396498112 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:30:23,806 basehttp 99512 135629413283520 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:30:23,814 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:30:23,828 basehttp 99512 135629404890816 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:30:23,832 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:32:01,666 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:32:01,672 basehttp 99512 135629413283520 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:32:01,685 basehttp 99512 135629404890816 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:32:01,689 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:32:38,748 basehttp 99512 135629413283520 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:32:38,773 basehttp 99512 135629396498112 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:32:38,779 basehttp 99512 135629379712704 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:32:38,782 basehttp 99512 135629404890816 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:32:38,794 basehttp 99512 135629027407552 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:32:38,795 basehttp 99512 135629388105408 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:33:42,900 basehttp 99512 135629404890816 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:33:42,919 basehttp 99512 135629396498112 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:33:42,938 basehttp 99512 135629379712704 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:33:42,944 basehttp 99512 135629413283520 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:33:42,947 basehttp 99512 135629027407552 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:33:42,954 basehttp 99512 135629388105408 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:33:56,069 basehttp 99512 135629404890816 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:33:56,079 basehttp 99512 135629396498112 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:34:25,668 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:25,677 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:26,000 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:26,011 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:27,074 basehttp 99512 135629027407552 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:34:27,083 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:27,089 basehttp 99512 135629027407552 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:34:27,096 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:27,394 basehttp 99512 135629027407552 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:34:27,405 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:34:27,408 basehttp 99512 135629413283520 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:34:27,421 basehttp 99512 135629396498112 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:35:21,876 basehttp 99512 135629413283520 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:35:21,897 basehttp 99512 135629404890816 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:35:21,902 basehttp 99512 135629388105408 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:35:21,904 basehttp 99512 135629396498112 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:35:21,904 basehttp 99512 135629027407552 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:35:21,905 basehttp 99512 135629379712704 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:35:33,433 basehttp 99512 135629413283520 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:35:33,441 basehttp 99512 135629404890816 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:36:29,168 basehttp 99512 135629396498112 "OPTIONS /api/support/tickets/ HTTP/1.1" 200 0
+INFO 2025-10-07 18:36:29,196 basehttp 99512 135629413283520 "POST /api/support/tickets/ HTTP/1.1" 201 178
+INFO 2025-10-07 18:37:40,094 basehttp 99512 135629404890816 "POST /api/support/tickets/ HTTP/1.1" 201 188
+INFO 2025-10-07 18:37:58,447 autoreload 99512 135629583168960 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:37:59,026 autoreload 101863 134545161766336 Watching for file changes with StatReloader
+INFO 2025-10-07 18:38:04,207 basehttp 101863 134544992761536 "POST /api/support/tickets/ HTTP/1.1" 201 235
+INFO 2025-10-07 18:38:12,869 autoreload 101863 134545161766336 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:38:13,449 autoreload 101970 137435278529984 Watching for file changes with StatReloader
+INFO 2025-10-07 18:38:29,914 basehttp 101970 137435111487168 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:38:29,918 basehttp 101970 137435103094464 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:38:33,209 basehttp 101970 137435111487168 "OPTIONS /api/support/tickets/check-status/ HTTP/1.1" 200 0
+INFO 2025-10-07 18:38:33,234 basehttp 101970 137435103094464 "POST /api/support/tickets/check-status/ HTTP/1.1" 200 897
+INFO 2025-10-07 18:40:29,187 basehttp 101970 137435103094464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,200 basehttp 101970 137435103094464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,257 basehttp 101970 137435111487168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,262 basehttp 101970 137435103094464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,527 basehttp 101970 137435111487168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,538 basehttp 101970 137435103094464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,600 basehttp 101970 137435111487168 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:29,611 basehttp 101970 137435103094464 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:40:46,896 autoreload 101970 137435278529984 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:40:47,534 autoreload 102503 124334941423040 Watching for file changes with StatReloader
+INFO 2025-10-07 18:40:53,085 autoreload 102503 124334941423040 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:40:53,700 autoreload 102648 139219067913664 Watching for file changes with StatReloader
+INFO 2025-10-07 18:41:11,524 autoreload 102648 139219067913664 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/gnx/settings.py changed, reloading.
+INFO 2025-10-07 18:41:12,137 autoreload 102684 139461194716608 Watching for file changes with StatReloader
+INFO 2025-10-07 18:41:28,900 autoreload 102684 139461194716608 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:41:29,624 autoreload 102737 136822532412864 Watching for file changes with StatReloader
+INFO 2025-10-07 18:41:33,262 basehttp 102737 136822434821824 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:41:33,263 basehttp 102737 136822357227200 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:41:33,273 basehttp 102737 136822348834496 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:41:33,276 basehttp 102737 136822434821824 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:41:33,558 basehttp 102737 136822357227200 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:41:33,566 basehttp 102737 136822434821824 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:41:33,574 basehttp 102737 136822348834496 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:41:33,577 basehttp 102737 136822434821824 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:42:03,232 basehttp 102737 136822434821824 "POST /api/support/tickets/ HTTP/1.1" 201 222
+INFO 2025-10-07 18:43:12,892 autoreload 103140 138926526580160 Watching for file changes with StatReloader
+INFO 2025-10-07 18:43:41,719 basehttp 103140 138926354331328 "POST /api/support/tickets/ HTTP/1.1" 201 223
+INFO 2025-10-07 18:45:26,137 basehttp 103140 138926345938624 "GET /admin HTTP/1.1" 301 0
+INFO 2025-10-07 18:45:26,202 basehttp 103140 138926337545920 "GET /admin/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:45:26,222 basehttp 103140 138926337545920 "GET /admin/login/?next=/admin/ HTTP/1.1" 200 4181
+INFO 2025-10-07 18:45:32,329 basehttp 103140 138926337545920 "POST /admin/login/?next=/admin/ HTTP/1.1" 200 4342
+INFO 2025-10-07 18:46:18,794 basehttp 103140 138926337545920 "POST /admin/login/?next=/admin/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:46:18,827 basehttp 103140 138926337545920 "GET /admin/ HTTP/1.1" 200 21423
+INFO 2025-10-07 18:46:18,894 basehttp 103140 138926337545920 "GET /static/admin/css/dashboard.css HTTP/1.1" 200 441
+INFO 2025-10-07 18:46:18,942 basehttp 103140 138926337545920 "GET /static/admin/img/icon-addlink.svg HTTP/1.1" 200 331
+INFO 2025-10-07 18:46:18,943 basehttp 103140 138926354331328 "GET /static/admin/img/icon-changelink.svg HTTP/1.1" 200 380
+INFO 2025-10-07 18:46:25,594 basehttp 103140 138926337545920 "GET /admin/support/supportticket/ HTTP/1.1" 200 25860
+INFO 2025-10-07 18:46:25,644 basehttp 103140 138926329153216 "GET /static/admin/js/jquery.init.js HTTP/1.1" 200 347
+INFO 2025-10-07 18:46:25,645 basehttp 103140 138926354331328 "GET /static/admin/css/changelists.css HTTP/1.1" 200 6566
+INFO 2025-10-07 18:46:25,649 basehttp 103140 138926354331328 "GET /static/admin/js/actions.js HTTP/1.1" 200 7872
+INFO 2025-10-07 18:46:25,650 basehttp 103140 138926320760512 "GET /static/admin/js/core.js HTTP/1.1" 200 5682
+INFO 2025-10-07 18:46:25,652 basehttp 103140 138926320760512 "GET /static/admin/js/prepopulate.js HTTP/1.1" 200 1531
+INFO 2025-10-07 18:46:25,655 basehttp 103140 138926337545920 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:46:25,656 basehttp 103140 138926312367808 "GET /static/admin/js/admin/RelatedObjectLookups.js HTTP/1.1" 200 8943
+INFO 2025-10-07 18:46:25,656 basehttp 103140 138926329153216 "GET /static/admin/js/urlify.js HTTP/1.1" 200 7887
+INFO 2025-10-07 18:46:25,659 basehttp 103140 138926337545920 "GET /static/admin/js/filters.js HTTP/1.1" 200 978
+INFO 2025-10-07 18:46:25,660 basehttp 103140 138926312367808 "GET /static/admin/js/vendor/xregexp/xregexp.js HTTP/1.1" 200 232381
+INFO 2025-10-07 18:46:25,661 basehttp 103140 138926345938624 "GET /static/admin/js/vendor/jquery/jquery.js HTTP/1.1" 200 292458
+INFO 2025-10-07 18:46:25,704 basehttp 103140 138926345938624 "GET /static/admin/img/search.svg HTTP/1.1" 200 458
+INFO 2025-10-07 18:46:25,705 basehttp 103140 138926329153216 "GET /static/admin/img/icon-no.svg HTTP/1.1" 200 560
+INFO 2025-10-07 18:46:25,735 basehttp 103140 138926345938624 "GET /static/admin/img/tooltag-add.svg HTTP/1.1" 200 331
+INFO 2025-10-07 18:46:25,736 basehttp 103140 138926312367808 "GET /static/admin/img/sorting-icons.svg HTTP/1.1" 200 1097
+INFO 2025-10-07 18:46:28,712 basehttp 103140 138926345938624 "GET /admin/support/supportticket/1/change/ HTTP/1.1" 200 48765
+INFO 2025-10-07 18:46:28,761 basehttp 103140 138926354331328 "GET /static/admin/js/collapse.js HTTP/1.1" 200 1803
+INFO 2025-10-07 18:46:28,763 basehttp 103140 138926329153216 "GET /static/admin/js/calendar.js HTTP/1.1" 200 8466
+INFO 2025-10-07 18:46:28,765 basehttp 103140 138926345938624 "GET /static/admin/css/forms.css HTTP/1.1" 200 9047
+INFO 2025-10-07 18:46:28,767 basehttp 103140 138926354331328 "GET /static/admin/js/change_form.js HTTP/1.1" 200 606
+INFO 2025-10-07 18:46:28,770 basehttp 103140 138926337545920 "GET /static/admin/js/inlines.js HTTP/1.1" 200 15526
+INFO 2025-10-07 18:46:28,773 basehttp 103140 138926345938624 "GET /static/admin/css/widgets.css HTTP/1.1" 200 11900
+INFO 2025-10-07 18:46:28,774 basehttp 103140 138926329153216 "GET /static/admin/js/prepopulate_init.js HTTP/1.1" 200 586
+INFO 2025-10-07 18:46:28,775 basehttp 103140 138926312367808 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:46:28,775 basehttp 103140 138926320760512 "GET /static/admin/js/admin/DateTimeShortcuts.js HTTP/1.1" 200 19319
+INFO 2025-10-07 18:46:28,820 basehttp 103140 138926354331328 "GET /static/admin/img/icon-unknown.svg HTTP/1.1" 200 655
+INFO 2025-10-07 18:46:28,821 basehttp 103140 138926320760512 "GET /static/admin/img/icon-viewlink.svg HTTP/1.1" 200 581
+INFO 2025-10-07 18:46:28,822 basehttp 103140 138926312367808 "GET /static/admin/img/icon-deletelink.svg HTTP/1.1" 200 392
+INFO 2025-10-07 18:46:28,907 basehttp 103140 138926312367808 "GET /static/admin/img/icon-clock.svg HTTP/1.1" 200 677
+INFO 2025-10-07 18:46:28,908 basehttp 103140 138926345938624 "GET /static/admin/img/icon-calendar.svg HTTP/1.1" 200 1086
+INFO 2025-10-07 18:46:40,421 basehttp 103140 138926345938624 "POST /admin/support/supportticket/1/change/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:46:40,455 basehttp 103140 138926345938624 "GET /admin/support/supportticket/ HTTP/1.1" 200 26104
+INFO 2025-10-07 18:46:40,544 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:46:40,587 basehttp 103140 138926345938624 "GET /static/admin/img/icon-yes.svg HTTP/1.1" 200 436
+INFO 2025-10-07 18:46:47,228 basehttp 103140 138926345938624 "GET /admin/support/supportticket/ HTTP/1.1" 200 25864
+INFO 2025-10-07 18:46:47,265 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:46:50,242 basehttp 103140 138926345938624 "GET /admin/support/supportticket/1/change/ HTTP/1.1" 200 48765
+INFO 2025-10-07 18:46:50,285 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:03,187 basehttp 103140 138926345938624 "POST /admin/support/supportticket/1/change/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:47:03,224 basehttp 103140 138926345938624 "GET /admin/support/supportticket/ HTTP/1.1" 200 26104
+INFO 2025-10-07 18:47:03,302 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:07,049 basehttp 103140 138926345938624 "GET /admin/support/supportticket/4/change/ HTTP/1.1" 200 48773
+INFO 2025-10-07 18:47:07,093 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:16,784 basehttp 103140 138926345938624 "POST /admin/support/supportticket/4/change/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:47:16,814 basehttp 103140 138926345938624 "GET /admin/support/supportticket/ HTTP/1.1" 200 26106
+INFO 2025-10-07 18:47:16,898 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:25,689 basehttp 103140 138926345938624 "GET /admin/support/supportticket/4/change/ HTTP/1.1" 200 48773
+INFO 2025-10-07 18:47:25,732 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:41,971 basehttp 103140 138926345938624 "POST /admin/support/supportticket/4/change/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:47:42,002 basehttp 103140 138926345938624 "GET /admin/support/supportticket/ HTTP/1.1" 200 26106
+INFO 2025-10-07 18:47:42,088 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:47:47,261 basehttp 103140 138926345938624 "GET /admin/support/supportticket/?o=9.-8 HTTP/1.1" 200 26859
+INFO 2025-10-07 18:47:47,299 basehttp 103140 138926345938624 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:49:43,908 autoreload 103140 138926526580160 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/apps.py changed, reloading.
+INFO 2025-10-07 18:49:44,411 autoreload 104598 124389950244288 Watching for file changes with StatReloader
+INFO 2025-10-07 18:50:04,297 autoreload 104598 124389950244288 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/signals.py changed, reloading.
+INFO 2025-10-07 18:50:04,776 autoreload 104751 126343200437696 Watching for file changes with StatReloader
+INFO 2025-10-07 18:51:31,761 autoreload 104915 132122986169792 Watching for file changes with StatReloader
+INFO 2025-10-07 18:51:37,776 basehttp 104915 132122819950272 "GET /admin/support/supportticket/4/change/?_changelist_filters=o%3D9.-8 HTTP/1.1" 200 48870
+INFO 2025-10-07 18:51:37,829 basehttp 104915 132122819950272 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:51:49,340 basehttp 104915 132122819950272 "POST /admin/support/supportticket/4/change/?_changelist_filters=o%3D9.-8 HTTP/1.1" 302 0
+INFO 2025-10-07 18:51:49,390 basehttp 104915 132122819950272 "GET /admin/support/supportticket/?o=9.-8 HTTP/1.1" 200 27104
+INFO 2025-10-07 18:51:49,466 basehttp 104915 132122811557568 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:52:20,529 autoreload 104915 132122986169792 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/signals.py changed, reloading.
+INFO 2025-10-07 18:52:21,043 autoreload 105146 123485399082432 Watching for file changes with StatReloader
+INFO 2025-10-07 18:52:35,128 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:35,139 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:35,188 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:35,239 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:37,074 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:37,074 basehttp 105146 123485225477824 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:52:37,085 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:37,086 basehttp 105146 123485141595840 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:52:37,397 basehttp 105146 123485225477824 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:52:37,401 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:37,413 basehttp 105146 123485141595840 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:52:37,418 basehttp 105146 123485233870528 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 18:52:41,904 basehttp 105146 123485141595840 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:52:41,905 basehttp 105146 123485233870528 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 18:52:41,920 basehttp 105146 123485225477824 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:52:41,924 basehttp 105146 123485124810432 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 18:52:41,928 basehttp 105146 123485133203136 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:52:41,932 basehttp 105146 123485116417728 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 18:52:48,772 basehttp 105146 123485108025024 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24539
+INFO 2025-10-07 18:52:48,818 basehttp 105146 123485108025024 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:52:51,035 basehttp 105146 123485108025024 "GET /admin/support/knowledgebasearticle/4/change/ HTTP/1.1" 200 31378
+INFO 2025-10-07 18:52:51,082 basehttp 105146 123485099632320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:52:55,945 basehttp 105146 123485108025024 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24539
+INFO 2025-10-07 18:53:17,054 basehttp 105146 123485233870528 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:53:17,068 basehttp 105146 123485233870528 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 18:54:19,731 autoreload 105146 123485399082432 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:54:20,359 autoreload 105844 127973912298944 Watching for file changes with StatReloader
+WARNING 2025-10-07 18:54:48,131 log 105844 127973743130304 Bad Request: /api/support/tickets/
+WARNING 2025-10-07 18:54:48,132 basehttp 105844 127973743130304 "POST /api/support/tickets/ HTTP/1.1" 400 133
+INFO 2025-10-07 18:54:59,737 basehttp 105844 127973743130304 "POST /api/support/tickets/ HTTP/1.1" 201 238
+INFO 2025-10-07 18:55:15,307 autoreload 105844 127973912298944 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:55:15,808 autoreload 106231 139287800550848 Watching for file changes with StatReloader
+INFO 2025-10-07 18:55:33,860 basehttp 106231 139287630706368 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24539
+INFO 2025-10-07 18:55:33,905 basehttp 106231 139287630706368 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:56:26,163 autoreload 106231 139287800550848 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/models.py changed, reloading.
+INFO 2025-10-07 18:56:26,738 autoreload 106461 126790132979136 Watching for file changes with StatReloader
+INFO 2025-10-07 18:56:34,308 autoreload 106461 126790132979136 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/models.py changed, reloading.
+INFO 2025-10-07 18:56:34,839 autoreload 106504 132725156279744 Watching for file changes with StatReloader
+INFO 2025-10-07 18:56:43,420 autoreload 106504 132725156279744 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/admin.py changed, reloading.
+INFO 2025-10-07 18:56:43,981 autoreload 106530 129196983739840 Watching for file changes with StatReloader
+INFO 2025-10-07 18:56:50,509 autoreload 106530 129196983739840 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/admin.py changed, reloading.
+INFO 2025-10-07 18:56:50,985 autoreload 106672 132368960427456 Watching for file changes with StatReloader
+INFO 2025-10-07 18:57:22,195 basehttp 106672 132368790714048 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24868
+INFO 2025-10-07 18:57:22,223 basehttp 106672 132368790714048 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+ERROR 2025-10-07 18:57:24,337 log 106672 132368790714048 Internal Server Error: /admin/support/registeredemail/
+Traceback (most recent call last):
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 89, in _execute
+ return self.cursor.execute(sql, params)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
+ return super().execute(query, params)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+sqlite3.OperationalError: no such table: support_registeredemail
+
+The above exception was the direct cause of the following exception:
+
+Traceback (most recent call last):
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
+ response = get_response(request)
+ ^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
+ response = wrapped_callback(request, *callback_args, **callback_kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 688, in wrapper
+ return self.admin_site.admin_view(view)(*args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
+ response = view_func(request, *args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/cache.py", line 62, in _wrapper_view_func
+ response = view_func(request, *args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/sites.py", line 242, in inner
+ return view(request, *args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/utils/decorators.py", line 46, in _wrapper
+ return bound_method(*args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/utils/decorators.py", line 134, in _wrapper_view
+ response = view_func(request, *args, **kwargs)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 1926, in changelist_view
+ cl = self.get_changelist_instance(request)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/options.py", line 836, in get_changelist_instance
+ return ChangeList(
+ ^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/main.py", line 123, in __init__
+ self.get_results(request)
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/main.py", line 279, in get_results
+ result_count = paginator.count
+ ^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/utils/functional.py", line 57, in __get__
+ res = instance.__dict__[self.name] = self.func(instance)
+ ^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/core/paginator.py", line 93, in count
+ return c()
+ ^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/models/query.py", line 608, in count
+ return self.query.get_count(using=self.db)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 568, in get_count
+ return obj.get_aggregation(using, {"__count": Count("*")})["__count"]
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/query.py", line 554, in get_aggregation
+ result = compiler.execute_sql(SINGLE)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/compiler.py", line 1562, in execute_sql
+ cursor.execute(sql, params)
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 102, in execute
+ return super().execute(sql, params)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 67, in execute
+ return self._execute_with_wrappers(
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 80, in _execute_with_wrappers
+ return executor(sql, params, many, context)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 84, in _execute
+ with self.db.wrap_database_errors:
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/utils.py", line 91, in __exit__
+ raise dj_exc_value.with_traceback(traceback) from exc_value
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/utils.py", line 89, in _execute
+ return self.cursor.execute(sql, params)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ File "/home/gnx/Desktop/GNX-WEB/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/base.py", line 328, in execute
+ return super().execute(query, params)
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+django.db.utils.OperationalError: no such table: support_registeredemail
+ERROR 2025-10-07 18:57:24,341 basehttp 106672 132368790714048 "GET /admin/support/registeredemail/ HTTP/1.1" 500 192724
+INFO 2025-10-07 18:57:26,243 basehttp 106672 132368790714048 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24868
+INFO 2025-10-07 18:57:46,959 autoreload 106672 132368960427456 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:57:47,573 autoreload 106754 140374243628480 Watching for file changes with StatReloader
+INFO 2025-10-07 18:58:01,330 autoreload 106754 140374243628480 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 18:58:01,835 autoreload 106909 124548362212800 Watching for file changes with StatReloader
+WARNING 2025-10-07 18:58:35,147 log 106909 124548192138944 Bad Request: /api/support/tickets/
+WARNING 2025-10-07 18:58:35,147 basehttp 106909 124548192138944 "POST /api/support/tickets/ HTTP/1.1" 400 133
+INFO 2025-10-07 18:58:45,279 basehttp 106909 124548192138944 "POST /api/support/tickets/ HTTP/1.1" 201 248
+WARNING 2025-10-07 18:59:08,000 log 106909 124548192138944 Bad Request: /api/support/tickets/
+WARNING 2025-10-07 18:59:08,001 basehttp 106909 124548192138944 "POST /api/support/tickets/ HTTP/1.1" 400 108
+INFO 2025-10-07 18:59:30,613 autoreload 106909 124548362212800 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/models.py changed, reloading.
+INFO 2025-10-07 18:59:31,110 autoreload 107568 134400339588544 Watching for file changes with StatReloader
+INFO 2025-10-07 18:59:36,892 basehttp 107568 134400171833024 "GET /admin/support/registeredemail/ HTTP/1.1" 200 22250
+INFO 2025-10-07 18:59:36,926 basehttp 107568 134400171833024 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:59:39,090 basehttp 107568 134400171833024 "GET /admin/support/registeredemail/add/ HTTP/1.1" 200 23857
+INFO 2025-10-07 18:59:39,135 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 18:59:51,136 basehttp 107568 134400171833024 "POST /admin/support/registeredemail/add/ HTTP/1.1" 302 0
+INFO 2025-10-07 18:59:51,158 basehttp 107568 134400171833024 "GET /admin/support/registeredemail/ HTTP/1.1" 200 23040
+INFO 2025-10-07 18:59:51,241 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+WARNING 2025-10-07 19:00:12,558 log 107568 134400155047616 Bad Request: /api/support/tickets/
+WARNING 2025-10-07 19:00:12,559 basehttp 107568 134400155047616 "POST /api/support/tickets/ HTTP/1.1" 400 133
+INFO 2025-10-07 19:00:35,841 basehttp 107568 134400146654912 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:00:35,841 basehttp 107568 134400155047616 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:00:35,864 basehttp 107568 134400146654912 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:00:35,865 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:00:51,129 basehttp 107568 134400155047616 "POST /api/support/tickets/ HTTP/1.1" 201 223
+INFO 2025-10-07 19:01:35,448 basehttp 107568 134399928563392 "POST /api/support/tickets/check-status/ HTTP/1.1" 200 873
+INFO 2025-10-07 19:01:43,048 basehttp 107568 134400171833024 "GET /admin/support/supportticket/ HTTP/1.1" 200 28156
+INFO 2025-10-07 19:01:43,093 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+WARNING 2025-10-07 19:01:43,143 log 107568 134400163440320 Not Found: /favicon.ico
+INFO 2025-10-07 19:01:59,521 basehttp 107568 134400171833024 "GET /admin/support/supportticket/ HTTP/1.1" 200 28156
+INFO 2025-10-07 19:01:59,556 basehttp 107568 134400171833024 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 19:02:03,359 basehttp 107568 134400171833024 "GET /admin/support/supportticket/5/change/ HTTP/1.1" 200 49102
+INFO 2025-10-07 19:02:03,406 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 19:02:32,335 basehttp 107568 134400171833024 "POST /admin/support/supportticket/5/change/ HTTP/1.1" 302 0
+INFO 2025-10-07 19:02:32,380 basehttp 107568 134400171833024 "GET /admin/support/supportticket/ HTTP/1.1" 200 28398
+INFO 2025-10-07 19:02:32,471 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 19:03:00,532 basehttp 107568 134400155047616 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:03:00,547 basehttp 107568 134399928563392 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:03:00,566 basehttp 107568 134399911777984 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:03:00,574 basehttp 107568 134400146654912 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:03:00,585 basehttp 107568 134399903385280 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:03:00,586 basehttp 107568 134399920170688 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:03:08,175 basehttp 107568 134400171833024 "GET /admin/support/knowledgebasecategory/ HTTP/1.1" 200 22400
+INFO 2025-10-07 19:03:08,225 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 19:03:10,692 basehttp 107568 134400171833024 "GET /admin/support/knowledgebasearticle/ HTTP/1.1" 200 24868
+INFO 2025-10-07 19:03:10,724 basehttp 107568 134400163440320 "GET /admin/jsi18n/ HTTP/1.1" 200 3343
+INFO 2025-10-07 19:04:27,017 basehttp 107568 134399903385280 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:04:27,021 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:04:27,034 basehttp 107568 134399903385280 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:04:27,038 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:04:30,808 basehttp 107568 134400146654912 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:04:30,827 basehttp 107568 134399928563392 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:04:30,839 basehttp 107568 134399903385280 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:04:30,843 basehttp 107568 134399911777984 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:04:30,846 basehttp 107568 134399920170688 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:04:30,849 basehttp 107568 134400155047616 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:04:38,546 basehttp 107568 134399903385280 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:04:38,548 basehttp 107568 134399911777984 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:04:38,557 basehttp 107568 134399928563392 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+WARNING 2025-10-07 19:05:27,779 log 107568 134400163440320 Not Found: /api/support/knowledge-base/articles/
+WARNING 2025-10-07 19:05:27,780 basehttp 107568 134400163440320 "GET /api/support/knowledge-base/articles/ HTTP/1.1" 404 23
+INFO 2025-10-07 19:05:45,290 basehttp 107568 134399928563392 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:05:45,299 basehttp 107568 134399928563392 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:05:49,334 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,352 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,402 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,459 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,694 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,707 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,768 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:49,819 basehttp 107568 134399928563392 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:05:55,159 autoreload 107568 134400339588544 /home/gnx/Desktop/GNX-WEB/gnx-react/backend/support/serializers.py changed, reloading.
+INFO 2025-10-07 19:05:55,962 autoreload 109496 124622115689920 Watching for file changes with StatReloader
+INFO 2025-10-07 19:06:58,576 basehttp 109496 124621940582080 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:06:58,576 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:06:58,584 basehttp 109496 124621932189376 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:06:58,588 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:06:58,912 basehttp 109496 124621940582080 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:06:58,915 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:06:58,924 basehttp 109496 124621932189376 "GET /api/support/categories/ HTTP/1.1" 200 1108
+INFO 2025-10-07 19:06:58,934 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:07:49,653 basehttp 109496 124621932189376 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:07:49,657 basehttp 109496 124621948974784 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:07:49,680 basehttp 109496 124621563098816 "GET /api/support/knowledge-base/featured/ HTTP/1.1" 200 1700
+INFO 2025-10-07 19:07:49,681 basehttp 109496 124621940582080 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:07:49,684 basehttp 109496 124621923796672 "GET /api/support/knowledge-base-categories/ HTTP/1.1" 200 1195
+INFO 2025-10-07 19:07:49,687 basehttp 109496 124621915403968 "GET /api/support/knowledge-base/ HTTP/1.1" 200 2589
+INFO 2025-10-07 19:08:08,669 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:08,686 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:09,009 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:09,023 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:12,432 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:12,432 basehttp 109496 124621940582080 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 19:08:12,486 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:12,491 basehttp 109496 124621915403968 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 19:08:12,836 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:12,846 basehttp 109496 124621940582080 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 19:08:12,888 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:12,892 basehttp 109496 124621915403968 "GET /api/career/jobs/ HTTP/1.1" 200 2334
+INFO 2025-10-07 19:08:18,134 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,153 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,261 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,275 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,603 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,613 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,684 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
+INFO 2025-10-07 19:08:18,744 basehttp 109496 124621948974784 "GET /api/services/?ordering=display_order&page=1 HTTP/1.1" 200 6882
diff --git a/gnx-react/backend/support/README.md b/gnx-react/backend/support/README.md
new file mode 100644
index 00000000..6db8179b
--- /dev/null
+++ b/gnx-react/backend/support/README.md
@@ -0,0 +1,193 @@
+# Support Center Module
+
+Enterprise Support Center for handling customer support tickets, knowledge base articles, and support settings.
+
+## Features
+
+- **Ticket Management**
+ - Create and track support tickets
+ - Multiple ticket types (technical, billing, feature requests, etc.)
+ - Priority and status management
+ - Ticket categories and tags
+ - SLA deadline tracking
+ - Message and activity history
+
+- **Knowledge Base**
+ - Categorized articles
+ - Search functionality
+ - Featured articles
+ - Article feedback (helpful/not helpful)
+ - View count tracking
+ - Rich content support
+
+- **Public API**
+ - Create tickets without authentication
+ - Check ticket status by ticket number
+ - Browse knowledge base articles
+ - Search articles
+
+## Setup
+
+### 1. Run Migrations
+
+```bash
+python manage.py migrate
+```
+
+### 2. Populate Initial Data
+
+```bash
+python manage.py populate_support_data
+```
+
+This will create:
+- 5 ticket statuses (Open, In Progress, Pending Response, Resolved, Closed)
+- 4 ticket priorities (Low, Medium, High, Critical)
+- 6 ticket categories
+- 6 knowledge base categories
+- 6 sample knowledge base articles
+
+### 3. Admin Access
+
+Access the Django admin panel to manage:
+- Support tickets
+- Ticket categories, statuses, and priorities
+- Knowledge base categories and articles
+- Support settings
+
+## API Endpoints
+
+### Tickets
+
+- `GET /api/support/tickets/` - List all tickets
+- `POST /api/support/tickets/` - Create a new ticket
+- `GET /api/support/tickets/{id}/` - Get ticket details
+- `POST /api/support/tickets/check-status/` - Check ticket status by ticket number
+- `POST /api/support/tickets/{id}/add-message/` - Add a message to a ticket
+
+### Categories
+
+- `GET /api/support/categories/` - List all ticket categories
+- `GET /api/support/statuses/` - List all ticket statuses
+- `GET /api/support/priorities/` - List all ticket priorities
+
+### Knowledge Base
+
+- `GET /api/support/knowledge-base/` - List all published articles
+- `GET /api/support/knowledge-base/{slug}/` - Get article details
+- `GET /api/support/knowledge-base/featured/` - Get featured articles
+- `GET /api/support/knowledge-base/by-category/{category_slug}/` - Get articles by category
+- `POST /api/support/knowledge-base/{slug}/mark-helpful/` - Mark article as helpful/not helpful
+- `GET /api/support/knowledge-base-categories/` - List all KB categories
+
+### Settings
+
+- `GET /api/support/settings/` - List all active support settings
+- `GET /api/support/settings/{setting_name}/` - Get specific setting
+
+## Models
+
+### SupportTicket
+Main model for support tickets with full tracking capabilities.
+
+### TicketStatus
+Ticket status options (Open, In Progress, Resolved, etc.)
+
+### TicketPriority
+Priority levels with SLA hours (Low, Medium, High, Critical)
+
+### TicketCategory
+Categorize tickets for better organization
+
+### TicketMessage
+Messages and updates on tickets
+
+### TicketActivity
+Audit trail of all ticket changes
+
+### KnowledgeBaseCategory
+Categories for knowledge base articles
+
+### KnowledgeBaseArticle
+Knowledge base articles with rich content
+
+### SupportSettings
+Configurable support center settings
+
+## Usage Examples
+
+### Create a Ticket
+
+```python
+import requests
+
+data = {
+ "title": "Cannot login to my account",
+ "description": "I've been trying to login but getting error 500",
+ "ticket_type": "technical",
+ "user_name": "John Doe",
+ "user_email": "john@example.com",
+ "user_phone": "+1234567890",
+ "company": "Acme Corp",
+ "category": 1 # Technical Support category ID
+}
+
+response = requests.post('http://localhost:8000/api/support/tickets/', json=data)
+ticket = response.json()
+print(f"Ticket created: {ticket['ticket_number']}")
+```
+
+### Check Ticket Status
+
+```python
+import requests
+
+data = {
+ "ticket_number": "TKT-20231015-ABCDE"
+}
+
+response = requests.post('http://localhost:8000/api/support/tickets/check-status/', json=data)
+ticket = response.json()
+print(f"Status: {ticket['status_name']}")
+```
+
+### Search Knowledge Base
+
+```python
+import requests
+
+response = requests.get('http://localhost:8000/api/support/knowledge-base/', params={'search': 'login'})
+articles = response.json()
+for article in articles:
+ print(f"- {article['title']}")
+```
+
+## Frontend Integration
+
+The support center is integrated with the Next.js frontend at `/support-center` with:
+- Ticket submission form
+- Knowledge base browser with search
+- Ticket status checker
+- Modern, responsive UI
+
+## Email Notifications
+
+To enable email notifications for tickets, configure email settings in `settings.py` and implement email templates in `support/templates/support/`.
+
+## Security
+
+- All endpoints are public (AllowAny permission)
+- Ticket numbers are randomly generated and hard to guess
+- Internal notes and messages are hidden from public API
+- Rate limiting recommended for production
+
+## Future Enhancements
+
+- [ ] Live chat integration
+- [ ] File attachments for tickets
+- [ ] Email notifications
+- [ ] Ticket assignment and routing
+- [ ] SLA breach alerts
+- [ ] Advanced analytics dashboard
+- [ ] Webhook notifications
+
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED b/gnx-react/backend/support/__init__.py
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED
rename to gnx-react/backend/support/__init__.py
diff --git a/gnx-react/backend/support/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/support/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..8c32f4c6
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/admin.cpython-312.pyc b/gnx-react/backend/support/__pycache__/admin.cpython-312.pyc
new file mode 100644
index 00000000..879eb497
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/apps.cpython-312.pyc b/gnx-react/backend/support/__pycache__/apps.cpython-312.pyc
new file mode 100644
index 00000000..3230c7c3
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/email_service.cpython-312.pyc b/gnx-react/backend/support/__pycache__/email_service.cpython-312.pyc
new file mode 100644
index 00000000..dc12cda0
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/email_service.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/models.cpython-312.pyc b/gnx-react/backend/support/__pycache__/models.cpython-312.pyc
new file mode 100644
index 00000000..72418b95
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/serializers.cpython-312.pyc b/gnx-react/backend/support/__pycache__/serializers.cpython-312.pyc
new file mode 100644
index 00000000..a7a34ef3
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/serializers.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/signals.cpython-312.pyc b/gnx-react/backend/support/__pycache__/signals.cpython-312.pyc
new file mode 100644
index 00000000..9a0680de
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/urls.cpython-312.pyc b/gnx-react/backend/support/__pycache__/urls.cpython-312.pyc
new file mode 100644
index 00000000..07aa20a6
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/__pycache__/views.cpython-312.pyc b/gnx-react/backend/support/__pycache__/views.cpython-312.pyc
new file mode 100644
index 00000000..bd182aba
Binary files /dev/null and b/gnx-react/backend/support/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/admin.py b/gnx-react/backend/support/admin.py
new file mode 100644
index 00000000..86e15aa4
--- /dev/null
+++ b/gnx-react/backend/support/admin.py
@@ -0,0 +1,182 @@
+from django.contrib import admin
+from .models import (
+ SupportTicket, TicketStatus, TicketPriority, TicketCategory,
+ TicketMessage, TicketActivity, KnowledgeBaseCategory,
+ KnowledgeBaseArticle, SupportSettings, RegisteredEmail
+)
+
+
+@admin.register(TicketStatus)
+class TicketStatusAdmin(admin.ModelAdmin):
+ list_display = ['name', 'color', 'is_closed', 'is_active', 'display_order']
+ list_filter = ['is_closed', 'is_active']
+ search_fields = ['name']
+ ordering = ['display_order', 'name']
+
+
+@admin.register(TicketPriority)
+class TicketPriorityAdmin(admin.ModelAdmin):
+ list_display = ['name', 'level', 'color', 'sla_hours', 'is_active']
+ list_filter = ['is_active']
+ search_fields = ['name']
+ ordering = ['level']
+
+
+@admin.register(TicketCategory)
+class TicketCategoryAdmin(admin.ModelAdmin):
+ list_display = ['name', 'icon', 'color', 'is_active', 'display_order']
+ list_filter = ['is_active']
+ search_fields = ['name', 'description']
+ ordering = ['display_order', 'name']
+
+
+class TicketMessageInline(admin.TabularInline):
+ model = TicketMessage
+ extra = 0
+ fields = ['message_type', 'content', 'author_name', 'created_at', 'is_internal']
+ readonly_fields = ['created_at']
+
+
+class TicketActivityInline(admin.TabularInline):
+ model = TicketActivity
+ extra = 0
+ fields = ['activity_type', 'description', 'user_name', 'created_at']
+ readonly_fields = ['created_at']
+
+
+@admin.register(SupportTicket)
+class SupportTicketAdmin(admin.ModelAdmin):
+ list_display = [
+ 'ticket_number', 'title', 'user_name', 'user_email',
+ 'status', 'priority', 'category', 'created_at', 'is_escalated'
+ ]
+ list_filter = ['status', 'priority', 'category', 'ticket_type', 'is_escalated', 'created_at']
+ search_fields = ['ticket_number', 'title', 'user_name', 'user_email', 'description']
+ readonly_fields = ['ticket_number', 'created_at', 'updated_at', 'last_activity']
+ inlines = [TicketMessageInline, TicketActivityInline]
+
+ fieldsets = (
+ ('Ticket Information', {
+ 'fields': ('ticket_number', 'title', 'description', 'ticket_type')
+ }),
+ ('User Information', {
+ 'fields': ('user_name', 'user_email', 'user_phone', 'company')
+ }),
+ ('Ticket Management', {
+ 'fields': ('category', 'priority', 'status', 'assigned_to', 'assigned_at')
+ }),
+ ('Escalation', {
+ 'fields': ('is_escalated', 'escalation_reason'),
+ 'classes': ('collapse',)
+ }),
+ ('Timestamps', {
+ 'fields': ('created_at', 'updated_at', 'closed_at', 'last_activity', 'first_response_at', 'sla_deadline')
+ }),
+ ('Additional Information', {
+ 'fields': ('tags', 'internal_notes', 'attachments'),
+ 'classes': ('collapse',)
+ }),
+ )
+
+ ordering = ['-created_at']
+
+
+@admin.register(TicketMessage)
+class TicketMessageAdmin(admin.ModelAdmin):
+ list_display = ['ticket', 'message_type', 'author_name', 'created_at', 'is_internal', 'is_read']
+ list_filter = ['message_type', 'is_internal', 'is_read', 'created_at']
+ search_fields = ['ticket__ticket_number', 'content', 'author_name', 'author_email']
+ readonly_fields = ['created_at', 'updated_at']
+ ordering = ['-created_at']
+
+
+@admin.register(TicketActivity)
+class TicketActivityAdmin(admin.ModelAdmin):
+ list_display = ['ticket', 'activity_type', 'user_name', 'created_at']
+ list_filter = ['activity_type', 'created_at']
+ search_fields = ['ticket__ticket_number', 'description', 'user_name']
+ readonly_fields = ['created_at']
+ ordering = ['-created_at']
+
+
+@admin.register(KnowledgeBaseCategory)
+class KnowledgeBaseCategoryAdmin(admin.ModelAdmin):
+ list_display = ['name', 'slug', 'icon', 'color', 'is_active', 'display_order']
+ list_filter = ['is_active']
+ search_fields = ['name', 'description']
+ prepopulated_fields = {'slug': ('name',)}
+ ordering = ['display_order', 'name']
+
+
+@admin.register(KnowledgeBaseArticle)
+class KnowledgeBaseArticleAdmin(admin.ModelAdmin):
+ list_display = [
+ 'title', 'category', 'is_published', 'is_featured',
+ 'view_count', 'helpful_count', 'created_at'
+ ]
+ list_filter = ['is_published', 'is_featured', 'category', 'created_at']
+ search_fields = ['title', 'content', 'summary', 'keywords']
+ prepopulated_fields = {'slug': ('title',)}
+ readonly_fields = ['view_count', 'helpful_count', 'not_helpful_count', 'created_at', 'updated_at']
+
+ fieldsets = (
+ ('Article Information', {
+ 'fields': ('title', 'slug', 'category', 'content', 'summary')
+ }),
+ ('SEO & Metadata', {
+ 'fields': ('meta_description', 'keywords')
+ }),
+ ('Publishing', {
+ 'fields': ('author', 'is_published', 'is_featured', 'published_at')
+ }),
+ ('Statistics', {
+ 'fields': ('view_count', 'helpful_count', 'not_helpful_count'),
+ 'classes': ('collapse',)
+ }),
+ ('Timestamps', {
+ 'fields': ('created_at', 'updated_at'),
+ 'classes': ('collapse',)
+ }),
+ )
+
+ ordering = ['-created_at']
+
+
+@admin.register(SupportSettings)
+class SupportSettingsAdmin(admin.ModelAdmin):
+ list_display = ['setting_name', 'is_active', 'created_at', 'updated_at']
+ list_filter = ['is_active']
+ search_fields = ['setting_name', 'setting_value', 'description']
+ ordering = ['setting_name']
+
+
+@admin.register(RegisteredEmail)
+class RegisteredEmailAdmin(admin.ModelAdmin):
+ list_display = ['email', 'company_name', 'contact_name', 'is_active', 'ticket_count', 'last_ticket_date', 'created_at']
+ list_filter = ['is_active', 'created_at', 'last_ticket_date']
+ search_fields = ['email', 'company_name', 'contact_name', 'notes']
+ readonly_fields = ['added_by', 'created_at', 'updated_at', 'last_ticket_date', 'ticket_count']
+ ordering = ['-created_at']
+
+ fieldsets = (
+ ('Email Information', {
+ 'fields': ('email', 'is_active')
+ }),
+ ('Contact Details', {
+ 'fields': ('company_name', 'contact_name', 'notes')
+ }),
+ ('Statistics', {
+ 'fields': ('ticket_count', 'last_ticket_date'),
+ 'classes': ('collapse',)
+ }),
+ ('System Information', {
+ 'fields': ('added_by', 'created_at', 'updated_at'),
+ 'classes': ('collapse',)
+ }),
+ )
+
+ def save_model(self, request, obj, form, change):
+ """Automatically set added_by to current user if creating new record"""
+ if not change: # If creating new object
+ obj.added_by = request.user
+ super().save_model(request, obj, form, change)
diff --git a/gnx-react/backend/support/apps.py b/gnx-react/backend/support/apps.py
new file mode 100644
index 00000000..6e354fbe
--- /dev/null
+++ b/gnx-react/backend/support/apps.py
@@ -0,0 +1,10 @@
+from django.apps import AppConfig
+
+
+class SupportConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'support'
+
+ def ready(self):
+ """Import signal handlers when app is ready"""
+ import support.signals
\ No newline at end of file
diff --git a/gnx-react/backend/support/email_service.py b/gnx-react/backend/support/email_service.py
new file mode 100644
index 00000000..b65ea964
--- /dev/null
+++ b/gnx-react/backend/support/email_service.py
@@ -0,0 +1,161 @@
+"""
+Email Service for Support Tickets
+Handles sending email notifications for ticket creation and updates
+"""
+
+from django.core.mail import EmailMultiAlternatives
+from django.template.loader import render_to_string
+from django.conf import settings
+from django.utils.html import strip_tags
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class SupportEmailService:
+ """Service for sending support ticket related emails"""
+
+ @staticmethod
+ def send_ticket_confirmation_to_user(ticket):
+ """
+ Send ticket confirmation email to the user who created the ticket
+
+ Args:
+ ticket: SupportTicket instance
+ """
+ try:
+ subject = f'Ticket Created: {ticket.ticket_number}'
+
+ # Context for email template
+ context = {
+ 'ticket': ticket,
+ 'ticket_number': ticket.ticket_number,
+ 'user_name': ticket.user_name,
+ 'title': ticket.title,
+ 'description': ticket.description,
+ 'ticket_type': ticket.get_ticket_type_display(),
+ 'category': ticket.category.name if ticket.category else 'General',
+ 'priority': ticket.priority.name if ticket.priority else 'Medium',
+ 'status': ticket.status.name if ticket.status else 'Open',
+ 'created_at': ticket.created_at.strftime('%B %d, %Y at %I:%M %p'),
+ 'support_url': f'{settings.SITE_URL}/support-center',
+ }
+
+ # Render HTML email
+ html_message = render_to_string(
+ 'support/ticket_confirmation_user.html',
+ context
+ )
+
+ # Create plain text version
+ text_message = render_to_string(
+ 'support/ticket_confirmation_user.txt',
+ context
+ )
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_message,
+ from_email=settings.DEFAULT_FROM_EMAIL,
+ to=[ticket.user_email],
+ )
+
+ # Attach HTML version
+ email.attach_alternative(html_message, "text/html")
+
+ # Send email
+ email.send(fail_silently=False)
+
+ logger.info(f'Ticket confirmation email sent to user: {ticket.user_email} for ticket {ticket.ticket_number}')
+ return True
+
+ except Exception as e:
+ logger.error(f'Failed to send ticket confirmation email to user: {str(e)}')
+ return False
+
+ @staticmethod
+ def send_ticket_notification_to_company(ticket):
+ """
+ Send ticket notification email to company/support team
+
+ Args:
+ ticket: SupportTicket instance
+ """
+ try:
+ subject = f'New Support Ticket: {ticket.ticket_number} - {ticket.title}'
+
+ # Get company email from settings
+ company_email = getattr(settings, 'SUPPORT_EMAIL', settings.DEFAULT_FROM_EMAIL)
+
+ # Context for email template
+ context = {
+ 'ticket': ticket,
+ 'ticket_number': ticket.ticket_number,
+ 'user_name': ticket.user_name,
+ 'user_email': ticket.user_email,
+ 'user_phone': ticket.user_phone,
+ 'company': ticket.company,
+ 'title': ticket.title,
+ 'description': ticket.description,
+ 'ticket_type': ticket.get_ticket_type_display(),
+ 'category': ticket.category.name if ticket.category else 'General',
+ 'priority': ticket.priority.name if ticket.priority else 'Medium',
+ 'status': ticket.status.name if ticket.status else 'Open',
+ 'created_at': ticket.created_at.strftime('%B %d, %Y at %I:%M %p'),
+ 'admin_url': f'{settings.SITE_URL}/admin/support/supportticket/{ticket.id}/change/',
+ }
+
+ # Render HTML email
+ html_message = render_to_string(
+ 'support/ticket_notification_company.html',
+ context
+ )
+
+ # Create plain text version
+ text_message = render_to_string(
+ 'support/ticket_notification_company.txt',
+ context
+ )
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_message,
+ from_email=settings.DEFAULT_FROM_EMAIL,
+ to=[company_email],
+ reply_to=[ticket.user_email],
+ )
+
+ # Attach HTML version
+ email.attach_alternative(html_message, "text/html")
+
+ # Send email
+ email.send(fail_silently=False)
+
+ logger.info(f'Ticket notification email sent to company: {company_email} for ticket {ticket.ticket_number}')
+ return True
+
+ except Exception as e:
+ logger.error(f'Failed to send ticket notification email to company: {str(e)}')
+ return False
+
+ @staticmethod
+ def send_ticket_created_emails(ticket):
+ """
+ Send both user confirmation and company notification emails
+
+ Args:
+ ticket: SupportTicket instance
+
+ Returns:
+ dict with status of both emails
+ """
+ user_email_sent = SupportEmailService.send_ticket_confirmation_to_user(ticket)
+ company_email_sent = SupportEmailService.send_ticket_notification_to_company(ticket)
+
+ return {
+ 'user_email_sent': user_email_sent,
+ 'company_email_sent': company_email_sent,
+ }
+
diff --git a/gnx-react/backend/support/management/__init__.py b/gnx-react/backend/support/management/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/backend/support/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/support/management/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..40d890f6
Binary files /dev/null and b/gnx-react/backend/support/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/management/commands/__init__.py b/gnx-react/backend/support/management/commands/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/backend/support/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/support/management/commands/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..56776c72
Binary files /dev/null and b/gnx-react/backend/support/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/management/commands/__pycache__/add_registered_emails.cpython-312.pyc b/gnx-react/backend/support/management/commands/__pycache__/add_registered_emails.cpython-312.pyc
new file mode 100644
index 00000000..881f3a36
Binary files /dev/null and b/gnx-react/backend/support/management/commands/__pycache__/add_registered_emails.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/management/commands/__pycache__/populate_support_data.cpython-312.pyc b/gnx-react/backend/support/management/commands/__pycache__/populate_support_data.cpython-312.pyc
new file mode 100644
index 00000000..0bfbfeda
Binary files /dev/null and b/gnx-react/backend/support/management/commands/__pycache__/populate_support_data.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/management/commands/add_registered_emails.py b/gnx-react/backend/support/management/commands/add_registered_emails.py
new file mode 100644
index 00000000..6f846b5f
--- /dev/null
+++ b/gnx-react/backend/support/management/commands/add_registered_emails.py
@@ -0,0 +1,57 @@
+"""
+Management command to add registered emails for testing
+"""
+from django.core.management.base import BaseCommand
+from django.contrib.auth.models import User
+from support.models import RegisteredEmail
+
+
+class Command(BaseCommand):
+ help = 'Add sample registered emails for testing'
+
+ def handle(self, *args, **kwargs):
+ # Get the admin user to set as added_by
+ admin_user = User.objects.filter(is_superuser=True).first()
+
+ emails_to_add = [
+ {
+ 'email': 'admin@gnxsoft.com',
+ 'company_name': 'GNX Software',
+ 'contact_name': 'Admin User',
+ 'notes': 'Primary admin email',
+ },
+ {
+ 'email': 'support@gnxsoft.com',
+ 'company_name': 'GNX Software',
+ 'contact_name': 'Support Team',
+ 'notes': 'General support email',
+ },
+ ]
+
+ created_count = 0
+ for email_data in emails_to_add:
+ registered_email, created = RegisteredEmail.objects.get_or_create(
+ email=email_data['email'],
+ defaults={
+ 'company_name': email_data['company_name'],
+ 'contact_name': email_data['contact_name'],
+ 'notes': email_data['notes'],
+ 'added_by': admin_user,
+ 'is_active': True,
+ }
+ )
+
+ if created:
+ created_count += 1
+ self.stdout.write(
+ self.style.SUCCESS(f'✓ Created registered email: {email_data["email"]}')
+ )
+ else:
+ self.stdout.write(
+ self.style.WARNING(f'- Email already exists: {email_data["email"]}')
+ )
+
+ self.stdout.write(
+ self.style.SUCCESS(f'\n✓ Added {created_count} new registered emails')
+ )
+
diff --git a/gnx-react/backend/support/management/commands/populate_support_data.py b/gnx-react/backend/support/management/commands/populate_support_data.py
new file mode 100644
index 00000000..772326e4
--- /dev/null
+++ b/gnx-react/backend/support/management/commands/populate_support_data.py
@@ -0,0 +1,268 @@
+from django.core.management.base import BaseCommand
+from django.utils.text import slugify
+from support.models import (
+ TicketStatus, TicketPriority, TicketCategory,
+ KnowledgeBaseCategory, KnowledgeBaseArticle
+)
+
+
+class Command(BaseCommand):
+ help = 'Populate support center with initial data'
+
+ def handle(self, *args, **kwargs):
+ self.stdout.write(self.style.SUCCESS('Starting to populate support data...'))
+
+ # Create Ticket Statuses
+ self.create_ticket_statuses()
+
+ # Create Ticket Priorities
+ self.create_ticket_priorities()
+
+ # Create Ticket Categories
+ self.create_ticket_categories()
+
+ # Create Knowledge Base Categories
+ self.create_kb_categories()
+
+ # Create Knowledge Base Articles
+ self.create_kb_articles()
+
+ self.stdout.write(self.style.SUCCESS('Successfully populated support data!'))
+
+ def create_ticket_statuses(self):
+ self.stdout.write('Creating ticket statuses...')
+
+ statuses = [
+ {'name': 'Open', 'color': '#3b82f6', 'description': 'Ticket has been opened', 'is_closed': False, 'display_order': 1},
+ {'name': 'In Progress', 'color': '#f59e0b', 'description': 'Ticket is being worked on', 'is_closed': False, 'display_order': 2},
+ {'name': 'Pending Response', 'color': '#8b5cf6', 'description': 'Waiting for customer response', 'is_closed': False, 'display_order': 3},
+ {'name': 'Resolved', 'color': '#10b981', 'description': 'Ticket has been resolved', 'is_closed': True, 'display_order': 4},
+ {'name': 'Closed', 'color': '#6b7280', 'description': 'Ticket has been closed', 'is_closed': True, 'display_order': 5},
+ ]
+
+ for status_data in statuses:
+ status, created = TicketStatus.objects.get_or_create(
+ name=status_data['name'],
+ defaults=status_data
+ )
+ if created:
+ self.stdout.write(self.style.SUCCESS(f' ✓ Created status: {status.name}'))
+ else:
+ self.stdout.write(f' - Status already exists: {status.name}')
+
+ def create_ticket_priorities(self):
+ self.stdout.write('Creating ticket priorities...')
+
+ priorities = [
+ {'name': 'Low', 'level': 4, 'color': '#6b7280', 'description': 'Low priority issue', 'sla_hours': 72},
+ {'name': 'Medium', 'level': 3, 'color': '#3b82f6', 'description': 'Medium priority issue', 'sla_hours': 48},
+ {'name': 'High', 'level': 2, 'color': '#f59e0b', 'description': 'High priority issue', 'sla_hours': 24},
+ {'name': 'Critical', 'level': 1, 'color': '#ef4444', 'description': 'Critical issue requiring immediate attention', 'sla_hours': 4},
+ ]
+
+ for priority_data in priorities:
+ priority, created = TicketPriority.objects.get_or_create(
+ name=priority_data['name'],
+ defaults=priority_data
+ )
+ if created:
+ self.stdout.write(self.style.SUCCESS(f' ✓ Created priority: {priority.name}'))
+ else:
+ self.stdout.write(f' - Priority already exists: {priority.name}')
+
+ def create_ticket_categories(self):
+ self.stdout.write('Creating ticket categories...')
+
+ categories = [
+ {'name': 'Technical Support', 'description': 'Technical issues and troubleshooting', 'color': '#3b82f6', 'icon': 'fa-wrench', 'display_order': 1},
+ {'name': 'Billing & Payments', 'description': 'Billing questions and payment issues', 'color': '#10b981', 'icon': 'fa-credit-card', 'display_order': 2},
+ {'name': 'Account Management', 'description': 'Account settings and access issues', 'color': '#8b5cf6', 'icon': 'fa-user-cog', 'display_order': 3},
+ {'name': 'Product Inquiry', 'description': 'Questions about products and features', 'color': '#f59e0b', 'icon': 'fa-box', 'display_order': 4},
+ {'name': 'Bug Reports', 'description': 'Report software bugs and issues', 'color': '#ef4444', 'icon': 'fa-bug', 'display_order': 5},
+ {'name': 'Feature Requests', 'description': 'Request new features or improvements', 'color': '#06b6d4', 'icon': 'fa-lightbulb', 'display_order': 6},
+ ]
+
+ for category_data in categories:
+ category, created = TicketCategory.objects.get_or_create(
+ name=category_data['name'],
+ defaults=category_data
+ )
+ if created:
+ self.stdout.write(self.style.SUCCESS(f' ✓ Created category: {category.name}'))
+ else:
+ self.stdout.write(f' - Category already exists: {category.name}')
+
+ def create_kb_categories(self):
+ self.stdout.write('Creating knowledge base categories...')
+
+ categories = [
+ {'name': 'Getting Started', 'slug': 'getting-started', 'description': 'Learn the basics and get started quickly', 'icon': 'fa-rocket', 'color': '#3b82f6', 'display_order': 1},
+ {'name': 'Account & Billing', 'slug': 'account-billing', 'description': 'Manage your account and billing information', 'icon': 'fa-user-circle', 'color': '#10b981', 'display_order': 2},
+ {'name': 'Technical Documentation', 'slug': 'technical-docs', 'description': 'Technical guides and API documentation', 'icon': 'fa-code', 'color': '#8b5cf6', 'display_order': 3},
+ {'name': 'Troubleshooting', 'slug': 'troubleshooting', 'description': 'Common issues and how to resolve them', 'icon': 'fa-tools', 'color': '#f59e0b', 'display_order': 4},
+ {'name': 'Security & Privacy', 'slug': 'security-privacy', 'description': 'Security features and privacy settings', 'icon': 'fa-shield-alt', 'color': '#ef4444', 'display_order': 5},
+ {'name': 'Best Practices', 'slug': 'best-practices', 'description': 'Tips and best practices for optimal use', 'icon': 'fa-star', 'color': '#daa520', 'display_order': 6},
+ ]
+
+ for category_data in categories:
+ category, created = KnowledgeBaseCategory.objects.get_or_create(
+ slug=category_data['slug'],
+ defaults=category_data
+ )
+ if created:
+ self.stdout.write(self.style.SUCCESS(f' ✓ Created KB category: {category.name}'))
+ else:
+ self.stdout.write(f' - KB category already exists: {category.name}')
+
+ def create_kb_articles(self):
+ self.stdout.write('Creating knowledge base articles...')
+
+ # Get categories
+ getting_started = KnowledgeBaseCategory.objects.filter(slug='getting-started').first()
+ account_billing = KnowledgeBaseCategory.objects.filter(slug='account-billing').first()
+ technical = KnowledgeBaseCategory.objects.filter(slug='technical-docs').first()
+ troubleshooting = KnowledgeBaseCategory.objects.filter(slug='troubleshooting').first()
+
+ articles = [
+ {
+ 'title': 'How to Get Started with Our Platform',
+ 'slug': 'how-to-get-started',
+ 'category': getting_started,
+ 'summary': 'A comprehensive guide to help you get started with our platform quickly and easily.',
+ 'content': '''
Welcome to Our Platform!
+
This guide will help you get started with our platform in just a few simple steps.
+
+
Step 1: Create Your Account
+
Visit our sign-up page and create your account using your email address or social login.
+
+
Step 2: Complete Your Profile
+
Add your company information and customize your profile settings.
+
+
Step 3: Explore the Dashboard
+
Familiarize yourself with the main dashboard and available features.
+
+
Step 4: Start Using Our Services
+
Begin using our services and tools to achieve your business goals.
+
+
If you need any help, our support team is always here to assist you!
''',
+ 'is_published': True,
+ 'is_featured': True,
+ },
+ {
+ 'title': 'Understanding Your Billing Cycle',
+ 'slug': 'understanding-billing-cycle',
+ 'category': account_billing,
+ 'summary': 'Learn how our billing cycle works and how to manage your payments.',
+ 'content': '''
Billing Cycle Overview
+
Understanding your billing cycle is important for managing your subscription effectively.
+
+
Monthly Billing
+
For monthly subscriptions, you'll be charged on the same date each month.
+
+
Annual Billing
+
Annual subscriptions offer a discount and are billed once per year.
+
+
Managing Your Subscription
+
You can upgrade, downgrade, or cancel your subscription at any time from your account settings.
''',
+ 'is_published': True,
+ 'is_featured': True,
+ },
+ {
+ 'title': 'API Documentation Overview',
+ 'slug': 'api-documentation-overview',
+ 'category': technical,
+ 'summary': 'Complete guide to our API endpoints and authentication.',
+ 'content': '''
API Documentation
+
Our API provides programmatic access to all platform features.
+
+
Authentication
+
All API requests require authentication using an API key.
+
Authorization: Bearer YOUR_API_KEY
+
+
Rate Limits
+
Standard accounts are limited to 1000 requests per hour.
+
+
Response Format
+
All responses are returned in JSON format.
''',
+ 'is_published': True,
+ 'is_featured': True,
+ },
+ {
+ 'title': 'Common Login Issues and Solutions',
+ 'slug': 'common-login-issues',
+ 'category': troubleshooting,
+ 'summary': 'Troubleshoot common login problems and learn how to resolve them.',
+ 'content': '''
Login Troubleshooting
+
Having trouble logging in? Here are some common issues and solutions.
+
+
Forgot Password
+
Click "Forgot Password" on the login page to reset your password via email.
+
+
Account Locked
+
After multiple failed login attempts, your account may be temporarily locked for security.
+
+
Browser Issues
+
Clear your browser cache and cookies, or try a different browser.
+
+
Still Having Issues?
+
Contact our support team for personalized assistance.
''',
+ 'is_published': True,
+ 'is_featured': False,
+ },
+ {
+ 'title': 'How to Update Your Payment Method',
+ 'slug': 'update-payment-method',
+ 'category': account_billing,
+ 'summary': 'Step-by-step guide to updating your payment information.',
+ 'content': '''
Updating Payment Information
+
Keep your payment method up to date to avoid service interruptions.
+
+
Steps to Update
+
+ Go to Account Settings
+ Click on "Billing & Payments"
+ Select "Update Payment Method"
+ Enter your new payment details
+ Click "Save Changes"
+
+
+
Supported Payment Methods
+
We accept all major credit cards, PayPal, and bank transfers.
''',
+ 'is_published': True,
+ 'is_featured': False,
+ },
+ {
+ 'title': 'Security Best Practices',
+ 'slug': 'security-best-practices',
+ 'category': KnowledgeBaseCategory.objects.filter(slug='security-privacy').first(),
+ 'summary': 'Essential security practices to keep your account safe.',
+ 'content': '''
Account Security
+
Follow these best practices to keep your account secure.
+
+
Use Strong Passwords
+
Create complex passwords with a mix of letters, numbers, and symbols.
+
+
Enable Two-Factor Authentication
+
Add an extra layer of security with 2FA.
+
+
Regular Security Audits
+
Review your account activity regularly for any suspicious behavior.
+
+
Keep Software Updated
+
Always use the latest version of our software for the best security.
''',
+ 'is_published': True,
+ 'is_featured': True,
+ },
+ ]
+
+ for article_data in articles:
+ if article_data['category']:
+ article, created = KnowledgeBaseArticle.objects.get_or_create(
+ slug=article_data['slug'],
+ defaults=article_data
+ )
+ if created:
+ self.stdout.write(self.style.SUCCESS(f' ✓ Created article: {article.title}'))
+ else:
+ self.stdout.write(f' - Article already exists: {article.title}')
+
diff --git a/gnx-react/backend/support/migrations/0001_initial.py b/gnx-react/backend/support/migrations/0001_initial.py
new file mode 100644
index 00000000..4b1a5dfc
--- /dev/null
+++ b/gnx-react/backend/support/migrations/0001_initial.py
@@ -0,0 +1,183 @@
+# Generated by Django 4.2.7 on 2025-10-07 15:42
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='SupportSettings',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('setting_name', models.CharField(max_length=100, unique=True)),
+ ('setting_value', models.TextField()),
+ ('description', models.TextField(blank=True)),
+ ('is_active', models.BooleanField(default=True)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ],
+ options={
+ 'verbose_name_plural': 'Support Settings',
+ },
+ ),
+ migrations.CreateModel(
+ name='TicketCategory',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100, unique=True)),
+ ('description', models.TextField(blank=True)),
+ ('color', models.CharField(default='#667eea', help_text='Hex color code', max_length=7)),
+ ('icon', models.CharField(default='fa-question-circle', help_text='FontAwesome icon class', max_length=50)),
+ ('is_active', models.BooleanField(default=True)),
+ ('display_order', models.PositiveIntegerField(default=0)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ],
+ options={
+ 'verbose_name_plural': 'Ticket Categories',
+ 'ordering': ['display_order', 'name'],
+ },
+ ),
+ migrations.CreateModel(
+ name='TicketPriority',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=50, unique=True)),
+ ('level', models.PositiveIntegerField(help_text='Lower number = higher priority', unique=True)),
+ ('color', models.CharField(default='#667eea', help_text='Hex color code', max_length=7)),
+ ('description', models.TextField(blank=True)),
+ ('sla_hours', models.PositiveIntegerField(default=24, help_text='SLA response time in hours')),
+ ('is_active', models.BooleanField(default=True)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ],
+ options={
+ 'verbose_name_plural': 'Ticket Priorities',
+ 'ordering': ['level'],
+ },
+ ),
+ migrations.CreateModel(
+ name='TicketStatus',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=50, unique=True)),
+ ('color', models.CharField(default='#667eea', help_text='Hex color code', max_length=7)),
+ ('description', models.TextField(blank=True)),
+ ('is_closed', models.BooleanField(default=False, help_text='Whether this status represents a closed ticket')),
+ ('is_active', models.BooleanField(default=True)),
+ ('display_order', models.PositiveIntegerField(default=0)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ],
+ options={
+ 'verbose_name_plural': 'Ticket Statuses',
+ 'ordering': ['display_order', 'name'],
+ },
+ ),
+ migrations.CreateModel(
+ name='SupportTicket',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('ticket_number', models.CharField(editable=False, max_length=20, unique=True)),
+ ('title', models.CharField(max_length=200)),
+ ('description', models.TextField()),
+ ('ticket_type', models.CharField(choices=[('technical', 'Technical Issue'), ('billing', 'Billing Question'), ('feature_request', 'Feature Request'), ('bug_report', 'Bug Report'), ('general', 'General Inquiry'), ('account', 'Account Issue')], default='general', max_length=20)),
+ ('user_name', models.CharField(max_length=100)),
+ ('user_email', models.EmailField(max_length=254)),
+ ('user_phone', models.CharField(blank=True, max_length=20)),
+ ('company', models.CharField(blank=True, max_length=100)),
+ ('assigned_at', models.DateTimeField(blank=True, null=True)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ('closed_at', models.DateTimeField(blank=True, null=True)),
+ ('last_activity', models.DateTimeField(auto_now=True)),
+ ('first_response_at', models.DateTimeField(blank=True, null=True)),
+ ('sla_deadline', models.DateTimeField(blank=True, null=True)),
+ ('tags', models.CharField(blank=True, help_text='Comma-separated tags', max_length=500)),
+ ('internal_notes', models.TextField(blank=True, help_text='Internal notes visible only to staff')),
+ ('is_escalated', models.BooleanField(default=False)),
+ ('escalation_reason', models.TextField(blank=True)),
+ ('attachments', models.JSONField(blank=True, default=list, help_text='List of file paths')),
+ ('assigned_to', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_tickets', to=settings.AUTH_USER_MODEL)),
+ ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='support.ticketcategory')),
+ ('priority', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='support.ticketpriority')),
+ ('status', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='support.ticketstatus')),
+ ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='support_tickets', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'ordering': ['-created_at'],
+ },
+ ),
+ migrations.CreateModel(
+ name='TicketMessage',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('message_type', models.CharField(choices=[('user_message', 'User Message'), ('agent_response', 'Agent Response'), ('system_note', 'System Note'), ('status_change', 'Status Change'), ('assignment_change', 'Assignment Change'), ('escalation', 'Escalation')], default='user_message', max_length=20)),
+ ('content', models.TextField()),
+ ('author_name', models.CharField(blank=True, max_length=100)),
+ ('author_email', models.EmailField(blank=True, max_length=254)),
+ ('is_internal', models.BooleanField(default=False, help_text='Internal message not visible to user')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ('attachments', models.JSONField(blank=True, default=list, help_text='List of file paths')),
+ ('is_read', models.BooleanField(default=False)),
+ ('read_at', models.DateTimeField(blank=True, null=True)),
+ ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_messages', to=settings.AUTH_USER_MODEL)),
+ ('read_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='read_messages', to=settings.AUTH_USER_MODEL)),
+ ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='support.supportticket')),
+ ],
+ options={
+ 'ordering': ['created_at'],
+ 'indexes': [models.Index(fields=['ticket', 'created_at'], name='support_tic_ticket__0cd9bd_idx'), models.Index(fields=['author'], name='support_tic_author__503d4b_idx'), models.Index(fields=['message_type'], name='support_tic_message_6220bd_idx')],
+ },
+ ),
+ migrations.CreateModel(
+ name='TicketActivity',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('activity_type', models.CharField(choices=[('created', 'Ticket Created'), ('updated', 'Ticket Updated'), ('status_changed', 'Status Changed'), ('assigned', 'Ticket Assigned'), ('message_added', 'Message Added'), ('escalated', 'Ticket Escalated'), ('closed', 'Ticket Closed'), ('reopened', 'Ticket Reopened')], max_length=20)),
+ ('description', models.TextField()),
+ ('user_name', models.CharField(blank=True, max_length=100)),
+ ('old_value', models.TextField(blank=True)),
+ ('new_value', models.TextField(blank=True)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('ticket', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='activities', to='support.supportticket')),
+ ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ticket_activities', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'ordering': ['-created_at'],
+ 'indexes': [models.Index(fields=['ticket', 'created_at'], name='support_tic_ticket__4097ca_idx'), models.Index(fields=['activity_type'], name='support_tic_activit_9c98a0_idx')],
+ },
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['ticket_number'], name='support_sup_ticket__4a7d4b_idx'),
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['user_email'], name='support_sup_user_em_c518a8_idx'),
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['status'], name='support_sup_status__7b4480_idx'),
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['priority'], name='support_sup_priorit_5d48ff_idx'),
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['assigned_to'], name='support_sup_assigne_53b075_idx'),
+ ),
+ migrations.AddIndex(
+ model_name='supportticket',
+ index=models.Index(fields=['created_at'], name='support_sup_created_83a137_idx'),
+ ),
+ ]
diff --git a/gnx-react/backend/support/migrations/0002_knowledgebasecategory_knowledgebasearticle.py b/gnx-react/backend/support/migrations/0002_knowledgebasecategory_knowledgebasearticle.py
new file mode 100644
index 00000000..1c11e791
--- /dev/null
+++ b/gnx-react/backend/support/migrations/0002_knowledgebasecategory_knowledgebasearticle.py
@@ -0,0 +1,61 @@
+# Generated by Django 4.2.7 on 2025-10-07 18:06
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('support', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='KnowledgeBaseCategory',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100, unique=True)),
+ ('slug', models.SlugField(max_length=120, unique=True)),
+ ('description', models.TextField(blank=True)),
+ ('icon', models.CharField(default='fa-book', help_text='FontAwesome icon class', max_length=50)),
+ ('color', models.CharField(default='#667eea', help_text='Hex color code', max_length=7)),
+ ('is_active', models.BooleanField(default=True)),
+ ('display_order', models.PositiveIntegerField(default=0)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ],
+ options={
+ 'verbose_name_plural': 'Knowledge Base Categories',
+ 'ordering': ['display_order', 'name'],
+ },
+ ),
+ migrations.CreateModel(
+ name='KnowledgeBaseArticle',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=200)),
+ ('slug', models.SlugField(max_length=220, unique=True)),
+ ('content', models.TextField()),
+ ('summary', models.TextField(blank=True, help_text='Short summary of the article')),
+ ('meta_description', models.CharField(blank=True, max_length=160)),
+ ('keywords', models.CharField(blank=True, help_text='Comma-separated keywords', max_length=500)),
+ ('is_published', models.BooleanField(default=False)),
+ ('is_featured', models.BooleanField(default=False)),
+ ('view_count', models.PositiveIntegerField(default=0)),
+ ('helpful_count', models.PositiveIntegerField(default=0)),
+ ('not_helpful_count', models.PositiveIntegerField(default=0)),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ('published_at', models.DateTimeField(blank=True, null=True)),
+ ('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='kb_articles', to=settings.AUTH_USER_MODEL)),
+ ('category', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='articles', to='support.knowledgebasecategory')),
+ ],
+ options={
+ 'ordering': ['-created_at'],
+ 'indexes': [models.Index(fields=['slug'], name='support_kno_slug_0c7b3a_idx'), models.Index(fields=['category'], name='support_kno_categor_733ba1_idx'), models.Index(fields=['is_published'], name='support_kno_is_publ_402a55_idx'), models.Index(fields=['created_at'], name='support_kno_created_ef91a5_idx')],
+ },
+ ),
+ ]
diff --git a/gnx-react/backend/support/migrations/0003_registeredemail.py b/gnx-react/backend/support/migrations/0003_registeredemail.py
new file mode 100644
index 00000000..324ada9c
--- /dev/null
+++ b/gnx-react/backend/support/migrations/0003_registeredemail.py
@@ -0,0 +1,39 @@
+# Generated by Django 4.2.7 on 2025-10-07 18:58
+
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('support', '0002_knowledgebasecategory_knowledgebasearticle'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='RegisteredEmail',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('email', models.EmailField(max_length=254, unique=True, validators=[django.core.validators.EmailValidator()])),
+ ('company_name', models.CharField(blank=True, help_text='Company or organization name', max_length=200)),
+ ('contact_name', models.CharField(blank=True, help_text='Primary contact name', max_length=200)),
+ ('notes', models.TextField(blank=True, help_text='Internal notes about this registration')),
+ ('is_active', models.BooleanField(default=True, help_text='Whether this email can submit tickets')),
+ ('created_at', models.DateTimeField(auto_now_add=True)),
+ ('updated_at', models.DateTimeField(auto_now=True)),
+ ('last_ticket_date', models.DateTimeField(blank=True, help_text='Last time this email submitted a ticket', null=True)),
+ ('ticket_count', models.PositiveIntegerField(default=0, help_text='Total number of tickets submitted')),
+ ('added_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='registered_emails', to=settings.AUTH_USER_MODEL)),
+ ],
+ options={
+ 'verbose_name': 'Registered Email',
+ 'verbose_name_plural': 'Registered Emails',
+ 'ordering': ['-created_at'],
+ 'indexes': [models.Index(fields=['email'], name='support_reg_email_ee78ad_idx'), models.Index(fields=['is_active'], name='support_reg_is_acti_fadc86_idx')],
+ },
+ ),
+ ]
diff --git a/gnx-react/backend/support/migrations/__init__.py b/gnx-react/backend/support/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/backend/support/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/backend/support/migrations/__pycache__/0001_initial.cpython-312.pyc
new file mode 100644
index 00000000..f10daf76
Binary files /dev/null and b/gnx-react/backend/support/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/migrations/__pycache__/0002_knowledgebasecategory_knowledgebasearticle.cpython-312.pyc b/gnx-react/backend/support/migrations/__pycache__/0002_knowledgebasecategory_knowledgebasearticle.cpython-312.pyc
new file mode 100644
index 00000000..772e2c4d
Binary files /dev/null and b/gnx-react/backend/support/migrations/__pycache__/0002_knowledgebasecategory_knowledgebasearticle.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/migrations/__pycache__/0003_registeredemail.cpython-312.pyc b/gnx-react/backend/support/migrations/__pycache__/0003_registeredemail.cpython-312.pyc
new file mode 100644
index 00000000..230681a8
Binary files /dev/null and b/gnx-react/backend/support/migrations/__pycache__/0003_registeredemail.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/backend/support/migrations/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..817fc332
Binary files /dev/null and b/gnx-react/backend/support/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/backend/support/models.py b/gnx-react/backend/support/models.py
new file mode 100644
index 00000000..71bc6e5b
--- /dev/null
+++ b/gnx-react/backend/support/models.py
@@ -0,0 +1,320 @@
+from django.db import models
+from django.contrib.auth.models import User
+from django.utils import timezone
+from django.core.validators import EmailValidator
+import random
+import string
+
+class TicketStatus(models.Model):
+ name = models.CharField(max_length=50, unique=True)
+ color = models.CharField(max_length=7, default='#667eea', help_text='Hex color code')
+ description = models.TextField(blank=True)
+ is_closed = models.BooleanField(default=False, help_text='Whether this status represents a closed ticket')
+ is_active = models.BooleanField(default=True)
+ display_order = models.PositiveIntegerField(default=0)
+ created_at = models.DateTimeField(auto_now_add=True)
+
+ class Meta:
+ ordering = ['display_order', 'name']
+ verbose_name_plural = 'Ticket Statuses'
+
+ def __str__(self):
+ return self.name
+
+
+class TicketPriority(models.Model):
+ name = models.CharField(max_length=50, unique=True)
+ level = models.PositiveIntegerField(unique=True, help_text='Lower number = higher priority')
+ color = models.CharField(max_length=7, default='#667eea', help_text='Hex color code')
+ description = models.TextField(blank=True)
+ sla_hours = models.PositiveIntegerField(default=24, help_text='SLA response time in hours')
+ is_active = models.BooleanField(default=True)
+ created_at = models.DateTimeField(auto_now_add=True)
+
+ class Meta:
+ ordering = ['level']
+ verbose_name_plural = 'Ticket Priorities'
+
+ def __str__(self):
+ return self.name
+
+
+class TicketCategory(models.Model):
+ name = models.CharField(max_length=100, unique=True)
+ description = models.TextField(blank=True)
+ color = models.CharField(max_length=7, default='#667eea', help_text='Hex color code')
+ icon = models.CharField(max_length=50, default='fa-question-circle', help_text='FontAwesome icon class')
+ is_active = models.BooleanField(default=True)
+ display_order = models.PositiveIntegerField(default=0)
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+
+ class Meta:
+ ordering = ['display_order', 'name']
+ verbose_name_plural = 'Ticket Categories'
+
+ def __str__(self):
+ return self.name
+
+
+class SupportTicket(models.Model):
+ TICKET_TYPES = [
+ ('technical', 'Technical Issue'),
+ ('billing', 'Billing Question'),
+ ('feature_request', 'Feature Request'),
+ ('bug_report', 'Bug Report'),
+ ('general', 'General Inquiry'),
+ ('account', 'Account Issue'),
+ ]
+
+ ticket_number = models.CharField(max_length=20, unique=True, editable=False)
+ title = models.CharField(max_length=200)
+ description = models.TextField()
+ ticket_type = models.CharField(max_length=20, choices=TICKET_TYPES, default='general')
+
+ # User information
+ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='support_tickets', null=True, blank=True)
+ user_name = models.CharField(max_length=100)
+ user_email = models.EmailField()
+ user_phone = models.CharField(max_length=20, blank=True)
+ company = models.CharField(max_length=100, blank=True)
+
+ # Ticket management
+ category = models.ForeignKey(TicketCategory, on_delete=models.SET_NULL, null=True, blank=True)
+ priority = models.ForeignKey(TicketPriority, on_delete=models.SET_NULL, null=True, blank=True)
+ status = models.ForeignKey(TicketStatus, on_delete=models.SET_NULL, null=True, blank=True)
+ assigned_to = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='assigned_tickets')
+ assigned_at = models.DateTimeField(null=True, blank=True)
+
+ # Timestamps
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+ closed_at = models.DateTimeField(null=True, blank=True)
+ last_activity = models.DateTimeField(auto_now=True)
+ first_response_at = models.DateTimeField(null=True, blank=True)
+ sla_deadline = models.DateTimeField(null=True, blank=True)
+
+ # Additional fields
+ tags = models.CharField(max_length=500, blank=True, help_text='Comma-separated tags')
+ internal_notes = models.TextField(blank=True, help_text='Internal notes visible only to staff')
+ is_escalated = models.BooleanField(default=False)
+ escalation_reason = models.TextField(blank=True)
+ attachments = models.JSONField(default=list, blank=True, help_text='List of file paths')
+
+ class Meta:
+ ordering = ['-created_at']
+ indexes = [
+ models.Index(fields=['ticket_number']),
+ models.Index(fields=['user_email']),
+ models.Index(fields=['status']),
+ models.Index(fields=['priority']),
+ models.Index(fields=['assigned_to']),
+ models.Index(fields=['created_at']),
+ ]
+
+ def __str__(self):
+ return f"{self.ticket_number} - {self.title}"
+
+ def save(self, *args, **kwargs):
+ if not self.ticket_number:
+ self.ticket_number = self.generate_ticket_number()
+
+ # Set SLA deadline based on priority
+ if not self.sla_deadline and self.priority:
+ self.sla_deadline = timezone.now() + timezone.timedelta(hours=self.priority.sla_hours)
+
+ super().save(*args, **kwargs)
+
+ @staticmethod
+ def generate_ticket_number():
+ """Generate a unique ticket number in format: TKT-YYYYMMDD-XXXXX"""
+ today = timezone.now().strftime('%Y%m%d')
+ random_str = ''.join(random.choices(string.ascii_uppercase + string.digits, k=5))
+ ticket_number = f'TKT-{today}-{random_str}'
+
+ # Ensure uniqueness
+ while SupportTicket.objects.filter(ticket_number=ticket_number).exists():
+ random_str = ''.join(random.choices(string.ascii_uppercase + string.digits, k=5))
+ ticket_number = f'TKT-{today}-{random_str}'
+
+ return ticket_number
+
+
+class TicketMessage(models.Model):
+ MESSAGE_TYPES = [
+ ('user_message', 'User Message'),
+ ('agent_response', 'Agent Response'),
+ ('system_note', 'System Note'),
+ ('status_change', 'Status Change'),
+ ('assignment_change', 'Assignment Change'),
+ ('escalation', 'Escalation'),
+ ]
+
+ ticket = models.ForeignKey(SupportTicket, on_delete=models.CASCADE, related_name='messages')
+ message_type = models.CharField(max_length=20, choices=MESSAGE_TYPES, default='user_message')
+ content = models.TextField()
+
+ # Author information
+ author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='ticket_messages')
+ author_name = models.CharField(max_length=100, blank=True)
+ author_email = models.EmailField(blank=True)
+
+ # Message metadata
+ is_internal = models.BooleanField(default=False, help_text='Internal message not visible to user')
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+ attachments = models.JSONField(default=list, blank=True, help_text='List of file paths')
+
+ # Read status
+ is_read = models.BooleanField(default=False)
+ read_at = models.DateTimeField(null=True, blank=True)
+ read_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='read_messages')
+
+ class Meta:
+ ordering = ['created_at']
+ indexes = [
+ models.Index(fields=['ticket', 'created_at']),
+ models.Index(fields=['author']),
+ models.Index(fields=['message_type']),
+ ]
+
+ def __str__(self):
+ return f"Message on {self.ticket.ticket_number} at {self.created_at}"
+
+
+class TicketActivity(models.Model):
+ ACTIVITY_TYPES = [
+ ('created', 'Ticket Created'),
+ ('updated', 'Ticket Updated'),
+ ('status_changed', 'Status Changed'),
+ ('assigned', 'Ticket Assigned'),
+ ('message_added', 'Message Added'),
+ ('escalated', 'Ticket Escalated'),
+ ('closed', 'Ticket Closed'),
+ ('reopened', 'Ticket Reopened'),
+ ]
+
+ ticket = models.ForeignKey(SupportTicket, on_delete=models.CASCADE, related_name='activities')
+ activity_type = models.CharField(max_length=20, choices=ACTIVITY_TYPES)
+ description = models.TextField()
+ user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='ticket_activities')
+ user_name = models.CharField(max_length=100, blank=True)
+ old_value = models.TextField(blank=True)
+ new_value = models.TextField(blank=True)
+ created_at = models.DateTimeField(auto_now_add=True)
+
+ class Meta:
+ ordering = ['-created_at']
+ indexes = [
+ models.Index(fields=['ticket', 'created_at']),
+ models.Index(fields=['activity_type']),
+ ]
+
+ def __str__(self):
+ return f"{self.activity_type} - {self.ticket.ticket_number}"
+
+
+class KnowledgeBaseCategory(models.Model):
+ name = models.CharField(max_length=100, unique=True)
+ slug = models.SlugField(max_length=120, unique=True)
+ description = models.TextField(blank=True)
+ icon = models.CharField(max_length=50, default='fa-book', help_text='FontAwesome icon class')
+ color = models.CharField(max_length=7, default='#667eea', help_text='Hex color code')
+ is_active = models.BooleanField(default=True)
+ display_order = models.PositiveIntegerField(default=0)
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+
+ class Meta:
+ ordering = ['display_order', 'name']
+ verbose_name_plural = 'Knowledge Base Categories'
+
+ def __str__(self):
+ return self.name
+
+
+class KnowledgeBaseArticle(models.Model):
+ title = models.CharField(max_length=200)
+ slug = models.SlugField(max_length=220, unique=True)
+ category = models.ForeignKey(KnowledgeBaseCategory, on_delete=models.SET_NULL, null=True, related_name='articles')
+ content = models.TextField()
+ summary = models.TextField(blank=True, help_text='Short summary of the article')
+
+ # SEO and metadata
+ meta_description = models.CharField(max_length=160, blank=True)
+ keywords = models.CharField(max_length=500, blank=True, help_text='Comma-separated keywords')
+
+ # Article management
+ author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='kb_articles')
+ is_published = models.BooleanField(default=False)
+ is_featured = models.BooleanField(default=False)
+ view_count = models.PositiveIntegerField(default=0)
+ helpful_count = models.PositiveIntegerField(default=0)
+ not_helpful_count = models.PositiveIntegerField(default=0)
+
+ # Timestamps
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+ published_at = models.DateTimeField(null=True, blank=True)
+
+ class Meta:
+ ordering = ['-created_at']
+ indexes = [
+ models.Index(fields=['slug']),
+ models.Index(fields=['category']),
+ models.Index(fields=['is_published']),
+ models.Index(fields=['created_at']),
+ ]
+
+ def __str__(self):
+ return self.title
+
+
+class SupportSettings(models.Model):
+ setting_name = models.CharField(max_length=100, unique=True)
+ setting_value = models.TextField()
+ description = models.TextField(blank=True)
+ is_active = models.BooleanField(default=True)
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+
+ class Meta:
+ verbose_name_plural = 'Support Settings'
+
+ def __str__(self):
+ return self.setting_name
+
+
+class RegisteredEmail(models.Model):
+ """
+ Email addresses that are authorized to submit support tickets
+ Only admins can add/remove emails from this list
+ """
+ email = models.EmailField(unique=True, validators=[EmailValidator()])
+ company_name = models.CharField(max_length=200, blank=True, help_text='Company or organization name')
+ contact_name = models.CharField(max_length=200, blank=True, help_text='Primary contact name')
+ notes = models.TextField(blank=True, help_text='Internal notes about this registration')
+ is_active = models.BooleanField(default=True, help_text='Whether this email can submit tickets')
+ added_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='registered_emails')
+ created_at = models.DateTimeField(auto_now_add=True)
+ updated_at = models.DateTimeField(auto_now=True)
+ last_ticket_date = models.DateTimeField(null=True, blank=True, help_text='Last time this email submitted a ticket')
+ ticket_count = models.PositiveIntegerField(default=0, help_text='Total number of tickets submitted')
+
+ class Meta:
+ ordering = ['-created_at']
+ verbose_name = 'Registered Email'
+ verbose_name_plural = 'Registered Emails'
+ indexes = [
+ models.Index(fields=['email']),
+ models.Index(fields=['is_active']),
+ ]
+
+ def __str__(self):
+ return f"{self.email} ({self.company_name or 'No company'})"
+
+ def increment_ticket_count(self):
+ """Increment ticket count and update last ticket date"""
+ self.ticket_count += 1
+ self.last_ticket_date = timezone.now()
+ self.save(update_fields=['ticket_count', 'last_ticket_date'])
diff --git a/gnx-react/backend/support/serializers.py b/gnx-react/backend/support/serializers.py
new file mode 100644
index 00000000..39f7d091
--- /dev/null
+++ b/gnx-react/backend/support/serializers.py
@@ -0,0 +1,204 @@
+from rest_framework import serializers
+from .models import (
+ SupportTicket, TicketStatus, TicketPriority, TicketCategory,
+ TicketMessage, TicketActivity, KnowledgeBaseCategory,
+ KnowledgeBaseArticle, SupportSettings
+)
+from .email_service import SupportEmailService
+import logging
+
+logger = logging.getLogger(__name__)
+
+
+class TicketStatusSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TicketStatus
+ fields = ['id', 'name', 'color', 'description', 'is_closed', 'display_order']
+
+
+class TicketPrioritySerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TicketPriority
+ fields = ['id', 'name', 'level', 'color', 'description', 'sla_hours']
+
+
+class TicketCategorySerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TicketCategory
+ fields = ['id', 'name', 'description', 'color', 'icon', 'display_order']
+
+
+class TicketMessageSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TicketMessage
+ fields = [
+ 'id', 'ticket', 'message_type', 'content', 'author_name',
+ 'author_email', 'is_internal', 'created_at', 'updated_at',
+ 'attachments', 'is_read'
+ ]
+ read_only_fields = ['created_at', 'updated_at']
+
+
+class TicketActivitySerializer(serializers.ModelSerializer):
+ class Meta:
+ model = TicketActivity
+ fields = [
+ 'id', 'activity_type', 'description', 'user_name',
+ 'old_value', 'new_value', 'created_at'
+ ]
+ read_only_fields = ['created_at']
+
+
+class SupportTicketSerializer(serializers.ModelSerializer):
+ status_name = serializers.CharField(source='status.name', read_only=True)
+ status_color = serializers.CharField(source='status.color', read_only=True)
+ priority_name = serializers.CharField(source='priority.name', read_only=True)
+ priority_color = serializers.CharField(source='priority.color', read_only=True)
+ category_name = serializers.CharField(source='category.name', read_only=True)
+ messages = TicketMessageSerializer(many=True, read_only=True)
+ activities = TicketActivitySerializer(many=True, read_only=True)
+
+ class Meta:
+ model = SupportTicket
+ fields = [
+ 'id', 'ticket_number', 'title', 'description', 'ticket_type',
+ 'user_name', 'user_email', 'user_phone', 'company',
+ 'category', 'category_name', 'priority', 'priority_name', 'priority_color',
+ 'status', 'status_name', 'status_color', 'assigned_to', 'assigned_at',
+ 'created_at', 'updated_at', 'closed_at', 'last_activity',
+ 'first_response_at', 'sla_deadline', 'tags', 'is_escalated',
+ 'escalation_reason', 'attachments', 'messages', 'activities'
+ ]
+ read_only_fields = [
+ 'ticket_number', 'created_at', 'updated_at', 'last_activity',
+ 'assigned_at', 'closed_at', 'first_response_at', 'sla_deadline'
+ ]
+
+
+class SupportTicketCreateSerializer(serializers.ModelSerializer):
+ """Simplified serializer for creating tickets from public form"""
+ ticket_number = serializers.CharField(read_only=True)
+
+ class Meta:
+ model = SupportTicket
+ fields = [
+ 'ticket_number', 'title', 'description', 'ticket_type', 'user_name',
+ 'user_email', 'user_phone', 'company', 'category'
+ ]
+ read_only_fields = ['ticket_number']
+
+ def validate_user_email(self, value):
+ """
+ Validate that the email is registered and active in the RegisteredEmail model
+ """
+ from .models import RegisteredEmail
+
+ # Check if email exists and is active in RegisteredEmail model
+ try:
+ registered_email = RegisteredEmail.objects.get(email=value)
+ if not registered_email.is_active:
+ raise serializers.ValidationError(
+ "This email has been deactivated. "
+ "Please contact us at support@gnxsoft.com for assistance."
+ )
+ except RegisteredEmail.DoesNotExist:
+ raise serializers.ValidationError(
+ "This email is not registered in our system. "
+ "Please contact us at support@gnxsoft.com to register your email first."
+ )
+
+ return value
+
+ def create(self, validated_data):
+ from .models import RegisteredEmail
+
+ # Set default status and priority if not set
+ if not validated_data.get('status'):
+ default_status = TicketStatus.objects.filter(name='Open').first()
+ if default_status:
+ validated_data['status'] = default_status
+
+ if not validated_data.get('priority'):
+ default_priority = TicketPriority.objects.filter(name='Medium').first()
+ if default_priority:
+ validated_data['priority'] = default_priority
+
+ ticket = SupportTicket.objects.create(**validated_data)
+
+ # Create initial activity
+ TicketActivity.objects.create(
+ ticket=ticket,
+ activity_type='created',
+ description=f'Ticket created by {ticket.user_name}',
+ user_name=ticket.user_name
+ )
+
+ # Update registered email statistics
+ try:
+ registered_email = RegisteredEmail.objects.get(email=validated_data['user_email'])
+ registered_email.increment_ticket_count()
+ except RegisteredEmail.DoesNotExist:
+ logger.warning(f'RegisteredEmail not found for {validated_data["user_email"]} after validation')
+
+ # Send email notifications
+ try:
+ email_results = SupportEmailService.send_ticket_created_emails(ticket)
+ logger.info(f'Email notifications sent for ticket {ticket.ticket_number}: {email_results}')
+ except Exception as e:
+ logger.error(f'Failed to send email notifications for ticket {ticket.ticket_number}: {str(e)}')
+ # Don't fail ticket creation if emails fail
+
+ return ticket
+
+
+class TicketStatusCheckSerializer(serializers.Serializer):
+ """Serializer for checking ticket status by ticket number"""
+ ticket_number = serializers.CharField(max_length=20)
+
+
+class KnowledgeBaseCategorySerializer(serializers.ModelSerializer):
+ article_count = serializers.SerializerMethodField()
+
+ class Meta:
+ model = KnowledgeBaseCategory
+ fields = [
+ 'id', 'name', 'slug', 'description', 'icon', 'color',
+ 'display_order', 'article_count'
+ ]
+
+ def get_article_count(self, obj):
+ return obj.articles.filter(is_published=True).count()
+
+
+class KnowledgeBaseArticleListSerializer(serializers.ModelSerializer):
+ category_name = serializers.CharField(source='category.name', read_only=True)
+ category_slug = serializers.CharField(source='category.slug', read_only=True)
+
+ class Meta:
+ model = KnowledgeBaseArticle
+ fields = [
+ 'id', 'title', 'slug', 'category', 'category_name', 'category_slug',
+ 'summary', 'is_featured', 'view_count', 'helpful_count',
+ 'not_helpful_count', 'created_at', 'updated_at', 'published_at'
+ ]
+
+
+class KnowledgeBaseArticleDetailSerializer(serializers.ModelSerializer):
+ category_name = serializers.CharField(source='category.name', read_only=True)
+ category_slug = serializers.CharField(source='category.slug', read_only=True)
+
+ class Meta:
+ model = KnowledgeBaseArticle
+ fields = [
+ 'id', 'title', 'slug', 'category', 'category_name', 'category_slug',
+ 'content', 'summary', 'meta_description', 'keywords',
+ 'is_featured', 'view_count', 'helpful_count', 'not_helpful_count',
+ 'created_at', 'updated_at', 'published_at'
+ ]
+
+
+class SupportSettingsSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = SupportSettings
+ fields = ['id', 'setting_name', 'setting_value', 'description', 'is_active']
+
diff --git a/gnx-react/backend/support/signals.py b/gnx-react/backend/support/signals.py
new file mode 100644
index 00000000..3682e62a
--- /dev/null
+++ b/gnx-react/backend/support/signals.py
@@ -0,0 +1,235 @@
+"""
+Django signals for Support app
+Handles automatic notifications when tickets are updated
+"""
+
+from django.db.models.signals import post_save, pre_save
+from django.dispatch import receiver
+from django.core.mail import EmailMultiAlternatives
+from django.template.loader import render_to_string
+from django.conf import settings
+import logging
+
+from .models import SupportTicket, TicketMessage, TicketActivity
+
+logger = logging.getLogger(__name__)
+
+
+class TicketUpdateNotifier:
+ """Service for sending ticket update notifications"""
+
+ @staticmethod
+ def send_status_change_notification(ticket, old_status, new_status):
+ """Send email when ticket status changes"""
+ try:
+ subject = f'Ticket Status Updated: {ticket.ticket_number}'
+
+ context = {
+ 'ticket': ticket,
+ 'ticket_number': ticket.ticket_number,
+ 'user_name': ticket.user_name,
+ 'title': ticket.title,
+ 'old_status': old_status,
+ 'new_status': new_status,
+ 'status_color': ticket.status.color if ticket.status else '#3b82f6',
+ 'updated_at': ticket.updated_at.strftime('%B %d, %Y at %I:%M %p'),
+ 'support_url': f'{settings.SITE_URL}/support-center',
+ }
+
+ # Render HTML email
+ html_message = render_to_string(
+ 'support/ticket_status_update.html',
+ context
+ )
+
+ # Create plain text version
+ text_message = render_to_string(
+ 'support/ticket_status_update.txt',
+ context
+ )
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_message,
+ from_email=settings.DEFAULT_FROM_EMAIL,
+ to=[ticket.user_email],
+ )
+
+ email.attach_alternative(html_message, "text/html")
+ email.send(fail_silently=False)
+
+ logger.info(f'Status change notification sent for ticket {ticket.ticket_number}')
+ return True
+
+ except Exception as e:
+ logger.error(f'Failed to send status change notification: {str(e)}')
+ return False
+
+ @staticmethod
+ def send_message_notification(ticket, message):
+ """Send email when a new message is added to the ticket"""
+ try:
+ # Only send if it's an agent response (not user message)
+ if message.message_type != 'agent_response':
+ return False
+
+ subject = f'New Response on Ticket: {ticket.ticket_number}'
+
+ context = {
+ 'ticket': ticket,
+ 'ticket_number': ticket.ticket_number,
+ 'user_name': ticket.user_name,
+ 'title': ticket.title,
+ 'message': message.content,
+ 'message_author': message.author_name or 'Support Team',
+ 'created_at': message.created_at.strftime('%B %d, %Y at %I:%M %p'),
+ 'support_url': f'{settings.SITE_URL}/support-center',
+ }
+
+ # Render HTML email
+ html_message = render_to_string(
+ 'support/ticket_message_notification.html',
+ context
+ )
+
+ # Create plain text version
+ text_message = render_to_string(
+ 'support/ticket_message_notification.txt',
+ context
+ )
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_message,
+ from_email=settings.DEFAULT_FROM_EMAIL,
+ to=[ticket.user_email],
+ )
+
+ email.attach_alternative(html_message, "text/html")
+ email.send(fail_silently=False)
+
+ logger.info(f'Message notification sent for ticket {ticket.ticket_number}')
+ return True
+
+ except Exception as e:
+ logger.error(f'Failed to send message notification: {str(e)}')
+ return False
+
+ @staticmethod
+ def send_assignment_notification(ticket, assigned_to):
+ """Send email when ticket is assigned"""
+ try:
+ subject = f'Ticket Assigned: {ticket.ticket_number}'
+
+ context = {
+ 'ticket': ticket,
+ 'ticket_number': ticket.ticket_number,
+ 'user_name': ticket.user_name,
+ 'title': ticket.title,
+ 'assigned_to': assigned_to.get_full_name() or assigned_to.username,
+ 'updated_at': ticket.updated_at.strftime('%B %d, %Y at %I:%M %p'),
+ 'support_url': f'{settings.SITE_URL}/support-center',
+ }
+
+ # Render HTML email
+ html_message = render_to_string(
+ 'support/ticket_assigned_notification.html',
+ context
+ )
+
+ # Create plain text version
+ text_message = render_to_string(
+ 'support/ticket_assigned_notification.txt',
+ context
+ )
+
+ # Create email
+ email = EmailMultiAlternatives(
+ subject=subject,
+ body=text_message,
+ from_email=settings.DEFAULT_FROM_EMAIL,
+ to=[ticket.user_email],
+ )
+
+ email.attach_alternative(html_message, "text/html")
+ email.send(fail_silently=False)
+
+ logger.info(f'Assignment notification sent for ticket {ticket.ticket_number}')
+ return True
+
+ except Exception as e:
+ logger.error(f'Failed to send assignment notification: {str(e)}')
+ return False
+
+
+# Store original values before save
+@receiver(pre_save, sender=SupportTicket)
+def store_ticket_original_values(sender, instance, **kwargs):
+ """Store original values before ticket is updated"""
+ if instance.pk:
+ try:
+ original = SupportTicket.objects.get(pk=instance.pk)
+ instance._original_status = original.status
+ instance._original_assigned_to = original.assigned_to
+ except SupportTicket.DoesNotExist:
+ pass
+
+
+# Send notifications after ticket is saved
+@receiver(post_save, sender=SupportTicket)
+def send_ticket_update_notifications(sender, instance, created, **kwargs):
+ """Send notifications when ticket is updated"""
+ if created:
+ # Ticket creation is handled in serializer
+ return
+
+ # Check for status change
+ if hasattr(instance, '_original_status') and instance._original_status != instance.status:
+ old_status = instance._original_status.name if instance._original_status else 'Unknown'
+ new_status = instance.status.name if instance.status else 'Unknown'
+
+ TicketUpdateNotifier.send_status_change_notification(
+ instance,
+ old_status,
+ new_status
+ )
+
+ # Create activity log
+ TicketActivity.objects.create(
+ ticket=instance,
+ activity_type='status_changed',
+ description=f'Status changed from {old_status} to {new_status}',
+ old_value=old_status,
+ new_value=new_status
+ )
+
+ # Check for assignment change
+ if hasattr(instance, '_original_assigned_to') and instance._original_assigned_to != instance.assigned_to:
+ if instance.assigned_to:
+ TicketUpdateNotifier.send_assignment_notification(
+ instance,
+ instance.assigned_to
+ )
+
+ # Create activity log
+ TicketActivity.objects.create(
+ ticket=instance,
+ activity_type='assigned',
+ description=f'Ticket assigned to {instance.assigned_to.get_full_name() or instance.assigned_to.username}',
+ new_value=str(instance.assigned_to)
+ )
+
+
+# Send notification when message is added
+@receiver(post_save, sender=TicketMessage)
+def send_message_notification(sender, instance, created, **kwargs):
+ """Send notification when a new message is added"""
+ if created and not instance.is_internal:
+ # Only send if it's a new message that's not internal
+ TicketUpdateNotifier.send_message_notification(
+ instance.ticket,
+ instance
+ )
+
diff --git a/gnx-react/backend/support/templates/support/ticket_assigned_notification.html b/gnx-react/backend/support/templates/support/ticket_assigned_notification.html
new file mode 100644
index 00000000..59febd77
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_assigned_notification.html
@@ -0,0 +1,115 @@
+
+
+
+
+
+
Ticket Assigned
+
+
+
+
+
+
+
+
Dear {{ user_name }},
+
+
Your support ticket has been assigned to a team member who will be assisting you.
+
+
+ Ticket: {{ ticket_number }}
+ Subject: {{ title }}
+
+
+
+
Assigned To
+
{{ assigned_to }}
+
{{ updated_at }}
+
+
+
+
+
+ Your assigned support agent will review your ticket and respond as soon as possible.
+
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/support/templates/support/ticket_assigned_notification.txt b/gnx-react/backend/support/templates/support/ticket_assigned_notification.txt
new file mode 100644
index 00000000..29d977ca
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_assigned_notification.txt
@@ -0,0 +1,31 @@
+TICKET ASSIGNED
+============================================================
+
+Dear {{ user_name }},
+
+Your support ticket has been assigned to a team member who will be assisting you.
+
+Ticket: {{ ticket_number }}
+Subject: {{ title }}
+
+------------------------------------------------------------
+ASSIGNED TO
+------------------------------------------------------------
+
+{{ assigned_to }}
+
+{{ updated_at }}
+
+------------------------------------------------------------
+
+Your assigned support agent will review your ticket and respond as soon as possible.
+
+View ticket details:
+{{ support_url }}
+
+============================================================
+GNX Software Solutions - Enterprise Support Center
+
+This is an automated notification.
+For assistance, visit our Support Center at {{ support_url }}
+
diff --git a/gnx-react/backend/support/templates/support/ticket_confirmation_user.html b/gnx-react/backend/support/templates/support/ticket_confirmation_user.html
new file mode 100644
index 00000000..e72e5274
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_confirmation_user.html
@@ -0,0 +1,186 @@
+
+
+
+
+
+
Support Ticket Confirmation
+
+
+
+
+
+
+
+
+
+
Dear {{ user_name }},
+
+
Thank you for contacting our support team. We've received your support request and our team will respond as soon as possible.
+
+
+
+
Your Ticket Number
+
{{ ticket_number }}
+
Please save this number for future reference
+
+
+
+
+
Ticket Details
+
+
+ Subject:
+ {{ title }}
+
+
+
+ Type:
+ {{ ticket_type }}
+
+
+
+ Category:
+ {{ category }}
+
+
+
+ Priority:
+ {{ priority }}
+
+
+
+ Status:
+ {{ status }}
+
+
+
+ Created:
+ {{ created_at }}
+
+
+
+
+
+
Description
+
{{ description }}
+
+
+
+
+
+
+ What happens next?
+ Our support team will review your ticket and respond within our standard SLA timeframe. You'll receive an email notification when there's an update.
+
+
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/support/templates/support/ticket_confirmation_user.txt b/gnx-react/backend/support/templates/support/ticket_confirmation_user.txt
new file mode 100644
index 00000000..39d928d6
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_confirmation_user.txt
@@ -0,0 +1,41 @@
+SUPPORT TICKET CREATED
+============================================================
+
+Dear {{ user_name }},
+
+Thank you for contacting our support team. We've received your support request and our team will respond as soon as possible.
+
+YOUR TICKET NUMBER: {{ ticket_number }}
+Please save this number for future reference.
+
+------------------------------------------------------------
+TICKET DETAILS
+------------------------------------------------------------
+
+Subject: {{ title }}
+Type: {{ ticket_type }}
+Category: {{ category }}
+Priority: {{ priority }}
+Status: {{ status }}
+Created: {{ created_at }}
+
+------------------------------------------------------------
+DESCRIPTION
+------------------------------------------------------------
+
+{{ description }}
+
+------------------------------------------------------------
+
+WHAT HAPPENS NEXT?
+Our support team will review your ticket and respond within our standard SLA timeframe. You'll receive an email notification when there's an update.
+
+To check your ticket status, visit:
+{{ support_url }}
+
+============================================================
+GNX Software Solutions - Enterprise Support Center
+
+This is an automated message. Please do not reply directly to this email.
+For assistance, please visit our Support Center at {{ support_url }}
+
diff --git a/gnx-react/backend/support/templates/support/ticket_message_notification.html b/gnx-react/backend/support/templates/support/ticket_message_notification.html
new file mode 100644
index 00000000..7bf3748f
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_message_notification.html
@@ -0,0 +1,124 @@
+
+
+
+
+
+
New Response on Your Ticket
+
+
+
+
+
+
+
+
Dear {{ user_name }},
+
+
Our support team has responded to your ticket.
+
+
+ Ticket: {{ ticket_number }}
+ Subject: {{ title }}
+
+
+
+
{{ message_author }} replied:
+
{{ message }}
+
{{ created_at }}
+
+
+
+
+
+ You can view the complete ticket history and reply to this message in the Support Center.
+
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/support/templates/support/ticket_message_notification.txt b/gnx-react/backend/support/templates/support/ticket_message_notification.txt
new file mode 100644
index 00000000..6ce4d0e2
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_message_notification.txt
@@ -0,0 +1,29 @@
+NEW RESPONSE ON YOUR TICKET
+============================================================
+
+Dear {{ user_name }},
+
+Our support team has responded to your ticket.
+
+Ticket: {{ ticket_number }}
+Subject: {{ title }}
+
+------------------------------------------------------------
+{{ message_author }} replied:
+------------------------------------------------------------
+
+{{ message }}
+
+{{ created_at }}
+
+------------------------------------------------------------
+
+View the full conversation and reply:
+{{ support_url }}
+
+============================================================
+GNX Software Solutions - Enterprise Support Center
+
+This is an automated notification.
+For assistance, visit our Support Center at {{ support_url }}
+
diff --git a/gnx-react/backend/support/templates/support/ticket_notification_company.html b/gnx-react/backend/support/templates/support/ticket_notification_company.html
new file mode 100644
index 00000000..7fd0061d
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_notification_company.html
@@ -0,0 +1,238 @@
+
+
+
+
+
+
New Support Ticket
+
+
+
+
+
+
+
+
+
+
A new support ticket has been submitted and requires your attention.
+
+
+
+
Ticket Number
+
{{ ticket_number }}
+
+ Created: {{ created_at }}
+
+
+
+
+
+
Customer Information
+
+
Name:
+
{{ user_name }}
+
+
Email:
+
+
+ {% if user_phone %}
+
Phone:
+
+ {% endif %}
+
+ {% if company %}
+
Company:
+
{{ company }}
+ {% endif %}
+
+
+
+
+
+
Ticket Details
+
+
+
Subject:
+
{{ title }}
+
+
+
+
Type:
+
{{ ticket_type }}
+
+
Category:
+
{{ category }}
+
+
Priority:
+
+ {% if priority == 'Critical' %}
+ {{ priority }}
+ {% elif priority == 'High' %}
+ {{ priority }}
+ {% elif priority == 'Low' %}
+ {{ priority }}
+ {% else %}
+ {{ priority }}
+ {% endif %}
+
+
+
Status:
+
{{ status }}
+
+
+
+
+
+
Description
+
{{ description }}
+
+
+
+
+
+
+ ⚠️ Action Required
+ Please review and respond to this ticket according to the SLA requirements for {{ priority }} priority tickets.
+
+
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/support/templates/support/ticket_notification_company.txt b/gnx-react/backend/support/templates/support/ticket_notification_company.txt
new file mode 100644
index 00000000..00611970
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_notification_company.txt
@@ -0,0 +1,50 @@
+NEW SUPPORT TICKET - REQUIRES ATTENTION
+======================================================================
+
+A new support ticket has been submitted and requires your attention.
+
+TICKET NUMBER: {{ ticket_number }}
+Created: {{ created_at }}
+
+----------------------------------------------------------------------
+CUSTOMER INFORMATION
+----------------------------------------------------------------------
+
+Name: {{ user_name }}
+Email: {{ user_email }}
+{% if user_phone %}Phone: {{ user_phone }}{% endif %}
+{% if company %}Company: {{ company }}{% endif %}
+
+----------------------------------------------------------------------
+TICKET DETAILS
+----------------------------------------------------------------------
+
+Subject: {{ title }}
+Type: {{ ticket_type }}
+Category: {{ category }}
+Priority: {{ priority }}
+Status: {{ status }}
+
+----------------------------------------------------------------------
+DESCRIPTION
+----------------------------------------------------------------------
+
+{{ description }}
+
+----------------------------------------------------------------------
+ACTION REQUIRED
+----------------------------------------------------------------------
+
+Please review and respond to this ticket according to the SLA requirements for {{ priority }} priority tickets.
+
+View ticket in admin panel:
+{{ admin_url }}
+
+Reply to customer:
+mailto:{{ user_email }}
+
+======================================================================
+GNX Software Solutions - Internal Support Notification
+
+This is an automated notification for new support tickets.
+
diff --git a/gnx-react/backend/support/templates/support/ticket_status_update.html b/gnx-react/backend/support/templates/support/ticket_status_update.html
new file mode 100644
index 00000000..7df1d904
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_status_update.html
@@ -0,0 +1,132 @@
+
+
+
+
+
+
Ticket Status Updated
+
+
+
+
+
+
+
+
Dear {{ user_name }},
+
+
Your support ticket status has been updated.
+
+
+ Ticket: {{ ticket_number }}
+ Subject: {{ title }}
+
+
+
+
Status Change
+
+ {{ old_status }}
+ →
+ {{ new_status }}
+
+
Updated: {{ updated_at }}
+
+
+
+
+
+ You can check the full details of your ticket and any new messages in the Support Center.
+
+
+
+
+
+
+
+
diff --git a/gnx-react/backend/support/templates/support/ticket_status_update.txt b/gnx-react/backend/support/templates/support/ticket_status_update.txt
new file mode 100644
index 00000000..5ea09061
--- /dev/null
+++ b/gnx-react/backend/support/templates/support/ticket_status_update.txt
@@ -0,0 +1,29 @@
+TICKET STATUS UPDATED
+============================================================
+
+Dear {{ user_name }},
+
+Your support ticket status has been updated.
+
+Ticket: {{ ticket_number }}
+Subject: {{ title }}
+
+------------------------------------------------------------
+STATUS CHANGE
+------------------------------------------------------------
+
+{{ old_status }} → {{ new_status }}
+
+Updated: {{ updated_at }}
+
+------------------------------------------------------------
+
+You can check the full details of your ticket and any new messages in the Support Center:
+{{ support_url }}
+
+============================================================
+GNX Software Solutions - Enterprise Support Center
+
+This is an automated notification.
+For assistance, visit our Support Center at {{ support_url }}
+
diff --git a/gnx-react/backend/support/tests.py b/gnx-react/backend/support/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/gnx-react/backend/support/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/gnx-react/backend/support/urls.py b/gnx-react/backend/support/urls.py
new file mode 100644
index 00000000..982f85d5
--- /dev/null
+++ b/gnx-react/backend/support/urls.py
@@ -0,0 +1,17 @@
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+from . import views
+
+router = DefaultRouter()
+router.register(r'tickets', views.SupportTicketViewSet, basename='ticket')
+router.register(r'categories', views.TicketCategoryViewSet, basename='category')
+router.register(r'statuses', views.TicketStatusViewSet, basename='status')
+router.register(r'priorities', views.TicketPriorityViewSet, basename='priority')
+router.register(r'knowledge-base-categories', views.KnowledgeBaseCategoryViewSet, basename='kb-category')
+router.register(r'knowledge-base', views.KnowledgeBaseArticleViewSet, basename='kb-article')
+router.register(r'settings', views.SupportSettingsViewSet, basename='settings')
+
+urlpatterns = [
+ path('', include(router.urls)),
+]
+
diff --git a/gnx-react/backend/support/views.py b/gnx-react/backend/support/views.py
new file mode 100644
index 00000000..eab77056
--- /dev/null
+++ b/gnx-react/backend/support/views.py
@@ -0,0 +1,216 @@
+from rest_framework import viewsets, status, filters
+from rest_framework.decorators import action
+from rest_framework.response import Response
+from rest_framework.permissions import AllowAny
+from django.shortcuts import get_object_or_404
+from django.db.models import Q
+from django.utils import timezone
+
+from .models import (
+ SupportTicket, TicketStatus, TicketPriority, TicketCategory,
+ TicketMessage, KnowledgeBaseCategory, KnowledgeBaseArticle, SupportSettings
+)
+from .serializers import (
+ SupportTicketSerializer, SupportTicketCreateSerializer,
+ TicketStatusSerializer, TicketPrioritySerializer, TicketCategorySerializer,
+ TicketMessageSerializer, TicketStatusCheckSerializer,
+ KnowledgeBaseCategorySerializer, KnowledgeBaseArticleListSerializer,
+ KnowledgeBaseArticleDetailSerializer, SupportSettingsSerializer
+)
+
+
+class SupportTicketViewSet(viewsets.ModelViewSet):
+ """
+ ViewSet for managing support tickets.
+ Public endpoint for creating tickets and checking status.
+ """
+ queryset = SupportTicket.objects.all()
+ permission_classes = [AllowAny]
+ filter_backends = [filters.SearchFilter, filters.OrderingFilter]
+ search_fields = ['ticket_number', 'title', 'user_email', 'user_name']
+ ordering_fields = ['created_at', 'updated_at', 'priority']
+ ordering = ['-created_at']
+
+ def get_serializer_class(self):
+ if self.action == 'create':
+ return SupportTicketCreateSerializer
+ return SupportTicketSerializer
+
+ @action(detail=False, methods=['post'], url_path='check-status')
+ def check_status(self, request):
+ """
+ Check the status of a ticket by ticket number.
+ POST /api/support/tickets/check-status/
+ Body: {"ticket_number": "TKT-20231015-XXXXX"}
+ """
+ serializer = TicketStatusCheckSerializer(data=request.data)
+ serializer.is_valid(raise_exception=True)
+
+ ticket_number = serializer.validated_data['ticket_number']
+
+ try:
+ ticket = SupportTicket.objects.get(ticket_number=ticket_number)
+ ticket_serializer = SupportTicketSerializer(ticket)
+ return Response(ticket_serializer.data)
+ except SupportTicket.DoesNotExist:
+ return Response(
+ {'error': 'Ticket not found. Please check your ticket number.'},
+ status=status.HTTP_404_NOT_FOUND
+ )
+
+ @action(detail=True, methods=['post'], url_path='add-message')
+ def add_message(self, request, pk=None):
+ """
+ Add a message to a ticket.
+ POST /api/support/tickets/{id}/add-message/
+ Body: {
+ "content": "Message content",
+ "author_name": "User Name",
+ "author_email": "user@example.com"
+ }
+ """
+ ticket = self.get_object()
+
+ message_data = {
+ 'ticket': ticket.id,
+ 'content': request.data.get('content'),
+ 'author_name': request.data.get('author_name', ticket.user_name),
+ 'author_email': request.data.get('author_email', ticket.user_email),
+ 'message_type': 'user_message'
+ }
+
+ serializer = TicketMessageSerializer(data=message_data)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+
+ # Update ticket's last activity
+ ticket.last_activity = timezone.now()
+ ticket.save()
+
+ return Response(serializer.data, status=status.HTTP_201_CREATED)
+
+
+class TicketCategoryViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for ticket categories.
+ Public read-only access to categories.
+ """
+ queryset = TicketCategory.objects.filter(is_active=True)
+ serializer_class = TicketCategorySerializer
+ permission_classes = [AllowAny]
+
+
+class TicketStatusViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for ticket statuses.
+ Public read-only access to statuses.
+ """
+ queryset = TicketStatus.objects.filter(is_active=True)
+ serializer_class = TicketStatusSerializer
+ permission_classes = [AllowAny]
+
+
+class TicketPriorityViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for ticket priorities.
+ Public read-only access to priorities.
+ """
+ queryset = TicketPriority.objects.filter(is_active=True)
+ serializer_class = TicketPrioritySerializer
+ permission_classes = [AllowAny]
+
+
+class KnowledgeBaseCategoryViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for knowledge base categories.
+ Public read-only access.
+ """
+ queryset = KnowledgeBaseCategory.objects.filter(is_active=True)
+ serializer_class = KnowledgeBaseCategorySerializer
+ permission_classes = [AllowAny]
+ lookup_field = 'slug'
+
+
+class KnowledgeBaseArticleViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for knowledge base articles.
+ Public read-only access to published articles.
+ """
+ queryset = KnowledgeBaseArticle.objects.filter(is_published=True)
+ permission_classes = [AllowAny]
+ filter_backends = [filters.SearchFilter, filters.OrderingFilter]
+ search_fields = ['title', 'content', 'summary', 'keywords']
+ ordering_fields = ['created_at', 'view_count', 'helpful_count']
+ ordering = ['-created_at']
+ lookup_field = 'slug'
+
+ def get_serializer_class(self):
+ if self.action == 'retrieve':
+ return KnowledgeBaseArticleDetailSerializer
+ return KnowledgeBaseArticleListSerializer
+
+ def retrieve(self, request, *args, **kwargs):
+ instance = self.get_object()
+ # Increment view count
+ instance.view_count += 1
+ instance.save(update_fields=['view_count'])
+ serializer = self.get_serializer(instance)
+ return Response(serializer.data)
+
+ @action(detail=True, methods=['post'], url_path='mark-helpful')
+ def mark_helpful(self, request, slug=None):
+ """
+ Mark an article as helpful.
+ POST /api/support/knowledge-base/{slug}/mark-helpful/
+ Body: {"helpful": true/false}
+ """
+ article = self.get_object()
+ is_helpful = request.data.get('helpful', True)
+
+ if is_helpful:
+ article.helpful_count += 1
+ else:
+ article.not_helpful_count += 1
+
+ article.save()
+
+ return Response({
+ 'helpful_count': article.helpful_count,
+ 'not_helpful_count': article.not_helpful_count
+ })
+
+ @action(detail=False, methods=['get'], url_path='featured')
+ def featured(self, request):
+ """
+ Get featured articles.
+ GET /api/support/knowledge-base/featured/
+ """
+ featured_articles = self.queryset.filter(is_featured=True)[:6]
+ serializer = self.get_serializer(featured_articles, many=True)
+ return Response(serializer.data)
+
+ @action(detail=False, methods=['get'], url_path='by-category/(?P
[^/.]+)')
+ def by_category(self, request, category_slug=None):
+ """
+ Get articles by category slug.
+ GET /api/support/knowledge-base/by-category/{category_slug}/
+ """
+ articles = self.queryset.filter(category__slug=category_slug)
+ page = self.paginate_queryset(articles)
+ if page is not None:
+ serializer = self.get_serializer(page, many=True)
+ return self.get_paginated_response(serializer.data)
+
+ serializer = self.get_serializer(articles, many=True)
+ return Response(serializer.data)
+
+
+class SupportSettingsViewSet(viewsets.ReadOnlyModelViewSet):
+ """
+ ViewSet for support settings.
+ Public read-only access to active settings.
+ """
+ queryset = SupportSettings.objects.filter(is_active=True)
+ serializer_class = SupportSettingsSerializer
+ permission_classes = [AllowAny]
+ lookup_field = 'setting_name'
diff --git a/gnx-react/components/pages/career/JobApplicationForm.tsx b/gnx-react/components/pages/career/JobApplicationForm.tsx
new file mode 100644
index 00000000..a9eedb0b
--- /dev/null
+++ b/gnx-react/components/pages/career/JobApplicationForm.tsx
@@ -0,0 +1,973 @@
+"use client";
+
+import { useState, FormEvent, ChangeEvent } from "react";
+import { JobPosition, JobApplication, careerService } from "@/lib/api/careerService";
+
+interface JobApplicationFormProps {
+ job: JobPosition;
+ onClose?: () => void;
+}
+
+const inputStyle = {
+ padding: '10px 12px',
+ borderRadius: '6px',
+ border: '1px solid #e0e0e0',
+ fontSize: '14px',
+ transition: 'all 0.2s',
+ width: '100%'
+};
+
+const labelStyle = {
+ fontWeight: '500',
+ color: '#555',
+ marginBottom: '6px',
+ display: 'block',
+ fontSize: '14px'
+};
+
+const sectionStyle = {
+ backgroundColor: '#ffffff',
+ padding: 'clamp(16px, 3vw, 20px)',
+ borderRadius: '8px',
+ border: '1px solid #e8e8e8',
+ marginBottom: '16px',
+ boxShadow: '0 2px 8px rgba(0,0,0,0.04)'
+};
+
+const sectionHeaderStyle = {
+ display: 'flex',
+ alignItems: 'center',
+ marginBottom: '14px',
+ paddingBottom: '10px',
+ borderBottom: '1px solid #f0f0f0'
+};
+
+const JobApplicationForm = ({ job, onClose }: JobApplicationFormProps) => {
+ const [formData, setFormData] = useState({
+ first_name: "",
+ last_name: "",
+ email: "",
+ phone: "",
+ current_position: "",
+ current_company: "",
+ years_of_experience: "",
+ cover_letter: "",
+ portfolio_url: "",
+ linkedin_url: "",
+ github_url: "",
+ website_url: "",
+ available_from: "",
+ notice_period: "",
+ expected_salary: "",
+ salary_currency: "USD",
+ consent: false,
+ });
+
+ const [resume, setResume] = useState(null);
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitStatus, setSubmitStatus] = useState<{
+ type: "success" | "error" | null;
+ message: string;
+ }>({ type: null, message: "" });
+
+ const handleInputChange = (
+ e: ChangeEvent
+ ) => {
+ const { name, value, type } = e.target;
+
+ if (type === "checkbox") {
+ const checked = (e.target as HTMLInputElement).checked;
+ setFormData((prev) => ({ ...prev, [name]: checked }));
+ } else {
+ setFormData((prev) => ({ ...prev, [name]: value }));
+ }
+ };
+
+ const handleFileChange = (e: ChangeEvent) => {
+ const file = e.target.files?.[0];
+ if (file) {
+ // Validate file type
+ const allowedTypes = [
+ "application/pdf",
+ "application/msword",
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
+ ];
+
+ if (!allowedTypes.includes(file.type)) {
+ setSubmitStatus({
+ type: "error",
+ message: "Please upload a PDF, DOC, or DOCX file",
+ });
+ return;
+ }
+
+ // Validate file size (5MB)
+ if (file.size > 5 * 1024 * 1024) {
+ setSubmitStatus({
+ type: "error",
+ message: "Resume file size must be less than 5MB",
+ });
+ return;
+ }
+
+ setResume(file);
+ setSubmitStatus({ type: null, message: "" });
+ }
+ };
+
+ const handleSubmit = async (e: FormEvent) => {
+ e.preventDefault();
+ setIsSubmitting(true);
+ setSubmitStatus({ type: null, message: "" });
+
+ // Validation
+ if (!resume) {
+ setSubmitStatus({
+ type: "error",
+ message: "Please upload your resume",
+ });
+ setIsSubmitting(false);
+ return;
+ }
+
+ if (!formData.consent) {
+ setSubmitStatus({
+ type: "error",
+ message: "You must consent to data processing to apply",
+ });
+ setIsSubmitting(false);
+ return;
+ }
+
+ try {
+ const applicationData: JobApplication = {
+ job: job.id,
+ first_name: formData.first_name,
+ last_name: formData.last_name,
+ email: formData.email,
+ phone: formData.phone || undefined,
+ current_position: formData.current_position || undefined,
+ current_company: formData.current_company || undefined,
+ years_of_experience: formData.years_of_experience || undefined,
+ cover_letter: formData.cover_letter || undefined,
+ resume: resume,
+ portfolio_url: formData.portfolio_url || undefined,
+ linkedin_url: formData.linkedin_url || undefined,
+ github_url: formData.github_url || undefined,
+ website_url: formData.website_url || undefined,
+ available_from: formData.available_from || undefined,
+ notice_period: formData.notice_period || undefined,
+ expected_salary: formData.expected_salary ? parseFloat(formData.expected_salary) : undefined,
+ salary_currency: formData.salary_currency || undefined,
+ consent: formData.consent,
+ };
+
+ await careerService.submitApplication(applicationData);
+
+ setSubmitStatus({
+ type: "success",
+ message: "Application submitted successfully! We'll be in touch soon.",
+ });
+
+ // Reset form
+ setFormData({
+ first_name: "",
+ last_name: "",
+ email: "",
+ phone: "",
+ current_position: "",
+ current_company: "",
+ years_of_experience: "",
+ cover_letter: "",
+ portfolio_url: "",
+ linkedin_url: "",
+ github_url: "",
+ website_url: "",
+ available_from: "",
+ notice_period: "",
+ expected_salary: "",
+ salary_currency: "USD",
+ consent: false,
+ });
+ setResume(null);
+
+ // Reset file input
+ const fileInput = document.getElementById('resume') as HTMLInputElement;
+ if (fileInput) fileInput.value = '';
+
+ } catch (error) {
+ setSubmitStatus({
+ type: "error",
+ message: error instanceof Error ? error.message : "Failed to submit application. Please try again.",
+ });
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ return (
+
+ {/* Header Section with Gradient */}
+
+ {/* Close Button */}
+ {onClose && (
+
{
+ e.currentTarget.style.backgroundColor = 'rgba(220, 53, 69, 0.9)';
+ e.currentTarget.style.transform = 'scale(1.1)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.backgroundColor = 'rgba(255,255,255,0.2)';
+ e.currentTarget.style.transform = 'scale(1)';
+ }}
+ title="Close"
+ >
+ close
+
+ )}
+
+
+
+ work_outline
+
+
+
+ Join our team and make an impact
+
+
+
+
+ {/* Form Content - Scrollable Area */}
+
+
+
+
+ );
+};
+
+export default JobApplicationForm;
+
diff --git a/gnx-react/components/pages/career/JobSingle.tsx b/gnx-react/components/pages/career/JobSingle.tsx
index d8fc27ba..2a15565b 100644
--- a/gnx-react/components/pages/career/JobSingle.tsx
+++ b/gnx-react/components/pages/career/JobSingle.tsx
@@ -1,152 +1,680 @@
-import Link from "next/link";
+"use client";
+
+import { useState, useEffect } from "react";
+import { JobPosition } from "@/lib/api/careerService";
+import JobApplicationForm from "./JobApplicationForm";
+
+interface JobSingleProps {
+ job: JobPosition;
+}
+
+const JobSingle = ({ job }: JobSingleProps) => {
+ const [showApplicationForm, setShowApplicationForm] = useState(false);
+
+ // Prevent body scroll when modal is open
+ useEffect(() => {
+ if (showApplicationForm) {
+ // Get scrollbar width to prevent layout shift
+ const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
+
+ // Save current scroll position
+ const scrollY = window.scrollY;
+
+ // Prevent background scroll
+ document.body.style.position = 'fixed';
+ document.body.style.top = `-${scrollY}px`;
+ document.body.style.left = '0';
+ document.body.style.right = '0';
+ document.body.style.overflow = 'hidden';
+ if (scrollbarWidth > 0) {
+ document.body.style.paddingRight = `${scrollbarWidth}px`;
+ }
+ } else {
+ // Get the scroll position from body top
+ const scrollY = parseInt(document.body.style.top || '0') * -1;
+
+ // Restore scroll
+ document.body.style.position = '';
+ document.body.style.top = '';
+ document.body.style.left = '';
+ document.body.style.right = '';
+ document.body.style.overflow = '';
+ document.body.style.paddingRight = '';
+
+ // Restore scroll position
+ window.scrollTo(0, scrollY);
+ }
+
+ // Cleanup on unmount
+ return () => {
+ const scrollY = parseInt(document.body.style.top || '0') * -1;
+ document.body.style.position = '';
+ document.body.style.top = '';
+ document.body.style.left = '';
+ document.body.style.right = '';
+ document.body.style.overflow = '';
+ document.body.style.paddingRight = '';
+ if (scrollY > 0) {
+ window.scrollTo(0, scrollY);
+ }
+ };
+ }, [showApplicationForm]);
+
+ const formatSalary = () => {
+ if (job.salary_min && job.salary_max) {
+ return `${job.salary_currency} ${job.salary_min}-${job.salary_max} ${job.salary_period}`;
+ } else if (job.salary_min) {
+ return `From ${job.salary_currency} ${job.salary_min} ${job.salary_period}`;
+ } else if (job.salary_max) {
+ return `Up to ${job.salary_currency} ${job.salary_max} ${job.salary_period}`;
+ }
+ return "Competitive";
+ };
+
+ const scrollToForm = () => {
+ setShowApplicationForm(true);
+ setTimeout(() => {
+ const formElement = document.getElementById('application-form');
+ if (formElement) {
+ formElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
+ }
+ }, 100);
+ };
-const JobSingle = () => {
return (
-
-
-
-
-
-
-
- UI/UX Design
-
-
- Position: (02)
-
-
- Location: (Remote)
-
-
-
-
- Who we are
-
-
- Lorem ipsum dolor sit amet consectetur. Augue morbi sapien
- malesuada augue massa vivamus pharetra. Pellentesque velit
- lectus dui convallis posuere viverra enim mauris. Pulvinar
- quam vitae ut viverra. Vitae quis cursus magna sit amet neque
- ultricies lectus massa. Sem mauris tincidunt risus enim
- adipiscing viverra. Interdum lectus interdum diam ultricies
- molestie. In et ullamcorper semper odio enim.
-
-
-
-
- What you want
-
-
-
- you have at least three years of commercial experience
-
-
- you have a strong web/UI portfolio including published
- projects
-
- fluent English in verbal and written communication
-
- you are passionate about user interface and web design
-
- issues are challenges not show-stoppers for you
- you are a trend seeker
- you bring a lot of attention to details
-
- you plan upfront, think ahead, and are ready to be surprised
-
- you think about the full picture
-
- you are familiar with any UI design tool, i.e., Sketch,
- Figma or Adobe XD
-
-
-
-
-
- Who we are
-
-
- Lorem ipsum dolor sit amet consectetur. Augue morbi sapien
- malesuada augue massa vivamus pharetra. Pellentesque velit
- lectus dui convallis posuere viverra enim mauris. Pulvinar
- quam vitae ut viverra. Vitae quis cursus magna sit amet neque
- ultricies lectus massa. Sem mauris tincidunt risus enim
- adipiscing viverra. Interdum lectus interdum diam ultricies
- molestie. In et ullamcorper semper odio enim.
-
-
-
-
- Bonus points
-
-
- you have at least three years
- you have a strong web/UI portfolio including
- fluent English in verbal
- you are passionate about user interface
- issues are challenges
- you are a seeker
-
-
-
-
- What you get is what you see
-
-
- you have at least three years
- you have a strong web/UI portfolio including
- fluent English in verbal
- you are passionate about user interface
- issues are challenges
- you are a seeker
- fluent English in verbal and written communication
-
- you are passionate about user interface and web design
-
- issues are challenges not show-stoppers for you
- you are a trend seeker
- you bring a lot of attention to details
-
- you plan upfront, think ahead, and are ready to be surprised
-
-
-
-
-
-
-
-
-
- JOIN US
-
-
- UI/UX Design
-
-
Full-time (40hr per week)
-
-
-
- Salary-
-
-
- $1500-$2000 per month
-
-
- + VAT (B2B) + bonuses
-
-
Remote / Poznań
-
Start: ASAP
-
-
-
- Apply Now
-
+ <>
+ {/* Job Header Banner */}
+
+
+
+
+
+
+
+ {job.department || 'Career Opportunity'}
+
+
+
+ {job.title}
+
+
+
+ location_on
+ {job.location}
+
+
+ work
+ {job.employment_type.replace('-', ' ').replace(/\b\w/g, l => l.toUpperCase())}
+
+ {job.employment_type.split('-')[0].charAt(0).toUpperCase() + job.employment_type.split('-')[0].slice(1)}
+
+
+
+ group
+ {job.open_positions} {job.open_positions === 1 ? 'Position' : 'Positions'}
+ {job.open_positions} {job.open_positions === 1 ? 'Pos' : 'Pos'}
+
+ {job.experience_required && (
+
+ school
+ {job.experience_required}
+
+ )}
+
+
+
+ {/* Job Content Section */}
+
+
+
+
+
+
+
+ About This Position
+
+ {job.short_description && (
+
+ {job.short_description}
+
+ )}
+
+
+ {job.about_role && (
+
+
+ info
+
+ About This Role
+
+
+
{job.about_role}
+
+ )}
+
+ {job.requirements && job.requirements.length > 0 && (
+
+
+ task_alt
+
+ Requirements
+
+
+
+ {job.requirements.map((req, index) => (
+
+
+ {req}
+
+ ))}
+
+
+ )}
+
+ {job.responsibilities && job.responsibilities.length > 0 && (
+
+
+ assignment
+
+ Key Responsibilities
+
+
+
+ {job.responsibilities.map((resp, index) => (
+
+
+ {resp}
+
+ ))}
+
+
+ )}
+
+ {job.qualifications && job.qualifications.length > 0 && (
+
+
+ workspace_premium
+
+ Qualifications
+
+
+
+ {job.qualifications.map((qual, index) => (
+
+
+ {qual}
+
+ ))}
+
+
+ )}
+
+ {job.bonus_points && job.bonus_points.length > 0 && (
+
+
+ stars
+
+ Nice to Have
+
+
+
+ {job.bonus_points.map((bonus, index) => (
+
+
+ {bonus}
+
+ ))}
+
+
+ )}
+
+ {job.benefits && job.benefits.length > 0 && (
+
+
+ card_giftcard
+
+ What We Offer
+
+
+
+ {job.benefits.map((benefit, index) => (
+
+
+ {benefit}
+
+ ))}
+
+
+ )}
+
+
+
+
+
+
+
+ JOB DETAILS
+
+
+
+
+
+
+
payments
+
Salary Range
+
+
+ {formatSalary()}
+
+ {job.salary_additional && (
+
+ {job.salary_additional}
+
+ )}
+
+
+
+
+
work
+
Employment Type
+
+
+ {job.employment_type.replace('-', ' ').replace(/\b\w/g, l => l.toUpperCase())}
+
+
+
+
+
+
location_on
+
Location
+
+
{job.location}
+
+
+
+
+
+
+
+ {job.open_positions} {job.open_positions === 1 ? 'Position' : 'Positions'} Available
+
+
+
+
+
+
+
+
+
+
+ {/* Application Form Modal/Popup */}
+ {showApplicationForm && (
+ <>
+ {/* Backdrop Overlay */}
+
setShowApplicationForm(false)}
+ aria-hidden="true"
+ />
+
+ {/* Modal Container */}
+
{
+ // Close when clicking the container background
+ if (e.target === e.currentTarget) {
+ setShowApplicationForm(false);
+ }
+ }}
+ onKeyDown={(e) => {
+ // Close on ESC key
+ if (e.key === 'Escape') {
+ setShowApplicationForm(false);
+ }
+ }}
+ ref={(el) => {
+ if (el) {
+ setTimeout(() => el.focus(), 100);
+ }
+ }}
+ >
+
e.stopPropagation()}
+ onTouchStart={(e) => e.stopPropagation()}
+ onTouchMove={(e) => e.stopPropagation()}
+ >
+ setShowApplicationForm(false)} />
+
+
+
+ {/* Animation Styles */}
+
+ >
+ )}
+ >
);
};
diff --git a/gnx-react/components/pages/career/OpenPosition.tsx b/gnx-react/components/pages/career/OpenPosition.tsx
index b325322d..283d4173 100644
--- a/gnx-react/components/pages/career/OpenPosition.tsx
+++ b/gnx-react/components/pages/career/OpenPosition.tsx
@@ -1,6 +1,74 @@
+"use client";
+
import Link from "next/link";
+import { useJobs } from "@/lib/hooks/useCareer";
const OpenPosition = () => {
+ const { jobs, loading, error } = useJobs();
+
+ if (loading) {
+ return (
+
+ );
+ }
+
+ if (error) {
+ return (
+
+ );
+ }
+
+ if (jobs.length === 0) {
+ return (
+
+ );
+ }
+
return (
-
-
-
- 01
-
-
-
- UI/UX Design
-
-
-
-
-
- (04 Open Roles)
+ {jobs.map((job, index) => (
+
+
+
+
+ {String(index + 1).padStart(2, '0')}
-
-
-
-
-
east
-
+
+
+ {job.title}
+
+
+
+
+
+ ({job.open_positions.toString().padStart(2, '0')} Open {job.open_positions === 1 ? 'Role' : 'Roles'})
+
+
+
+
-
-
-
-
- 02
-
-
-
- Administrative Assistant
-
-
-
-
-
- (03 Open Roles)
-
-
-
-
-
-
-
-
-
- 03
-
-
-
- Software Engineer
-
-
-
-
-
- (12 Open Roles)
-
-
-
-
-
-
-
-
-
- 04
-
-
-
- Data Entry Clerk
-
-
-
-
-
- (01 Open Roles)
-
-
-
-
-
-
-
-
-
- 05
-
-
-
- Marketing Manager
-
-
-
-
-
- (09 Open Roles)
-
-
-
-
-
-
-
-
-
- 06
-
-
-
- Executive Assistant
-
-
-
-
-
- (07 Open Roles)
-
-
-
-
-
-
-
-
-
- 07
-
-
-
- Lead Product Designer
-
-
-
-
-
- (03 Open Roles)
-
-
-
-
-
-
+ ))}
diff --git a/gnx-react/components/pages/support/CreateTicketForm.tsx b/gnx-react/components/pages/support/CreateTicketForm.tsx
new file mode 100644
index 00000000..330edfd5
--- /dev/null
+++ b/gnx-react/components/pages/support/CreateTicketForm.tsx
@@ -0,0 +1,300 @@
+"use client";
+import { useState, FormEvent } from 'react';
+import { createTicket, CreateTicketData } from '@/lib/api/supportService';
+import { useTicketCategories } from '@/lib/hooks/useSupport';
+
+const CreateTicketForm = () => {
+ const { categories, loading: categoriesLoading } = useTicketCategories();
+
+ const [formData, setFormData] = useState
({
+ title: '',
+ description: '',
+ ticket_type: 'general',
+ user_name: '',
+ user_email: '',
+ user_phone: '',
+ company: '',
+ category: undefined
+ });
+
+ const [isSubmitting, setIsSubmitting] = useState(false);
+ const [submitError, setSubmitError] = useState(null);
+ const [submitSuccess, setSubmitSuccess] = useState(false);
+ const [ticketNumber, setTicketNumber] = useState('');
+
+ const handleInputChange = (
+ e: React.ChangeEvent
+ ) => {
+ const { name, value } = e.target;
+ setFormData(prev => ({
+ ...prev,
+ [name]: name === 'category' ? (value ? parseInt(value) : undefined) : value
+ }));
+ };
+
+ const handleSubmit = async (e: FormEvent) => {
+ e.preventDefault();
+ setIsSubmitting(true);
+ setSubmitError(null);
+ setSubmitSuccess(false);
+
+ try {
+ const response = await createTicket(formData);
+ setTicketNumber(response.ticket_number);
+ setSubmitSuccess(true);
+
+ // Reset form
+ setFormData({
+ title: '',
+ description: '',
+ ticket_type: 'general',
+ user_name: '',
+ user_email: '',
+ user_phone: '',
+ company: '',
+ category: undefined
+ });
+ } catch (error: any) {
+ setSubmitError(error.message || 'Failed to submit ticket. Please try again.');
+ } finally {
+ setIsSubmitting(false);
+ }
+ };
+
+ if (submitSuccess) {
+ return (
+
+
+
+
+
Ticket Created Successfully!
+
Your ticket number: {ticketNumber}
+
+ We've received your support request and will respond as soon as possible.
+ Please save your ticket number for future reference.
+
+
setSubmitSuccess(false)}
+ >
+ Submit Another Ticket
+
+
+ );
+ }
+
+ return (
+
+
+
+
+
Submit a Support Ticket
+
Fill out the form below and our team will get back to you shortly.
+
+ ℹ️ Note: Only registered email addresses can submit tickets.
+ If your email is not registered, please contact support@gnxsoft.com
+
+
+
+ {submitError && (
+
+
+ {submitError}
+
+ )}
+
+
+
+ {/* Personal Information */}
+
+
Personal Information
+
+
+
+
+
+ Full Name *
+
+
+
+
+
+
+
+
+ Email Address *
+
+
+
+
+
+
+
+
+
+ {/* Ticket Details */}
+
+
Ticket Details
+
+
+
+
+
+ Issue Type *
+
+
+ General Inquiry
+ Technical Issue
+ Billing Question
+ Feature Request
+ Bug Report
+ Account Issue
+
+
+
+
+
+
+ Category
+
+ Select a category
+ {Array.isArray(categories) && categories.map(cat => (
+
+ {cat.name}
+
+ ))}
+
+
+
+
+
+
+
+
+
+ Description *
+
+
+
+
+
+
+
+ {isSubmitting ? (
+ <>
+
+ Submitting...
+ >
+ ) : (
+ <>
+
+ Submit Ticket
+ >
+ )}
+
+
+
+
+
+
+
+ );
+};
+
+export default CreateTicketForm;
+
diff --git a/gnx-react/components/pages/support/KnowledgeBase.tsx b/gnx-react/components/pages/support/KnowledgeBase.tsx
new file mode 100644
index 00000000..cbdbac07
--- /dev/null
+++ b/gnx-react/components/pages/support/KnowledgeBase.tsx
@@ -0,0 +1,217 @@
+"use client";
+import { useState } from 'react';
+import { useKnowledgeBaseCategories, useFeaturedArticles, useKnowledgeBaseArticles } from '@/lib/hooks/useSupport';
+import KnowledgeBaseArticleModal from './KnowledgeBaseArticleModal';
+
+const KnowledgeBase = () => {
+ const { categories, loading: categoriesLoading } = useKnowledgeBaseCategories();
+ const [searchTerm, setSearchTerm] = useState('');
+ const [selectedCategory, setSelectedCategory] = useState(null);
+ const [selectedArticleSlug, setSelectedArticleSlug] = useState(null);
+
+ // Fetch all articles (for browsing and category filtering)
+ const { articles: allArticles, loading: allArticlesLoading } = useKnowledgeBaseArticles();
+
+ // Fetch featured articles (for default view)
+ const { articles: featuredArticles, loading: featuredLoading } = useFeaturedArticles();
+
+ // Determine which articles to display
+ let displayArticles = featuredArticles;
+ let isLoading = featuredLoading;
+ let headerText = 'Featured Articles';
+
+ if (searchTerm) {
+ // If searching, filter all articles by search term
+ displayArticles = allArticles.filter(article =>
+ article.title.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ article.summary.toLowerCase().includes(searchTerm.toLowerCase()) ||
+ article.content.toLowerCase().includes(searchTerm.toLowerCase())
+ );
+ isLoading = allArticlesLoading;
+ headerText = 'Search Results';
+ } else if (selectedCategory) {
+ // If a category is selected, filter articles by that category
+ displayArticles = allArticles.filter(article => article.category_slug === selectedCategory);
+ isLoading = allArticlesLoading;
+ const categoryName = categories.find(cat => cat.slug === selectedCategory)?.name || 'Category';
+ headerText = `${categoryName} Articles`;
+ }
+
+ const handleSearch = (e: React.FormEvent) => {
+ e.preventDefault();
+ // The search is already being performed by the hook
+ };
+
+ const filteredCategories = selectedCategory
+ ? categories.filter(cat => cat.slug === selectedCategory)
+ : categories;
+
+ return (
+
+
+
+
+
Knowledge Base
+
Find answers to frequently asked questions and explore our documentation.
+
+
+ {/* Search Bar */}
+
+
+
+ setSearchTerm(e.target.value)}
+ placeholder="Search articles, topics, or keywords..."
+ className="form-control"
+ />
+ {searchTerm && (
+ setSearchTerm('')}
+ aria-label="Clear search"
+ >
+
+
+ )}
+
+
+
+ {/* Categories */}
+ {!searchTerm && (
+
+
Browse by Category
+ {categoriesLoading ? (
+
+ ) : (
+
+ {Array.isArray(categories) && categories.map(category => (
+
+
setSelectedCategory(category.slug)}
+ style={{ borderLeftColor: category.color }}
+ >
+
+
+
+
+
{category.name}
+
{category.description}
+
+
+ {category.article_count} {category.article_count === 1 ? 'article' : 'articles'}
+
+
+
+
+
+ ))}
+
+ )}
+
+ )}
+
+ {/* Featured/Search Results Articles */}
+
+
+
+
{headerText}
+ {selectedCategory && !searchTerm && (
+ setSelectedCategory(null)}
+ >
+
+ Back to All Articles
+
+ )}
+
+ {searchTerm && (
+
+ Found {displayArticles.length} {displayArticles.length === 1 ? 'article' : 'articles'} for "{searchTerm}"
+
+ )}
+
+
+ {isLoading ? (
+
+ ) : displayArticles.length === 0 ? (
+
+
+
No articles found
+
+ {searchTerm
+ ? `We couldn't find any articles matching "${searchTerm}". Try different keywords.`
+ : 'No articles available at the moment.'}
+
+
+ ) : (
+
+ {Array.isArray(displayArticles) && displayArticles.map(article => (
+
setSelectedArticleSlug(article.slug)}
+ >
+
+
{article.title}
+ {article.is_featured && (
+
+
+ Featured
+
+ )}
+
+
{article.summary}
+
+
+
+ {article.category_name}
+
+
+
+ {article.view_count} views
+
+
+
+ {article.helpful_count} helpful
+
+
+
+ Read More
+
+
+ ))}
+
+ )}
+
+
+
+
+ {/* Article Modal */}
+ {selectedArticleSlug && (
+
setSelectedArticleSlug(null)}
+ />
+ )}
+
+ );
+};
+
+export default KnowledgeBase;
+
diff --git a/gnx-react/components/pages/support/KnowledgeBaseArticleModal.tsx b/gnx-react/components/pages/support/KnowledgeBaseArticleModal.tsx
new file mode 100644
index 00000000..149d7fa6
--- /dev/null
+++ b/gnx-react/components/pages/support/KnowledgeBaseArticleModal.tsx
@@ -0,0 +1,139 @@
+"use client";
+import { useEffect, useState } from 'react';
+import { useKnowledgeBaseArticle } from '@/lib/hooks/useSupport';
+import { markArticleHelpful } from '@/lib/api/supportService';
+
+interface KnowledgeBaseArticleModalProps {
+ slug: string;
+ onClose: () => void;
+}
+
+const KnowledgeBaseArticleModal = ({ slug, onClose }: KnowledgeBaseArticleModalProps) => {
+ const { article, loading, error } = useKnowledgeBaseArticle(slug);
+ const [feedbackGiven, setFeedbackGiven] = useState(false);
+
+ useEffect(() => {
+ // Prevent body scroll when modal is open
+ document.body.style.overflow = 'hidden';
+
+ return () => {
+ document.body.style.overflow = 'unset';
+ };
+ }, []);
+
+ const handleFeedback = async (helpful: boolean) => {
+ if (!article || feedbackGiven) return;
+
+ try {
+ await markArticleHelpful(slug, helpful);
+ setFeedbackGiven(true);
+ } catch (error) {
+ console.error('Error submitting feedback:', error);
+ }
+ };
+
+ const formatDate = (dateString: string) => {
+ const date = new Date(dateString);
+ return date.toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric'
+ });
+ };
+
+ return (
+
+
e.stopPropagation()}>
+
+
+
+
+
+ {loading && (
+
+
+ Loading...
+
+
Loading article...
+
+ )}
+
+ {error && (
+
+
+
Error Loading Article
+
{error}
+
+ )}
+
+ {article && (
+ <>
+
+ {article.is_featured && (
+
+
+ Featured
+
+ )}
+
{article.title}
+
+
+
+ {article.category_name}
+
+
+
+ {formatDate(article.published_at || article.created_at)}
+
+
+
+ {article.view_count} views
+
+
+
+
+
+
+
+
+
Was this article helpful?
+ {feedbackGiven ? (
+
+
+ Thank you for your feedback!
+
+ ) : (
+
+ handleFeedback(true)}
+ >
+
+ Yes ({article.helpful_count})
+
+ handleFeedback(false)}
+ >
+
+ No ({article.not_helpful_count})
+
+
+ )}
+
+
+ >
+ )}
+
+
+
+ );
+};
+
+export default KnowledgeBaseArticleModal;
+
diff --git a/gnx-react/components/pages/support/SupportCenterContent.tsx b/gnx-react/components/pages/support/SupportCenterContent.tsx
new file mode 100644
index 00000000..6eb32601
--- /dev/null
+++ b/gnx-react/components/pages/support/SupportCenterContent.tsx
@@ -0,0 +1,55 @@
+"use client";
+import { useState } from 'react';
+import CreateTicketForm from './CreateTicketForm';
+import KnowledgeBase from './KnowledgeBase';
+import TicketStatusCheck from './TicketStatusCheck';
+
+type TabType = 'create' | 'knowledge' | 'status';
+
+const SupportCenterContent = () => {
+ const [activeTab, setActiveTab] = useState('create');
+
+ return (
+
+
+
+
+ {/* Tab Navigation */}
+
+
+
+ setActiveTab('create')}>
+
+ Submit a Ticket
+
+
+
+ setActiveTab('knowledge')}>
+
+ Knowledge Base
+
+
+
+ setActiveTab('status')}>
+
+ Check Ticket Status
+
+
+
+
+ {/* Tab Content */}
+
+ {activeTab === 'create' && }
+ {activeTab === 'knowledge' && }
+ {activeTab === 'status' && }
+
+
+
+
+
+
+ );
+};
+
+export default SupportCenterContent;
+
diff --git a/gnx-react/components/pages/support/SupportCenterHero.tsx b/gnx-react/components/pages/support/SupportCenterHero.tsx
new file mode 100644
index 00000000..e6162e3b
--- /dev/null
+++ b/gnx-react/components/pages/support/SupportCenterHero.tsx
@@ -0,0 +1,91 @@
+"use client";
+
+const SupportCenterHero = () => {
+ return (
+
+ {/* Animated Background */}
+
+ {/* Floating Support Icons */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Grid Pattern */}
+
+
+ {/* Animated Gradient Orbs */}
+
+
+
+
+ {/* Video Overlay */}
+
+
+
+
+
+
+
+
+ Support Center
+
+
+ Get expert assistance whenever you need it. Our dedicated support team is here to help you succeed.
+
+
+
+
+
+
+
+
+
+
Submit Tickets
+
Create and track support requests
+
+
+
+
+
+
+
+
Knowledge Base
+
Find answers to common questions
+
+
+
+
+
+
+
+
Track Status
+
Monitor your ticket progress
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SupportCenterHero;
+
diff --git a/gnx-react/components/pages/support/TicketStatusCheck.tsx b/gnx-react/components/pages/support/TicketStatusCheck.tsx
new file mode 100644
index 00000000..a1d419e9
--- /dev/null
+++ b/gnx-react/components/pages/support/TicketStatusCheck.tsx
@@ -0,0 +1,197 @@
+"use client";
+import { useState, FormEvent } from 'react';
+import { checkTicketStatus, SupportTicket } from '@/lib/api/supportService';
+
+const TicketStatusCheck = () => {
+ const [ticketNumber, setTicketNumber] = useState('');
+ const [isSearching, setIsSearching] = useState(false);
+ const [searchError, setSearchError] = useState(null);
+ const [ticket, setTicket] = useState(null);
+
+ const handleSubmit = async (e: FormEvent) => {
+ e.preventDefault();
+ setIsSearching(true);
+ setSearchError(null);
+ setTicket(null);
+
+ try {
+ const response = await checkTicketStatus(ticketNumber);
+ setTicket(response);
+ } catch (error: any) {
+ if (error.message === 'Ticket not found') {
+ setSearchError('Ticket not found. Please check your ticket number and try again.');
+ } else {
+ setSearchError('An error occurred while searching. Please try again.');
+ }
+ } finally {
+ setIsSearching(false);
+ }
+ };
+
+ const formatDate = (dateString: string) => {
+ const date = new Date(dateString);
+ return date.toLocaleDateString('en-US', {
+ year: 'numeric',
+ month: 'long',
+ day: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ };
+
+ return (
+
+
+
+
+
Check Ticket Status
+
Enter your ticket number to view the current status and details of your support request.
+
+
+
+
+ setTicketNumber(e.target.value)}
+ placeholder="Enter your ticket number (e.g., TKT-20231015-ABCDE)"
+ required
+ className="form-control"
+ />
+
+ {isSearching ? (
+ <>
+
+ Searching...
+ >
+ ) : (
+ <>
+
+ Check Status
+ >
+ )}
+
+
+
+
+ {searchError && (
+
+
+ {searchError}
+
+ )}
+
+ {ticket && (
+
+
+
+
+ {ticket.ticket_number}
+
+
+ {ticket.status_name}
+
+
+
+
+
{ticket.title}
+
+
+
+ Created: {formatDate(ticket.created_at)}
+
+
+
+ Last Updated: {formatDate(ticket.updated_at)}
+
+ {ticket.priority_name && (
+
+
+ Priority:
+
+ {ticket.priority_name}
+
+
+ )}
+ {ticket.category_name && (
+
+
+ Category: {ticket.category_name}
+
+ )}
+
+
+
+
Description
+
{ticket.description}
+
+
+ {ticket.messages && ticket.messages.length > 0 && (
+
+
Messages ({ticket.messages.length})
+
+ {ticket.messages
+ .filter(msg => !msg.is_internal)
+ .map((message, index) => (
+
+
+
+
+ {message.author_name || message.author_email}
+
+
+ {formatDate(message.created_at)}
+
+
+
+ {message.content}
+
+
+ ))}
+
+
+ )}
+
+ {ticket.activities && ticket.activities.length > 0 && (
+
+
Activity Timeline
+
+ {ticket.activities.slice(0, 5).map((activity, index) => (
+
+
+
+
+
+
+ {activity.description}
+
+
+ {formatDate(activity.created_at)}
+
+
+
+ ))}
+
+
+ )}
+
+
+ )}
+
+
+
+ );
+};
+
+export default TicketStatusCheck;
+
diff --git a/gnx-react/components/shared/layout/header/Header.tsx b/gnx-react/components/shared/layout/header/Header.tsx
index 8b9eb63f..aaadca12 100644
--- a/gnx-react/components/shared/layout/header/Header.tsx
+++ b/gnx-react/components/shared/layout/header/Header.tsx
@@ -52,8 +52,8 @@ const Header = () => {
navigationType: "both",
headerClass: "tp-header",
scrolledClass: "navbar-active",
- buttonText: "Get Started",
- buttonUrl: "/contact-us",
+ buttonText: "Support Center",
+ buttonUrl: "/support-center",
buttonClass: "btn btn-primary d-none d-sm-flex",
isActive: true,
displayOrder: 1,
diff --git a/gnx-react/lib/api/careerService.ts b/gnx-react/lib/api/careerService.ts
new file mode 100644
index 00000000..eb42d739
--- /dev/null
+++ b/gnx-react/lib/api/careerService.ts
@@ -0,0 +1,237 @@
+import { API_BASE_URL } from '../config/api';
+
+export interface JobPosition {
+ id: number;
+ title: string;
+ slug: string;
+ department: string;
+ employment_type: string;
+ location_type: string;
+ location: string;
+ open_positions: number;
+ experience_required?: string;
+ salary_min?: number;
+ salary_max?: number;
+ salary_currency: string;
+ salary_period: string;
+ salary_additional?: string;
+ short_description?: string;
+ about_role?: string;
+ requirements?: string[];
+ responsibilities?: string[];
+ qualifications?: string[];
+ bonus_points?: string[];
+ benefits?: string[];
+ start_date: string;
+ posted_date: string;
+ updated_date: string;
+ deadline?: string;
+ status: string;
+ featured?: boolean;
+}
+
+export interface JobApplication {
+ job: number;
+ first_name: string;
+ last_name: string;
+ email: string;
+ phone?: string;
+ current_position?: string;
+ current_company?: string;
+ years_of_experience?: string;
+ cover_letter?: string;
+ resume: File;
+ portfolio_url?: string;
+ linkedin_url?: string;
+ github_url?: string;
+ website_url?: string;
+ available_from?: string;
+ notice_period?: string;
+ expected_salary?: number;
+ salary_currency?: string;
+ consent: boolean;
+}
+
+class CareerService {
+ private baseUrl = `${API_BASE_URL}/api/career`;
+
+ /**
+ * Get all active job positions
+ */
+ async getAllJobs(): Promise {
+ try {
+ const response = await fetch(`${this.baseUrl}/jobs/`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch jobs: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ // Handle paginated response - extract results array
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching jobs:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Get a single job position by slug
+ */
+ async getJobBySlug(slug: string): Promise {
+ try {
+ const response = await fetch(`${this.baseUrl}/jobs/${slug}/`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch job: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ return data;
+ } catch (error) {
+ console.error('Error fetching job:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Get featured job positions
+ */
+ async getFeaturedJobs(): Promise {
+ try {
+ const response = await fetch(`${this.baseUrl}/jobs/featured/`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch featured jobs: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ // Handle paginated response - extract results array
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching featured jobs:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Submit a job application
+ */
+ async submitApplication(applicationData: JobApplication): Promise {
+ try {
+ const formData = new FormData();
+
+ // Append all fields to FormData
+ formData.append('job', applicationData.job.toString());
+ formData.append('first_name', applicationData.first_name);
+ formData.append('last_name', applicationData.last_name);
+ formData.append('email', applicationData.email);
+ formData.append('consent', applicationData.consent.toString());
+
+ // Append resume file
+ if (applicationData.resume) {
+ formData.append('resume', applicationData.resume);
+ }
+
+ // Append optional fields
+ if (applicationData.phone) formData.append('phone', applicationData.phone);
+ if (applicationData.current_position) formData.append('current_position', applicationData.current_position);
+ if (applicationData.current_company) formData.append('current_company', applicationData.current_company);
+ if (applicationData.years_of_experience) formData.append('years_of_experience', applicationData.years_of_experience);
+ if (applicationData.cover_letter) formData.append('cover_letter', applicationData.cover_letter);
+ if (applicationData.portfolio_url) formData.append('portfolio_url', applicationData.portfolio_url);
+ if (applicationData.linkedin_url) formData.append('linkedin_url', applicationData.linkedin_url);
+ if (applicationData.github_url) formData.append('github_url', applicationData.github_url);
+ if (applicationData.website_url) formData.append('website_url', applicationData.website_url);
+ if (applicationData.available_from) formData.append('available_from', applicationData.available_from);
+ if (applicationData.notice_period) formData.append('notice_period', applicationData.notice_period);
+ if (applicationData.expected_salary) formData.append('expected_salary', applicationData.expected_salary.toString());
+ if (applicationData.salary_currency) formData.append('salary_currency', applicationData.salary_currency);
+
+ const response = await fetch(`${this.baseUrl}/applications/`, {
+ method: 'POST',
+ body: formData,
+ // Don't set Content-Type header - browser will set it with boundary for multipart/form-data
+ });
+
+ if (!response.ok) {
+ const errorData = await response.json();
+ throw new Error(errorData.error || `Failed to submit application: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ return data;
+ } catch (error) {
+ console.error('Error submitting application:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Filter jobs by department
+ */
+ async getJobsByDepartment(department: string): Promise {
+ try {
+ const response = await fetch(`${this.baseUrl}/jobs/?department=${department}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch jobs: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ // Handle paginated response - extract results array
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching jobs by department:', error);
+ throw error;
+ }
+ }
+
+ /**
+ * Filter jobs by employment type
+ */
+ async getJobsByEmploymentType(employmentType: string): Promise {
+ try {
+ const response = await fetch(`${this.baseUrl}/jobs/?employment_type=${employmentType}`, {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`Failed to fetch jobs: ${response.statusText}`);
+ }
+
+ const data = await response.json();
+ // Handle paginated response - extract results array
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching jobs by employment type:', error);
+ throw error;
+ }
+ }
+}
+
+export const careerService = new CareerService();
+
diff --git a/gnx-react/lib/api/supportService.ts b/gnx-react/lib/api/supportService.ts
new file mode 100644
index 00000000..7ae87957
--- /dev/null
+++ b/gnx-react/lib/api/supportService.ts
@@ -0,0 +1,406 @@
+import { API_CONFIG } from '../config/api';
+
+const BASE_URL = `${API_CONFIG.BASE_URL}/api/support`;
+
+// ==================== Types ====================
+export interface TicketStatus {
+ id: number;
+ name: string;
+ color: string;
+ description: string;
+ is_closed: boolean;
+ display_order: number;
+}
+
+export interface TicketPriority {
+ id: number;
+ name: string;
+ level: number;
+ color: string;
+ description: string;
+ sla_hours: number;
+}
+
+export interface TicketCategory {
+ id: number;
+ name: string;
+ description: string;
+ color: string;
+ icon: string;
+ display_order: number;
+}
+
+export interface TicketMessage {
+ id: number;
+ ticket: number;
+ message_type: string;
+ content: string;
+ author_name: string;
+ author_email: string;
+ is_internal: boolean;
+ created_at: string;
+ updated_at: string;
+ attachments: string[];
+ is_read: boolean;
+}
+
+export interface TicketActivity {
+ id: number;
+ activity_type: string;
+ description: string;
+ user_name: string;
+ old_value: string;
+ new_value: string;
+ created_at: string;
+}
+
+export interface SupportTicket {
+ id: number;
+ ticket_number: string;
+ title: string;
+ description: string;
+ ticket_type: string;
+ user_name: string;
+ user_email: string;
+ user_phone: string;
+ company: string;
+ category: number | null;
+ category_name: string;
+ priority: number | null;
+ priority_name: string;
+ priority_color: string;
+ status: number | null;
+ status_name: string;
+ status_color: string;
+ assigned_to: number | null;
+ assigned_at: string | null;
+ created_at: string;
+ updated_at: string;
+ closed_at: string | null;
+ last_activity: string;
+ first_response_at: string | null;
+ sla_deadline: string | null;
+ tags: string;
+ is_escalated: boolean;
+ escalation_reason: string;
+ attachments: string[];
+ messages: TicketMessage[];
+ activities: TicketActivity[];
+}
+
+export interface CreateTicketData {
+ title: string;
+ description: string;
+ ticket_type: string;
+ user_name: string;
+ user_email: string;
+ user_phone?: string;
+ company?: string;
+ category?: number;
+}
+
+export interface KnowledgeBaseCategory {
+ id: number;
+ name: string;
+ slug: string;
+ description: string;
+ icon: string;
+ color: string;
+ display_order: number;
+ article_count: number;
+}
+
+export interface KnowledgeBaseArticle {
+ id: number;
+ title: string;
+ slug: string;
+ category: number;
+ category_name: string;
+ category_slug: string;
+ content?: string;
+ summary: string;
+ meta_description?: string;
+ keywords?: string;
+ is_featured: boolean;
+ view_count: number;
+ helpful_count: number;
+ not_helpful_count: number;
+ created_at: string;
+ updated_at: string;
+ published_at: string;
+}
+
+export interface SupportSettings {
+ id: number;
+ setting_name: string;
+ setting_value: string;
+ description: string;
+ is_active: boolean;
+}
+
+// ==================== API Functions ====================
+
+/**
+ * Fetch all ticket categories
+ */
+export const getTicketCategories = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/categories/`);
+ if (!response.ok) throw new Error('Failed to fetch ticket categories');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching ticket categories:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch all ticket statuses
+ */
+export const getTicketStatuses = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/statuses/`);
+ if (!response.ok) throw new Error('Failed to fetch ticket statuses');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching ticket statuses:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch all ticket priorities
+ */
+export const getTicketPriorities = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/priorities/`);
+ if (!response.ok) throw new Error('Failed to fetch ticket priorities');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching ticket priorities:', error);
+ throw error;
+ }
+};
+
+/**
+ * Create a new support ticket
+ */
+export const createTicket = async (data: CreateTicketData): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/tickets/`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify(data),
+ });
+
+ if (!response.ok) {
+ const errorData = await response.json().catch(() => ({}));
+
+ // Handle validation errors
+ if (response.status === 400 && errorData.user_email) {
+ throw new Error(errorData.user_email[0] || 'Email validation failed');
+ }
+
+ throw new Error(errorData.detail || errorData.message || 'Failed to create ticket');
+ }
+
+ return await response.json();
+ } catch (error) {
+ console.error('Error creating ticket:', error);
+ throw error;
+ }
+};
+
+/**
+ * Check ticket status by ticket number
+ */
+export const checkTicketStatus = async (ticketNumber: string): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/tickets/check-status/`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ ticket_number: ticketNumber }),
+ });
+ if (!response.ok) {
+ if (response.status === 404) {
+ throw new Error('Ticket not found');
+ }
+ throw new Error('Failed to check ticket status');
+ }
+ return await response.json();
+ } catch (error) {
+ console.error('Error checking ticket status:', error);
+ throw error;
+ }
+};
+
+/**
+ * Add a message to a ticket
+ */
+export const addTicketMessage = async (
+ ticketId: number,
+ content: string,
+ authorName: string,
+ authorEmail: string
+): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/tickets/${ticketId}/add-message/`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ content,
+ author_name: authorName,
+ author_email: authorEmail,
+ }),
+ });
+ if (!response.ok) throw new Error('Failed to add ticket message');
+ return await response.json();
+ } catch (error) {
+ console.error('Error adding ticket message:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch all knowledge base categories
+ */
+export const getKnowledgeBaseCategories = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/knowledge-base-categories/`);
+ if (!response.ok) throw new Error('Failed to fetch knowledge base categories');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching knowledge base categories:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch all knowledge base articles
+ */
+export const getKnowledgeBaseArticles = async (search?: string): Promise => {
+ try {
+ const url = search
+ ? `${BASE_URL}/knowledge-base/?search=${encodeURIComponent(search)}`
+ : `${BASE_URL}/knowledge-base/`;
+ const response = await fetch(url);
+ if (!response.ok) throw new Error('Failed to fetch knowledge base articles');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching knowledge base articles:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch featured knowledge base articles
+ */
+export const getFeaturedArticles = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/knowledge-base/featured/`);
+ if (!response.ok) throw new Error('Failed to fetch featured articles');
+ const data = await response.json();
+ // Handle both array and paginated responses
+ return Array.isArray(data) ? data : (data.results || data);
+ } catch (error) {
+ console.error('Error fetching featured articles:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch a single knowledge base article by slug
+ */
+export const getKnowledgeBaseArticle = async (slug: string): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/knowledge-base/${slug}/`);
+ if (!response.ok) throw new Error('Failed to fetch knowledge base article');
+ return await response.json();
+ } catch (error) {
+ console.error('Error fetching knowledge base article:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch articles by category
+ */
+export const getArticlesByCategory = async (categorySlug: string): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/knowledge-base/by-category/${categorySlug}/`);
+ if (!response.ok) throw new Error('Failed to fetch articles by category');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching articles by category:', error);
+ throw error;
+ }
+};
+
+/**
+ * Mark an article as helpful or not helpful
+ */
+export const markArticleHelpful = async (slug: string, helpful: boolean): Promise<{ helpful_count: number; not_helpful_count: number }> => {
+ try {
+ const response = await fetch(`${BASE_URL}/knowledge-base/${slug}/mark-helpful/`, {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({ helpful }),
+ });
+ if (!response.ok) throw new Error('Failed to mark article helpful');
+ return await response.json();
+ } catch (error) {
+ console.error('Error marking article helpful:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch support settings
+ */
+export const getSupportSettings = async (): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/settings/`);
+ if (!response.ok) throw new Error('Failed to fetch support settings');
+ const data = await response.json();
+ // Handle paginated response
+ return data.results || data;
+ } catch (error) {
+ console.error('Error fetching support settings:', error);
+ throw error;
+ }
+};
+
+/**
+ * Fetch a specific support setting by name
+ */
+export const getSupportSetting = async (settingName: string): Promise => {
+ try {
+ const response = await fetch(`${BASE_URL}/settings/${settingName}/`);
+ if (!response.ok) throw new Error('Failed to fetch support setting');
+ return await response.json();
+ } catch (error) {
+ console.error('Error fetching support setting:', error);
+ throw error;
+ }
+};
+
diff --git a/gnx-react/lib/hooks/useCareer.ts b/gnx-react/lib/hooks/useCareer.ts
new file mode 100644
index 00000000..bb8ecd97
--- /dev/null
+++ b/gnx-react/lib/hooks/useCareer.ts
@@ -0,0 +1,95 @@
+import { useState, useEffect } from 'react';
+import { careerService, JobPosition } from '../api/careerService';
+
+/**
+ * Custom hook to fetch all job positions
+ */
+export const useJobs = () => {
+ const [jobs, setJobs] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchJobs = async () => {
+ try {
+ setLoading(true);
+ const data = await careerService.getAllJobs();
+ setJobs(data);
+ setError(null);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'An error occurred');
+ console.error('Error fetching jobs:', err);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchJobs();
+ }, []);
+
+ return { jobs, loading, error };
+};
+
+/**
+ * Custom hook to fetch a single job by slug
+ */
+export const useJob = (slug: string) => {
+ const [job, setJob] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ if (!slug) {
+ setLoading(false);
+ return;
+ }
+
+ const fetchJob = async () => {
+ try {
+ setLoading(true);
+ const data = await careerService.getJobBySlug(slug);
+ setJob(data);
+ setError(null);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'An error occurred');
+ console.error('Error fetching job:', err);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchJob();
+ }, [slug]);
+
+ return { job, loading, error };
+};
+
+/**
+ * Custom hook to fetch featured jobs
+ */
+export const useFeaturedJobs = () => {
+ const [jobs, setJobs] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchFeaturedJobs = async () => {
+ try {
+ setLoading(true);
+ const data = await careerService.getFeaturedJobs();
+ setJobs(data);
+ setError(null);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : 'An error occurred');
+ console.error('Error fetching featured jobs:', err);
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchFeaturedJobs();
+ }, []);
+
+ return { jobs, loading, error };
+};
+
diff --git a/gnx-react/lib/hooks/useSupport.ts b/gnx-react/lib/hooks/useSupport.ts
new file mode 100644
index 00000000..d23523fd
--- /dev/null
+++ b/gnx-react/lib/hooks/useSupport.ts
@@ -0,0 +1,251 @@
+import { useState, useEffect } from 'react';
+import {
+ getTicketCategories,
+ getTicketStatuses,
+ getTicketPriorities,
+ getKnowledgeBaseCategories,
+ getKnowledgeBaseArticles,
+ getFeaturedArticles,
+ getKnowledgeBaseArticle,
+ getArticlesByCategory,
+ TicketCategory,
+ TicketStatus,
+ TicketPriority,
+ KnowledgeBaseCategory,
+ KnowledgeBaseArticle
+} from '../api/supportService';
+
+/**
+ * Hook to fetch ticket categories
+ */
+export const useTicketCategories = () => {
+ const [categories, setCategories] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchCategories = async () => {
+ try {
+ setLoading(true);
+ const data = await getTicketCategories();
+ setCategories(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch ticket categories');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchCategories();
+ }, []);
+
+ return { categories, loading, error };
+};
+
+/**
+ * Hook to fetch ticket statuses
+ */
+export const useTicketStatuses = () => {
+ const [statuses, setStatuses] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchStatuses = async () => {
+ try {
+ setLoading(true);
+ const data = await getTicketStatuses();
+ setStatuses(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch ticket statuses');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchStatuses();
+ }, []);
+
+ return { statuses, loading, error };
+};
+
+/**
+ * Hook to fetch ticket priorities
+ */
+export const useTicketPriorities = () => {
+ const [priorities, setPriorities] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchPriorities = async () => {
+ try {
+ setLoading(true);
+ const data = await getTicketPriorities();
+ setPriorities(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch ticket priorities');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchPriorities();
+ }, []);
+
+ return { priorities, loading, error };
+};
+
+/**
+ * Hook to fetch knowledge base categories
+ */
+export const useKnowledgeBaseCategories = () => {
+ const [categories, setCategories] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchCategories = async () => {
+ try {
+ setLoading(true);
+ const data = await getKnowledgeBaseCategories();
+ setCategories(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch knowledge base categories');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchCategories();
+ }, []);
+
+ return { categories, loading, error };
+};
+
+/**
+ * Hook to fetch knowledge base articles with optional search
+ */
+export const useKnowledgeBaseArticles = (search?: string) => {
+ const [articles, setArticles] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchArticles = async () => {
+ try {
+ setLoading(true);
+ const data = await getKnowledgeBaseArticles(search);
+ setArticles(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch knowledge base articles');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchArticles();
+ }, [search]);
+
+ return { articles, loading, error };
+};
+
+/**
+ * Hook to fetch featured knowledge base articles
+ */
+export const useFeaturedArticles = () => {
+ const [articles, setArticles] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ const fetchArticles = async () => {
+ try {
+ setLoading(true);
+ const data = await getFeaturedArticles();
+ setArticles(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch featured articles');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchArticles();
+ }, []);
+
+ return { articles, loading, error };
+};
+
+/**
+ * Hook to fetch a single knowledge base article
+ */
+export const useKnowledgeBaseArticle = (slug: string | null) => {
+ const [article, setArticle] = useState(null);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ if (!slug) {
+ setLoading(false);
+ return;
+ }
+
+ const fetchArticle = async () => {
+ try {
+ setLoading(true);
+ const data = await getKnowledgeBaseArticle(slug);
+ setArticle(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch knowledge base article');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchArticle();
+ }, [slug]);
+
+ return { article, loading, error };
+};
+
+/**
+ * Hook to fetch articles by category
+ */
+export const useArticlesByCategory = (categorySlug: string | null) => {
+ const [articles, setArticles] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState(null);
+
+ useEffect(() => {
+ if (!categorySlug) {
+ setLoading(false);
+ return;
+ }
+
+ const fetchArticles = async () => {
+ try {
+ setLoading(true);
+ const data = await getArticlesByCategory(categorySlug);
+ setArticles(data);
+ setError(null);
+ } catch (err: any) {
+ setError(err.message || 'Failed to fetch articles by category');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ fetchArticles();
+ }, [categorySlug]);
+
+ return { articles, loading, error };
+};
+
diff --git a/gnx-react/public/styles/main.scss b/gnx-react/public/styles/main.scss
index db6c4316..bdc31722 100644
--- a/gnx-react/public/styles/main.scss
+++ b/gnx-react/public/styles/main.scss
@@ -28,6 +28,7 @@
// page-specific styles
@use "./pages/about-enterprise";
+@use "./pages/support-center";
// responsive styles (CSS-only files) - using @use for modern Sass
@use "./responsive";
diff --git a/gnx-react/public/styles/pages/_support-center.scss b/gnx-react/public/styles/pages/_support-center.scss
new file mode 100644
index 00000000..09ae3953
--- /dev/null
+++ b/gnx-react/public/styles/pages/_support-center.scss
@@ -0,0 +1,1403 @@
+/* ====
+| --------- Support Center Page Styles ---------
+| ==== */
+
+// Support Hero Section
+.support-hero {
+ padding: 150px 0 100px;
+ margin-top: 80px; // Account for fixed header
+ min-height: 70vh;
+ background: linear-gradient(135deg,
+ #0f172a 0%,
+ #1e293b 25%,
+ #334155 50%,
+ #1e293b 75%,
+ #0f172a 100%);
+ position: relative;
+ overflow: hidden;
+ display: flex;
+ align-items: center;
+ color: var(--white);
+
+ // Animated Background Elements
+ .hero-background {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ z-index: 1;
+ overflow: hidden;
+
+ // Floating Support Icons
+ .floating-tech {
+ position: absolute;
+ opacity: 0.15;
+ animation: float 6s ease-in-out infinite;
+
+ i {
+ font-size: 3rem;
+ background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+
+ &.tech-1 {
+ top: 15%;
+ left: 8%;
+ animation-delay: 0s;
+ }
+
+ &.tech-2 {
+ top: 60%;
+ left: 15%;
+ animation-delay: 2s;
+ }
+
+ &.tech-3 {
+ top: 30%;
+ right: 12%;
+ animation-delay: 1s;
+ }
+
+ &.tech-4 {
+ bottom: 20%;
+ right: 20%;
+ animation-delay: 3s;
+ }
+
+ &.tech-5 {
+ top: 45%;
+ left: 50%;
+ animation-delay: 4s;
+ opacity: 0.08;
+ }
+
+ &.tech-6 {
+ bottom: 30%;
+ left: 25%;
+ animation-delay: 5s;
+ opacity: 0.1;
+ }
+ }
+
+ // Grid Pattern
+ .grid-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background-image:
+ linear-gradient(rgba(59, 130, 246, 0.03) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(59, 130, 246, 0.03) 1px, transparent 1px);
+ background-size: 50px 50px;
+ animation: gridMove 20s linear infinite;
+ }
+
+ // Animated Gradient Orbs
+ .gradient-orb {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(60px);
+ opacity: 0.2;
+ animation: orbFloat 15s ease-in-out infinite;
+
+ &.orb-1 {
+ width: 300px;
+ height: 300px;
+ top: -100px;
+ left: -100px;
+ background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
+ animation-delay: 0s;
+ }
+
+ &.orb-2 {
+ width: 250px;
+ height: 250px;
+ bottom: -80px;
+ right: -80px;
+ background: linear-gradient(135deg, #10b981 0%, #3b82f6 100%);
+ animation-delay: 5s;
+ }
+
+ &.orb-3 {
+ width: 200px;
+ height: 200px;
+ top: 50%;
+ right: 10%;
+ background: linear-gradient(135deg, #f59e0b 0%, #ef4444 100%);
+ animation-delay: 10s;
+ }
+ }
+
+ // Video Overlay
+ .video-overlay {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: linear-gradient(135deg,
+ rgba(15, 23, 42, 0.8) 0%,
+ rgba(30, 41, 59, 0.7) 25%,
+ rgba(51, 65, 85, 0.6) 50%,
+ rgba(30, 41, 59, 0.7) 75%,
+ rgba(15, 23, 42, 0.8) 100%);
+ z-index: 1;
+ }
+ }
+
+ // Main Container
+ .container {
+ position: relative;
+ z-index: 2;
+ }
+
+ &__content {
+ position: relative;
+ z-index: 2;
+ }
+
+ &__title {
+ font-size: 3.5rem;
+ font-weight: 700;
+ color: #ffffff;
+ margin-bottom: 1.5rem;
+ line-height: 1.2;
+
+ @media (max-width: 991px) {
+ font-size: 2.5rem;
+ }
+
+ @media (max-width: 767px) {
+ font-size: 2rem;
+ }
+ }
+
+ &__subtitle {
+ font-size: 1.25rem;
+ color: rgba(255, 255, 255, 0.8);
+ margin-bottom: 3rem;
+ max-width: 700px;
+ margin-left: auto;
+ margin-right: auto;
+
+ @media (max-width: 991px) {
+ font-size: 1.1rem;
+ }
+ }
+
+ &__features {
+ margin-top: 4rem;
+
+ .feature-item {
+ text-align: center;
+ padding: 2rem;
+ background: rgba(255, 255, 255, 0.05);
+ border-radius: 12px;
+ backdrop-filter: blur(10px);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: translateY(-5px);
+ background: rgba(255, 255, 255, 0.08);
+ border-color: rgba(218, 165, 32, 0.3);
+ }
+
+ .feature-icon {
+ width: 70px;
+ height: 70px;
+ margin: 0 auto 1.5rem;
+ background: linear-gradient(135deg, var(--enterprise-gold), #d4af37);
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.8rem;
+ color: #0f172a;
+ }
+
+ h3 {
+ font-size: 1.25rem;
+ color: #ffffff;
+ margin-bottom: 0.5rem;
+ font-weight: 600;
+ }
+
+ p {
+ color: rgba(255, 255, 255, 0.7);
+ margin: 0;
+ font-size: 0.95rem;
+ }
+ }
+ }
+}
+
+// Support Center Content
+.support-center-content {
+ padding: 80px 0;
+ background: linear-gradient(180deg, #f8fafc 0%, #ffffff 100%);
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, var(--enterprise-gold), transparent);
+ }
+}
+
+// Support Tabs
+.support-tabs {
+ &__nav {
+ list-style: none;
+ padding: 0;
+ margin: 0 0 3.5rem 0;
+ display: flex;
+ gap: 0.5rem;
+ border-bottom: 3px solid #e2e8f0;
+ flex-wrap: wrap;
+ background: linear-gradient(180deg, #f8fafc 0%, transparent 100%);
+ padding: 0.5rem;
+ border-radius: 12px 12px 0 0;
+
+ li {
+ button {
+ background: transparent;
+ border: none;
+ padding: 1.125rem 2.25rem;
+ font-size: 1.05rem;
+ font-weight: 600;
+ color: #64748b;
+ cursor: pointer;
+ position: relative;
+ transition: all 0.3s ease;
+ border-bottom: 4px solid transparent;
+ border-radius: 8px 8px 0 0;
+ letter-spacing: 0.3px;
+
+ &:hover {
+ color: var(--enterprise-gold);
+ background: rgba(218, 165, 32, 0.05);
+ }
+
+ i {
+ font-size: 1.25rem;
+ margin-right: 0.5rem;
+ vertical-align: middle;
+ }
+ }
+
+ &.active button {
+ color: #0f172a;
+ background: linear-gradient(180deg, rgba(218, 165, 32, 0.1) 0%, transparent 100%);
+ border-bottom-color: var(--enterprise-gold);
+ font-weight: 700;
+ }
+ }
+
+ @media (max-width: 991px) {
+ flex-direction: column;
+ gap: 0.5rem;
+ border-bottom: none;
+
+ li button {
+ text-align: left;
+ width: 100%;
+ padding: 1rem;
+ border-radius: 8px;
+ border-bottom: none;
+ }
+
+ li.active button {
+ background: rgba(218, 165, 32, 0.1);
+ }
+ }
+ }
+
+ &__content {
+ background: #ffffff;
+ border-radius: 16px;
+ padding: 3.5rem;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04);
+ border: 1px solid rgba(218, 165, 32, 0.1);
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ background: linear-gradient(90deg, var(--enterprise-gold), #d4af37, var(--enterprise-gold));
+ border-radius: 16px 16px 0 0;
+ }
+
+ @media (max-width: 991px) {
+ padding: 2.5rem 1.75rem;
+ }
+ }
+}
+
+// Form Header
+.form-header {
+ margin-bottom: 3rem;
+ padding-bottom: 1.5rem;
+ border-bottom: 3px solid var(--enterprise-gold);
+ position: relative;
+
+ &::after {
+ content: '';
+ position: absolute;
+ bottom: -3px;
+ left: 0;
+ width: 120px;
+ height: 3px;
+ background: linear-gradient(90deg, var(--enterprise-gold), transparent);
+ }
+
+ h2 {
+ font-size: 2.25rem;
+ font-weight: 700;
+ color: #0f172a;
+ margin-bottom: 0.75rem;
+ letter-spacing: -0.5px;
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+ }
+
+ p {
+ color: #475569;
+ font-size: 1.1rem;
+ margin: 0;
+ font-weight: 400;
+ }
+}
+
+// Create Ticket Form
+.create-ticket-form {
+ .form-section-title {
+ font-size: 1.4rem;
+ font-weight: 700;
+ color: #0f172a;
+ margin-bottom: 2rem;
+ padding-bottom: 0.75rem;
+ padding-left: 1rem;
+ border-left: 4px solid var(--enterprise-gold);
+ background: linear-gradient(90deg, rgba(218, 165, 32, 0.05), transparent);
+ padding-top: 0.5rem;
+ padding-right: 1rem;
+ position: relative;
+
+ &::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ width: 4px;
+ background: linear-gradient(180deg, var(--enterprise-gold), #d4af37);
+ }
+ }
+
+ .form-group {
+ margin-bottom: 1.5rem;
+
+ label {
+ display: block;
+ font-weight: 600;
+ color: #1e293b;
+ margin-bottom: 0.625rem;
+ font-size: 0.975rem;
+ letter-spacing: 0.2px;
+ text-transform: uppercase;
+ font-size: 0.85rem;
+
+ .required {
+ color: #ef4444;
+ margin-left: 0.25rem;
+ font-size: 1.1em;
+ }
+ }
+
+ .form-control {
+ width: 100%;
+ padding: 0.875rem 1.125rem;
+ border: 2px solid #cbd5e1;
+ border-radius: 10px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+ background: #ffffff;
+ font-family: inherit;
+ color: #1e293b;
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+
+ &:hover {
+ border-color: #94a3b8;
+ }
+
+ &:focus {
+ outline: none;
+ border-color: var(--enterprise-gold);
+ box-shadow: 0 0 0 4px rgba(218, 165, 32, 0.1), 0 2px 8px rgba(0, 0, 0, 0.08);
+ background: #ffffff;
+ }
+
+ &::placeholder {
+ color: #94a3b8;
+ font-style: italic;
+ }
+
+ &:disabled {
+ background: #f1f5f9;
+ color: #94a3b8;
+ cursor: not-allowed;
+ }
+ }
+
+ select.form-control {
+ cursor: pointer;
+ appearance: none;
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
+ background-repeat: no-repeat;
+ background-position: right 1rem center;
+ padding-right: 2.5rem;
+ }
+
+ textarea.form-control {
+ resize: vertical;
+ min-height: 140px;
+ line-height: 1.6;
+ font-family: inherit;
+ }
+
+ input[type="email"],
+ input[type="tel"] {
+ &:invalid:not(:placeholder-shown) {
+ border-color: #f59e0b;
+ }
+ }
+ }
+
+ .btn {
+ padding: 1rem 2.5rem;
+ font-size: 1.05rem;
+ font-weight: 600;
+ border-radius: 10px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ box-shadow: 0 4px 12px rgba(218, 165, 32, 0.3);
+ transition: all 0.3s ease;
+
+ &:hover:not(:disabled) {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(218, 165, 32, 0.4);
+ }
+
+ &:active:not(:disabled) {
+ transform: translateY(0);
+ }
+
+ &:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ i {
+ font-size: 1.1em;
+ }
+ }
+}
+
+// Ticket Success
+.ticket-success {
+ text-align: center;
+ padding: 4rem 2rem;
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.05) 0%, rgba(16, 185, 129, 0.02) 100%);
+ border-radius: 16px;
+ border: 2px solid rgba(16, 185, 129, 0.2);
+
+ .success-icon {
+ font-size: 5.5rem;
+ color: #10b981;
+ margin-bottom: 1.5rem;
+ animation: scaleIn 0.5s ease;
+ filter: drop-shadow(0 4px 12px rgba(16, 185, 129, 0.3));
+ }
+
+ h3 {
+ font-size: 2.25rem;
+ font-weight: 700;
+ color: #0f172a;
+ margin-bottom: 1.25rem;
+ letter-spacing: -0.5px;
+ }
+
+ .ticket-number {
+ font-size: 1.3rem;
+ color: #475569;
+ margin-bottom: 1.5rem;
+ padding: 1.5rem;
+ background: #ffffff;
+ border-radius: 12px;
+ display: inline-block;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
+
+ strong {
+ color: var(--enterprise-gold);
+ font-size: 1.6rem;
+ font-family: 'Courier New', monospace;
+ font-weight: 700;
+ letter-spacing: 1px;
+ display: block;
+ margin-top: 0.5rem;
+ }
+ }
+
+ .ticket-info {
+ color: #64748b;
+ margin-bottom: 2.5rem;
+ max-width: 600px;
+ margin-left: auto;
+ margin-right: auto;
+ font-size: 1.05rem;
+ line-height: 1.7;
+ }
+
+ .btn {
+ padding: 1rem 2.5rem;
+ font-size: 1.05rem;
+ font-weight: 600;
+ box-shadow: 0 4px 12px rgba(218, 165, 32, 0.3);
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 6px 20px rgba(218, 165, 32, 0.4);
+ }
+ }
+}
+
+@keyframes scaleIn {
+ from {
+ transform: scale(0);
+ opacity: 0;
+ }
+ to {
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+// Ticket Status Check
+.ticket-status-check {
+ .status-search-form {
+ margin-bottom: 2rem;
+
+ .search-input-group {
+ display: flex;
+ gap: 1rem;
+ max-width: 700px;
+ margin: 0 auto;
+
+ @media (max-width: 767px) {
+ flex-direction: column;
+ }
+
+ .form-control {
+ flex: 1;
+ padding: 1rem 1.25rem;
+ border: 2px solid #e2e8f0;
+ border-radius: 8px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+
+ &:focus {
+ outline: none;
+ border-color: var(--enterprise-gold);
+ box-shadow: 0 0 0 3px rgba(218, 165, 32, 0.1);
+ }
+ }
+
+ .btn {
+ white-space: nowrap;
+ }
+ }
+ }
+}
+
+// Ticket Details
+.ticket-details {
+ margin-top: 2rem;
+ border: 1px solid #e2e8f0;
+ border-radius: 12px;
+ overflow: hidden;
+ background: #ffffff;
+
+ .ticket-header {
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+ padding: 2rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 1rem;
+
+ .ticket-number {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #ffffff;
+ font-family: monospace;
+ }
+
+ .ticket-status-badge {
+ padding: 0.5rem 1.25rem;
+ border-radius: 50px;
+ color: #ffffff;
+ font-weight: 600;
+ font-size: 0.95rem;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+ }
+ }
+
+ .ticket-info {
+ padding: 2rem;
+
+ h3 {
+ font-size: 1.75rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 1.5rem;
+ }
+
+ h4 {
+ font-size: 1.25rem;
+ font-weight: 600;
+ color: #334155;
+ margin-bottom: 1rem;
+ margin-top: 2rem;
+ }
+ }
+
+ .ticket-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.5rem;
+ margin-bottom: 2rem;
+ padding-bottom: 1.5rem;
+ border-bottom: 1px solid #e2e8f0;
+
+ .meta-item {
+ display: flex;
+ align-items: center;
+ color: #64748b;
+ font-size: 0.95rem;
+
+ i {
+ color: var(--enterprise-gold);
+ margin-right: 0.5rem;
+ }
+
+ strong {
+ color: #334155;
+ margin-right: 0.5rem;
+ }
+
+ .priority-badge {
+ padding: 0.25rem 0.75rem;
+ border-radius: 50px;
+ color: #ffffff;
+ font-size: 0.85rem;
+ font-weight: 600;
+ }
+ }
+ }
+
+ .ticket-description {
+ p {
+ color: #475569;
+ line-height: 1.7;
+ white-space: pre-wrap;
+ }
+ }
+}
+
+// Ticket Messages
+.ticket-messages {
+ margin-top: 2rem;
+ padding-top: 2rem;
+ border-top: 1px solid #e2e8f0;
+
+ .messages-list {
+ margin-top: 1.5rem;
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+ }
+
+ .message-item {
+ background: #f8fafc;
+ border-radius: 8px;
+ padding: 1.5rem;
+ border-left: 3px solid var(--enterprise-gold);
+
+ .message-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 1rem;
+ flex-wrap: wrap;
+ gap: 0.5rem;
+
+ .message-author {
+ font-weight: 600;
+ color: #1e293b;
+ display: flex;
+ align-items: center;
+
+ i {
+ color: var(--enterprise-gold);
+ font-size: 1.2rem;
+ }
+ }
+
+ .message-date {
+ color: #64748b;
+ font-size: 0.9rem;
+ }
+ }
+
+ .message-content {
+ color: #475569;
+ line-height: 1.6;
+ white-space: pre-wrap;
+ }
+ }
+}
+
+// Ticket Timeline
+.ticket-timeline {
+ margin-top: 2rem;
+ padding-top: 2rem;
+ border-top: 1px solid #e2e8f0;
+
+ .timeline-list {
+ margin-top: 1.5rem;
+ position: relative;
+ padding-left: 2rem;
+
+ &::before {
+ content: '';
+ position: absolute;
+ left: 0.375rem;
+ top: 0;
+ bottom: 0;
+ width: 2px;
+ background: #e2e8f0;
+ }
+ }
+
+ .timeline-item {
+ position: relative;
+ margin-bottom: 1.5rem;
+
+ .timeline-icon {
+ position: absolute;
+ left: -2rem;
+ top: 0;
+ width: 20px;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ i {
+ color: var(--enterprise-gold);
+ font-size: 0.6rem;
+ }
+ }
+
+ .timeline-content {
+ .timeline-description {
+ color: #334155;
+ font-weight: 500;
+ margin-bottom: 0.25rem;
+ }
+
+ .timeline-date {
+ color: #64748b;
+ font-size: 0.85rem;
+ }
+ }
+
+ &:last-child {
+ margin-bottom: 0;
+ }
+ }
+}
+
+// Knowledge Base
+.knowledge-base {
+ .kb-search-form {
+ margin-bottom: 3rem;
+
+ .search-input-group {
+ position: relative;
+ max-width: 700px;
+ margin: 0 auto;
+
+ .search-icon {
+ position: absolute;
+ left: 1.25rem;
+ top: 50%;
+ transform: translateY(-50%);
+ color: #94a3b8;
+ font-size: 1.2rem;
+ }
+
+ .form-control {
+ width: 100%;
+ padding: 1rem 3.5rem 1rem 3.5rem;
+ border: 2px solid #e2e8f0;
+ border-radius: 50px;
+ font-size: 1rem;
+ transition: all 0.3s ease;
+
+ &:focus {
+ outline: none;
+ border-color: var(--enterprise-gold);
+ box-shadow: 0 0 0 3px rgba(218, 165, 32, 0.1);
+ }
+
+ &::placeholder {
+ color: #94a3b8;
+ }
+ }
+
+ .clear-search {
+ position: absolute;
+ right: 1.25rem;
+ top: 50%;
+ transform: translateY(-50%);
+ background: none;
+ border: none;
+ color: #94a3b8;
+ font-size: 1.2rem;
+ cursor: pointer;
+ padding: 0.5rem;
+ transition: color 0.3s ease;
+
+ &:hover {
+ color: #64748b;
+ }
+ }
+ }
+ }
+
+ .kb-categories {
+ margin-bottom: 3rem;
+
+ h3 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 1.5rem;
+ }
+
+ .category-card {
+ background: #ffffff;
+ border-radius: 12px;
+ padding: 1.5rem;
+ border-left: 4px solid var(--enterprise-gold);
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+ cursor: pointer;
+ transition: all 0.3s ease;
+ height: 100%;
+
+ &:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
+ }
+
+ .category-icon {
+ font-size: 2rem;
+ margin-bottom: 1rem;
+ }
+
+ .category-content {
+ h4 {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 0.5rem;
+ }
+
+ p {
+ color: #64748b;
+ font-size: 0.95rem;
+ margin-bottom: 1rem;
+ line-height: 1.5;
+ }
+
+ .category-meta {
+ .article-count {
+ color: var(--enterprise-gold);
+ font-weight: 600;
+ font-size: 0.9rem;
+ }
+ }
+ }
+ }
+ }
+
+ .kb-articles {
+ .articles-header {
+ margin-bottom: 2rem;
+
+ h3 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 0.5rem;
+ }
+
+ .search-info {
+ color: #64748b;
+ font-size: 0.95rem;
+ }
+ }
+
+ .articles-list {
+ display: flex;
+ flex-direction: column;
+ gap: 1.5rem;
+ }
+
+ .article-item {
+ background: #ffffff;
+ border-radius: 12px;
+ padding: 2rem;
+ border: 1px solid #e2e8f0;
+ cursor: pointer;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1);
+ border-color: var(--enterprise-gold);
+ }
+
+ .article-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: start;
+ margin-bottom: 1rem;
+ gap: 1rem;
+
+ h4 {
+ font-size: 1.4rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin: 0;
+ flex: 1;
+ }
+
+ .featured-badge {
+ background: linear-gradient(135deg, var(--enterprise-gold), #d4af37);
+ color: #0f172a;
+ padding: 0.4rem 1rem;
+ border-radius: 50px;
+ font-size: 0.85rem;
+ font-weight: 600;
+ white-space: nowrap;
+ }
+ }
+
+ .article-summary {
+ color: #64748b;
+ line-height: 1.6;
+ margin-bottom: 1rem;
+ }
+
+ .article-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.5rem;
+ margin-bottom: 1rem;
+ padding-bottom: 1rem;
+ border-bottom: 1px solid #e2e8f0;
+
+ .article-category,
+ .article-stats {
+ color: #64748b;
+ font-size: 0.9rem;
+ display: flex;
+ align-items: center;
+
+ i {
+ color: var(--enterprise-gold);
+ }
+ }
+ }
+
+ .article-read-more {
+ background: none;
+ border: none;
+ color: var(--enterprise-gold);
+ font-weight: 600;
+ font-size: 1rem;
+ cursor: pointer;
+ padding: 0;
+ transition: all 0.3s ease;
+
+ &:hover {
+ transform: translateX(5px);
+ }
+
+ i {
+ transition: transform 0.3s ease;
+ }
+ }
+ }
+ }
+}
+
+// Knowledge Base Article Modal
+.kb-modal-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.7);
+ z-index: 9999;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 2rem;
+ animation: fadeIn 0.3s ease;
+
+ @media (max-width: 767px) {
+ padding: 1rem;
+ }
+}
+
+.kb-modal {
+ background: #ffffff;
+ border-radius: 12px;
+ max-width: 900px;
+ width: 100%;
+ max-height: 90vh;
+ overflow-y: auto;
+ position: relative;
+ animation: slideUp 0.3s ease;
+
+ .modal-close {
+ position: sticky;
+ top: 1rem;
+ right: 1rem;
+ float: right;
+ background: #ef4444;
+ border: none;
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ color: #ffffff;
+ font-size: 1.2rem;
+ cursor: pointer;
+ transition: all 0.3s ease;
+ z-index: 10;
+
+ &:hover {
+ background: #dc2626;
+ transform: rotate(90deg);
+ }
+ }
+
+ .modal-content {
+ padding: 3rem;
+
+ @media (max-width: 991px) {
+ padding: 2rem;
+ }
+
+ @media (max-width: 767px) {
+ padding: 1.5rem;
+ }
+ }
+
+ .article-header {
+ margin-bottom: 2rem;
+
+ .featured-badge {
+ background: linear-gradient(135deg, var(--enterprise-gold), #d4af37);
+ color: #0f172a;
+ padding: 0.4rem 1rem;
+ border-radius: 50px;
+ font-size: 0.85rem;
+ font-weight: 600;
+ display: inline-block;
+ margin-bottom: 1rem;
+ }
+
+ h2 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 1rem;
+ line-height: 1.2;
+
+ @media (max-width: 991px) {
+ font-size: 2rem;
+ }
+
+ @media (max-width: 767px) {
+ font-size: 1.75rem;
+ }
+ }
+
+ .article-meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 1.5rem;
+ color: #64748b;
+ font-size: 0.95rem;
+
+ .meta-item {
+ display: flex;
+ align-items: center;
+
+ i {
+ color: var(--enterprise-gold);
+ }
+ }
+ }
+ }
+
+ .article-body {
+ margin-bottom: 2rem;
+
+ .article-content {
+ color: #475569;
+ line-height: 1.8;
+ font-size: 1.05rem;
+
+ h1, h2, h3, h4, h5, h6 {
+ color: #1e293b;
+ margin-top: 2rem;
+ margin-bottom: 1rem;
+ font-weight: 700;
+ }
+
+ p {
+ margin-bottom: 1.5rem;
+ }
+
+ ul, ol {
+ margin-bottom: 1.5rem;
+ padding-left: 2rem;
+
+ li {
+ margin-bottom: 0.5rem;
+ }
+ }
+
+ code {
+ background: #f1f5f9;
+ padding: 0.2rem 0.5rem;
+ border-radius: 4px;
+ font-family: monospace;
+ color: #ef4444;
+ }
+
+ pre {
+ background: #0f172a;
+ color: #f8fafc;
+ padding: 1.5rem;
+ border-radius: 8px;
+ overflow-x: auto;
+ margin-bottom: 1.5rem;
+
+ code {
+ background: none;
+ color: inherit;
+ padding: 0;
+ }
+ }
+ }
+ }
+
+ .article-footer {
+ border-top: 2px solid #e2e8f0;
+ padding-top: 2rem;
+
+ .article-feedback {
+ h4 {
+ font-size: 1.25rem;
+ font-weight: 700;
+ color: #1e293b;
+ margin-bottom: 1rem;
+ }
+
+ .feedback-thanks {
+ color: #10b981;
+ font-weight: 600;
+ font-size: 1.05rem;
+ }
+
+ .feedback-buttons {
+ display: flex;
+ gap: 1rem;
+ flex-wrap: wrap;
+ }
+ }
+ }
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ }
+ to {
+ opacity: 1;
+ }
+}
+
+@keyframes slideUp {
+ from {
+ transform: translateY(50px);
+ opacity: 0;
+ }
+ to {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+// Loading and Empty States
+.loading-state {
+ text-align: center;
+ padding: 3rem 2rem;
+ color: #64748b;
+
+ .spinner-border {
+ width: 3rem;
+ height: 3rem;
+ border-width: 0.3rem;
+ border-color: var(--enterprise-gold);
+ border-right-color: transparent;
+ margin-bottom: 1rem;
+ }
+
+ p {
+ margin-top: 1rem;
+ font-size: 1.05rem;
+ }
+}
+
+.empty-state {
+ text-align: center;
+ padding: 4rem 2rem;
+
+ .empty-icon {
+ font-size: 4rem;
+ color: #cbd5e1;
+ margin-bottom: 1.5rem;
+ }
+
+ h4 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #334155;
+ margin-bottom: 0.75rem;
+ }
+
+ p {
+ color: #64748b;
+ max-width: 500px;
+ margin: 0 auto;
+ }
+}
+
+.error-state {
+ text-align: center;
+ padding: 3rem 2rem;
+
+ i {
+ font-size: 4rem;
+ color: #ef4444;
+ margin-bottom: 1rem;
+ }
+
+ h3 {
+ font-size: 1.5rem;
+ font-weight: 700;
+ color: #334155;
+ margin-bottom: 0.75rem;
+ }
+
+ p {
+ color: #64748b;
+ }
+}
+
+// Utility classes
+.section-padding {
+ padding: 80px 0;
+
+ @media (max-width: 991px) {
+ padding: 60px 0;
+ }
+
+ @media (max-width: 767px) {
+ padding: 40px 0;
+ }
+}
+
+// Keyframe Animations for Hero Background
+@keyframes float {
+ 0%, 100% {
+ transform: translateY(0) translateX(0);
+ }
+ 25% {
+ transform: translateY(-20px) translateX(10px);
+ }
+ 50% {
+ transform: translateY(-10px) translateX(-10px);
+ }
+ 75% {
+ transform: translateY(-15px) translateX(5px);
+ }
+}
+
+@keyframes gridMove {
+ 0% {
+ transform: translateY(0);
+ }
+ 100% {
+ transform: translateY(50px);
+ }
+}
+
+@keyframes orbFloat {
+ 0%, 100% {
+ transform: translate(0, 0) scale(1);
+ }
+ 33% {
+ transform: translate(30px, -30px) scale(1.1);
+ }
+ 66% {
+ transform: translate(-20px, 20px) scale(0.9);
+ }
+}
+
diff --git a/gnx-react/venv/bin/celery b/gnx-react/venv/bin/celery
index f1a39a43..68b9d124 100755
--- a/gnx-react/venv/bin/celery
+++ b/gnx-react/venv/bin/celery
@@ -1,8 +1,7 @@
#!/home/gnx/Desktop/GNX-WEB/gnx-react/venv/bin/python3
-# -*- coding: utf-8 -*-
-import re
import sys
from celery.__main__ import main
if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ if sys.argv[0].endswith('.exe'):
+ sys.argv[0] = sys.argv[0][:-4]
sys.exit(main())
diff --git a/gnx-react/venv/bin/django-admin b/gnx-react/venv/bin/django-admin
index 0157f6ef..27d46b75 100755
--- a/gnx-react/venv/bin/django-admin
+++ b/gnx-react/venv/bin/django-admin
@@ -1,8 +1,7 @@
#!/home/gnx/Desktop/GNX-WEB/gnx-react/venv/bin/python3
-# -*- coding: utf-8 -*-
-import re
import sys
from django.core.management import execute_from_command_line
if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ if sys.argv[0].endswith('.exe'):
+ sys.argv[0] = sys.argv[0][:-4]
sys.exit(execute_from_command_line())
diff --git a/gnx-react/venv/bin/sqlformat b/gnx-react/venv/bin/sqlformat
index b74fa83b..8cea9c67 100755
--- a/gnx-react/venv/bin/sqlformat
+++ b/gnx-react/venv/bin/sqlformat
@@ -1,8 +1,7 @@
#!/home/gnx/Desktop/GNX-WEB/gnx-react/venv/bin/python3
-# -*- coding: utf-8 -*-
-import re
import sys
from sqlparse.__main__ import main
if __name__ == '__main__':
- sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
+ if sys.argv[0].endswith('.exe'):
+ sys.argv[0] = sys.argv[0][:-4]
sys.exit(main())
diff --git a/gnx-react/venv/lib/python3.12/site-packages/Django-4.2.7.dist-info/RECORD b/gnx-react/venv/lib/python3.12/site-packages/Django-4.2.7.dist-info/RECORD
index 29f8e1bb..62f12145 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/Django-4.2.7.dist-info/RECORD
+++ b/gnx-react/venv/lib/python3.12/site-packages/Django-4.2.7.dist-info/RECORD
@@ -1,4 +1,4 @@
-../../../bin/django-admin,sha256=L5jtZEgc2NRgQQEtL0lqHFe3SHIfvpoPDKdws-MTQlI,299
+../../../bin/django-admin,sha256=yi1IVJ-Bv_FlLGxWIwk33OHehGDN81LWqAeQHh1bvUE,272
Django-4.2.7.dist-info/AUTHORS,sha256=XnaAZyQQxFczdrn4l-fUAmmysNq_u0CVJ5wKIYN4ynw,41362
Django-4.2.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
Django-4.2.7.dist-info/LICENSE,sha256=uEZBXRtRTpwd_xSiLeuQbXlLxUbKYSn5UKGM0JHipmk,1552
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc
index 2c0d4bce..98c2976a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BdfFontFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc
index 8b699358..f85e871b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc
index e203ae3f..60321f3c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc
index 22996502..b95be946 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc
index 7175cf0c..8f4b17cd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ContainerIO.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc
index bf5a9ac1..cdf5ebc1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/CurImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc
index eed42fb5..6198cfef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc
index 15dccf09..558da104 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc
index e20dcc8d..441588e5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc
index faf8e8d5..e5a6cc68 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ExifTags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc
index 02086ed3..ea617fc8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc
index fab6356e..a0d19e14 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FliImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc
index 541125c2..a10a4a72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FontFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc
index 485670c5..ef47b998 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc
index fe0b8e44..bf7611d6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc
index d171e61d..48550b3b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc
index 890a7cf2..2668a8f3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GdImageFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc
index 3c5c51c6..ba868d7a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GifImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc
index 0cd759d5..69b59643 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpGradientFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc
index 4b072955..c0369831 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc
index 2c3583a8..1ddfda82 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc
index 24abfab8..2905e177 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc
index ec6759be..64b74b88 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc
index 1cb73908..cc412948 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc
index 81761190..0c0c08ed 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc
index 6f349ff2..63a6cb36 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Image.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc
index 57aad57b..a8b5be82 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageChops.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc
index 417d0873..f44d7b52 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageCms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc
index de271b87..cc24ecde 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageColor.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc
index c56fb3dd..4c764cb3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc
index a6892790..86b34aca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageDraw2.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc
index af315a22..5a2aa5a8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageEnhance.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc
index 0667262a..2d3047dc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc
index c159556c..b7a5af34 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFilter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc
index b6714a57..bd897195 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageFont.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc
index accbcdf2..8e8a7888 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageGrab.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc
index ddb86caf..eeb6c978 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMath.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc
index 5e63b99d..107fb4f6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMode.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc
index 3b1ebfab..cd5c3515 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageMorph.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc
index db95d3cd..f9b05dd0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageOps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc
index ba11d005..5ad74893 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePalette.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc
index 692fabe6..ef02c33c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImagePath.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc
index b48b40c9..6d06da56 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageQt.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc
index 396f17ed..96382aca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageSequence.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc
index fff4665b..860985f1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageShow.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc
index 5794cc64..69b2219a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageStat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc
index 48ef97b1..1f349fb4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTk.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc
index 232c9eac..4bdc5f73 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageTransform.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc
index 3932ee1b..dbcdb2c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImageWin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc
index ceeced54..bc0485f3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc
index 66a41e4e..7e71b4c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc
index 2a0db99e..a76f5afd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc
index ae323324..128031af 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc
index 81d3f65b..97ac82e7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/JpegPresets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc
index cd2201d0..f9fdb918 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc
index ccff14df..77dfb62d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MicImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc
index 7855016d..2a87194d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc
index 83a126bb..37a40731 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc
index 466b6e9c..bcd85513 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/MspImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc
index 634351a8..d04c116d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PSDraw.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc
index 49b26757..37dfa1a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PaletteFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc
index 3357edb8..4258a8cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc
index 46591aa7..02f82e36 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc
index 6bbcad2d..719fa2c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcfFontFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc
index 23e0cd10..d69f26cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc
index 20635ce0..25b69315 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc
index 6c4c3750..db71eb3f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PdfParser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc
index 1fccbf74..1d0f9f9c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc
index 779c9a41..fd48458f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PngImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc
index 687e18ca..365e5119 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc
index a2a298e0..5426e5c2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PyAccess.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PyAccess.cpython-312.pyc
index d373e1d4..f9e06ad6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PyAccess.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/PyAccess.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc
index 15f016ce..de31181d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc
index beab7f84..b14526bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc
index 2a558fae..376498cd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc
index 16cc782e..b589867b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/SunImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc
index 094d9177..e99d9e9e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TarIO.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc
index 0507211e..b9414017 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc
index fd682f5b..69a9a9a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc
index 7eec8e19..1a497525 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/TiffTags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc
index 41142235..ab00264d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WalImageFile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc
index 24204e6f..0157b675 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc
index 2218eb6e..b9b1ecbd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc
index c9d54310..34277504 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc
index 28f5f700..b96f4470 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc
index 14390eb0..bf3c15e3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc
index 0d3f132f..587e1e94 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc
index 438e6e8f..7fcaac58 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc
index 74495eef..d843b2b6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_binary.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc
index 68446526..c730aae3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_deprecate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc
index e26e763d..56744b5e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_tkinter_finder.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc
index 3354c8ab..22fcd0cb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_util.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc
index 8d3e1397..d270cb66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/_version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc
index 8ac64ac8..588f9b32 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/PIL/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/click_plugins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/click_plugins.cpython-312.pyc
index 2c848b72..5d6e224f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/click_plugins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/click_plugins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/decouple.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/decouple.cpython-312.pyc
index 5d1c3e85..4f058065 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/decouple.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/decouple.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/inflection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/inflection.cpython-312.pyc
index 21acc648..5384f1f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/inflection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/inflection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc
index c8c4113a..ef6d7f92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/__pycache__/six.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc
index 837107a2..524ec068 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc
index 6b5f306a..6c94ed36 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/_distutils_hack/__pycache__/override.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc
index b994e71f..39527bb3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/_yaml/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/__init__.cpython-312.pyc
index 5ce6974b..43b0bac8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/abstract_channel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/abstract_channel.cpython-312.pyc
index ba1f0b20..200b945a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/abstract_channel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/abstract_channel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/basic_message.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/basic_message.cpython-312.pyc
index 7fd727f7..0f64e369 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/basic_message.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/basic_message.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/channel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/channel.cpython-312.pyc
index 84e66d4b..00dec096 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/channel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/channel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/connection.cpython-312.pyc
index 2f7a4660..f7213999 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/exceptions.cpython-312.pyc
index 0394233f..58846736 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/method_framing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/method_framing.cpython-312.pyc
index 2da37e4a..5919ccaf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/method_framing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/method_framing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/platform.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/platform.cpython-312.pyc
index a7e02e47..4bc26362 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/platform.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/platform.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/protocol.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/protocol.cpython-312.pyc
index 7769f4bf..1dd5e0de 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/protocol.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/protocol.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/sasl.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/sasl.cpython-312.pyc
index 01ce2ae3..e2811384 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/sasl.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/sasl.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/serialization.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/serialization.cpython-312.pyc
index d913335e..3014cbb3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/serialization.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/serialization.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/spec.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/spec.cpython-312.pyc
index 15766865..089a5d32 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/spec.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/spec.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/transport.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/transport.cpython-312.pyc
index 05b747e9..e090212d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/transport.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/transport.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/utils.cpython-312.pyc
index e8aabb4d..bb02689f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/amqp/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc
index 591c5303..3e3c737b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc
index 1ba47c61..362b7ad5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/compatibility.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc
index 18da3215..44e1c98a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/current_thread_executor.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc
index 1aaf0f85..6b7bda15 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/local.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/server.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/server.cpython-312.pyc
index 445525c9..8a063f87 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/server.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/server.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc
index 9b3a82c9..f3cc9aff 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/sync.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/testing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/testing.cpython-312.pyc
index 5cc52804..6b4883f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/testing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/testing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/timeout.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/timeout.cpython-312.pyc
index 27db2278..e052dd8c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/timeout.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/timeout.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc
index 496dc215..f6c01d58 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/typing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc
index 5a52ebe7..18feae10 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/asgiref/__pycache__/wsgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/__init__.cpython-312.pyc
index 9e0dbe06..c92fc78f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_ext.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_ext.cpython-312.pyc
index 087e9eea..0c097462 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_ext.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_ext.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_win.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_win.cpython-312.pyc
index ba65da78..68d2a064 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_win.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/_win.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/common.cpython-312.pyc
index c04b60d6..9fc9997f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/compat.cpython-312.pyc
index 9443c697..d0c2da45 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/connection.cpython-312.pyc
index 6f366389..fc8940c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/context.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/context.cpython-312.pyc
index e3ee41b1..a9a1036c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/context.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/context.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/einfo.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/einfo.cpython-312.pyc
index 4a4d76f2..a61ca257 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/einfo.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/einfo.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/exceptions.cpython-312.pyc
index 190f9f20..8500e58f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/forkserver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/forkserver.cpython-312.pyc
index 14cf32de..0a1eb89c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/forkserver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/forkserver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/heap.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/heap.cpython-312.pyc
index dc8fd71c..ec38be8d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/heap.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/heap.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/managers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/managers.cpython-312.pyc
index a3d8067d..46732984 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/managers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/managers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/pool.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/pool.cpython-312.pyc
index 59425b92..ef6ca474 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/pool.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/pool.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_fork.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_fork.cpython-312.pyc
index 3081845e..bc3d3afb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_fork.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_fork.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_forkserver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_forkserver.cpython-312.pyc
index 16fc15d4..6245e8d8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_forkserver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_forkserver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-312.pyc
index 5a0af6c0..33985c0f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_posix.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-312.pyc
index 9912135b..3ab4eea4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/popen_spawn_win32.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/process.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/process.cpython-312.pyc
index 18144a17..9a8a4269 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/process.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/process.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/queues.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/queues.cpython-312.pyc
index de9a2f82..e2e8534a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/queues.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/queues.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/reduction.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/reduction.cpython-312.pyc
index f8ec6736..8179820e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/reduction.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/reduction.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/resource_sharer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/resource_sharer.cpython-312.pyc
index 86c53729..1c8bd474 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/resource_sharer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/resource_sharer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/semaphore_tracker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/semaphore_tracker.cpython-312.pyc
index 5edb206e..7e1296ba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/semaphore_tracker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/semaphore_tracker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/sharedctypes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/sharedctypes.cpython-312.pyc
index 7fee02fb..73f4a326 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/sharedctypes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/sharedctypes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/spawn.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/spawn.cpython-312.pyc
index 3c6dfe77..470fb87d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/spawn.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/spawn.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/synchronize.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/synchronize.cpython-312.pyc
index 3d1267b4..3b89f6f4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/synchronize.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/synchronize.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/util.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/util.cpython-312.pyc
index bc093c36..cb05f779 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/util.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/__pycache__/util.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/__init__.cpython-312.pyc
index d70f9c74..326e593c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/connection.cpython-312.pyc
index 0ff7924e..6aed8644 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/billiard/dummy/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery-5.3.4.dist-info/RECORD b/gnx-react/venv/lib/python3.12/site-packages/celery-5.3.4.dist-info/RECORD
index 31f29c93..fb2f36da 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/celery-5.3.4.dist-info/RECORD
+++ b/gnx-react/venv/lib/python3.12/site-packages/celery-5.3.4.dist-info/RECORD
@@ -1,4 +1,4 @@
-../../../bin/celery,sha256=BnCgCpFDMj3bWDoA2MwFirqWdmgK8lfwd6OjW19pv3E,250
+../../../bin/celery,sha256=fEs2qnIxV_I89VeGRGU57NaMzVwm4L84mDJS8RhhOKA,223
celery-5.3.4.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
celery-5.3.4.dist-info/LICENSE,sha256=w1jN938ou6tQ1KdU4SMRgznBUjA0noK_Zkic7OOsCTo,2717
celery-5.3.4.dist-info/METADATA,sha256=VwAVQZ0Kl2NxLaXXqYf8PcnptX9fakvtAmI2xHeTqdo,21051
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__init__.cpython-312.pyc
index 259cb805..f38a9262 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__main__.cpython-312.pyc
index f0fb047d..4084db07 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/_state.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/_state.cpython-312.pyc
index 3bfdf580..1b0aece4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/_state.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/_state.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/beat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/beat.cpython-312.pyc
index 5d861a32..176801a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/beat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/beat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/bootsteps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/bootsteps.cpython-312.pyc
index e14580b5..520e9b67 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/bootsteps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/bootsteps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/canvas.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/canvas.cpython-312.pyc
index e67cbad3..3d57a768 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/canvas.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/canvas.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/exceptions.cpython-312.pyc
index 2038f73c..2b4d2cf8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/local.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/local.cpython-312.pyc
index 87505bfd..b3fa29b1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/local.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/local.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/platforms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/platforms.cpython-312.pyc
index 62ce8f0a..68116429 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/platforms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/platforms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/result.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/result.cpython-312.pyc
index 738ed3c4..58fe0dc3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/result.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/result.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/schedules.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/schedules.cpython-312.pyc
index 62894301..33dcaafa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/schedules.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/schedules.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/signals.cpython-312.pyc
index 16a6548a..07c93693 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/states.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/states.cpython-312.pyc
index 09cf1918..fc82d3c3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/states.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/__pycache__/states.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/__init__.cpython-312.pyc
index 02dbf0f3..2e37be14 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/amqp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/amqp.cpython-312.pyc
index 0cd5f576..520e2c5a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/amqp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/amqp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/annotations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/annotations.cpython-312.pyc
index a7d3f111..68ee49b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/annotations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/annotations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/autoretry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/autoretry.cpython-312.pyc
index afb46cb9..cbfa6fc9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/autoretry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/autoretry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/backends.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/backends.cpython-312.pyc
index 92c475bb..3782501c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/backends.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/backends.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/base.cpython-312.pyc
index 351ceb1c..aa4aef55 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/builtins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/builtins.cpython-312.pyc
index 253302dc..c73300e6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/builtins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/builtins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/control.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/control.cpython-312.pyc
index 573c54e3..56fbafe9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/control.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/control.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/defaults.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/defaults.cpython-312.pyc
index 30581055..28e266f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/defaults.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/defaults.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/events.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/events.cpython-312.pyc
index af5ca098..09de6bbd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/events.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/events.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/log.cpython-312.pyc
index 1c91284a..4a0c3754 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/registry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/registry.cpython-312.pyc
index 0ee802ae..4e487849 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/registry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/registry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/routes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/routes.cpython-312.pyc
index 4ceb2053..20b42999 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/routes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/routes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/task.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/task.cpython-312.pyc
index 05505d8a..731d7a95 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/task.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/task.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/trace.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/trace.cpython-312.pyc
index fd66adc2..6b0c8772 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/trace.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/trace.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/utils.cpython-312.pyc
index 128e7dc0..3edbdb1c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/app/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/__init__.cpython-312.pyc
index c54734db..e65241dd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/beat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/beat.cpython-312.pyc
index 29c9b8fc..f42db76f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/beat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/beat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/multi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/multi.cpython-312.pyc
index 502ee76a..a9ea97fb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/multi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/multi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/worker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/worker.cpython-312.pyc
index 24ef4218..a49aba27 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/worker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/apps/__pycache__/worker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/__init__.cpython-312.pyc
index 436349b8..9874c9c0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/arangodb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/arangodb.cpython-312.pyc
index 7492e45d..ce81c1aa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/arangodb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/arangodb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/asynchronous.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/asynchronous.cpython-312.pyc
index af1d986f..fe7c056c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/asynchronous.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/asynchronous.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/azureblockblob.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/azureblockblob.cpython-312.pyc
index 0e820020..1de58422 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/azureblockblob.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/azureblockblob.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/base.cpython-312.pyc
index 7a529c3a..47726e79 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cache.cpython-312.pyc
index d382e9a3..4ef7b569 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cassandra.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cassandra.cpython-312.pyc
index b304d9e9..38ab9dca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cassandra.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cassandra.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/consul.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/consul.cpython-312.pyc
index f2d8463c..480400b2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/consul.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/consul.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-312.pyc
index 4497ef4c..0d47d1fa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/cosmosdbsql.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchbase.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchbase.cpython-312.pyc
index 60cb6776..3653fefb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchbase.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchbase.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchdb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchdb.cpython-312.pyc
index 83d30ff0..fbc53cbe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchdb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/couchdb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/dynamodb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/dynamodb.cpython-312.pyc
index df8b3e79..f95a354f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/dynamodb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/dynamodb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/elasticsearch.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/elasticsearch.cpython-312.pyc
index 9b07ee72..46ee459b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/elasticsearch.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/elasticsearch.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/filesystem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/filesystem.cpython-312.pyc
index ca6d947b..aa39639d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/filesystem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/filesystem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/mongodb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/mongodb.cpython-312.pyc
index d0d32c3a..de87fbf0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/mongodb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/mongodb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/redis.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/redis.cpython-312.pyc
index 6432af98..469829d0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/redis.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/redis.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/rpc.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/rpc.cpython-312.pyc
index 97165e20..b03fc554 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/rpc.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/rpc.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/s3.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/s3.cpython-312.pyc
index 21e02d1c..3b281633 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/s3.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/__pycache__/s3.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/__init__.cpython-312.pyc
index 677a339c..180d03c4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/models.cpython-312.pyc
index 25904ae7..71f1ee5a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/session.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/session.cpython-312.pyc
index f5948646..634ebbaa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/session.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/backends/database/__pycache__/session.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/__init__.cpython-312.pyc
index 82eb435f..7e347375 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/amqp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/amqp.cpython-312.pyc
index eec71495..d5e4f843 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/amqp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/amqp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/base.cpython-312.pyc
index e71df512..d583157b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/beat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/beat.cpython-312.pyc
index 635f60df..154e3d84 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/beat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/beat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/call.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/call.cpython-312.pyc
index 7af33770..ea2402f8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/call.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/call.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/celery.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/celery.cpython-312.pyc
index 91311f07..5715eb12 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/celery.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/celery.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/control.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/control.cpython-312.pyc
index 755f1045..882a80b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/control.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/control.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/events.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/events.cpython-312.pyc
index 271ee3c9..32b58546 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/events.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/events.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/graph.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/graph.cpython-312.pyc
index 6d762dc7..7e96046d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/graph.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/graph.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/list.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/list.cpython-312.pyc
index e1e46dfd..e89b4e38 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/list.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/list.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/logtool.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/logtool.cpython-312.pyc
index 6aaa005b..d9cf05af 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/logtool.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/logtool.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/migrate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/migrate.cpython-312.pyc
index ec441ce2..9d5a12e3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/migrate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/migrate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/multi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/multi.cpython-312.pyc
index af12a63c..12095c4d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/multi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/multi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/purge.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/purge.cpython-312.pyc
index a34e3573..4b4ce92a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/purge.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/purge.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/result.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/result.cpython-312.pyc
index b922552a..b369dbc2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/result.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/result.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/shell.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/shell.cpython-312.pyc
index 5a98e1fb..13ff8a34 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/shell.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/shell.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/upgrade.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/upgrade.cpython-312.pyc
index 47a9356a..8d1f6baf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/upgrade.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/upgrade.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/worker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/worker.cpython-312.pyc
index d453ccbb..184cf7cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/worker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/bin/__pycache__/worker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/__init__.cpython-312.pyc
index 9644424c..924a5b92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/asynpool.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/asynpool.cpython-312.pyc
index eae76bc4..0f77072f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/asynpool.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/asynpool.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/base.cpython-312.pyc
index 70b26ee2..f1c93bec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/eventlet.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/eventlet.cpython-312.pyc
index e06dd8cc..334d8b11 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/eventlet.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/eventlet.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/gevent.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/gevent.cpython-312.pyc
index 5f7fbcd5..69a8a6b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/gevent.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/gevent.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/prefork.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/prefork.cpython-312.pyc
index 6d0be795..54869188 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/prefork.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/prefork.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/solo.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/solo.cpython-312.pyc
index c49a5592..d696eaa4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/solo.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/solo.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/thread.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/thread.cpython-312.pyc
index 4dbfa9ae..726d9f40 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/thread.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/concurrency/__pycache__/thread.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/__init__.cpython-312.pyc
index a4ed9c98..93c7a471 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/abortable.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/abortable.cpython-312.pyc
index c496d07b..6120db6d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/abortable.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/abortable.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/migrate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/migrate.cpython-312.pyc
index 68a905ca..68510310 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/migrate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/migrate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/pytest.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/pytest.cpython-312.pyc
index 2571e829..5316cd0b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/pytest.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/pytest.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/rdb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/rdb.cpython-312.pyc
index 5a388f3c..0fd6e479 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/rdb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/rdb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/sphinx.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/sphinx.cpython-312.pyc
index a2a2c025..313e43aa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/sphinx.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/__pycache__/sphinx.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-312.pyc
index 374fe57c..b71f63e0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/app.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/app.cpython-312.pyc
index 9f02ec5d..f6ab3fa6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/app.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/app.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/manager.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/manager.cpython-312.pyc
index eb63aee7..a5c1b5f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/manager.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/manager.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-312.pyc
index 17f67dee..bbab9c00 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/mocks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-312.pyc
index f91519d1..95955f35 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/tasks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/worker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/worker.cpython-312.pyc
index 05dfff0f..b45524a1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/worker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/contrib/testing/__pycache__/worker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/__init__.cpython-312.pyc
index d4cc8086..c5023dcb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/cursesmon.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/cursesmon.cpython-312.pyc
index 8ef45c63..ba546d92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/cursesmon.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/cursesmon.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dispatcher.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dispatcher.cpython-312.pyc
index 938cca96..de8f8ce0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dispatcher.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dispatcher.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dumper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dumper.cpython-312.pyc
index 66bfe738..38a25b43 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dumper.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/dumper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/event.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/event.cpython-312.pyc
index 2d199ec5..f8d8eb82 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/event.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/event.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/receiver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/receiver.cpython-312.pyc
index 4c76b7a4..0576e41d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/receiver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/receiver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/snapshot.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/snapshot.cpython-312.pyc
index e396b792..d9cd0597 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/snapshot.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/snapshot.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/state.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/state.cpython-312.pyc
index 1f4c4712..e4890401 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/state.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/events/__pycache__/state.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/__init__.cpython-312.pyc
index fafc96e1..8c28d1ce 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/django.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/django.cpython-312.pyc
index 56832f8f..56af3e59 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/django.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/fixups/__pycache__/django.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/__init__.cpython-312.pyc
index 1d1bed9d..b567d59a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/app.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/app.cpython-312.pyc
index 25567774..345e299f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/app.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/app.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/base.cpython-312.pyc
index cd24eee3..49890d85 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/default.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/default.cpython-312.pyc
index f9c39ea7..bef1408b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/default.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/loaders/__pycache__/default.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/__init__.cpython-312.pyc
index 249f02fe..14158df7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/certificate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/certificate.cpython-312.pyc
index 42a7370a..df487947 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/certificate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/certificate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/key.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/key.cpython-312.pyc
index 0e42ffb7..535f2a8f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/key.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/key.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/serialization.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/serialization.cpython-312.pyc
index 81ea88bc..d53600e7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/serialization.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/serialization.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/utils.cpython-312.pyc
index 4f1faba7..a7c00026 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/security/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/__init__.cpython-312.pyc
index 75122dc5..b251e62f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/abstract.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/abstract.cpython-312.pyc
index c8eb01b3..87c6d2a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/abstract.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/abstract.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/collections.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/collections.cpython-312.pyc
index 2692e978..9dad32c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/collections.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/collections.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/debug.cpython-312.pyc
index 5a429b99..825193d6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/deprecated.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/deprecated.cpython-312.pyc
index dba9c410..a82a1eb4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/deprecated.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/deprecated.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/functional.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/functional.cpython-312.pyc
index 428b06e0..9f019113 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/functional.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/functional.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/graph.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/graph.cpython-312.pyc
index c82c30c1..13c69814 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/graph.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/graph.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/imports.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/imports.cpython-312.pyc
index 04cd5616..00e83d25 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/imports.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/imports.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/iso8601.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/iso8601.cpython-312.pyc
index 3bdb3ce8..142e1b77 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/iso8601.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/iso8601.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/log.cpython-312.pyc
index b00956f0..98570faf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/nodenames.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/nodenames.cpython-312.pyc
index 2b0a9245..b47de912 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/nodenames.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/nodenames.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/objects.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/objects.cpython-312.pyc
index 7112a843..57b81584 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/objects.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/objects.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/saferepr.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/saferepr.cpython-312.pyc
index abd83984..d3f2249d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/saferepr.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/saferepr.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/serialization.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/serialization.cpython-312.pyc
index 07a37411..38c88f39 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/serialization.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/serialization.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/sysinfo.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/sysinfo.cpython-312.pyc
index d11a41ad..b4b752c8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/sysinfo.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/sysinfo.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/term.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/term.cpython-312.pyc
index 0444bf61..8dd915b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/term.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/term.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/text.cpython-312.pyc
index 2aa0b8ef..753a471e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/threads.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/threads.cpython-312.pyc
index 5cd145f3..d54ada33 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/threads.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/threads.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/time.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/time.cpython-312.pyc
index fe1c04e3..7565d3c6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/time.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/time.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/timer2.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/timer2.cpython-312.pyc
index 397a190a..c8ff5f86 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/timer2.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/__pycache__/timer2.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-312.pyc
index 4d4b837c..396d1a52 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-312.pyc
index 3614b739..735e4fd7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/dispatch/__pycache__/signal.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/static/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/static/__pycache__/__init__.cpython-312.pyc
index bebfe707..21f3c781 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/utils/static/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/utils/static/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/__init__.cpython-312.pyc
index 3c4806e2..8504960c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/autoscale.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/autoscale.cpython-312.pyc
index 5000a7dd..16d9c3e1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/autoscale.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/autoscale.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/components.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/components.cpython-312.pyc
index 35a24e64..f222e282 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/components.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/components.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/control.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/control.cpython-312.pyc
index 307f4b76..7c15ca72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/control.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/control.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/heartbeat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/heartbeat.cpython-312.pyc
index 37573f35..9c411cfd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/heartbeat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/heartbeat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/loops.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/loops.cpython-312.pyc
index ba3ae05e..20ddb088 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/loops.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/loops.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/pidbox.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/pidbox.cpython-312.pyc
index d7e5fa16..2026aba4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/pidbox.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/pidbox.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/request.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/request.cpython-312.pyc
index 154a1604..ec1abf75 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/request.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/request.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/state.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/state.cpython-312.pyc
index e27f75c4..d5be4f0f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/state.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/state.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/strategy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/strategy.cpython-312.pyc
index 08ea928d..06d7ec89 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/strategy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/strategy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/worker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/worker.cpython-312.pyc
index b88110fa..2043764a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/worker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/__pycache__/worker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-312.pyc
index d12c16e5..5e273f09 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/agent.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/agent.cpython-312.pyc
index 91ccb16f..54cafd7b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/agent.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/agent.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/connection.cpython-312.pyc
index 0458c4f4..8ca2fb88 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-312.pyc
index a0b0089a..e652f690 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/consumer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/control.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/control.cpython-312.pyc
index 08cd8d76..206bb560 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/control.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/control.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/events.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/events.cpython-312.pyc
index 7cc356d7..3bce2234 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/events.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/events.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-312.pyc
index f62dc79d..dc4a6787 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/gossip.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/heart.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/heart.cpython-312.pyc
index 493aab51..09526874 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/heart.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/heart.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-312.pyc
index c4b762df..19b99a24 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/mingle.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-312.pyc
index de8e9648..2d339df9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/celery/worker/consumer/__pycache__/tasks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc
index 50add522..c1d8e775 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc
index 90d13044..8311410a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc
index 4bbabfa7..f70e55f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_termui_impl.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc
index 0122cd92..29425c19 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_textwrap.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc
index de13823e..267f1492 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc
index 67d6f56b..79c41907 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/_winconsole.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc
index 763cb106..b4bd3a11 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/core.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc
index 8ac26ebe..f09586d7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/decorators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc
index 1cc56f76..9ae36ca6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc
index eea9585c..b8204599 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/formatting.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc
index 94c08a0b..862e5d61 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/globals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc
index 57abbaea..bc200f75 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc
index f32bd249..280dc419 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/shell_completion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc
index a5f256ef..74980743 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/termui.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc
index 0ad2f883..36d38793 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/testing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc
index a67d4d7e..e9bfc187 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/types.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc
index 5110b12a..b7d69d61 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_didyoumean/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_didyoumean/__pycache__/__init__.cpython-312.pyc
index 7d874d5f..3043ed53 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_didyoumean/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_didyoumean/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/__init__.cpython-312.pyc
index 5ac8ca85..2f427ddf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/core.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/core.cpython-312.pyc
index 0fd7778f..4dcf3f99 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/core.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_plugins/__pycache__/core.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/__init__.cpython-312.pyc
index 87129f01..7415d2d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_completer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_completer.cpython-312.pyc
index 22084778..6a571c7b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_completer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_completer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_repl.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_repl.cpython-312.pyc
index a24c6c20..ade79eb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_repl.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/_repl.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/exceptions.cpython-312.pyc
index 8f08d866..528e44f3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/utils.cpython-312.pyc
index 0f471396..a0c088f6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/click_repl/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/__init__.cpython-312.pyc
index 47e75ff9..f1994721 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/apps.cpython-312.pyc
index d260b711..633b6fb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/checks.cpython-312.pyc
index 6a07aefc..7e118617 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/conf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/conf.cpython-312.pyc
index 5baf0d05..8a0f5dbc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/conf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/conf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/defaults.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/defaults.cpython-312.pyc
index f4726208..544e0be4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/defaults.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/defaults.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/middleware.cpython-312.pyc
index 88c76bd5..ebdfabec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/signals.cpython-312.pyc
index 7ea20fa0..95fd6ac8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/corsheaders/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/__init__.cpython-312.pyc
index d949cb81..28e3c7aa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_common.cpython-312.pyc
index dcdf685c..eaf69d2c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_version.cpython-312.pyc
index bedcfc55..7cdbcbd0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/_version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/easter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/easter.cpython-312.pyc
index d2f30f60..c659bb5b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/easter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/easter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/relativedelta.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/relativedelta.cpython-312.pyc
index 29aa3fad..537693a4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/relativedelta.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/relativedelta.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/rrule.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/rrule.cpython-312.pyc
index c7f0eeb0..dc929870 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/rrule.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/rrule.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/tzwin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/tzwin.cpython-312.pyc
index bda7a30c..41af6a91 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/tzwin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/tzwin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/utils.cpython-312.pyc
index 4c683ffc..34e4febe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc
index 68f0a51e..4774bb21 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc
index 9ac4c2a0..a7fca567 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/_parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc
index a31ba8eb..a11755e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/parser/__pycache__/isoparser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc
index 71dde220..7f5ade65 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_common.cpython-312.pyc
index ee30e76d..5f33dfb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_factories.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_factories.cpython-312.pyc
index 6b86874a..e36c4110 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_factories.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/_factories.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc
index 372bd84d..42336327 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/tz.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/win.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/win.cpython-312.pyc
index 07bc2b26..c4771040 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/win.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/tz/__pycache__/win.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-312.pyc
index 1bcd0785..06875a8a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-312.pyc
index 11f60fc5..58134770 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/dateutil/zoneinfo/__pycache__/rebuild.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc
index 0cc8627d..8a34b3fd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__main__.cpython-312.pyc
index d782ecc6..7ba7004d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc
index b924f14a..418c113d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/__pycache__/shortcuts.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc
index 3971d744..f328425c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc
index c1735233..cee3e444 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/config.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/registry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/registry.cpython-312.pyc
index 4aa813b5..bfc54b96 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/registry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/apps/__pycache__/registry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/__init__.cpython-312.pyc
index ff17ff71..965d64f4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc
index e96a60fc..5fba7ad5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/__pycache__/global_settings.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc
index 8d262ea3..97fbe108 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc
index e1ee8871..985ccd9c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc
index 219fa024..5e60b56c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-312.pyc
index 2ce6f1de..b0f698e9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc
index 2f2b7896..f3acf590 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ar_DZ/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc
index 02b8a31c..e6231f4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc
index d96de803..f26e45b6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/az/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc
index 13882d41..ca3e8d56 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc
index e287162d..c7d69d12 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bg/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc
index 52c393f7..e863cb97 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc
index efa97888..cd84c4cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bn/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc
index f18e1dfc..0a420d90 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc
index adc11a80..e9a5e4b6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/bs/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc
index 7e063688..aa854d5e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc
index 0b3887fb..05012e66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ca/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc
index 61145e47..64ca05db 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc
index e85586e9..1ca5deec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ckb/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-312.pyc
index 0d5b62af..d8e5d018 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc
index 241f0860..3f6c1620 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cs/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-312.pyc
index e98f1ece..26178e3b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc
index ad2997bc..bed873b4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/cy/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc
index 1ed8f09a..91879188 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc
index a21a0fcb..e937762b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/da/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc
index 4e39fca6..22b24fc4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc
index 72fc6897..b5842361 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc
index 586fba82..89ef7559 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc
index 5aa31577..5e7a1dba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/de_CH/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-312.pyc
index 0e6993e6..820faf71 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc
index c72d576b..be38e8e5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/el/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc
index 67a39a23..78b5f10c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc
index 567e552a..4716fa51 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc
index 159a878e..f4c4ba40 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc
index 68c65d1c..31e42faa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_AU/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc
index bb6268bd..9bcc9da0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc
index a0cb2012..1f2be944 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/en_GB/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-312.pyc
index 824f72dd..d12b61b9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc
index eaf1e91d..87e85173 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eo/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc
index 297e6451..3d389fb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc
index 85368c43..97fa97e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc
index cbbd7d4a..b27229a5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc
index bc66084f..71ab8c4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_AR/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc
index 289f97fa..fbd3b70d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc
index 5498386c..4f6c3aee 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_CO/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc
index ad679b3d..3f0e6a78 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc
index 7d7dd121..5541e864 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_MX/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc
index 39c2379d..ae3c28f4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc
index a09399b4..76f77af8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_NI/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc
index a2c5cf1a..32fe6a66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc
index f830ae3c..59093811 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/es_PR/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc
index be443f55..337ccbf8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc
index dd130e58..3613d09d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/et/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc
index 1623d91f..870b772e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc
index 379d316b..9e66dc24 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/eu/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc
index cf6c0f35..65da3fc1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc
index 8689d880..571f1815 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fa/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc
index 6e650c33..a9047c9c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc
index d09cbb92..99cfc9ff 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fi/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-312.pyc
index 1e150ef0..f2727268 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc
index 16c2345b..cc9321f2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fr/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc
index 5706af30..3e910e10 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc
index 4a14c959..ce70923f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/fy/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc
index 4e0b5212..a3324c3b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc
index 0df7884c..07b2d024 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ga/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc
index c7824b86..c9df9e7f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc
index cad40d47..1b0ea5d6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gd/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-312.pyc
index e4c8310f..797791a9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc
index 2163e74b..4a2cf465 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/gl/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc
index 4d73b4b8..462b0c59 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc
index 7ca57055..bf272035 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/he/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc
index d1cb6976..9b2926c3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc
index ade171b8..8e92e4e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hi/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-312.pyc
index 5f4f2c46..8eb8e22e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc
index 192c9427..f4923ebd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hr/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-312.pyc
index 54e4ab47..22a29fc2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc
index ccb06dd3..eaf01e0a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/hu/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc
index 83e441c9..0b70e64e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc
index 5c4d7aba..76df1613 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/id/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-312.pyc
index ff1af719..994c2c8b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc
index fb646596..969c3e4e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ig/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc
index 9e5a6a5a..02912bfc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc
index 9f5e8412..cea1e8de 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/is/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-312.pyc
index 5bda2d7f..4be5ce66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc
index a46549d0..8ba7e84d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/it/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-312.pyc
index b1194751..d4a35691 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc
index edf887bc..519acf76 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ja/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc
index d6b50303..e9d30d87 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc
index 7749db5d..aa9946a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ka/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-312.pyc
index d2058010..76cf00bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc
index 7e9f312b..2fc44250 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/km/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc
index 3ca4aaee..ef6cbcd1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc
index d6fccf0f..4cd2aa35 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/kn/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc
index d23bbf20..e8a701c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc
index 9482cf1b..25e92bef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ko/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc
index 0cdf4f10..309c8e05 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc
index 78807d54..e88880d2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ky/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc
index f82d1bc7..7d2ff510 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc
index 386e14fe..e67608cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lt/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-312.pyc
index 7833fdba..356141c8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc
index 6f4ef588..2505957d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/lv/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc
index c290c6e5..7cc06dc1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc
index 267ed1c7..da5c49f0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mk/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc
index 34b60be6..6027d189 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc
index aec26ada..cdb9451f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ml/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc
index c7f8d47c..06ab8823 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc
index d0a2cedc..65c47432 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/mn/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc
index eeba9d24..81746144 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc
index 5e163728..ad1687a9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ms/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc
index ac42d105..e07db463 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc
index 563aef42..1326daf1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nb/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc
index 984879b8..18884354 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc
index 2f92e4ab..b3af1f9c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nl/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc
index 6d590861..f8be7b29 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc
index 8be65f8a..42c0ab90 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/nn/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc
index 9b570d45..92732a48 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc
index 27ac83d8..9fd597c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pl/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-312.pyc
index e12c9176..e92cca9a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc
index ff3a9643..11a339e5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc
index bc9bf90d..0ef1d6ca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc
index e004df63..1a3a2710 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/pt_BR/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc
index e81b28c6..5803b0a9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc
index 2fcca38f..6d3d118c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ro/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc
index 382992f2..94550e46 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc
index d7bf57d5..e003f2d3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ru/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc
index 1112a516..44a897d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc
index 915aeaa8..8fc69425 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sk/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-312.pyc
index e3d82c99..6c8face4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc
index c8eb43fe..f30ca6ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sl/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-312.pyc
index 2e630114..ec309357 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc
index 28baaabd..2c7231ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sq/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-312.pyc
index c2188b81..6ea24aad 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc
index 95c2fa80..4b2199aa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc
index ec333061..ba438dc1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc
index 3bfc51a8..388eacd9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sr_Latn/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc
index 553bbf5b..99ce6202 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc
index a47086b0..25343da6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/sv/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc
index 0447a6de..bf07e4d7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc
index f5c919e0..1b0364ce 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/ta/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-312.pyc
index 2a4c2401..e49b0ab9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc
index 234e95f7..d3c47461 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/te/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc
index 756de6c0..4368c933 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc
index 66ecbdd5..8050a2c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tg/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc
index 08e39fce..ebf28ec2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc
index a9f1b8f7..fc48c663 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/th/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc
index 5b53f1cd..59e494a2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc
index 92e79a13..39ea596c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tk/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc
index eb6f70a0..ee4c7433 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc
index 0fb46d59..0ac46ae6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/tr/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc
index 4dd04f6f..dab2c7f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc
index 6e141f7e..0c095b53 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uk/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-312.pyc
index 71d55ef6..48423083 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc
index 7bc918dc..83a7936d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/uz/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc
index 11cb4b0e..cd1aadb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc
index 3fb68418..0894f8a3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/vi/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-312.pyc
index a3ec6049..d217d835 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc
index e674af81..436ae3e4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hans/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc
index 119d3ce5..6c6245cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc
index 86ba6a80..5c221a5f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/locale/zh_Hant/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc
index eb171147..f28c8138 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc
index 198b8907..d1f59ec3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/i18n.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/static.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/static.cpython-312.pyc
index ee01721c..519c1122 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/static.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/conf/urls/__pycache__/static.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc
index d2a35398..b1f53326 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc
index a6dce3c7..ed449cf0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc
index 262de216..49d68034 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/actions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc
index ea4e552d..6cf6181e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc
index 1cb068d4..651c47a4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc
index 10b2aeeb..90d319e3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/decorators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc
index 5ba2eb27..c649a9ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc
index b7e6de95..ab4bbd3a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/filters.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc
index 82d43aa9..75db90b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/forms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc
index ea7bc310..12138e5b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/helpers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc
index 61e0094e..3923c630 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/options.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/options.cpython-312.pyc
index 9c329138..99a320b2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/options.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/options.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc
index 8e672f49..de4ad544 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/sites.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/tests.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/tests.cpython-312.pyc
index e4806fe2..49fc656d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/tests.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/tests.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/utils.cpython-312.pyc
index 43dda355..c065605b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc
index 995020b7..efd9aae1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/__pycache__/widgets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-312.pyc
index 4a96bd44..9c121e26 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc
index 2befee4d..c040f33a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0002_logentry_remove_auto_add.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc
index 04db6e54..4bd29bec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/0003_logentry_add_action_flag_choices.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc
index 00480018..59ee1e22 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc
index 6b822ae0..231cb86d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc
index c37efa08..0b1d6afc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_list.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc
index 5a6d4380..122e8f5c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_modify.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc
index a28a5c9e..9889a5a9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/admin_urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc
index e0c4f6aa..9ee42fb4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc
index ab7ce859..a8395e72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/templatetags/__pycache__/log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc
index 4c2e8218..75abb488 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc
index 7a22a13d..1d327e0a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/autocomplete.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/decorators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/decorators.cpython-312.pyc
index 8f7ea679..2eaabc46 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/decorators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/decorators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc
index f0c7db04..5dd4f9f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admin/views/__pycache__/main.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/__init__.cpython-312.pyc
index bc22e347..cdc2fdd9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc
index 68a9c796..585da367 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/middleware.cpython-312.pyc
index 265d7f6d..583f4abd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc
index a002f81b..d4d503c0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/utils.cpython-312.pyc
index 6b35dc2f..a53d0723 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/views.cpython-312.pyc
index 93d43678..fbd86db0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/admindocs/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc
index 6b7b0a23..c5507f48 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc
index a20ad3b5..5340cde4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc
index 1bd28e87..ffb747e0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc
index c9d30ad8..1260993a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/backends.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc
index 1686cccc..256b60cb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/base_user.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc
index c618938e..7bc4e0b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc
index 9cc51111..61958f57 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/context_processors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc
index fc06d894..d08b3c43 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/decorators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc
index 05701b17..23da8911 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/forms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc
index 55f0be99..1f95182a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/hashers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/middleware.cpython-312.pyc
index 32939df2..112aab2e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc
index 093e8d8e..f8a74229 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc
index fa0791bb..678f51c4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc
index d9e85bc3..504c83cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/password_validation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc
index 1e1744e5..5164961d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc
index ab981269..4fc0e326 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/tokens.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc
index 85c3acfe..ca03ca72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc
index 668ef982..7c754b20 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/validators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc
index 02a856a3..5ddfae21 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc
index 722f54aa..cb46d994 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc
index 01a19789..17700cf5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/handlers/__pycache__/modwsgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc
index 5a884fa1..702f9d68 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc
index d772f93c..be9a0d90 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc
index cbe771d5..6ade274c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/changepassword.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc
index bc135305..a096ea45 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/management/commands/__pycache__/createsuperuser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0001_initial.cpython-312.pyc
index d81741d6..365033f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc
index 912dcf1f..fdb47293 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0002_alter_permission_name_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc
index ec33e3bd..4355b7b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0003_alter_user_email_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-312.pyc
index 5fd3b70e..7e0dd2cd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0004_alter_user_username_opts.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc
index 4442799b..c3887f55 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0005_alter_user_last_login_null.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc
index 058d6b74..0291d768 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0006_require_contenttypes_0002.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc
index 4159f58d..0b4a2f09 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0007_alter_validators_add_error_messages.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc
index 3d1ca477..b501a7c4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0008_alter_user_username_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc
index 22510498..39c29037 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0009_alter_user_last_name_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc
index 2f899a42..53ff5bf9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0010_alter_group_name_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-312.pyc
index b0843041..172cf84b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0011_update_proxy_permissions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc
index ffe56254..a1c2d679 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/0012_alter_user_first_name_max_length.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc
index cebd0487..7eba25dc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/auth/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc
index c154e650..66c283db 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc
index 6e29aebe..69b0e549 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc
index a071dbdb..5dc773f9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc
index 371b0bb7..9b459c10 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc
index 3edeaefd..b22144d8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc
index 920b0adc..c58d5616 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/forms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc
index 74fe90e4..b2008754 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc
index cb4834af..f6e53528 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/__pycache__/__init__.cpython-312.pyc
index 90408fb2..42a8e8e4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc
index 101dd331..23dcad97 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-312.pyc
index 9afad811..85b58070 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/management/commands/__pycache__/remove_stale_contenttypes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc
index d2ac1de9..6e95bb50 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc
index eb71c4b9..8240d697 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/0002_remove_content_type_name.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-312.pyc
index bd33acb9..19d9394b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/contenttypes/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc
index 8b2a9f05..6c82291f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc
index cfd385d7..3dbc7d56 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc
index 9db769d6..8a951463 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc
index 75b19698..81272a1e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/forms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/middleware.cpython-312.pyc
index 363c185a..f737049a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/models.cpython-312.pyc
index 5d895d61..ac57fe5b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/sitemaps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/sitemaps.cpython-312.pyc
index a8319a04..8458b427 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/sitemaps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/sitemaps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc
index 5cd2c129..8b96be22 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/views.cpython-312.pyc
index 7e6201ac..5c9d212e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc
index f316ae1d..89e2ee25 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc
index 07098a4d..d759266c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc
index fc3e6bbc..0368dadc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc
index 0e91126b..9bcfe770 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/flatpages/templatetags/__pycache__/flatpages.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc
index 97fcc028..6dd6cf24 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc
index 522b1016..a6b88ee8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc
index 5b23fcd2..c3b73939 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/feeds.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geometry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geometry.cpython-312.pyc
index ded65d85..217fd319 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geometry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/geometry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc
index ddcab097..eb86901e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/measure.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc
index 12cc6a6e..f0491375 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/ptr.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/shortcuts.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/shortcuts.cpython-312.pyc
index 2d39653b..45ba2e18 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/shortcuts.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/shortcuts.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/views.cpython-312.pyc
index ef644a1e..3fb01fc5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/__init__.cpython-312.pyc
index 8fcd3360..6b41bb28 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc
index 0d12e38c..10113548 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/options.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/widgets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/widgets.cpython-312.pyc
index b1ac2b2b..5d195ea1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/widgets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/admin/__pycache__/widgets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc
index 30154f13..cfea4af4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc
index 778476a8..2cc4630f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc
index da1fe0a5..f27902fc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc
index ea19d962..fc20a4aa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc
index 72e35923..b56cceff 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/adapter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc
index 907adc58..994da188 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/models.cpython-312.pyc
index 388d1825..1e91490d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc
index 5fbaf060..13ee0418 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/base/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc
index 869a0959..28d018c6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc
index 77a7b094..96f49a66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc
index 5c4f5ad5..afe2cf00 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc
index 500f24d0..198af355 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc
index 1bcf8ba2..f8a063ac 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc
index 24cfa098..4587df7d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/mysql/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-312.pyc
index 4d04cb9c..b66745d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc
index 2da54668..677b0b22 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/adapter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc
index 814f8177..fd6747df 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc
index 79466cac..420e87ca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc
index 5afcdb11..fecfb163 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc
index 5c8ae8d8..92800c4b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc
index 85ea5b73..4dd8a23a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc
index d56999d1..1c631c2f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/oracle/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc
index 9d947871..6c042565 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc
index 9103f978..4c3c4fe2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/adapter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc
index 3c7b189e..3f5e75b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc
index b41feb6b..27b1d84d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/const.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc
index e8a0bf12..144a98a5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc
index 161bdf26..b59a6c3c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-312.pyc
index 77c87e6a..a592ce3d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc
index bb484d9d..676d8687 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-312.pyc
index 62964f32..1d80c7dc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/pgraster.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-312.pyc
index 5e2ca9e2..e86c3180 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/postgis/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc
index 9ce850d9..38a0accc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc
index 9c701139..7b5354d4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/adapter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc
index 4323203d..e1898901 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-312.pyc
index 7b6e1fef..e6c9fa1d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-312.pyc
index e576b9e9..56091cac 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc
index 1f62b443..8b4e68d6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc
index 711498c6..f27e4551 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc
index 483c678f..e6568126 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-312.pyc
index 8d626865..f6d451eb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/backends/spatialite/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc
index 065b34fd..329388a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc
index c3db914e..fc7acbd3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/aggregates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc
index 59a68f6b..a8e5a93a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/functions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/functions.cpython-312.pyc
index 984f3bec..761783de 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/functions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/functions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/lookups.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/lookups.cpython-312.pyc
index 7fbcf30d..bc99e438 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/lookups.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/lookups.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc
index 5a22357c..78eeefea 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/__pycache__/proxy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc
index 7011f539..0d154fde 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc
index d8bf1466..20c5a7c6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/db/models/sql/__pycache__/conversion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc
index b3a1629b..58241c13 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc
index 9b1ae6a2..187865df 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/widgets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/widgets.cpython-312.pyc
index 424942b4..f2a5df1e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/widgets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/forms/__pycache__/widgets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/__init__.cpython-312.pyc
index a3ec182c..37a76c16 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc
index 16e6bf51..c5e2c613 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/datasource.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/datasource.cpython-312.pyc
index 2bf998e6..e52a6031 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/datasource.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/datasource.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc
index 83691fea..a073e603 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/driver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc
index 4aeb4305..7c047986 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/envelope.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/error.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/error.cpython-312.pyc
index 628c7eed..5383d785 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/error.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/error.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc
index c4fdc237..0bee4d6e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/feature.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc
index e694144c..a417449c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/field.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geometries.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geometries.cpython-312.pyc
index 9990dd25..a41459b0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geometries.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geometries.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc
index fd957466..00b1bd82 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/geomtype.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/layer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/layer.cpython-312.pyc
index 682230e7..dce0dace 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/layer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/layer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/libgdal.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/libgdal.cpython-312.pyc
index d8373b93..9d1109f0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/libgdal.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/libgdal.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/srs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/srs.cpython-312.pyc
index 08047ae6..8d116981 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/srs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/__pycache__/srs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc
index 92aaa7f8..d5a0e247 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc
index 815b53ad..7a6693a5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/ds.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc
index 3388f4ba..1d0d9bfd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/errcheck.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-312.pyc
index 66f41a17..e973cac1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/generation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc
index 0eec089a..5f11e1ce 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/geom.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-312.pyc
index 3c7ee28d..f9dca820 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/raster.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc
index 27999719..1986c70e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/prototypes/__pycache__/srs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc
index 5ef70108..d5210025 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc
index f891ef7a..51d8f4cd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/band.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc
index 5633fa50..a8aefd01 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc
index 5ad3e8e6..67040553 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/const.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc
index 5a3aab3c..f8df2e74 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/gdal/raster/__pycache__/source.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/__init__.cpython-312.pyc
index e0a49161..13516e32 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/base.cpython-312.pyc
index d4c8b69f..6dc7123b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/resources.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/resources.cpython-312.pyc
index b980bbe5..4dd0f40a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/resources.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geoip2/__pycache__/resources.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc
index 7a410d96..b0f783e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/base.cpython-312.pyc
index cb0369be..a28e6ffb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/collections.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/collections.cpython-312.pyc
index f0973073..d149e6cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/collections.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/collections.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc
index 434edc1c..b0445b92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/coordseq.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/error.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/error.cpython-312.pyc
index 9724d852..c9079ad8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/error.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/error.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc
index c029c44d..5d05a830 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/factory.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc
index 30135a8b..d8cc1205 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/geometry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/io.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/io.cpython-312.pyc
index fbd54121..06a11b35 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/io.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/io.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc
index 3c3c1cf2..3962aca9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/libgeos.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc
index 87dfe755..494c5ba2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/linestring.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc
index ed5ef059..663627fd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/mutable_list.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/point.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/point.cpython-312.pyc
index dc56e1fd..61129b35 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/point.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/point.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc
index 53b27509..c54aad8b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/polygon.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc
index 98fc460f..03428d11 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/__pycache__/prepared.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc
index 9f68d76b..3961af62 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc
index b4330b1c..ec4e14e6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/coordseq.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc
index 54c4eeb5..eb608004 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/errcheck.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc
index c1c4a145..8752d22b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/geom.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc
index b5b86ba4..9872939a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/io.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc
index 6c89f23a..7f334b5d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/misc.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-312.pyc
index 66ab0674..09b87af3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/predicates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc
index ae8518da..7be12335 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/prepared.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc
index 4e806474..b1486d89 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/threadsafe.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc
index 5d7c57d8..527d541a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/geos/prototypes/__pycache__/topology.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/__pycache__/__init__.cpython-312.pyc
index a5cea573..bc5e0ffa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc
index dd000b37..343d548b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc
index 8acf2469..d54b57a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/inspectdb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc
index 6cb792b8..2e0ad6f6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/management/commands/__pycache__/ogrinspect.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc
index 70433566..71354b7f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc
index 736edf12..11d936bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/serializers/__pycache__/geojson.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc
index 04732ab4..61a2f1cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc
index 04fa98f3..2c68fdff 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/kml.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc
index bf06e6ae..60556044 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/sitemaps/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/__init__.cpython-312.pyc
index d24aad25..90f1f3ea 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc
index 58f49fea..7f0d0740 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/layermapping.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc
index ae2f8b03..873cbbaa 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinfo.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc
index 284a8e6d..8ed7d873 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/ogrinspect.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/srs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/srs.cpython-312.pyc
index 6757896d..6b2440a8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/srs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/gis/utils/__pycache__/srs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/__init__.cpython-312.pyc
index dbbec11a..66d35811 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc
index 4b736117..354e518f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc
index 8749e788..8e510d53 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc
index 228719df..c4a650f0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/humanize/templatetags/__pycache__/humanize.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc
index 188f1510..933288b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc
index 8f47b235..77625b8c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/api.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc
index 0a4da19b..7e8b37f7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc
index e8e5f7e5..b6f2fdf4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/constants.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc
index 77169a59..2b007ccc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/context_processors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc
index b8fe8244..9f2d1550 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc
index 477930a0..51f7d8ea 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/views.cpython-312.pyc
index cf8d3919..135214b4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc
index 424e802e..772420d5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc
index 8f06c527..41e60f24 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc
index 2b7ebc89..7e83566c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/cookie.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc
index a5cd6877..d116a41d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/fallback.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/session.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/session.cpython-312.pyc
index 8f381423..c0db24c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/session.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/messages/storage/__pycache__/session.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc
index dedb8da1..730abe31 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc
index 35e593e4..f4982270 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/constraints.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/constraints.cpython-312.pyc
index eb670d08..ab822ca5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/constraints.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/constraints.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/expressions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/expressions.cpython-312.pyc
index b3d39651..d78a2901 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/expressions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/expressions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc
index 1507ae50..9bcb917d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/functions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc
index aa40b16f..09efe00b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/indexes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/lookups.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/lookups.cpython-312.pyc
index 07383c9f..b6b4632c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/lookups.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/lookups.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc
index 536eaf99..9919da7c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/search.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/search.cpython-312.pyc
index ad5c31ba..feb80a4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/search.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/search.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc
index 1f930ae3..47490769 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/serializers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc
index c41446a3..849c5770 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/utils.cpython-312.pyc
index 2ba33451..3e0ef8d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc
index 1e82bda0..f43efefe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/__pycache__/validators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc
index ca171387..c2f280b4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc
index 9844bff2..ace590bd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/general.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc
index 02ef8780..5f5f648c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc
index 6f9e4c99..b947951a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/aggregates/__pycache__/statistics.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/__init__.cpython-312.pyc
index 8e699636..c6486992 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc
index 26d1ff2e..ab697e14 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/array.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc
index 6fadfeab..3b502f30 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/citext.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc
index c8a8b511..786da726 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/hstore.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/jsonb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/jsonb.cpython-312.pyc
index 97e1d417..b3c975e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/jsonb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/jsonb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc
index 18b3e1fb..0999823c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/ranges.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc
index ec3e7013..8cd77e33 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/fields/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/__init__.cpython-312.pyc
index ea9496b7..f45c3178 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc
index 3171ad7a..4b02d6d2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/array.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc
index ba879ae5..d00cebac 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/hstore.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc
index a8050921..c33ac17e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/postgres/forms/__pycache__/ranges.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc
index 26f65f52..092f917c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc
index 5e218f7c..69f47a11 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc
index 2ac278ea..ab715deb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc
index 193770ac..a10da2c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc
index 228395af..6bfdfbd3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc
index e7aac26c..e65b0a70 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc
index 9b753bae..71ee8753 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/0002_alter_redirect_new_path_help_text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc
index 5ddbfc56..46247f64 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/redirects/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc
index 8b7126c0..4ed4dce7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc
index f49f714c..2cbf4fa8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc
index 80670b85..b841d715 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/base_session.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc
index 9c80e850..db86ba5c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc
index 5e4d570b..390ff184 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc
index c569e9db..9c0433cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc
index 0fd70a76..cc338430 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/__pycache__/serializers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc
index 96792e6a..8d00d942 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc
index bace494a..a8c8409d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc
index 042cd206..c8e23018 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc
index d6ff5445..cf502b12 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/cached_db.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc
index 5f9210d7..3b97a641 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/db.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc
index 95b121d5..0d336f77 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/file.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-312.pyc
index 8916dde0..04791313 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/backends/__pycache__/signed_cookies.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc
index 89d3d609..51155025 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc
index ebed32ee..3cbef333 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc
index 88c40098..b8e0139c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/management/commands/__pycache__/clearsessions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc
index 423efd44..1e6dab73 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc
index f272d308..be63589a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sessions/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc
index 684e09a6..d729fd96 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/apps.cpython-312.pyc
index 26c913db..03ee75da 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc
index f7f41c17..679a1fc4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/__pycache__/__init__.cpython-312.pyc
index 7f4dc282..f6340db4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/__init__.cpython-312.pyc
index 76e908b6..19f34ae1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-312.pyc
index 57e6f18b..956c0efb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sitemaps/management/commands/__pycache__/ping_google.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc
index 06cd0ede..d7167f94 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/admin.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/admin.cpython-312.pyc
index ea910a6f..30748f2c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/admin.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/admin.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc
index 98a5af78..e97505c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc
index c725c8ff..dc0059b5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc
index 3297500d..8f5bd09c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/management.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/managers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/managers.cpython-312.pyc
index 7345bd00..1f14f604 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/managers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/managers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc
index d0702af0..00401bb6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc
index 60288c0f..03c36a7b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc
index 57fd008c..5c0959f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/requests.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc
index 3053c908..4232cc9c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/__pycache__/shortcuts.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0001_initial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0001_initial.cpython-312.pyc
index 5a277b42..a0166989 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0001_initial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0001_initial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc
index 1f17e7e1..35de1c20 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/0002_alter_domain_unique.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc
index 3d34c27a..9cefa0b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/sites/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc
index 6af42c07..c49cb7a8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc
index 6bdb1211..62b288e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc
index 0eed6ff2..87353516 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc
index 6f57294d..b72dd614 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/finders.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc
index 1327522f..f1f9e881 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/handlers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc
index 210e4483..f65390a2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/storage.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc
index 9e09fff0..aed67dc5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/testing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/urls.cpython-312.pyc
index 9ef85d96..c12bc4cb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc
index fb16b883..6271b812 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc
index d96cbe39..62f07d4b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc
index 17fa0459..a834b953 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc
index 78ce7cab..90b97373 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-312.pyc
index d2b531fb..5b986bc1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/collectstatic.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc
index 40435164..05fc32e9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/findstatic.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc
index e07d91e9..e8819c68 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/staticfiles/management/commands/__pycache__/runserver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc
index 55fac115..2fb98ff5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc
index 2c04ca0f..1815a32b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/apps.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc
index d3e419c2..edae30c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/contrib/syndication/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc
index d12b7ab5..8768faf5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc
index cd97a59b..bbcb9c4c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/asgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc
index 54b945c5..747bc517 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc
index ef00b8de..7ebab487 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/paginator.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc
index e7e05f9d..26c1ae99 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc
index 334e3924..15f647b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/signing.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc
index 99fd4879..4d05f605 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/validators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc
index 71d6fbc4..56e6a56b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/__pycache__/wsgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc
index 86fab94e..5410d534 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc
index bfcc7e0c..d7b41c54 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc
index acf4b8d0..37bb06b0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc
index 035ab67f..4065e32f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/db.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/db.cpython-312.pyc
index f227701b..12e555a8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/db.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/db.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc
index 6849ce84..f06d90f6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/dummy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc
index f461274b..77621cbe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/filebased.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc
index 7e27fcfb..ea3709ee 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/locmem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/memcached.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/memcached.cpython-312.pyc
index d45c844c..d923878e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/memcached.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/memcached.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc
index b1f6de42..ad51b303 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/cache/backends/__pycache__/redis.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc
index d27b5332..a8b4cc74 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/async_checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/async_checks.cpython-312.pyc
index 06f9fe0e..f6023f39 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/async_checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/async_checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc
index c190553a..a3f08c60 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/caches.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc
index 61d222b0..e90f8357 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/database.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/files.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/files.cpython-312.pyc
index 327bd39e..69b7cd54 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/files.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/files.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc
index ac8f1e02..85870fc3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/messages.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc
index f71548af..e789929e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/model_checks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc
index 813aacff..20c0046e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/registry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc
index 0d9d6a6a..34214cd6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/templates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc
index 084eaeea..15e44ab6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/translation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc
index 6cc043b6..108a4b3e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc
index 08d06eeb..2b5ff935 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc
index fbdf3245..d68b12d2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/compatibility/__pycache__/django_4_0.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc
index 9b686841..7096ea59 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc
index 2fb254c3..93357ac2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc
index 4bbdac37..10294418 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/csrf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc
index 2b9179a6..f137097e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/checks/security/__pycache__/sessions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc
index f7c3a9eb..aaf18ec4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc
index 7426aaf6..59470c24 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc
index 944b5b6b..5a5fb3cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/images.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc
index dbc2f770..a570ee92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/locks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc
index 3baf23ef..920d08b2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/move.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc
index 2e178412..821f20e1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/temp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc
index b28cd9fa..6e47faef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadedfile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc
index ee3d8e6d..fa26e897 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/uploadhandler.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc
index c4d22e5b..c80a29a1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc
index 6f1d9486..5e00df57 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc
index 0fe9f5db..622b410d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/filesystem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/filesystem.cpython-312.pyc
index 8e83f03f..dc2e1120 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/filesystem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/filesystem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc
index cc83c705..66bab87b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/handler.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc
index 1492bbec..0bbfb452 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/memory.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/mixins.cpython-312.pyc
index 361239a5..0708e822 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/files/storage/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/__init__.cpython-312.pyc
index 634cc984..24b3f9be 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc
index 71035dca..4a45b419 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/asgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/base.cpython-312.pyc
index 24a271ae..370efdc3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc
index c7582636..6c50d6bd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/exception.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc
index 9c6dbf66..644316ae 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/handlers/__pycache__/wsgi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc
index afcb3e1f..507b2544 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc
index 81868a5c..250ad368 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/message.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/utils.cpython-312.pyc
index 22e44ec9..f40da687 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/__init__.cpython-312.pyc
index bf01b748..0fc57a93 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc
index 01f7b322..b110f467 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc
index e08c34c2..b2c3bbf4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/console.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/dummy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/dummy.cpython-312.pyc
index e3042ec0..4ae97fd4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/dummy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/dummy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc
index 9d96be23..eb6215f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/filebased.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc
index b74585e5..777bde0d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/locmem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/smtp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/smtp.cpython-312.pyc
index fd092d45..9bb1725d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/smtp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/mail/backends/__pycache__/smtp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc
index e41bcebc..310e1dca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/base.cpython-312.pyc
index edf013b7..05772b16 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc
index 928407fa..0ea7825f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/color.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc
index b3ccd8fc..de3a6b62 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/sql.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc
index bb28ee68..dc1cda5f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/templates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/utils.cpython-312.pyc
index 8940583a..7eacd5a4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc
index 298cb5b9..3d813afb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc
index 1d2557fe..c97b075d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/check.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc
index 5416d712..203332cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/compilemessages.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc
index 5a05a437..e6969aa4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/createcachetable.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dbshell.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dbshell.cpython-312.pyc
index 879d6acf..42715b23 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dbshell.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dbshell.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/diffsettings.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/diffsettings.cpython-312.pyc
index 4626a6bc..f21566ef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/diffsettings.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/diffsettings.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc
index 38a3eeeb..4e42f8e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/dumpdata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc
index 55dff007..c2e3bc70 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/flush.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc
index cc9b0876..6637052e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/inspectdb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/loaddata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/loaddata.cpython-312.pyc
index bf71037c..72688417 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/loaddata.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/loaddata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc
index 777cba3b..799921d8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemessages.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc
index 7f53476c..4a02737d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/makemigrations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc
index 8fdcee43..37f7bfc7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/migrate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/optimizemigration.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/optimizemigration.cpython-312.pyc
index 33edc668..560d4a5e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/optimizemigration.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/optimizemigration.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/runserver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/runserver.cpython-312.pyc
index 6fd1fb84..847b4cae 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/runserver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/runserver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc
index 974ce0bc..62d76ba5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sendtestemail.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc
index f9eb81f2..76b18a57 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/shell.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/showmigrations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/showmigrations.cpython-312.pyc
index 2c2c591d..45023755 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/showmigrations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/showmigrations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlflush.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlflush.cpython-312.pyc
index 3c1313a9..9171c2b9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlflush.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlflush.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc
index 3dbb13ef..060155a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlmigrate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc
index 49297607..d07fd0af 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/sqlsequencereset.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/squashmigrations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/squashmigrations.cpython-312.pyc
index 02a51802..d15960bf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/squashmigrations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/squashmigrations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc
index 2d85217b..ccd9366f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startapp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc
index d98831bd..914f511e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/startproject.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc
index e99453f5..7665e590 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/test.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc
index 69143980..07c84313 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/management/commands/__pycache__/testserver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc
index 148d7193..e37832d5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc
index af7d8bbd..704f6b80 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc
index 5a273490..e781f007 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/json.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc
index b47ae0f9..0f2f935b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/jsonl.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc
index 7d069406..4a90bd92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/python.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc
index faee5633..06a11e16 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/pyyaml.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc
index 22c0cf6d..23f808a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/serializers/__pycache__/xml_serializer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc
index 5034dca0..4e8d730f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc
index f6ee3dc9..560108e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/core/servers/__pycache__/basehttp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc
index bca7880d..a32cb07e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc
index 95bab855..43efc87f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/transaction.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc
index 0b2ed799..7c5dd95f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc
index 23024dc5..5791b36f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc
index 0cc2341f..e9e8a02e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/ddl_references.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/signals.cpython-312.pyc
index f597c1a1..8410c083 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/utils.cpython-312.pyc
index 7d869d45..dcbc8540 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc
index f1352ef2..cee91734 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc
index 2f639049..97e010ab 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/client.cpython-312.pyc
index ceed2224..47eadf7e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc
index 8c29a6ed..5b379da7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/creation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc
index 352d06c9..3bdd84db 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc
index e24c74d7..cd2a627e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc
index cc5c9ea8..9a24112f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/schema.cpython-312.pyc
index 3f90b3c4..be066f89 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc
index 79fd7861..0dbe8f4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/base/__pycache__/validation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/__init__.cpython-312.pyc
index 5b6b8792..1b185bd9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc
index 06801e2a..ad27c3d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc
index 4e77436c..b0ebc907 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/dummy/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/__init__.cpython-312.pyc
index 14a6279e..9924bc7e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc
index 202331f9..eb5b44a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/client.cpython-312.pyc
index 2301f22c..d5eacedc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc
index 828a6031..1015dde0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/compiler.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc
index 938a2651..07a1f32b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/creation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc
index 92775ce3..e845b2be 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc
index dc992fdd..ae1b478f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc
index 12af5031..525cbfa7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/schema.cpython-312.pyc
index 01995d6b..8c260026 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc
index 34553b2d..eac7b652 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/mysql/__pycache__/validation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc
index 17a046f8..57b6fe4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc
index 99ab2f63..ebf04382 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc
index 3b16600e..e2d2cb81 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc
index f4667530..433b1a45 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/creation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/features.cpython-312.pyc
index 5620253b..8f1392b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc
index 26a8a040..54067f3e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/functions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc
index b29f72b1..59b7f8c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc
index 6c2519a1..a2f49ae0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc
index fd288e31..3d8afb0b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc
index 07f5c7d6..ef2c5f2b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc
index 6327f43c..378c7205 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/oracle/__pycache__/validation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc
index af9b9b34..89d8a200 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc
index f6d2c2af..8f73b243 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc
index 327e80e7..fa7473c5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc
index e8458c74..6ca3f7c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/creation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/features.cpython-312.pyc
index 4f195571..5ba48dea 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc
index 6424ae65..d578b5e6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc
index eea80de2..fdb69ffb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/psycopg_any.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/psycopg_any.cpython-312.pyc
index 7cc9cf42..070a7dae 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/psycopg_any.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/psycopg_any.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc
index 122d617a..3a103b99 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/postgresql/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc
index 935fd41c..c9138062 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc
index 788a91be..929868b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/_functions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc
index 0356efe6..b0786179 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc
index 661f160c..7433f904 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc
index 883e5874..1fda66ff 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/creation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc
index 0c7ccca8..e8351808 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/features.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/introspection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/introspection.cpython-312.pyc
index 6d4adf5c..3467f681 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/introspection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/introspection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc
index 498d978c..695ca514 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/operations.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc
index 4aa9e813..181667dd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/__pycache__/schema.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc
index 761c2a11..0915f185 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/autodetector.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/autodetector.cpython-312.pyc
index e344407a..84586894 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/autodetector.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/autodetector.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc
index f154c846..42da41d1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc
index 33044120..fa064936 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/executor.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc
index f0f975a8..42e40971 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/graph.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/loader.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/loader.cpython-312.pyc
index db6cb8ce..8b69e1d8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/loader.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/loader.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc
index d1d7a63a..b285f602 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/migration.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc
index 4976c5cb..34c83420 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/optimizer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/questioner.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/questioner.cpython-312.pyc
index a446ca33..8d4eedc4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/questioner.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/questioner.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc
index 718e0c00..d5be5ddc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/recorder.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc
index e57c8102..b1dce94c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/serializer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/state.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/state.cpython-312.pyc
index bc60da21..111f92cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/state.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/state.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc
index 84aefc69..163096a2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc
index 1b4d2f76..91b13075 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/__pycache__/writer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc
index e482cec4..78ff409c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc
index 3bcb8ce6..b96a5406 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc
index 8ee4ebf4..1c5935e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc
index 5181b35f..d7bae11f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/special.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/special.cpython-312.pyc
index 8cd7acde..877558d2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/special.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/migrations/operations/__pycache__/special.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc
index a1bf5674..936271b0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc
index 69d82bb2..8a798bbe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/aggregates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc
index 3cc73436..f93ad044 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc
index 5a998e7a..26358e73 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constants.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc
index 32158b68..ad683284 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/constraints.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/deletion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/deletion.cpython-312.pyc
index b8e085c6..32aa51ae 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/deletion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/deletion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc
index b6cd1036..d19538ef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/enums.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc
index feccd90e..1d2d452b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/expressions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc
index af62d1c0..9210e0df 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/indexes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc
index 717e110f..1bae9c0c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/lookups.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc
index 57fbb962..42595a57 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/manager.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/options.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/options.cpython-312.pyc
index 21599153..69179768 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/options.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/options.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc
index 3b48a804..36be0d5a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc
index ad0071fe..c1a4889e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/query_utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc
index a2e00664..cbe8bf16 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc
index bc07991f..f992ae17 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc
index e2dc4189..80930017 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc
index d25a2be7..1393e9cf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/files.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc
index c18b0a4e..f8219fd2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/json.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc
index d32712af..0e9f24ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc
index 76f0e9a1..f4484a58 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/proxy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc
index 6d4322a1..a19c184e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_descriptors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_descriptors.cpython-312.pyc
index 923d0e20..6dd7e1e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_descriptors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_descriptors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_lookups.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_lookups.cpython-312.pyc
index baeb179f..144c7fb6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_lookups.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/related_lookups.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc
index 7756cb42..98bd57da 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/fields/__pycache__/reverse_related.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc
index de0bb9de..433a4a2f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc
index d0b1f8a5..517c2267 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/comparison.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc
index 04ba1782..e066b7c1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/datetime.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc
index 8ceeb98e..d2eb4093 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/math.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc
index c4f3280b..c37fc178 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc
index 5ac58bff..b2126e51 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/window.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/window.cpython-312.pyc
index 98c32c11..49d9a9e4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/window.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/functions/__pycache__/window.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/__init__.cpython-312.pyc
index 1feefc0b..0bb51459 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/compiler.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/compiler.cpython-312.pyc
index ff303464..649c1bcf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/compiler.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/compiler.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc
index 8969bcc5..9473ece8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/constants.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc
index bab9a045..4dd70824 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/datastructures.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc
index 72ca7a0e..6bc89e22 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/query.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc
index db112780..71fd9332 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/subqueries.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc
index b1252470..7a81288d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/db/models/sql/__pycache__/where.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc
index 07337aea..6b422fa8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc
index 641d73b2..3faa778d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/dispatch/__pycache__/dispatcher.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc
index 6c7ad5b3..a01b78d2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc
index a2b5b41b..738d66bf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/boundfield.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc
index 3edddf3a..5689684c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc
index 0d108d7d..d2ac0273 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/forms.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/formsets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/formsets.cpython-312.pyc
index 932b3c47..d912c426 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/formsets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/formsets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc
index 8c763ab0..3504831e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc
index 880bba0e..5d3cf9b1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/renderers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc
index 7afcf7a5..92743fe0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc
index c613c42d..2b0aad61 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/forms/__pycache__/widgets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc
index 4c3bff31..4c7e4db5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc
index 37a64595..51638b61 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/cookie.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc
index 6974706d..3c61eacb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/multipartparser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc
index b0aa948a..a298e734 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/request.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc
index e43bb75c..affeafab 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/http/__pycache__/response.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc
index 12f1f285..264e6a81 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc
index 1a016392..10582915 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc
index ff9dd8b4..74a7ef1e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/clickjacking.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc
index db441cb9..d4f21923 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc
index 30de61d5..17ed04e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/csrf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/gzip.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/gzip.cpython-312.pyc
index 99b4517a..b91aea69 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/gzip.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/gzip.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc
index 71521c11..69b3b585 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/http.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/locale.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/locale.cpython-312.pyc
index 1ae418fa..e726a0f1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/locale.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/locale.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/security.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/security.cpython-312.pyc
index 50a437cb..c61be9c6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/security.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/middleware/__pycache__/security.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc
index 4d07622b..56ae02bd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc
index fbcbcdc9..40b0c09d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/autoreload.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc
index bf160a52..8485c5da 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context.cpython-312.pyc
index 2a9d9943..079ef6c5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc
index 9d64bfb7..0ece5293 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/context_processors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaultfilters.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaultfilters.cpython-312.pyc
index f2dbe544..de981f5c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaultfilters.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaultfilters.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc
index fa4e33e0..c3c9b9d3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/defaulttags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc
index b25671bb..bb171aba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/engine.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc
index 03f587ed..66d0661d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/library.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/library.cpython-312.pyc
index d261a86d..c74dfc7f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/library.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/library.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc
index db1f125f..7edca1dc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc
index 5c37fd2d..18d7ffe1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/loader_tags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc
index 41ec56f3..7dbb9aa7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/response.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc
index 7dc8a694..93d1bf4b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/smartif.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc
index b7e1bb63..32a64e4b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc
index f1c74e7d..f11fa8ca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc
index 128032da..ea23f028 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc
index 50225ce2..f7bbf8eb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/django.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/dummy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/dummy.cpython-312.pyc
index f64650eb..bb4c6d4d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/dummy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/dummy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/jinja2.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/jinja2.cpython-312.pyc
index a33f8388..2a4ce961 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/jinja2.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/jinja2.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/utils.cpython-312.pyc
index 2eaaeee6..2a16bc5f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/backends/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/__init__.cpython-312.pyc
index 3db56864..807b8669 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc
index 11df43b7..976c6218 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/app_directories.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc
index 8dacbb6b..98910fc6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc
index 8b8191ba..b8705a0c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/cached.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc
index 115fc196..f642fb5a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/filesystem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc
index ad309a68..bf192744 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/template/loaders/__pycache__/locmem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc
index ed3d2f40..c12e8639 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc
index d5344521..2e6ff8e0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc
index 7bdb8478..e2944265 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/i18n.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/l10n.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/l10n.cpython-312.pyc
index cecce7de..ba9a0a83 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/l10n.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/l10n.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc
index 0fc761d9..eb31a0f7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/static.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc
index 6e23e525..d2d76010 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/templatetags/__pycache__/tz.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/__init__.cpython-312.pyc
index c596d321..a1c11cf3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc
index b2391aab..94fc658f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc
index 0865c1dd..487203a3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/html.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/runner.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/runner.cpython-312.pyc
index 453843fc..118bc25c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/runner.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/runner.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc
index ae4b0913..63bf4211 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/selenium.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc
index 13e55331..65f71371 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/signals.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/testcases.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/testcases.cpython-312.pyc
index 651ce0ff..b55e23bd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/testcases.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/testcases.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/utils.cpython-312.pyc
index 58b1d638..ee87b96f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/test/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc
index 0c97312a..66b3f72f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc
index a4a89360..0b075f08 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc
index ad95299c..3eedcd38 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/conf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc
index 1db56f87..28d5c046 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/converters.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc
index 4b2b7094..82bbeabe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc
index c59b3333..6115ea57 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/resolvers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc
index 397b7a70..181d7c67 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/urls/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc
index ad63a0d8..3e208262 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc
index 9a5007ac..684b4baf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/_os.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc
index a22e09a0..4c4df7a5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/archive.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc
index c5ba572f..70ceb27e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/asyncio.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc
index 36dbb12b..761b27f0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/autoreload.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/baseconv.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/baseconv.cpython-312.pyc
index f0839e3e..b5f671e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/baseconv.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/baseconv.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc
index 740d36f3..09c7ac1d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc
index 9f1e8c72..01c052df 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc
index c10e6a2c..5157bea6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/crypto.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc
index ef16553b..392d0a5d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datastructures.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc
index ff3426ef..01e28b93 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateformat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc
index 7c41d38f..845fe1d3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dateparse.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc
index 92f0512f..3da6571d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/dates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datetime_safe.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datetime_safe.cpython-312.pyc
index d00ba9bf..27a82fcd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datetime_safe.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/datetime_safe.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc
index 00a8e677..a998491b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deconstruct.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc
index 43cc1869..d7f691ea 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/decorators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc
index eeee4758..cff07235 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/deprecation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc
index 57a56600..fb258e8d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/duration.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc
index e47995d9..f1408125 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/encoding.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc
index 787c8888..bb20027c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/feedgenerator.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/formats.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/formats.cpython-312.pyc
index 7b448651..8ea2a3b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/formats.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/formats.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc
index e69ab5ae..b1f17ce9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/functional.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc
index 725862b3..5e58eb2c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/hashable.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc
index 6125c87d..033518dd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/html.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/http.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/http.cpython-312.pyc
index 2afe9032..0f21f294 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/http.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/http.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc
index bb913984..8948b5b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/inspect.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc
index 600be44b..0e27c92d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/ipv6.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc
index cb88a6a3..664e4721 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/itercompat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc
index e9a371e2..fa48d4ba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/jslex.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc
index eb4d610a..5981e187 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc
index 7dd0cc43..48291690 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/lorem_ipsum.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc
index 7f955afc..14249a87 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/module_loading.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc
index 4e7518ee..34bb52bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/numberformat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc
index 47434ae5..dce687d4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/regex_helper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc
index 57889051..3e73cec0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/safestring.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc
index 9777a2c9..41007c52 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/termcolors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc
index abbbcf2a..c324f54e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc
index f959216d..dfe186ef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timesince.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc
index 3c98e4d7..2b0c7d91 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/timezone.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/topological_sort.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/topological_sort.cpython-312.pyc
index dde01585..c0b930e5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/topological_sort.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/topological_sort.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc
index 7109d9b1..6a759b5c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/tree.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc
index c50b39d8..46b25bc7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc
index e906e6a4..1acead21 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/__pycache__/xmlutils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/__init__.cpython-312.pyc
index 9c763b4f..eb7cb76f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc
index 5623e81a..3622fb76 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/reloader.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc
index 2675c2e6..7b1ab857 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/template.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_null.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_null.cpython-312.pyc
index f12e2a68..19657f1e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_null.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_null.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc
index 80f469d8..2b120952 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/utils/translation/__pycache__/trans_real.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc
index cb102612..0c69ca3e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc
index 741dc49f..29189246 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/csrf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc
index fce357fb..9c6e8326 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/defaults.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/defaults.cpython-312.pyc
index 308ff051..200c34dd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/defaults.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/defaults.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc
index e5f4e461..bf6f7886 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/i18n.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc
index 2647389a..591d7df0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/__pycache__/static.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc
index c65aaf1f..49888131 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc
index 5b436a6d..73b4181d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc
index b093938c..2bb0ab2f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/clickjacking.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc
index 9c225245..88151d2b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc
index c3f3e3f0..95e83514 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/csrf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc
index 5d7cc9f9..0b972c6e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc
index 0b8ec0a2..5df3f09c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/gzip.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc
index 92d3523d..d8c1278e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/http.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc
index 24cbf69e..e389c0da 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/decorators/__pycache__/vary.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc
index 5a1bbe19..93289490 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/base.cpython-312.pyc
index f93b6afa..7f04727d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/dates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/dates.cpython-312.pyc
index ae238ad2..b0dd2680 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/dates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/dates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc
index e069fdcc..371f95a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/detail.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc
index 317893bc..0e0b4e5b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/edit.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc
index ebd4958e..e3888d4c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django/views/generic/__pycache__/list.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/__init__.cpython-312.pyc
index 8495527e..b9a9e346 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/compat.cpython-312.pyc
index 7048243b..b4a685db 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/conf.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/conf.cpython-312.pyc
index 61659ea0..08c6315f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/conf.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/conf.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/constants.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/constants.cpython-312.pyc
index 9eadfa58..c34272f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/constants.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/constants.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/exceptions.cpython-312.pyc
index 5b32eb61..f3c0648a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/fields.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/fields.cpython-312.pyc
index da415f0b..3a3da053 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/fields.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/fields.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filters.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filters.cpython-312.pyc
index fedf0c73..6414b580 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filters.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filters.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filterset.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filterset.cpython-312.pyc
index a144549f..19f0d074 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filterset.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/filterset.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/utils.cpython-312.pyc
index 59163504..0039fbc5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/views.cpython-312.pyc
index 709c2c39..a363a27f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/widgets.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/widgets.cpython-312.pyc
index cd780e68..19467cfc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/widgets.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/__pycache__/widgets.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/__init__.cpython-312.pyc
index da4f02c1..76662475 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/backends.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/backends.cpython-312.pyc
index d4c28a45..f00b1632 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/backends.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/backends.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filters.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filters.cpython-312.pyc
index 139086b9..dc7090d8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filters.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filters.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filterset.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filterset.cpython-312.pyc
index e930cf69..3c6ab628 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filterset.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/django_filters/rest_framework/__pycache__/filterset.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/INSTALLER
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/PyYAML-6.0.2.dist-info/INSTALLER
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/INSTALLER
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/LICENSE.rst b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/LICENSE.rst
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/LICENSE.rst
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/LICENSE.rst
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/METADATA b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/METADATA
similarity index 86%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/METADATA
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/METADATA
index 4a1b9492..0bff4b7f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/METADATA
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/METADATA
@@ -1,12 +1,13 @@
Metadata-Version: 2.1
Name: drf-yasg
-Version: 1.21.10
+Version: 1.21.7
Summary: Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code.
Home-page: https://github.com/axnsan12/drf-yasg
Author: Cristi V.
Author-email: cristi@cvjd.me
License: BSD License
Keywords: drf django django-rest-framework schema swagger openapi codegen swagger-codegen documentation drf-yasg django-rest-swagger drf-openapi
+Platform: UNKNOWN
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: BSD License
Classifier: Development Status :: 5 - Production/Stable
@@ -22,7 +23,6 @@ Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
-Classifier: Programming Language :: Python :: 3.12
Classifier: Framework :: Django
Classifier: Framework :: Django :: 2.2
Classifier: Framework :: Django :: 3.0
@@ -30,22 +30,20 @@ Classifier: Framework :: Django :: 3.1
Classifier: Framework :: Django :: 3.2
Classifier: Framework :: Django :: 4.0
Classifier: Framework :: Django :: 4.1
-Classifier: Framework :: Django :: 4.2
Requires-Python: >=3.6
Description-Content-Type: text/x-rst
-License-File: LICENSE.rst
-Requires-Dist: djangorestframework>=3.10.3
-Requires-Dist: django>=2.2.16
-Requires-Dist: pyyaml>=5.1
-Requires-Dist: inflection>=0.3.1
-Requires-Dist: packaging>=21.0
-Requires-Dist: pytz>=2021.1
-Requires-Dist: uritemplate>=3.0.0
+Requires-Dist: djangorestframework (>=3.10.3)
+Requires-Dist: django (>=2.2.16)
+Requires-Dist: pyyaml (>=5.1)
+Requires-Dist: inflection (>=0.3.1)
+Requires-Dist: packaging (>=21.0)
+Requires-Dist: pytz (>=2021.1)
+Requires-Dist: uritemplate (>=3.0.0)
Provides-Extra: coreapi
-Requires-Dist: coreapi>=2.3.3; extra == "coreapi"
-Requires-Dist: coreschema>=0.0.4; extra == "coreapi"
+Requires-Dist: coreapi (>=2.3.3) ; extra == 'coreapi'
+Requires-Dist: coreschema (>=0.0.4) ; extra == 'coreapi'
Provides-Extra: validation
-Requires-Dist: swagger-spec-validator>=2.1.0; extra == "validation"
+Requires-Dist: swagger-spec-validator (>=2.1.0) ; extra == 'validation'
.. role:: python(code)
:language: python
@@ -54,15 +52,15 @@ Requires-Dist: swagger-spec-validator>=2.1.0; extra == "validation"
drf-yasg - Yet another Swagger generator
########################################
-|actions| |nbsp| |codecov| |nbsp| |rtd-badge| |nbsp| |pypi-version| |nbsp| |gitter|
+|actions| |nbsp| |codecov| |nbsp| |rtd-badge| |nbsp| |pypi-version|
Generate **real** Swagger/OpenAPI 2.0 specifications from a Django Rest Framework API.
Compatible with
- **Django Rest Framework**: 3.10, 3.11, 3.12, 3.13, 3.14
-- **Django**: 2.2, 3.0, 3.1, 3.2, 4.0, 4.1, 4.2
-- **Python**: 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12
+- **Django**: 2.2, 3.0, 3.1, 3.2, 4.0, 4.1
+- **Python**: 3.6, 3.7, 3.8, 3.9, 3.10, 3.11
Only the latest patch version of each ``major.minor`` series of Python, Django and Django REST Framework is supported.
@@ -73,14 +71,14 @@ through a deprecation cycle of a few minor releases.
Resources:
-* `Sources `_
-* `Documentation `_
-* `Changelog `_
-* `Live demo `_
-* `Discussion `_
+* **Source**: https://github.com/axnsan12/drf-yasg/
+* **Documentation**: https://drf-yasg.readthedocs.io/
+* **Changelog**: https://drf-yasg.readthedocs.io/en/stable/changelog.html
+* **Live demo**: https://drf-yasg-demo.herokuapp.com/
|heroku-button|
+
****************
OpenAPI 3.0 note
****************
@@ -151,14 +149,14 @@ The preferred installation method is directly from pypi:
.. code:: console
- pip install --upgrade drf-yasg
+ pip install -U drf-yasg
Additionally, if you want to use the built-in validation mechanisms (see `4. Validation`_), you need to install
some extra requirements:
.. code:: console
- pip install --upgrade drf-yasg[validation]
+ pip install -U drf-yasg[validation]
.. _readme-quickstart:
@@ -202,7 +200,7 @@ In ``urls.py``:
)
urlpatterns = [
- path('swagger./', schema_view.without_ui(cache_timeout=0), name='schema-json'),
+ path('swagger/', schema_view.without_ui(cache_timeout=0), name='schema-json'),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
path('redoc/', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
...
@@ -346,7 +344,7 @@ You can use the specification outputted by this library together with
$ docker run --rm -v ${PWD}:/local swaggerapi/swagger-codegen-cli generate -i /local/tests/reference.yaml -l javascript -o /local/.codegen/js
-See the GitHub page linked above for more details.
+See the github page linked above for more details.
.. _readme-testproj:
@@ -362,8 +360,8 @@ For additional usage examples, you can take a look at the test project in the ``
$ virtualenv venv
$ source venv/bin/activate
(venv) $ cd testproj
- (venv) $ python -m pip install --upgrade pip setuptools
- (venv) $ pip install --upgrade -r requirements.txt
+ (venv) $ python -m pip install -U pip setuptools
+ (venv) $ pip install -U -r requirements.txt
(venv) $ python manage.py migrate
(venv) $ python manage.py runserver
(venv) $ firefox localhost:8000/swagger/
@@ -385,7 +383,7 @@ djangorestframework-recursive
Integration with `djangorestframework-recursive `_ is
provided out of the box - if you have ``djangorestframework-recursive`` installed.
-.. |actions| image:: https://img.shields.io/github/actions/workflow/status/axnsan12/drf-yasg/review.yml?branch=master
+.. |actions| image:: https://img.shields.io/github/workflow/status/axnsan12/drf-yasg/Review
:target: https://github.com/axnsan12/drf-yasg/actions
:alt: GitHub Workflow Status
@@ -397,10 +395,6 @@ provided out of the box - if you have ``djangorestframework-recursive`` installe
:target: https://pypi.org/project/drf-yasg/
:alt: PyPI
-.. |gitter| image:: https://badges.gitter.im/drf-yasg.svg
- :target: https://app.gitter.im/#/room/#drf-yasg:gitter.im
- :alt: Gitter
-
.. |rtd-badge| image:: https://img.shields.io/readthedocs/drf-yasg.svg
:target: https://drf-yasg.readthedocs.io/
:alt: ReadTheDocs
@@ -440,32 +434,4 @@ for display the Base64 fields correctly.
else:
return 'pdf'
-************
-Contributing
-************
-This repository adheres to semantic versioning standards. For more
-information on semantic versioning visit `SemVer `_.
-
-To keep our process simple we merge pull requests into the master branch we use
-git tags for releases. We use labels to mark which issues are intended for each
-version. For example:
-
-.. figure:: ./docs/images/flow.png
- :width: 70%
- :figwidth: image
- :alt: Git flow
- :align: center
-
-Labels
-======
-
-- New issues without a version are given a ``triage`` label.
-
-- Issues are labeled ``bug``, ``enhancement`` or ``question`` to describe their
- content
-
-- Once given a version, an issue will either have an assignee or be given a
- ``help wanted`` label
-
-- A question that hasn't been answered will be given an ``unanswered`` label
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/RECORD b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/RECORD
similarity index 81%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/RECORD
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/RECORD
index 34506edf..9d782cf2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/RECORD
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/RECORD
@@ -1,11 +1,11 @@
-drf_yasg-1.21.10.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-drf_yasg-1.21.10.dist-info/LICENSE.rst,sha256=UzGd4V_BWMNqAFaICyjIs1I5w3g0Snr-hNWw6YL-TWY,1639
-drf_yasg-1.21.10.dist-info/METADATA,sha256=O9LDGJQcHd0-h-O3mlmI4UuxcyyTb8ABv6dnQEXqLNk,17173
-drf_yasg-1.21.10.dist-info/RECORD,,
-drf_yasg-1.21.10.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-drf_yasg-1.21.10.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
-drf_yasg-1.21.10.dist-info/top_level.txt,sha256=GzwSSUdnwQRQ8b_CyQvPz0yYEhaZV8Hme8BrlYhkkug,9
-drf_yasg/__init__.py,sha256=Zk_2JkOxQoVVoLhz520V2ak9XUvjaB03MEXAicfHKos,435
+drf_yasg-1.21.7.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+drf_yasg-1.21.7.dist-info/LICENSE.rst,sha256=UzGd4V_BWMNqAFaICyjIs1I5w3g0Snr-hNWw6YL-TWY,1639
+drf_yasg-1.21.7.dist-info/METADATA,sha256=7HoFKIQp0WdpRCYvWavnOg2a574ULG9AyGt3SlWaY3Y,16007
+drf_yasg-1.21.7.dist-info/RECORD,,
+drf_yasg-1.21.7.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+drf_yasg-1.21.7.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92
+drf_yasg-1.21.7.dist-info/top_level.txt,sha256=GzwSSUdnwQRQ8b_CyQvPz0yYEhaZV8Hme8BrlYhkkug,9
+drf_yasg/__init__.py,sha256=ydQ7DqAOm38dXniI0dK4GVFkd-ubGq7BB3rbgtzfxY4,287
drf_yasg/__pycache__/__init__.cpython-312.pyc,,
drf_yasg/__pycache__/app_settings.cpython-312.pyc,,
drf_yasg/__pycache__/codecs.cpython-312.pyc,,
@@ -16,7 +16,7 @@ drf_yasg/__pycache__/openapi.cpython-312.pyc,,
drf_yasg/__pycache__/renderers.cpython-312.pyc,,
drf_yasg/__pycache__/utils.cpython-312.pyc,,
drf_yasg/__pycache__/views.cpython-312.pyc,,
-drf_yasg/app_settings.py,sha256=lXQopEFhN9hfEobuW9GdmP3Eq4N9hD24x2RuCX5ljaI,4438
+drf_yasg/app_settings.py,sha256=YFHfREt8eA-WobudHHV5BIitdgwVqgqd3ZunXzxx0hI,4251
drf_yasg/codecs.py,sha256=kJs-DuV66ecZxD1igt7XGDf1ZfKLtobsEfi6cFNVMBM,7802
drf_yasg/errors.py,sha256=sfDVvNLqKGkmDuoDViQDve4R3xhYDsf75gU6R2EP1ms,380
drf_yasg/generators.py,sha256=vcf3BFJxYvEb54lQha1GwuCnmURjzEi61XkmPtGmC8s,26364
@@ -27,7 +27,7 @@ drf_yasg/inspectors/__pycache__/field.cpython-312.pyc,,
drf_yasg/inspectors/__pycache__/query.cpython-312.pyc,,
drf_yasg/inspectors/__pycache__/view.cpython-312.pyc,,
drf_yasg/inspectors/base.py,sha256=YISM68P55QQaT7rOxNZvbhxQ_-0Kt3EYgbuDbrK8iDg,21217
-drf_yasg/inspectors/field.py,sha256=CZBgmZGn0NZFyiSjtTiGg_JT-Qyir6bjefiJs2kseuU,35309
+drf_yasg/inspectors/field.py,sha256=UnOJc2VQGN9bl4O9lP_27pDuguLZDdDUpaYvUBh6vZ0,35003
drf_yasg/inspectors/query.py,sha256=WRdCOZ4Altfl1sPUwLab5MtJUkjGPA93Ohyba88Tq_c,4924
drf_yasg/inspectors/view.py,sha256=HGWIWMl1mZkp2tgD4PM3RyLYuGl_L_4EzTJkVXVGdxw,17639
drf_yasg/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -37,8 +37,8 @@ drf_yasg/management/commands/__pycache__/__init__.cpython-312.pyc,,
drf_yasg/management/commands/__pycache__/generate_swagger.cpython-312.pyc,,
drf_yasg/management/commands/generate_swagger.py,sha256=7XoTMZw0QF2QcjmPonc-Lm-43ANg1GFMj9M53bmpjsI,6523
drf_yasg/middleware.py,sha256=DUyfMffwybsZU5i7YlMPS9iy-6VXZA9J-I3bT57afzs,799
-drf_yasg/openapi.py,sha256=850yFrSGwtrtPK7mr7ZcTSZqFWBOZjW4SqyKoJ_o1ag,31035
-drf_yasg/renderers.py,sha256=7ZVssC0KBEl0-8j1Y6eh2E-YQGDspq-d0GnwVS_kbaI,8310
+drf_yasg/openapi.py,sha256=HwTb08RfIGcyozbK4tuvadBkH9t-1mFrfWHJ2NuR7uY,31035
+drf_yasg/renderers.py,sha256=N2v2iMruaC-E5AW6UcPkDQCpxTc28IbzhWBsI19vhVw,8107
drf_yasg/static/drf-yasg/README,sha256=6Maug8UcMmmohB2DFyqbkKMpteUUW-k8SbC1XDyZw3c,520
drf_yasg/static/drf-yasg/immutable.js,sha256=m1Jds09_KiSf-55aQe2m8SzLRdHVAdJmAMhDEHI2ATY,142352
drf_yasg/static/drf-yasg/immutable.min.js,sha256=-0IwgnFxUKpHZPXBhTQkuv-Dqy0eDno7myZB6OOjORA,56904
@@ -72,9 +72,9 @@ drf_yasg/static/drf-yasg/swagger-ui-dist/swagger-ui-standalone-preset.js.map,sha
drf_yasg/static/drf-yasg/swagger-ui-dist/swagger-ui.css,sha256=RXm4uga517Y84t07A_Jg2Yo0YRCyZ-jGF00X2jw2YjQ,145206
drf_yasg/static/drf-yasg/swagger-ui-dist/swagger-ui.css.map,sha256=VH4Fk6LbhMDyFx5JPt1N9FcPMqO7MfWIcZwBX0q307s,251096
drf_yasg/static/drf-yasg/swagger-ui-dist/swagger-ui.js.map,sha256=_RT15uSIUcwaFC2JWKETu81WyFSCKHLOzhQO6x0vIdI,304572
-drf_yasg/static/drf-yasg/swagger-ui-init.js,sha256=WZCeIzIsgYbIOif8IFA4s1fcEchNndKvspe_ZUfol3s,15480
+drf_yasg/static/drf-yasg/swagger-ui-init.js,sha256=-SmJClN1g33RwVx4h_NSf6G3QyACZGUsk_0Bcaevlss,14964
drf_yasg/templates/drf-yasg/redoc-old.html,sha256=3UhYrp8OnIitnSUPu0siNqfiIS8QiEiW6zxQex2CNyo,598
drf_yasg/templates/drf-yasg/redoc.html,sha256=43jrmXeRxhjOqqvlsTEiZySHNdzshgXm1K-o5-W5roU,1515
drf_yasg/templates/drf-yasg/swagger-ui.html,sha256=oaBGwOqZSCTn-o-WUPNQDc5GW78MFybFV6oMTp5z64E,3349
-drf_yasg/utils.py,sha256=KFGHZTcCQx8j11hQf_kcuGRXtQrmkUpR-4Savib0_Yk,23930
-drf_yasg/views.py,sha256=ZvHpaOsb6KG9PnL8YQtk0Brca9mjIoRIDZJ855U5O7w,7860
+drf_yasg/utils.py,sha256=2vvNPJP5xBTiWG5teQyJnj8BWww5T7ZYUMgGTg3efhQ,23681
+drf_yasg/views.py,sha256=SJy-NjDW0khcP8QJBhOjNv0Btd79fd60lailJvxiIhs,7068
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/REQUESTED b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/REQUESTED
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/WHEEL b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/WHEEL
similarity index 65%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/WHEEL
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/WHEEL
index 79d5c89a..1f37c02f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/WHEEL
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.45.1)
+Generator: bdist_wheel (0.40.0)
Root-Is-Purelib: true
Tag: py3-none-any
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/top_level.txt b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/top_level.txt
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/top_level.txt
rename to gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.7.dist-info/top_level.txt
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__init__.py
index 0f8df57a..21c6d57e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__init__.py
@@ -1,15 +1,11 @@
# coding=utf-8
+from pkg_resources import DistributionNotFound, get_distribution
__author__ = """Cristi V."""
__email__ = 'cristi@cvjd.me'
try:
- from importlib.metadata import version
- __version__ = version(__name__)
-except ImportError: # Python < 3.8
- try:
- from pkg_resources import DistributionNotFound, get_distribution
- __version__ = get_distribution(__name__).version
- except DistributionNotFound: # pragma: no cover
- # package is not installed
- pass
+ __version__ = get_distribution(__name__).version
+except DistributionNotFound: # pragma: no cover
+ # package is not installed
+ pass
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/__init__.cpython-312.pyc
index c6ed555b..bd2825bd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/app_settings.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/app_settings.cpython-312.pyc
index 9fbe2764..760e0845 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/app_settings.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/app_settings.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/codecs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/codecs.cpython-312.pyc
index ff1f2f30..31c7f498 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/codecs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/codecs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/errors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/errors.cpython-312.pyc
index a775a9bf..9a09a0b6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/errors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/errors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/generators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/generators.cpython-312.pyc
index 5e589581..3f887c0e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/generators.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/generators.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/middleware.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/middleware.cpython-312.pyc
index 6f5144de..ec3d207a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/middleware.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/middleware.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/openapi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/openapi.cpython-312.pyc
index 3ca16aa7..4b750917 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/openapi.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/openapi.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/renderers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/renderers.cpython-312.pyc
index e9e8229b..6b89a14e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/renderers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/renderers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/utils.cpython-312.pyc
index fac58407..3bf1f896 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/views.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/views.cpython-312.pyc
index cd99fd9c..10c23016 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/views.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/__pycache__/views.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/app_settings.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/app_settings.py
index f06c1b96..dd14fdc8 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/app_settings.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/app_settings.py
@@ -41,9 +41,6 @@ SWAGGER_DEFAULTS = {
'DEFAULT_API_URL': None,
'USE_SESSION_AUTH': True,
- 'USE_COMPAT_RENDERERS': getattr(settings, 'SWAGGER_USE_COMPAT_RENDERERS', True),
- 'CSRF_COOKIE_NAME': settings.CSRF_COOKIE_NAME,
- 'CSRF_HEADER_NAME': settings.CSRF_HEADER_NAME,
'SECURITY_DEFINITIONS': {
'Basic': {
'type': 'basic'
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/__init__.cpython-312.pyc
index 21274920..7d1c01b3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/base.cpython-312.pyc
index 4ff255bd..88c9a639 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/field.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/field.cpython-312.pyc
index ddcce515..21c8fdbd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/field.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/field.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/query.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/query.cpython-312.pyc
index 198053ff..70d96572 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/query.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/query.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/view.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/view.cpython-312.pyc
index 47cb7915..1304a550 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/view.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/__pycache__/view.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/field.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/field.py
index 10be17ac..9b767a8e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/field.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/inspectors/field.py
@@ -6,7 +6,9 @@ import uuid
from contextlib import suppress
from collections import OrderedDict
from decimal import Decimal
+from inspect import signature as inspect_signature
+import pkg_resources
import typing
from django.core import validators
from django.db import models
@@ -21,20 +23,7 @@ from ..utils import (
decimal_as_float, field_value_to_representation, filter_none, get_serializer_class, get_serializer_ref_name
)
-try:
- from importlib import metadata
- drf_version = metadata.version("djangorestframework")
-except ImportError: # Python < 3.8
- import pkg_resources
- drf_version = pkg_resources.get_distribution("djangorestframework").version
-
-try:
- from types import NoneType, UnionType
-
- UNION_TYPES = (typing.Union, UnionType)
-except ImportError: # Python < 3.10
- NoneType = type(None)
- UNION_TYPES = (typing.Union,)
+drf_version = pkg_resources.get_distribution("djangorestframework").version
logger = logging.getLogger(__name__)
@@ -200,7 +189,7 @@ def get_queryset_from_view(view, serializer=None):
if queryset is not None and serializer is not None:
# make sure the view is actually using *this* serializer
- assert type(serializer) is call_view_method(view, 'get_serializer_class', 'serializer_class')
+ assert type(serializer) == call_view_method(view, 'get_serializer_class', 'serializer_class')
return queryset
except Exception: # pragma: no cover
@@ -487,6 +476,15 @@ def decimal_return_type():
return openapi.TYPE_STRING if rest_framework_settings.COERCE_DECIMAL_TO_STRING else openapi.TYPE_NUMBER
+def get_origin_type(hint_class):
+ return getattr(hint_class, '__origin__', None) or hint_class
+
+
+def hint_class_issubclass(hint_class, check_class):
+ origin_type = get_origin_type(hint_class)
+ return inspect.isclass(origin_type) and issubclass(origin_type, check_class)
+
+
hinting_type_info = [
(bool, (openapi.TYPE_BOOLEAN, None)),
(int, (openapi.TYPE_INTEGER, None)),
@@ -503,15 +501,11 @@ hinting_type_info = [
if hasattr(typing, 'get_args'):
# python >=3.8
typing_get_args = typing.get_args
- typing_get_origin = typing.get_origin
else:
# python <3.8
def typing_get_args(tp):
return getattr(tp, '__args__', ())
- def typing_get_origin(tp):
- return getattr(tp, '__origin__', None)
-
def inspect_collection_hint_class(hint_class):
args = typing_get_args(hint_class)
@@ -527,6 +521,12 @@ def inspect_collection_hint_class(hint_class):
hinting_type_info.append(((typing.Sequence, typing.AbstractSet), inspect_collection_hint_class))
+def _get_union_types(hint_class):
+ origin_type = get_origin_type(hint_class)
+ if origin_type is typing.Union:
+ return hint_class.__args__
+
+
def get_basic_type_info_from_hint(hint_class):
"""Given a class (eg from a SerializerMethodField's return type hint,
return its basic type information - ``type``, ``format``, ``pattern``,
@@ -536,12 +536,12 @@ def get_basic_type_info_from_hint(hint_class):
:return: the extracted attributes as a dictionary, or ``None`` if the field type is not known
:rtype: OrderedDict
"""
+ union_types = _get_union_types(hint_class)
- if typing_get_origin(hint_class) in UNION_TYPES:
+ if union_types:
# Optional is implemented as Union[T, None]
- filtered_types = [t for t in typing_get_args(hint_class) if t is not NoneType]
- if len(filtered_types) == 1:
- result = get_basic_type_info_from_hint(filtered_types[0])
+ if len(union_types) == 2 and isinstance(None, union_types[1]):
+ result = get_basic_type_info_from_hint(union_types[0])
if result:
result['x-nullable'] = True
@@ -549,15 +549,8 @@ def get_basic_type_info_from_hint(hint_class):
return None
- # resolve the origin class if the class is generic
- resolved_class = typing_get_origin(hint_class) or hint_class
-
- # bail out early
- if not inspect.isclass(resolved_class):
- return None
-
for check_class, info in hinting_type_info:
- if issubclass(resolved_class, check_class):
+ if hint_class_issubclass(hint_class, check_class):
if callable(info):
return info(hint_class)
@@ -620,19 +613,17 @@ class SerializerMethodFieldInspector(FieldInspector):
return self.probe_field_inspectors(serializer, swagger_object_type, use_references, read_only=True)
else:
# look for Python 3.5+ style type hinting of the return value
- hint_class = typing.get_type_hints(method).get('return')
+ hint_class = inspect_signature(method).return_annotation
- # annotations such as typing.Optional have an __instancecheck__
- # hook and will not look like classes, but `issubclass` needs
- # a class as its first argument, so only in that case abort
- if inspect.isclass(hint_class) and issubclass(hint_class, inspect._empty):
- return NotHandled
+ if not inspect.isclass(hint_class) and hasattr(hint_class, '__args__'):
+ hint_class = hint_class.__args__[0]
+ if inspect.isclass(hint_class) and not issubclass(hint_class, inspect._empty):
+ type_info = get_basic_type_info_from_hint(hint_class)
- type_info = get_basic_type_info_from_hint(hint_class)
- if type_info is not None:
- SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type,
- use_references, **kwargs)
- return SwaggerType(**type_info)
+ if type_info is not None:
+ SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type,
+ use_references, **kwargs)
+ return SwaggerType(**type_info)
return NotHandled
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/__pycache__/__init__.cpython-312.pyc
index 809fd663..aa209a48 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/__init__.cpython-312.pyc
index 31e7fa96..b0fe92d4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/generate_swagger.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/generate_swagger.cpython-312.pyc
index 8e7ba356..bc4e199f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/generate_swagger.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/management/commands/__pycache__/generate_swagger.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/openapi.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/openapi.py
index 9679c80d..0a2cfb8f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/openapi.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/openapi.py
@@ -88,7 +88,7 @@ class SwaggerDict(OrderedDict):
def __init__(self, **attrs):
super(SwaggerDict, self).__init__()
self._extras__ = attrs
- if type(self) is SwaggerDict:
+ if type(self) == SwaggerDict:
self._insert_extras__()
def __setattr__(self, key, value):
@@ -516,7 +516,7 @@ class _Ref(SwaggerDict):
:param bool ignore_unresolved: do not throw if the referenced object does not exist
"""
super(_Ref, self).__init__()
- assert not type(self) is _Ref, "do not instantiate _Ref directly"
+ assert not type(self) == _Ref, "do not instantiate _Ref directly"
ref_name = "#/{scope}/{name}".format(scope=scope, name=name)
if not ignore_unresolved:
obj = resolver.get(name, scope)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/renderers.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/renderers.py
index 6c7728fd..7d79aaf6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/renderers.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/renderers.py
@@ -46,14 +46,14 @@ class OpenAPIRenderer(_SpecRenderer):
class SwaggerJSONRenderer(_SpecRenderer):
"""Renders the schema as a JSON document with the generic ``application/json`` mime type."""
media_type = 'application/json'
- format = 'json'
+ format = '.json'
codec_class = OpenAPICodecJson
class SwaggerYAMLRenderer(_SpecRenderer):
"""Renders the schema as a YAML document."""
media_type = 'application/yaml'
- format = 'yaml'
+ format = '.yaml'
codec_class = OpenAPICodecYaml
@@ -153,9 +153,6 @@ class SwaggerUIRenderer(_UIRenderer):
'refetchWithAuth': swagger_settings.REFETCH_SCHEMA_WITH_AUTH,
'refetchOnLogout': swagger_settings.REFETCH_SCHEMA_ON_LOGOUT,
'fetchSchemaWithQuery': swagger_settings.FETCH_SCHEMA_WITH_QUERY,
- 'csrfCookie': swagger_settings.CSRF_COOKIE_NAME,
- # remove HTTP_ and convert underscores to dashes
- 'csrfHeader': swagger_settings.CSRF_HEADER_NAME[5:].replace('_', '-'),
}
data = filter_none(data)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/static/drf-yasg/swagger-ui-init.js b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/static/drf-yasg/swagger-ui-init.js
index 4ef2fd51..9606a3be 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/static/drf-yasg/swagger-ui-init.js
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/static/drf-yasg/swagger-ui-init.js
@@ -36,26 +36,11 @@ var swaggerUiConfig = {
],
layout: "StandaloneLayout",
filter: true,
- csrfCookie: 'csrftoken',
- csrfHeader: 'X-CSRFToken',
requestInterceptor: function (request) {
var headers = request.headers || {};
var csrftoken = document.querySelector("[name=csrfmiddlewaretoken]");
if (csrftoken) {
- csrftoken = csrftoken.value;
- } else {
- var cookies = document.cookie.split(/;\s+/);
- var name = swaggerUiConfig.csrfCookie;
- for (var i = 0; i < cookies.length; i++) {
- if (cookies[i].indexOf(name) === 0) {
- csrftoken = cookies[i].slice(cookies[i].indexOf('=') + 1);
- break;
- }
- }
- }
-
- if (csrftoken) {
- headers[swaggerUiConfig.csrfHeader] = csrftoken;
+ headers["X-CSRFToken"] = csrftoken.value;
}
return request;
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/utils.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/utils.py
index dc0b509b..494ce48c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/utils.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/utils.py
@@ -17,15 +17,6 @@ from rest_framework.views import APIView
from .app_settings import swagger_settings
-try:
- import zoneinfo
-except ImportError:
- try:
- from backports import zoneinfo
- except ImportError:
- zoneinfo = None
-
-
logger = logging.getLogger(__name__)
@@ -451,7 +442,7 @@ def force_real_str(s, encoding='utf-8', strings_only=False, errors='strict'):
"""
if s is not None:
s = force_str(s, encoding, strings_only, errors)
- if type(s) is not str:
+ if type(s) != str:
s = '' + s
# Remove common indentation to get the correct Markdown rendering
@@ -474,10 +465,7 @@ def field_value_to_representation(field, value):
else:
value = str(value)
- elif isinstance(value, pytz.BaseTzInfo):
- value = str(value)
-
- elif zoneinfo is not None and isinstance(value, zoneinfo.ZoneInfo):
+ if isinstance(value, pytz.BaseTzInfo):
value = str(value)
# JSON roundtrip ensures that the value is valid JSON;
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/views.py b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/views.py
index 5bca782f..977f2f4a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/views.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/drf_yasg/views.py
@@ -13,9 +13,7 @@ from .app_settings import swagger_settings
from .renderers import (
ReDocOldRenderer,
ReDocRenderer,
- SwaggerJSONRenderer,
SwaggerUIRenderer,
- SwaggerYAMLRenderer,
_SpecRenderer,
)
@@ -79,20 +77,6 @@ def get_schema_view(info=None, url=None, patterns=None, urlconf=None, public=Fal
validators = validators or []
_spec_renderers = tuple(renderer.with_validators(validators) for renderer in SPEC_RENDERERS)
- # optionally copy renderers with the validators that are configured above
- if swagger_settings.USE_COMPAT_RENDERERS:
- warnings.warn(
- "SwaggerJSONRenderer & SwaggerYAMLRenderer's `format` has changed to not include a `.` prefix, "
- "please silence this warning by setting `SWAGGER_USE_COMPAT_RENDERERS = False` "
- "in your Django settings and ensure your application works "
- "(check your URLCONF and swagger/redoc URLs).",
- DeprecationWarning)
- _spec_renderers += tuple(
- type(cls.__name__, (cls,), {'format': '.' + cls.format})
- for cls in _spec_renderers
- if issubclass(cls, (SwaggerJSONRenderer, SwaggerYAMLRenderer))
- )
-
class SchemaView(APIView):
_ignore_model_permissions = True
schema = None # exclude from schema
diff --git a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/__init__.cpython-312.pyc
index cc65a902..2f6d9f7b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/compat.cpython-312.pyc
index c5b4b0d8..b2697c6f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/environ.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/environ.cpython-312.pyc
index 3f9a8b55..66e3b70c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/environ.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/environ.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/fileaware_mapping.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/fileaware_mapping.cpython-312.pyc
index 1d00639c..c724da79 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/fileaware_mapping.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/environ/__pycache__/fileaware_mapping.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/inflection/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/inflection/__pycache__/__init__.cpython-312.pyc
index 6b426a2d..4296bd5d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/inflection/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/inflection/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/__init__.cpython-312.pyc
index c0bc3d2a..f7cd3ccb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/abstract.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/abstract.cpython-312.pyc
index c43f7531..1e7013e9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/abstract.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/abstract.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/clocks.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/clocks.cpython-312.pyc
index 140717ea..c65a62a6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/clocks.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/clocks.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/common.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/common.cpython-312.pyc
index f4096488..439501ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/common.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/common.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compat.cpython-312.pyc
index da86f36b..112d34c2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compression.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compression.cpython-312.pyc
index cfc30a0a..7430ee2e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compression.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/compression.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/connection.cpython-312.pyc
index f56a2cf4..f70681f5 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/entity.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/entity.cpython-312.pyc
index 04477f1a..b3da00a7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/entity.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/entity.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/exceptions.cpython-312.pyc
index 2656a88c..18c5175d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/log.cpython-312.pyc
index e0f29ed5..2a6f2cba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/matcher.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/matcher.cpython-312.pyc
index 30ed0b98..8db3b897 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/matcher.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/matcher.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/message.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/message.cpython-312.pyc
index 13247e49..94b4ff85 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/message.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/message.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/messaging.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/messaging.cpython-312.pyc
index f560e89f..d86783b9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/messaging.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/messaging.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/mixins.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/mixins.cpython-312.pyc
index b63b4c3c..d0372589 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/mixins.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/mixins.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pidbox.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pidbox.cpython-312.pyc
index da71339d..3e0e27d4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pidbox.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pidbox.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pools.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pools.cpython-312.pyc
index 5615fcb3..edda9c43 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pools.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/pools.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/resource.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/resource.cpython-312.pyc
index 3adaf9f8..8b1599b9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/resource.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/resource.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/serialization.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/serialization.cpython-312.pyc
index cd6855a9..1628c959 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/serialization.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/serialization.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/simple.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/simple.cpython-312.pyc
index e33eff55..57a1b784 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/simple.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/__pycache__/simple.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/__init__.cpython-312.pyc
index 113aa112..cb55a711 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/debug.cpython-312.pyc
index 56d51de6..884af69b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/hub.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/hub.cpython-312.pyc
index e664180b..1539ec33 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/hub.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/hub.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/semaphore.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/semaphore.cpython-312.pyc
index 7008e5f3..ac6f545c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/semaphore.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/semaphore.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/timer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/timer.cpython-312.pyc
index 84a7beda..b42cfb85 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/timer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/__pycache__/timer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/__init__.cpython-312.pyc
index b0b15e7f..663ede93 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/connection.cpython-312.pyc
index 46f4111a..6c407515 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/ext.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/ext.cpython-312.pyc
index 3db8e71f..0ffb7417 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/ext.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/__pycache__/ext.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/__init__.cpython-312.pyc
index f8cce552..83db6c7c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/connection.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/connection.cpython-312.pyc
index 37c85ec1..e42d2acc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/connection.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/connection.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/ext.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/ext.cpython-312.pyc
index 4d6fd797..c1d9c61a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/ext.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/ext.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/message.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/message.cpython-312.pyc
index 77143cdf..98574ed0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/message.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/message.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/queue.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/queue.cpython-312.pyc
index 2f1c2899..42cdafed 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/queue.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/aws/sqs/__pycache__/queue.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/__init__.cpython-312.pyc
index 46b99742..f7813bc7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/base.cpython-312.pyc
index c61a9a87..949de80a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/urllib3_client.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/urllib3_client.cpython-312.pyc
index 9f1d8e10..41f24307 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/urllib3_client.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/asynchronous/http/__pycache__/urllib3_client.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SLMQ.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SLMQ.cpython-312.pyc
index 2322a912..bfff3d18 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SLMQ.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SLMQ.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SQS.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SQS.cpython-312.pyc
index 590b86fc..5cecbeb8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SQS.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/SQS.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/__init__.cpython-312.pyc
index 1db9ed5d..e9126fce 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azureservicebus.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azureservicebus.cpython-312.pyc
index 4eb4bf48..5b030bc2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azureservicebus.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azureservicebus.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azurestoragequeues.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azurestoragequeues.cpython-312.pyc
index 7412b29e..a8272e3c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azurestoragequeues.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/azurestoragequeues.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/base.cpython-312.pyc
index 87045eee..18d6b487 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/confluentkafka.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/confluentkafka.cpython-312.pyc
index 00faf112..38575208 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/confluentkafka.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/confluentkafka.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/consul.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/consul.cpython-312.pyc
index dc5c57ea..83d2fc9f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/consul.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/consul.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/etcd.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/etcd.cpython-312.pyc
index 3d872046..ee3eb41a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/etcd.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/etcd.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/filesystem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/filesystem.cpython-312.pyc
index 5718aef9..46de327d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/filesystem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/filesystem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/gcpubsub.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/gcpubsub.cpython-312.pyc
index ce4f1319..7f474c79 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/gcpubsub.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/gcpubsub.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/librabbitmq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/librabbitmq.cpython-312.pyc
index 2997042f..f6bb7b4c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/librabbitmq.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/librabbitmq.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/memory.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/memory.cpython-312.pyc
index 8a78e7ae..eb96ebcc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/memory.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/memory.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/mongodb.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/mongodb.cpython-312.pyc
index 31abd5cc..5627d188 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/mongodb.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/mongodb.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/native_delayed_delivery.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/native_delayed_delivery.cpython-312.pyc
index 0900cce2..c77c9151 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/native_delayed_delivery.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/native_delayed_delivery.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyamqp.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyamqp.cpython-312.pyc
index 578721b0..ef417931 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyamqp.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyamqp.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyro.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyro.cpython-312.pyc
index 488ef123..17951b80 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyro.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/pyro.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/qpid.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/qpid.cpython-312.pyc
index a63ddcee..a2a5b460 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/qpid.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/qpid.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/redis.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/redis.cpython-312.pyc
index f6c3de12..b4adc13e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/redis.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/redis.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/zookeeper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/zookeeper.cpython-312.pyc
index 013c4034..b58e731e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/zookeeper.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/__pycache__/zookeeper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/__init__.cpython-312.pyc
index 212c592a..d751cf89 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/models.cpython-312.pyc
index e427e6ba..dbe4adf0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/models.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/sqlalchemy/__pycache__/models.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/__init__.cpython-312.pyc
index 814dc0c1..a555952f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/base.cpython-312.pyc
index 01fd5e1b..cd665a47 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/exchange.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/exchange.cpython-312.pyc
index 6c3a7a3c..d9ac076e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/exchange.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/transport/virtual/__pycache__/exchange.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/__init__.cpython-312.pyc
index 72c94cc3..58d01779 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/amq_manager.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/amq_manager.cpython-312.pyc
index 19709457..8774410c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/amq_manager.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/amq_manager.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/collections.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/collections.cpython-312.pyc
index 8dd7e07e..06a2313b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/collections.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/collections.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/compat.cpython-312.pyc
index 9dc56f5d..c741e8c0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/debug.cpython-312.pyc
index c895bc80..2c2760b1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/div.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/div.cpython-312.pyc
index 7eaa3c61..31cae92b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/div.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/div.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/encoding.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/encoding.cpython-312.pyc
index 4813b8ff..5794fca6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/encoding.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/encoding.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/eventio.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/eventio.cpython-312.pyc
index 7c3ce912..a692dd20 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/eventio.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/eventio.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/functional.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/functional.cpython-312.pyc
index 8e6abd88..f1109371 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/functional.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/functional.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/imports.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/imports.cpython-312.pyc
index 67ebb086..3c864d5d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/imports.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/imports.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/json.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/json.cpython-312.pyc
index d0dfd20e..7993f355 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/json.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/json.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/limits.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/limits.cpython-312.pyc
index 748292f1..7f21cb74 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/limits.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/limits.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/objects.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/objects.cpython-312.pyc
index b637b988..fc45b579 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/objects.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/objects.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/scheduling.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/scheduling.cpython-312.pyc
index a351b5e5..5ba0861d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/scheduling.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/scheduling.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/text.cpython-312.pyc
index 2797273c..f60e2d5a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/time.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/time.cpython-312.pyc
index 9ad79efc..21ee5bf7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/time.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/time.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/url.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/url.cpython-312.pyc
index f8a7ddf9..52b5e723 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/url.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/url.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/uuid.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/uuid.cpython-312.pyc
index d320fbba..1310bd89 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/uuid.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/kombu/utils/__pycache__/uuid.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc
index ea0f7b6a..637a01b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc
index 4acd7761..59b80e98 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_elffile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc
index e4a3cb08..502ceefd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_manylinux.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc
index ff5372a8..442b7d44 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_musllinux.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc
index 605918df..13646f98 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc
index 7123dfba..e5fc5bac 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_structures.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc
index eca70825..b679f36e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/_tokenizer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc
index 0568dafb..4a61410f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/markers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc
index c83ece10..c951d617 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/metadata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc
index 44347081..3e1d1de1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/requirements.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc
index c8d1f5dd..93f5954f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/specifiers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc
index ba4076e9..21d83a93 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/tags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc
index 64243be0..10a212a7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc
index 33161169..5335c410 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/__pycache__/version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc
index e95054d5..a79507e8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc
index e8de91ce..a1b7f040 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/packaging/licenses/__pycache__/_spdx.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD b/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD
deleted file mode 100644
index 82a3f45d..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD
+++ /dev/null
@@ -1,1005 +0,0 @@
-../../../bin/pip,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
-../../../bin/pip3,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
-../../../bin/pip3.12,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
-pip-24.0.dist-info/AUTHORS.txt,sha256=SwXm4nkwRkmtnO1ZY-dLy7EPeoQNXMNLby5CN3GlNhY,10388
-pip-24.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip-24.0.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
-pip-24.0.dist-info/METADATA,sha256=kNEfJ3_Vho2mee4lfJdlbd5RHIqsfQJSMUB-bOkIOeI,3581
-pip-24.0.dist-info/RECORD,,
-pip-24.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip-24.0.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
-pip-24.0.dist-info/entry_points.txt,sha256=Fa_c0b-xGFaYxagIruvpJD6qqXmNTA02vAVIkmMj-9o,125
-pip-24.0.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
-pip/__init__.py,sha256=oAk1nFpLmUVS5Ln7NxvNoGUn5Vkn6FGQjPaNDf8Q8pk,355
-pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
-pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444
-pip/__pycache__/__init__.cpython-312.pyc,,
-pip/__pycache__/__main__.cpython-312.pyc,,
-pip/__pycache__/__pip-runner__.cpython-312.pyc,,
-pip/_internal/__init__.py,sha256=iqZ5-YQsQV08tkUc7L806Reop6tguLFWf70ySF6be0Y,515
-pip/_internal/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/__pycache__/build_env.cpython-312.pyc,,
-pip/_internal/__pycache__/cache.cpython-312.pyc,,
-pip/_internal/__pycache__/configuration.cpython-312.pyc,,
-pip/_internal/__pycache__/exceptions.cpython-312.pyc,,
-pip/_internal/__pycache__/main.cpython-312.pyc,,
-pip/_internal/__pycache__/pyproject.cpython-312.pyc,,
-pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,,
-pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,,
-pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243
-pip/_internal/cache.py,sha256=uiYD-9F0Bv1C8ZyWE85lpzDmQf7hcUkgL99GmI8I41Q,10370
-pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132
-pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/main.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/parser.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,,
-pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,,
-pip/_internal/cli/autocompletion.py,sha256=_br_5NgSxSuvPjMF0MLHzS5s6BpSkQAQHKrLK89VauM,6690
-pip/_internal/cli/base_command.py,sha256=iuVWGa2oTq7gBReo0er3Z0tXJ2oqBIC6QjDHcnDhKXY,8733
-pip/_internal/cli/cmdoptions.py,sha256=V8ggG6AtHpHKkH_6tRU0mhJaZTeqtrFpu75ghvMXXJk,30063
-pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774
-pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816
-pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338
-pip/_internal/cli/parser.py,sha256=KW6C3-7-4ErTNB0TfLTKwOdHcd-qefCeGnrOoE2r0RQ,10781
-pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968
-pip/_internal/cli/req_command.py,sha256=c7_XHABnXmD3_qlK9-r37KqdKBAcgmVKvQ2WcTrNLfc,18369
-pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118
-pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
-pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882
-pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/cache.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/check.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/completion.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/debug.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/download.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/hash.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/help.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/index.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/install.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/list.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/search.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/show.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,,
-pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/commands/cache.py,sha256=xg76_ZFEBC6zoQ3gXLRfMZJft4z2a0RwH4GEFZC6nnU,7944
-pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782
-pip/_internal/commands/completion.py,sha256=HT4lD0bgsflHq2IDgYfiEdp7IGGtE7s6MgI3xn0VQEw,4287
-pip/_internal/commands/configuration.py,sha256=n98enwp6y0b5G6fiRQjaZo43FlJKYve_daMhN-4BRNc,9766
-pip/_internal/commands/debug.py,sha256=63972uUCeMIGOdMMVeIUGrOjTOqTVWplFC82a-hcKyA,6777
-pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335
-pip/_internal/commands/freeze.py,sha256=qrIHS_-c6JPrQ92hMhAv9kkl0bHgFpRLwYJDdbcYr1o,3243
-pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703
-pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132
-pip/_internal/commands/index.py,sha256=CNXQer_PeZKSJooURcCFCBEKGfwyNoUWYP_MWczAcOM,4775
-pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188
-pip/_internal/commands/install.py,sha256=VxDd-BD3a27ApeE2OK34rfBXS6Zo2wtemK9-HCwPqxM,28782
-pip/_internal/commands/list.py,sha256=-QbpPuGDiGN1SdThsk2ml8beBnepliefbGhMAN8tkzU,12547
-pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697
-pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419
-pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886
-pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476
-pip/_internal/configuration.py,sha256=XkAiBS0hpzsM-LF0Qu5hvPWO_Bs67-oQKRYFBuMbESs,14006
-pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
-pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/distributions/__pycache__/base.cpython-312.pyc,,
-pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,,
-pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,,
-pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/distributions/base.py,sha256=oRSEvnv2ZjBnargamnv2fcJa1n6gUDKaW0g6CWSEpWs,1743
-pip/_internal/distributions/installed.py,sha256=QinHFbWAQ8oE0pbD8MFZWkwlnfU1QYTccA1vnhrlYOU,842
-pip/_internal/distributions/sdist.py,sha256=4K3V0VNMllHbBzCJibjwd_tylUKpmIdu2AQyhplvCQo,6709
-pip/_internal/distributions/wheel.py,sha256=-ma3sOtUQj0AxXCEb6_Fhmjl3nh4k3A0HC2taAb2N-4,1277
-pip/_internal/exceptions.py,sha256=TmF1iNFEneSWaemwlg6a5bpPuq2cMHK7d1-SvjsQHb0,23634
-pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30
-pip/_internal/index/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/index/__pycache__/collector.cpython-312.pyc,,
-pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,,
-pip/_internal/index/__pycache__/sources.cpython-312.pyc,,
-pip/_internal/index/collector.py,sha256=sH0tL_cOoCk6pLLfCSGVjFM4rPEJtllF-VobvAvLSH4,16590
-pip/_internal/index/package_finder.py,sha256=S_nC8gzVIMY6ikWfKoSOzRtoesUqnfNhAPl_BwSOusA,37843
-pip/_internal/index/sources.py,sha256=dJegiR9f86kslaAHcv9-R5L_XBf5Rzm_FkyPteDuPxI,8688
-pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365
-pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,,
-pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,,
-pip/_internal/locations/__pycache__/base.cpython-312.pyc,,
-pip/_internal/locations/_distutils.py,sha256=H9ZHK_35rdDV1Qsmi4QeaBULjFT4Mbu6QuoVGkJ6QHI,6009
-pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680
-pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556
-pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340
-pip/_internal/metadata/__init__.py,sha256=9pU3W3s-6HtjFuYhWcLTYVmSaziklPv7k2x8p7X1GmA,4339
-pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,,
-pip/_internal/metadata/__pycache__/base.cpython-312.pyc,,
-pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,,
-pip/_internal/metadata/_json.py,sha256=Rz5M5ciSNvITwaTQR6NfN8TgKgM5WfTws4D6CFknovE,2627
-pip/_internal/metadata/base.py,sha256=l3Wgku4xlgr8s4p6fS-3qQ4QKOpPbWLRwi5d9omEFG4,25907
-pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
-pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,,
-pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,,
-pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882
-pip/_internal/metadata/importlib/_dists.py,sha256=UPl1wUujFqiwiltRJ1tMF42WRINO1sSpNNlYQ2mX0mk,8297
-pip/_internal/metadata/importlib/_envs.py,sha256=XTaFIYERP2JF0QUZuPx2ETiugXbPEcZ8q8ZKeht6Lpc,7456
-pip/_internal/metadata/pkg_resources.py,sha256=opjw4IBSqHvie6sXJ_cbT42meygoPEUfNURJuWZY7sk,10035
-pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63
-pip/_internal/models/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/models/__pycache__/candidate.cpython-312.pyc,,
-pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,,
-pip/_internal/models/__pycache__/format_control.cpython-312.pyc,,
-pip/_internal/models/__pycache__/index.cpython-312.pyc,,
-pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,,
-pip/_internal/models/__pycache__/link.cpython-312.pyc,,
-pip/_internal/models/__pycache__/scheme.cpython-312.pyc,,
-pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,,
-pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,,
-pip/_internal/models/__pycache__/target_python.cpython-312.pyc,,
-pip/_internal/models/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/models/candidate.py,sha256=hEPu8VdGE5qVASv6vLz-R-Rgh5-7LMbai1jgthMCd8M,931
-pip/_internal/models/direct_url.py,sha256=FwouYBKcqckh7B-k2H3HVgRhhFTukFwqiS3kfvtFLSk,6889
-pip/_internal/models/format_control.py,sha256=wtsQqSK9HaUiNxQEuB-C62eVimw6G4_VQFxV9-_KDBE,2486
-pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
-pip/_internal/models/installation_report.py,sha256=zRVZoaz-2vsrezj_H3hLOhMZCK9c7TbzWgC-jOalD00,2818
-pip/_internal/models/link.py,sha256=XirOAGv1jgMu7vu87kuPbohGj7VHpwVrd2q3KUgVQNg,20777
-pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738
-pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643
-pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907
-pip/_internal/models/target_python.py,sha256=34EkorrMuRvRp-bjqHKJ-bOO71m9xdjN2b8WWFEC2HU,4272
-pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600
-pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50
-pip/_internal/network/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/network/__pycache__/auth.cpython-312.pyc,,
-pip/_internal/network/__pycache__/cache.cpython-312.pyc,,
-pip/_internal/network/__pycache__/download.cpython-312.pyc,,
-pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,,
-pip/_internal/network/__pycache__/session.cpython-312.pyc,,
-pip/_internal/network/__pycache__/utils.cpython-312.pyc,,
-pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,,
-pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541
-pip/_internal/network/cache.py,sha256=48A971qCzKNFvkb57uGEk7-0xaqPS0HWj2711QNTxkU,3935
-pip/_internal/network/download.py,sha256=i0Tn55CD5D7XYEFY3TxiYaCf0OaaTQ6SScNgCsSeV14,6086
-pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638
-pip/_internal/network/session.py,sha256=9tqEDD8JiVaFdplOEXJxNo9cjRfBZ6RIa0yQQ_qBNiM,18698
-pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073
-pip/_internal/network/xmlrpc.py,sha256=sAxzOacJ-N1NXGPvap9jC3zuYWSnnv3GXtgR2-E2APA,1838
-pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/operations/__pycache__/check.cpython-312.pyc,,
-pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,,
-pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,,
-pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,,
-pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,,
-pip/_internal/operations/build/build_tracker.py,sha256=z-H5DOknZdBa3dh2Vq6VBMY5qLYIKmlj2p6CGZK5Lc8,4832
-pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422
-pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474
-pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198
-pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075
-pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417
-pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064
-pip/_internal/operations/check.py,sha256=fsqA88iGaqftCr2tlP3sSU202CSkoODRtW0O-JU9M4Y,6806
-pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816
-pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51
-pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,,
-pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282
-pip/_internal/operations/install/wheel.py,sha256=9hGb1c4bRnPIb2FG7CtUSPfPxqprmHQBtwIAlWPNTtE,27311
-pip/_internal/operations/prepare.py,sha256=57Oq87HfunX3Rbqp47FdaJr9cHbAKUm_3gv7WhBAqbE,28128
-pip/_internal/pyproject.py,sha256=4Xszp11xgr126yzG6BbJA0oaQ9WXuhb0jyUb-y_6lPQ,7152
-pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738
-pip/_internal/req/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/req/__pycache__/constructors.cpython-312.pyc,,
-pip/_internal/req/__pycache__/req_file.cpython-312.pyc,,
-pip/_internal/req/__pycache__/req_install.cpython-312.pyc,,
-pip/_internal/req/__pycache__/req_set.cpython-312.pyc,,
-pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,,
-pip/_internal/req/constructors.py,sha256=8hlY56imEthLORRwmloyKz3YOyXymIaKsNB6P9ewvNI,19018
-pip/_internal/req/req_file.py,sha256=M8ttOZL-PwAj7scPElhW3ZD2hiD9mm_6FJAGIbwAzEI,17790
-pip/_internal/req/req_install.py,sha256=wtOPxkyRSM8comTks8oL1Gp2oyGqbH7JwIDRci2QiPk,35460
-pip/_internal/req/req_set.py,sha256=iMYDUToSgkxFyrP_OrTtPSgw4dwjRyGRDpGooTqeA4Y,4704
-pip/_internal/req/req_uninstall.py,sha256=nmvTQaRCC0iu-5Tw0djlXJhSj6WmqHRvT3qkkEdC35E,24551
-pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/resolution/__pycache__/base.cpython-312.pyc,,
-pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583
-pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,,
-pip/_internal/resolution/legacy/resolver.py,sha256=Xk24jQ62GvLr4Mc7IjN_qiO88qp0BImzVmPIFz9QLOE,24025
-pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,,
-pip/_internal/resolution/resolvelib/base.py,sha256=jg5COmHLhmBIKOR-4spdJD3jyULYa1BdsqiBu2YJnJ4,5173
-pip/_internal/resolution/resolvelib/candidates.py,sha256=19Ki91Po-MSxBknGIfOGkaWkFdOznN0W_nKv7jL28L0,21052
-pip/_internal/resolution/resolvelib/factory.py,sha256=vqqk-hjchdhShwWVdeW2_A-5ZblLhE_nC_v3Mhz4Svc,32292
-pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705
-pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824
-pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100
-pip/_internal/resolution/resolvelib/requirements.py,sha256=-kJONP0WjDfdTvBAs2vUXPgAnOyNIBEAXY4b72ogtPE,5696
-pip/_internal/resolution/resolvelib/resolver.py,sha256=nLJOsVMEVi2gQUVJoUFKMZAeu2f7GRMjGMvNSWyz0Bc,12592
-pip/_internal/self_outdated_check.py,sha256=saxQLB8UzIFtMScquytG10TOTsYVFJQ_mkW1NY-46wE,8378
-pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/_log.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/compat.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/encoding.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/logging.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/misc.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/models.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/urls.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,,
-pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,,
-pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351
-pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
-pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665
-pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884
-pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377
-pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242
-pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627
-pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206
-pip/_internal/utils/egg_link.py,sha256=0FePZoUYKv4RGQ2t6x7w5Z427wbA_Uo3WZnAkrgsuqo,2463
-pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169
-pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064
-pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122
-pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716
-pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113
-pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118
-pip/_internal/utils/logging.py,sha256=fdtuZJ-AKkqwDTANDvGcBEpssL8el7T1jnwk1CnZl3Y,11603
-pip/_internal/utils/misc.py,sha256=fNXwaeeikvnUt4CPMFIL4-IQbZDxxjj4jDpzCi4ZsOw,23623
-pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193
-pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108
-pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435
-pip/_internal/utils/subprocess.py,sha256=zzdimb75jVLE1GU4WlTZ055gczhD7n1y1xTcNc7vNZQ,9207
-pip/_internal/utils/temp_dir.py,sha256=DUAw22uFruQdK43i2L2K53C-CDjRCPeAsBKJpu-rHQ4,9312
-pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821
-pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759
-pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456
-pip/_internal/utils/wheel.py,sha256=i4BwUNHattzN0ixy3HBAF04tZPRh2CcxaT6t86viwkE,4499
-pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
-pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,,
-pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,,
-pip/_internal/vcs/__pycache__/git.cpython-312.pyc,,
-pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,,
-pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,,
-pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,,
-pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519
-pip/_internal/vcs/git.py,sha256=CeKBGJnl6uskvvjkAUXrJVxbHJrpS_B_pyfFdjL3CRc,18121
-pip/_internal/vcs/mercurial.py,sha256=oULOhzJ2Uie-06d1omkL-_Gc6meGaUkyogvqG9ZCyPs,5249
-pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729
-pip/_internal/vcs/versioncontrol.py,sha256=3eIjtOMYvOY5qP6BMYIYDZ375CSuec6kSEB0bOo1cSs,22787
-pip/_internal/wheel_builder.py,sha256=qTTzQV8F6b1jNsFCda1TRQC8J7gK-m7iuRNgKo7Dj68,11801
-pip/_vendor/__init__.py,sha256=U51NPwXdA-wXOiANIQncYjcMp6txgeOL5nHxksJeyas,4993
-pip/_vendor/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/__pycache__/six.cpython-312.pyc,,
-pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__init__.py,sha256=ctHagMhQXuvQDdm4TirZrwDOT5H8oBNAJqzdKI6sovk,676
-pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,,
-pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,,
-pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
-pip/_vendor/cachecontrol/adapter.py,sha256=_CcWvUP9048qAZjsNqViaHbdcLs9mmFNixVfpO7oebE,6392
-pip/_vendor/cachecontrol/cache.py,sha256=OTQj72tUf8C1uEgczdl3Gc8vkldSzsTITKtDGKMx4z8,1952
-pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
-pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,,
-pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,,
-pip/_vendor/cachecontrol/caches/file_cache.py,sha256=3z8AWKD-vfKeiJqIzLmJyIYtR2yd6Tsh3u1TyLRQoIQ,5352
-pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
-pip/_vendor/cachecontrol/controller.py,sha256=keCFA3ZaNVaWTwHd6F1zqWhb4vyvNx_UvZuo5iIYMfo,18384
-pip/_vendor/cachecontrol/filewrapper.py,sha256=STttGmIPBvZzt2b51dUOwoWX5crcMCpKZOisM3f5BNc,4292
-pip/_vendor/cachecontrol/heuristics.py,sha256=fdFbk9W8IeLrjteIz_fK4mj2HD_Y7COXF2Uc8TgjT1c,4828
-pip/_vendor/cachecontrol/serialize.py,sha256=0dHeMaDwysVAAnGVlhMOP4tDliohgNK0Jxk_zsOiWxw,7173
-pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
-pip/_vendor/certifi/__init__.py,sha256=L_j-d0kYuA_MzA2_2hraF1ovf6KT6DTquRdV3paQwOk,94
-pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
-pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,,
-pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,,
-pip/_vendor/certifi/cacert.pem,sha256=eU0Dn_3yd8BH4m8sfVj4Glhl2KDrcCSg-sEWT-pNJ88,281617
-pip/_vendor/certifi/core.py,sha256=DNTl8b_B6C4vO3Vc9_q2uvwHpNnBQoy5onDC4McImxc,4531
-pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797
-pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc,,
-pip/_vendor/chardet/__pycache__/version.cpython-312.pyc,,
-pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274
-pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763
-pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032
-pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915
-pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420
-pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc,,
-pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242
-pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732
-pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542
-pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860
-pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683
-pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006
-pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176
-pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934
-pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566
-pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753
-pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913
-pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753
-pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735
-pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759
-pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537
-pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796
-pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498
-pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752
-pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055
-pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562
-pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484
-pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196
-pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363
-pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035
-pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774
-pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372
-pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380
-pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077
-pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715
-pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131
-pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391
-pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc,,
-pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560
-pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402
-pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400
-pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137
-pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007
-pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848
-pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505
-pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812
-pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244
-pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266
-pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc,,
-pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc,,
-pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc,,
-pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc,,
-pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc,,
-pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522
-pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128
-pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325
-pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75
-pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc,,
-pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc,,
-pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839
-pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678
-pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741
-pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866
-pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079
-pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709
-pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181
-pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134
-pip/_vendor/distlib/__init__.py,sha256=hJKF7FHoqbmGckncDuEINWo_OYkDNiHODtYXSMcvjcc,625
-pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/database.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/index.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/version.cpython-312.pyc,,
-pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc,,
-pip/_vendor/distlib/compat.py,sha256=Un-uIBvy02w-D267OG4VEhuddqWgKj9nNkxVltAb75w,41487
-pip/_vendor/distlib/database.py,sha256=0V9Qvs0Vrxa2F_-hLWitIyVyRifJ0pCxyOI-kEOBwsA,51965
-pip/_vendor/distlib/index.py,sha256=lTbw268rRhj8dw1sib3VZ_0EhSGgoJO3FKJzSFMOaeA,20797
-pip/_vendor/distlib/locators.py,sha256=o1r_M86_bRLafSpetmyfX8KRtFu-_Q58abvQrnOSnbA,51767
-pip/_vendor/distlib/manifest.py,sha256=3qfmAmVwxRqU1o23AlfXrQGZzh6g_GGzTAP_Hb9C5zQ,14168
-pip/_vendor/distlib/markers.py,sha256=n3DfOh1yvZ_8EW7atMyoYeZFXjYla0Nz0itQlojCd0A,5268
-pip/_vendor/distlib/metadata.py,sha256=pB9WZ9mBfmQxc9OVIldLS5CjOoQRvKAvUwwQyKwKQtQ,39693
-pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
-pip/_vendor/distlib/scripts.py,sha256=nQFXN6G7nOWNDUyxirUep-3WOlJhB7McvCs9zOnkGTI,18315
-pip/_vendor/distlib/util.py,sha256=XSznxEi_i3T20UJuaVc0qXHz5ksGUCW1khYlBprN_QE,67530
-pip/_vendor/distlib/version.py,sha256=9pXkduchve_aN7JG6iL9VTYV_kqNSGoc2Dwl8JuySnQ,23747
-pip/_vendor/distlib/wheel.py,sha256=FVQCve8u-L0QYk5-YTZc7s4WmNQdvjRWTK08KXzZVX4,43958
-pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
-pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
-pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,,
-pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,,
-pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330
-pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849
-pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/core.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,,
-pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,,
-pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374
-pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321
-pip/_vendor/idna/core.py,sha256=kkCFNJOrE6I3WwBTXcGNuc24V_QZQ8AULE6EYe1iHlU,12813
-pip/_vendor/idna/idnadata.py,sha256=9NIhTqC2piUpeIMOGZ9Bu_7eAFQ-Ic8TkP_hOzUpnDc,78344
-pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881
-pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21
-pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539
-pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132
-pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,,
-pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,,
-pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,,
-pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
-pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079
-pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544
-pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661
-pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497
-pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,,
-pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,,
-pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488
-pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378
-pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
-pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487
-pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676
-pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110
-pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699
-pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200
-pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665
-pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364
-pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155
-pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476
-pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,,
-pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,,
-pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211
-pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132
-pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678
-pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809
-pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160
-pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573
-pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983
-pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353
-pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/cmdline.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,,
-pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,,
-pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685
-pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697
-pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938
-pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386
-pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178
-pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424
-pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/groff.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/html.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/img.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/irc.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/latex.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/other.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/svg.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-312.pyc,,
-pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
-pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314
-pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094
-pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610
-pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938
-pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981
-pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351
-pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073
-pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212
-pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014
-pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335
-pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674
-pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753
-pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618
-pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130
-pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,,
-pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,,
-pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281
-pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424
-pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986
-pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591
-pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072
-pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092
-pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882
-pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257
-pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700
-pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184
-pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223
-pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230
-pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116
-pip/_vendor/pyparsing/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/actions.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/common.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/core.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/exceptions.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/helpers.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/results.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/testing.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/unicode.cpython-312.pyc,,
-pip/_vendor/pyparsing/__pycache__/util.cpython-312.pyc,,
-pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567
-pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387
-pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445
-pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215
-pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523
-pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646
-pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692
-pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488
-pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646
-pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670
-pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491
-pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-312.pyc,,
-pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,,
-pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138
-pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920
-pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546
-pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,,
-pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927
-pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169
-pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/api.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/help.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/models.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,,
-pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,,
-pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435
-pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
-pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697
-pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449
-pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187
-pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575
-pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286
-pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560
-pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823
-pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879
-pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
-pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288
-pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695
-pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373
-pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235
-pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
-pip/_vendor/requests/utils.py,sha256=BvQDKkLuXCSaVfSW_1blUN0IzJSfNC8njNr8vhKj76Y,33189
-pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537
-pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,,
-pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,,
-pip/_vendor/resolvelib/__pycache__/resolvers.cpython-312.pyc,,
-pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,,
-pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-312.pyc,,
-pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156
-pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871
-pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601
-pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511
-pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963
-pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
-pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478
-pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/align.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/box.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/color.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/console.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/control.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/json.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/live.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/region.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/status.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/style.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/table.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/text.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,,
-pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,,
-pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096
-pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
-pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
-pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100
-pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
-pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
-pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695
-pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
-pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
-pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387
-pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
-pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
-pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472
-pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
-pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
-pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
-pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820
-pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926
-pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
-pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840
-pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
-pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368
-pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906
-pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264
-pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842
-pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509
-pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224
-pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
-pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
-pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218
-pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
-pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497
-pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630
-pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082
-pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972
-pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501
-pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
-pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
-pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508
-pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584
-pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032
-pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
-pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007
-pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273
-pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667
-pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903
-pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198
-pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
-pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970
-pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
-pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
-pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574
-pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852
-pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706
-pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165
-pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303
-pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
-pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
-pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431
-pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
-pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
-pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
-pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247
-pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339
-pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425
-pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073
-pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
-pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173
-pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684
-pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
-pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525
-pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777
-pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
-pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604
-pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169
-pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549
-pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493
-pip/_vendor/tenacity/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/_asyncio.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/_utils.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/after.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/before.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/before_sleep.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/nap.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/retry.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/stop.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-312.pyc,,
-pip/_vendor/tenacity/__pycache__/wait.cpython-312.pyc,,
-pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551
-pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179
-pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682
-pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562
-pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372
-pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383
-pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746
-pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086
-pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142
-pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024
-pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396
-pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,,
-pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,,
-pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,,
-pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633
-pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943
-pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
-pip/_vendor/truststore/__init__.py,sha256=qzTLSH8PvAkY1fr6QQ2vV-KwE_M83wdXugtpJaP_AbM,403
-pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,,
-pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,,
-pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,,
-pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,,
-pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,,
-pip/_vendor/truststore/_api.py,sha256=xjuEu_rlH4hcdJTROImEyOEqdw-F8t5vO2H2BToY0Ro,9893
-pip/_vendor/truststore/_macos.py,sha256=BjvAKoAjXhdIPuxpY124HJIFswDb0pq8DjynzJOVwqc,17694
-pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
-pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
-pip/_vendor/truststore/_windows.py,sha256=1x_EhROeJ9QK1sMAjfnZC7awYI8UnBJYL-TjACUYI4A,17468
-pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130
-pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
-pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,,
-pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,,
-pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
-pip/_vendor/urllib3/_version.py,sha256=azoM7M7BUADl2kBhMVR6PPf2GhBDI90me1fcnzTwdcw,64
-pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300
-pip/_vendor/urllib3/connectionpool.py,sha256=Be6q65SR9laoikg-h_jmc_p8OWtEmwgq_Om_Xtig-2M,40285
-pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
-pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,,
-pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
-pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
-pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
-pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
-pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
-pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448
-pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
-pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
-pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
-pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
-pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,,
-pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
-pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,,
-pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,,
-pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
-pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
-pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
-pip/_vendor/urllib3/poolmanager.py,sha256=mJmZWy_Mb4-dHbmNCKbDqv3fZS9UF_2bVDuiECHyPaI,20943
-pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
-pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
-pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
-pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,,
-pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,,
-pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
-pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
-pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
-pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
-pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
-pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
-pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177
-pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
-pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
-pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
-pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
-pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
-pip/_vendor/vendor.txt,sha256=4NKk7fQhVsZw0U-0zmm9Q2LgGyaPXacFbnJAaS0Q6EY,493
-pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579
-pip/_vendor/webencodings/__pycache__/__init__.cpython-312.pyc,,
-pip/_vendor/webencodings/__pycache__/labels.cpython-312.pyc,,
-pip/_vendor/webencodings/__pycache__/mklabels.cpython-312.pyc,,
-pip/_vendor/webencodings/__pycache__/tests.cpython-312.pyc,,
-pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-312.pyc,,
-pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979
-pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305
-pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563
-pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307
-pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
diff --git a/gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/INSTALLER b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/INSTALLER
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/drf_yasg-1.21.10.dist-info/INSTALLER
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/INSTALLER
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/METADATA
similarity index 67%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/METADATA
index e5b45bdd..2cf904bc 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/METADATA
@@ -1,48 +1,72 @@
-Metadata-Version: 2.1
+Metadata-Version: 2.4
Name: pip
-Version: 24.0
+Version: 25.2
Summary: The PyPA recommended tool for installing Python packages.
Author-email: The pip developers
-License: MIT
+License-Expression: MIT
Project-URL: Homepage, https://pip.pypa.io/
Project-URL: Documentation, https://pip.pypa.io
Project-URL: Source, https://github.com/pypa/pip
Project-URL: Changelog, https://pip.pypa.io/en/stable/news/
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
-Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Build Tools
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
+Classifier: Programming Language :: Python :: 3.13
+Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
-Requires-Python: >=3.7
+Requires-Python: >=3.9
Description-Content-Type: text/x-rst
-License-File: LICENSE.txt
License-File: AUTHORS.txt
+License-File: LICENSE.txt
+License-File: src/pip/_vendor/msgpack/COPYING
+License-File: src/pip/_vendor/cachecontrol/LICENSE.txt
+License-File: src/pip/_vendor/certifi/LICENSE
+License-File: src/pip/_vendor/dependency_groups/LICENSE.txt
+License-File: src/pip/_vendor/distlib/LICENSE.txt
+License-File: src/pip/_vendor/distro/LICENSE
+License-File: src/pip/_vendor/idna/LICENSE.md
+License-File: src/pip/_vendor/packaging/LICENSE
+License-File: src/pip/_vendor/packaging/LICENSE.APACHE
+License-File: src/pip/_vendor/packaging/LICENSE.BSD
+License-File: src/pip/_vendor/pkg_resources/LICENSE
+License-File: src/pip/_vendor/platformdirs/LICENSE
+License-File: src/pip/_vendor/pygments/LICENSE
+License-File: src/pip/_vendor/pyproject_hooks/LICENSE
+License-File: src/pip/_vendor/requests/LICENSE
+License-File: src/pip/_vendor/resolvelib/LICENSE
+License-File: src/pip/_vendor/rich/LICENSE
+License-File: src/pip/_vendor/tomli/LICENSE
+License-File: src/pip/_vendor/tomli/LICENSE-HEADER
+License-File: src/pip/_vendor/tomli_w/LICENSE
+License-File: src/pip/_vendor/truststore/LICENSE
+License-File: src/pip/_vendor/urllib3/LICENSE.txt
+Dynamic: license-file
pip - The Python Package Installer
==================================
-.. image:: https://img.shields.io/pypi/v/pip.svg
+.. |pypi-version| image:: https://img.shields.io/pypi/v/pip.svg
:target: https://pypi.org/project/pip/
:alt: PyPI
-.. image:: https://img.shields.io/pypi/pyversions/pip
+.. |python-versions| image:: https://img.shields.io/pypi/pyversions/pip
:target: https://pypi.org/project/pip
:alt: PyPI - Python Version
-.. image:: https://readthedocs.org/projects/pip/badge/?version=latest
+.. |docs-badge| image:: https://readthedocs.org/projects/pip/badge/?version=latest
:target: https://pip.pypa.io/en/latest
:alt: Documentation
+|pypi-version| |python-versions| |docs-badge|
+
pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes.
Please take a look at our documentation for how to install and use pip:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/RECORD b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/RECORD
new file mode 100644
index 00000000..a1e5a65c
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/RECORD
@@ -0,0 +1,860 @@
+../../../bin/pip,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
+../../../bin/pip3,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
+../../../bin/pip3.12,sha256=mmTmCLJvZo5_wht45rZazEcNAJJ3RhgaAo84XzvsTqQ,257
+pip-25.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip-25.2.dist-info/METADATA,sha256=l6OtFNcf2JFKOPJK9bMaH5-usFrqZqSvQNl51tetIp8,4744
+pip-25.2.dist-info/RECORD,,
+pip-25.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip-25.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
+pip-25.2.dist-info/entry_points.txt,sha256=eeIjuzfnfR2PrhbjnbzFU6MnSS70kZLxwaHHq6M-bD0,87
+pip-25.2.dist-info/licenses/AUTHORS.txt,sha256=ioEfMGkkizcTcIPdvjh-kYymO1E9I9dvzHjLUlKS5m8,11385
+pip-25.2.dist-info/licenses/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093
+pip-25.2.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt,sha256=hu7uh74qQ_P_H1ZJb0UfaSQ5JvAl_tuwM2ZsMExMFhs,558
+pip-25.2.dist-info/licenses/src/pip/_vendor/certifi/LICENSE,sha256=6TcW2mucDVpKHfYP5pWzcPBpVgPSH2-D8FPkLPwQyvc,989
+pip-25.2.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt,sha256=GrNuPipLqGMWJThPh-ngkdsfrtA0xbIzJbMjmr8sxSU,1099
+pip-25.2.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt,sha256=gI4QyKarjesUn_mz-xn0R6gICUYG1xKpylf-rTVSWZ0,14531
+pip-25.2.dist-info/licenses/src/pip/_vendor/distro/LICENSE,sha256=y16Ofl9KOYjhBjwULGDcLfdWBfTEZRXnduOspt-XbhQ,11325
+pip-25.2.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md,sha256=pZ8LDvNjWHQQmkRhykT_enDVBpboFHZ7-vch1Mmw2w8,1541
+pip-25.2.dist-info/licenses/src/pip/_vendor/msgpack/COPYING,sha256=SS3tuoXaWHL3jmCRvNH-pHTWYNNay03ulkuKqz8AdCc,614
+pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE,sha256=ytHvW9NA1z4HS6YU0m996spceUDD2MNIUuZcSQlobEg,197
+pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
+pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD,sha256=tw5-m3QvHMb5SLNMFqo5_-zpQZY2S8iP8NIYDwAo-sU,1344
+pip-25.2.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE,sha256=htoPAa6uRjSKPD1GUZXcHOzN55956HdppkuNoEsqR0E,1023
+pip-25.2.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE,sha256=KeD9YukphQ6G6yjD_czwzv30-pSHkBHP-z0NS-1tTbY,1089
+pip-25.2.dist-info/licenses/src/pip/_vendor/pygments/LICENSE,sha256=qdZvHVJt8C4p3Oc0NtNOVuhjL0bCdbvf_HBWnogvnxc,1331
+pip-25.2.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE,sha256=GyKwSbUmfW38I6Z79KhNjsBLn9-xpR02DkK0NCyLQVQ,1081
+pip-25.2.dist-info/licenses/src/pip/_vendor/requests/LICENSE,sha256=CeipvOyAZxBGUsFoaFqwkx54aPnIKEtm9a5u2uXxEws,10142
+pip-25.2.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE,sha256=84j9OMrRMRLB3A9mm76A5_hFQe26-3LzAw0sp2QsPJ0,751
+pip-25.2.dist-info/licenses/src/pip/_vendor/rich/LICENSE,sha256=3u18F6QxgVgZCj6iOcyHmlpQJxzruYrnAl9I--WNyhU,1056
+pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
+pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER,sha256=l86TMJBaFy3ehw7gNh2Jvrlbo70PRUV5aqkajAGkNTE,121
+pip-25.2.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE,sha256=uAgWsNUwuKzLTCIReDeQmEpuO2GSLCte6S8zcqsnQv4,1072
+pip-25.2.dist-info/licenses/src/pip/_vendor/truststore/LICENSE,sha256=M757fo-k_Rmxdg4ajtimaL2rhSyRtpLdQUJLy3Jan8o,1086
+pip-25.2.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt,sha256=w3vxhuJ8-dvpYZ5V7f486nswCRzrPaY8fay-Dm13kHs,1115
+pip-25.2.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
+pip/__init__.py,sha256=_lgs5Mfp0t7AGtI7sTVwxKWquz_vahWWH9kKO1cJusA,353
+pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854
+pip/__pip-runner__.py,sha256=JOoEZTwrtv7jRaXBkgSQKAE04yNyfFmGHxqpHiGHvL0,1450
+pip/__pycache__/__init__.cpython-312.pyc,,
+pip/__pycache__/__main__.cpython-312.pyc,,
+pip/__pycache__/__pip-runner__.cpython-312.pyc,,
+pip/_internal/__init__.py,sha256=S7i9Dn9aSZS0MG-2Wrve3dV9TImPzvQn5jjhp9t_uf0,511
+pip/_internal/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/__pycache__/build_env.cpython-312.pyc,,
+pip/_internal/__pycache__/cache.cpython-312.pyc,,
+pip/_internal/__pycache__/configuration.cpython-312.pyc,,
+pip/_internal/__pycache__/exceptions.cpython-312.pyc,,
+pip/_internal/__pycache__/main.cpython-312.pyc,,
+pip/_internal/__pycache__/pyproject.cpython-312.pyc,,
+pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc,,
+pip/_internal/__pycache__/wheel_builder.cpython-312.pyc,,
+pip/_internal/build_env.py,sha256=5_-O5G0QtCeFKHAezqAz0IZ5_O7qCYZ-Bxddu9idpYs,11566
+pip/_internal/cache.py,sha256=rWXvsuFY7GgPERhiNp3yZHFGKdvDvkZRn2n4mXn8lAg,10364
+pip/_internal/cli/__init__.py,sha256=Iqg_tKA771XuMO1P4t_sDHnSKPzkUb9D0DqunAmw_ko,131
+pip/_internal/cli/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/base_command.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/command_context.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/index_command.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/main.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/parser.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/req_command.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/spinners.cpython-312.pyc,,
+pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc,,
+pip/_internal/cli/autocompletion.py,sha256=ZG2cM03nlcNrs-WG_SFTW46isx9s2Go5lUD_8-iv70o,7193
+pip/_internal/cli/base_command.py,sha256=1Nx919JRFlgURLis9XYJwtbyEEjRJa_NdHwM6iBkZvY,8716
+pip/_internal/cli/cmdoptions.py,sha256=99bW3xpXJ8Mr59OGbG7d7vN7CGPLPwi1nTmE3eMc8lE,32032
+pip/_internal/cli/command_context.py,sha256=kmu3EWZbfBega1oDamnGJTA_UaejhIQNuMj2CVmMXu0,817
+pip/_internal/cli/index_command.py,sha256=AHk6eSqboaxTXbG3v9mBrVd0dCK1MtW4w3PVudnj0WE,5717
+pip/_internal/cli/main.py,sha256=K9PtpRdg6uBrVKk8S2VZ14fAN0kP-cnA1o-FtJCN_OQ,2815
+pip/_internal/cli/main_parser.py,sha256=UugPD-hF1WtNQdow_WWduDLUH1DvElpc7EeUWjUkcNo,4329
+pip/_internal/cli/parser.py,sha256=sAOebBa5_0rRAlmBy8myMPFHQZb-bbCH1xpIJDaXaLs,10928
+pip/_internal/cli/progress_bars.py,sha256=nRTWNof-FjHfvirvECXIh7T7eAynTUVPTyHENfpbWiU,4668
+pip/_internal/cli/req_command.py,sha256=pXT_jAwcmO9PjJ1-Pl1VevBgr5pnxHsyPZUBzAfqQg8,13081
+pip/_internal/cli/spinners.py,sha256=EJzZIZNyUtJljp3-WjcsyIrqxW-HUsfWzhuW84n_Tqw,7362
+pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116
+pip/_internal/commands/__init__.py,sha256=aNeCbQurGWihfhQq7BqaLXHqWDQ0i3I04OS7kxK6plQ,4026
+pip/_internal/commands/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/cache.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/check.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/completion.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/configuration.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/debug.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/download.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/freeze.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/hash.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/help.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/index.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/inspect.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/install.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/list.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/lock.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/search.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/show.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc,,
+pip/_internal/commands/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/commands/cache.py,sha256=OrrLS6EJEha_55yPa9fTaOaonw-VpH4_lVhjxuOTChQ,8230
+pip/_internal/commands/check.py,sha256=hVFBQezQ3zj4EydoWbFQj_afPUppMt7r9JPAlY22U6Y,2244
+pip/_internal/commands/completion.py,sha256=MDwhTOBjlM4WEbOhgbhrWnlDm710i4FMjop3RBXXXCc,4530
+pip/_internal/commands/configuration.py,sha256=6gNOGrVWnOLU15zUnAiNuOMhf76RRIZvCdVD0degPRk,10105
+pip/_internal/commands/debug.py,sha256=_8IqM8Fx1_lY2STu_qspr63tufF7zyFJCyYAXtxz0N4,6805
+pip/_internal/commands/download.py,sha256=GGBSxhORV0mrad8STgORfvjRGh1qS2plvpXFNbxgcps,5249
+pip/_internal/commands/freeze.py,sha256=fxoW8AAc-bAqB_fXdNq2VnZ3JfWkFMg-bR6LcdDVO7A,3099
+pip/_internal/commands/hash.py,sha256=GO9pRN3wXC2kQaovK57TaLYBMc3IltOH92O6QEw6YE0,1679
+pip/_internal/commands/help.py,sha256=Bz3LcjNQXkz4Cu__pL4CZ86o4-HNLZj1NZWdlJhjuu0,1108
+pip/_internal/commands/index.py,sha256=8GMBVI5NvhRRHBSUq27YxDIE02DpvdJ_6qiBFgGd1co,5243
+pip/_internal/commands/inspect.py,sha256=ogm4UT7LRo8bIQcWUS1IiA25QdD4VHLa7JaPAodDttM,3177
+pip/_internal/commands/install.py,sha256=AIO-Um49e3GqMOk2SmHCt45A0W0-YhKXcpr5okjHh80,30080
+pip/_internal/commands/list.py,sha256=I4ZH604E5gpcROxEXA7eyaNEFhXx3VFVqvpscz_Ps_A,13514
+pip/_internal/commands/lock.py,sha256=SxXGnU2EH-TG-fs9fuZHAuMOH15Lzy1K7e_KJ4vtSr0,5917
+pip/_internal/commands/search.py,sha256=zbMsX_YASj6kXA6XIBgTDv0bGK51xG-CV3IynZJcE-c,5782
+pip/_internal/commands/show.py,sha256=oLVJIfKWmDKm0SsQGEi3pozNiqrXjTras_fbBSYKpBA,8066
+pip/_internal/commands/uninstall.py,sha256=CsOihqvb6ZA6O67L70oXeoLHeOfNzMM88H9g-9aocgw,3868
+pip/_internal/commands/wheel.py,sha256=vcNgnhxwilocRQJEBdWQvJ8qvO0RfWmz9LwrUBadvYE,6322
+pip/_internal/configuration.py,sha256=BomQ3pC84J6zCXDQpND_OmFY7mubE9cMBZVohNUzMvY,14587
+pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858
+pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/distributions/__pycache__/base.cpython-312.pyc,,
+pip/_internal/distributions/__pycache__/installed.cpython-312.pyc,,
+pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc,,
+pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/distributions/base.py,sha256=l-OTCAIs25lsapejA6IYpPZxSM5-BET4sdZDkql8jiY,1830
+pip/_internal/distributions/installed.py,sha256=kgIEE_1NzjZxLBSC-v5s64uOFZlVEt3aPrjTtL6x2XY,929
+pip/_internal/distributions/sdist.py,sha256=gYgrzI0lstHJRKweOdL_m6LtqDxtfuo_yCL9HjmH-xw,6952
+pip/_internal/distributions/wheel.py,sha256=_HbG0OehF8dwj4UX-xV__tXLwgPus9OjMEf2NTRqBbE,1364
+pip/_internal/exceptions.py,sha256=bRTEn6Jlw-vxHjixtiu0K79jXJu0X5FVC0L62Bdb0KI,28974
+pip/_internal/index/__init__.py,sha256=tzwMH_fhQeubwMqHdSivasg1cRgTSbNg2CiMVnzMmyU,29
+pip/_internal/index/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/index/__pycache__/collector.cpython-312.pyc,,
+pip/_internal/index/__pycache__/package_finder.cpython-312.pyc,,
+pip/_internal/index/__pycache__/sources.cpython-312.pyc,,
+pip/_internal/index/collector.py,sha256=PCB3thVWRiSBowGtpv1elIPFc-GvEqhZiNgZD7b0vBc,16185
+pip/_internal/index/package_finder.py,sha256=Kd2FmWJFAcEg2Sy2pTGQX8WPFC8B9U_3b1VK7i8sx9o,38827
+pip/_internal/index/sources.py,sha256=nXJkOjhLy-O2FsrKU9RIqCOqgY2PsoKWybtZjjRgqU0,8639
+pip/_internal/locations/__init__.py,sha256=2SADX0Gr9BIpx19AO7Feq89nOmBQGEbl1IWjBpnaE9E,14185
+pip/_internal/locations/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc,,
+pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc,,
+pip/_internal/locations/__pycache__/base.cpython-312.pyc,,
+pip/_internal/locations/_distutils.py,sha256=jpFj4V00rD9IR3vA9TqrGkwcdNVFc58LsChZavge9JY,5975
+pip/_internal/locations/_sysconfig.py,sha256=NhcEi1_25w9cTTcH4RyOjD4UHW6Ijks0uKy1PL1_j_8,7716
+pip/_internal/locations/base.py,sha256=AImjYJWxOtDkc0KKc6Y4Gz677cg91caMA4L94B9FZEg,2550
+pip/_internal/main.py,sha256=1cHqjsfFCrMFf3B5twzocxTJUdHMLoXUpy5lJoFqUi8,338
+pip/_internal/metadata/__init__.py,sha256=a19B00IsX25khBt8oWWy6_kKgjCM4zeh-FqYteCOFwA,5714
+pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/metadata/__pycache__/_json.cpython-312.pyc,,
+pip/_internal/metadata/__pycache__/base.cpython-312.pyc,,
+pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc,,
+pip/_internal/metadata/_json.py,sha256=hNvnMHOXLAyNlzirWhPL9Nx2CvCqa1iRma6Osq1YfV8,2711
+pip/_internal/metadata/base.py,sha256=BGuMenlcQT8i7j9iclrfdC3vSwgvhr8gjn955cCy16s,25420
+pip/_internal/metadata/importlib/__init__.py,sha256=jUUidoxnHcfITHHaAWG1G2i5fdBYklv_uJcjo2x7VYE,135
+pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc,,
+pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc,,
+pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc,,
+pip/_internal/metadata/importlib/_compat.py,sha256=sneVh4_6WxQZK4ljdl3ylVuP-q0ttSqbgl9mWt0HnOg,2804
+pip/_internal/metadata/importlib/_dists.py,sha256=aOUgCX_AtA8B-lWLu-HfXA-ivMJWNxHPAohVcpQj2g4,8259
+pip/_internal/metadata/importlib/_envs.py,sha256=H3qVLXVh4LWvrPvu_ekXf3dfbtwnlhNJQP2pxXpccfU,5333
+pip/_internal/metadata/pkg_resources.py,sha256=NO76ZrfR2-LKJTyaXrmQoGhmJMArALvacrlZHViSDT8,10544
+pip/_internal/models/__init__.py,sha256=AjmCEBxX_MH9f_jVjIGNCFJKYCYeSEe18yyvNx4uRKQ,62
+pip/_internal/models/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/models/__pycache__/candidate.cpython-312.pyc,,
+pip/_internal/models/__pycache__/direct_url.cpython-312.pyc,,
+pip/_internal/models/__pycache__/format_control.cpython-312.pyc,,
+pip/_internal/models/__pycache__/index.cpython-312.pyc,,
+pip/_internal/models/__pycache__/installation_report.cpython-312.pyc,,
+pip/_internal/models/__pycache__/link.cpython-312.pyc,,
+pip/_internal/models/__pycache__/pylock.cpython-312.pyc,,
+pip/_internal/models/__pycache__/scheme.cpython-312.pyc,,
+pip/_internal/models/__pycache__/search_scope.cpython-312.pyc,,
+pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc,,
+pip/_internal/models/__pycache__/target_python.cpython-312.pyc,,
+pip/_internal/models/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/models/candidate.py,sha256=zzgFRuw_kWPjKpGw7LC0ZUMD2CQ2EberUIYs8izjdCA,753
+pip/_internal/models/direct_url.py,sha256=4NMWacu_QzPPWREC1te7v6Wfv-2HkI4tvSJF-CBgLh4,6555
+pip/_internal/models/format_control.py,sha256=PwemYG1L27BM0f1KP61rm24wShENFyxqlD1TWu34alc,2471
+pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030
+pip/_internal/models/installation_report.py,sha256=cqfWJ93ThCxjcacqSWryOCD2XtIn1CZrgzZxAv5FQZ0,2839
+pip/_internal/models/link.py,sha256=h4lI8MaDA7DTIxIJ_NgDE64EE4h1sX3AB23Y1Qu8W-k,21793
+pip/_internal/models/pylock.py,sha256=Vmaa71gOSV0ZYzRgWiIm4KwVbClaahMcuvKCkP_ZznA,6211
+pip/_internal/models/scheme.py,sha256=PakmHJM3e8OOWSZFtfz1Az7f1meONJnkGuQxFlt3wBE,575
+pip/_internal/models/search_scope.py,sha256=1hxU2IVsAaLZVjp0CbzJbYaYzCxv72_Qbg3JL0qhXo0,4507
+pip/_internal/models/selection_prefs.py,sha256=lgYyo4W8lb22wsYx2ElBBB0cvSNlBVgucwBzL43dfzE,2016
+pip/_internal/models/target_python.py,sha256=I0eFS-eia3kwhrOvgsphFZtNAB2IwXZ9Sr9fp6IjBP4,4243
+pip/_internal/models/wheel.py,sha256=xWO0K-YanSL3OfMZUN1gHlEUV0YJOVYMQ4wrwmA9Zis,5526
+pip/_internal/network/__init__.py,sha256=FMy06P__y6jMjUc8z3ZcQdKF-pmZ2zM14_vBeHPGhUI,49
+pip/_internal/network/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/network/__pycache__/auth.cpython-312.pyc,,
+pip/_internal/network/__pycache__/cache.cpython-312.pyc,,
+pip/_internal/network/__pycache__/download.cpython-312.pyc,,
+pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc,,
+pip/_internal/network/__pycache__/session.cpython-312.pyc,,
+pip/_internal/network/__pycache__/utils.cpython-312.pyc,,
+pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc,,
+pip/_internal/network/auth.py,sha256=uAwRGAYnVtgNSZm4HMC3BMACkgA7ku4m8wupiX6LpK8,20681
+pip/_internal/network/cache.py,sha256=u5LtQbnCzMU6vFT0eUUcYe6iKiwALMqrn1jUZj4CqaY,5302
+pip/_internal/network/download.py,sha256=HgsFvTkPDdgg0zUehose_J-542-9R0FpyipRw5BhxAM,12682
+pip/_internal/network/lazy_wheel.py,sha256=5H7_s-_AK6br1K5NFcyUsiocK9E6vwrJY5kzwjMv0EM,7651
+pip/_internal/network/session.py,sha256=eE-VUIJGU9YeeaVy7tVAvMRWigMsyuAMpxkjlbptbjo,19188
+pip/_internal/network/utils.py,sha256=ACsXd1msqNCidHVXsu7LHUSr8NgaypcOKQ4KG-Z_wJM,4091
+pip/_internal/network/xmlrpc.py,sha256=_-Rnk3vOff8uF9hAGmT6SLALflY1gMBcbGwS12fb_Y4,1830
+pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/operations/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/operations/__pycache__/check.cpython-312.pyc,,
+pip/_internal/operations/__pycache__/freeze.cpython-312.pyc,,
+pip/_internal/operations/__pycache__/prepare.cpython-312.pyc,,
+pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc,,
+pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc,,
+pip/_internal/operations/build/build_tracker.py,sha256=W3b5cmkMWPaE6QIwfzsTayJo7-OlxFHWDxfPuax1KcE,4771
+pip/_internal/operations/build/metadata.py,sha256=INHaeiRfOiLYCXApfDNRo9Cw2xI4VwTc0KItvfdfOjk,1421
+pip/_internal/operations/build/metadata_editable.py,sha256=oWudMsnjy4loO_Jy7g4N9nxsnaEX_iDlVRgCy7pu1rs,1509
+pip/_internal/operations/build/metadata_legacy.py,sha256=wv8cFA0wTqF62Jlm9QwloYZsofOyQ7sWBBmvCcVvn1k,2189
+pip/_internal/operations/build/wheel.py,sha256=toBJE5atKJGsSckY5ztVAQpRss25f049f-nJaiJsiD8,1080
+pip/_internal/operations/build/wheel_editable.py,sha256=Djx7hZqhejgYUcdQD5p4mn7AVFN3VQ7bOSs7b90TtOI,1422
+pip/_internal/operations/build/wheel_legacy.py,sha256=LaHpG4_s6415iLjuTb6seO3JIJ7097yQUIthcmpqaOY,3616
+pip/_internal/operations/check.py,sha256=yC2XWth6iehGGE_fj7XRJLjVKBsTIG3ZoWRkFi3rOwc,5894
+pip/_internal/operations/freeze.py,sha256=PDdY-y_ZtZZJLAKcaWPIGRKAGW7DXR48f0aMRU0j7BA,9854
+pip/_internal/operations/install/__init__.py,sha256=ak-UETcQPKlFZaWoYKWu5QVXbpFBvg0sXc3i0O4vSYY,50
+pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc,,
+pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/operations/install/editable_legacy.py,sha256=zS6Hm-9SHcrVuA_9Irc9Qc8CIoFLDMZiSvi5rizZe34,1311
+pip/_internal/operations/install/wheel.py,sha256=8aepxxAFmnzZFtcMCv-1I4T_maEkQd4hXZztYWE4yR0,27956
+pip/_internal/operations/prepare.py,sha256=gdbQUAjxLqqz8P2KFem2OEJ_6V3aTuozQkiBLfCCVAU,28613
+pip/_internal/pyproject.py,sha256=T72qz0buaY0s-mgrXLUU1sONf4Rk97dJu0qpniBCGU8,7233
+pip/_internal/req/__init__.py,sha256=vM0bWAl3By5ALRIXWmKdkMca18KQfbGXVJZm3Igpwmg,3122
+pip/_internal/req/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/req/__pycache__/constructors.cpython-312.pyc,,
+pip/_internal/req/__pycache__/req_dependency_group.cpython-312.pyc,,
+pip/_internal/req/__pycache__/req_file.cpython-312.pyc,,
+pip/_internal/req/__pycache__/req_install.cpython-312.pyc,,
+pip/_internal/req/__pycache__/req_set.cpython-312.pyc,,
+pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc,,
+pip/_internal/req/constructors.py,sha256=QlLjBIg5xPxyQx_hGGB7Fz527ruAXC6nbVMoGfXzNnM,18320
+pip/_internal/req/req_dependency_group.py,sha256=0yEQCUaO5Bza66Y3D5o9JRf0qII5QgCRugn1x5aRivA,2618
+pip/_internal/req/req_file.py,sha256=j_1PcBDO0aKb8pjjRMsZQrwts5YNrKsrHjPyV56XoHo,20161
+pip/_internal/req/req_install.py,sha256=N4LxV9LHimgle5zEkNFk9WSfi51KXvK9y73mvYl9uig,35718
+pip/_internal/req/req_set.py,sha256=awkqIXnYA4Prmsj0Qb3zhqdbYUmXd-1o0P-KZ3mvRQs,2828
+pip/_internal/req/req_uninstall.py,sha256=dCmOHt-9RaJBq921L4tMH3PmIBDetGplnbjRKXmGt00,24099
+pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/resolution/__pycache__/base.cpython-312.pyc,,
+pip/_internal/resolution/base.py,sha256=RIsqSP79olPdOgtPKW-oOQ364ICVopehA6RfGkRfe2s,577
+pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc,,
+pip/_internal/resolution/legacy/resolver.py,sha256=bwUqE66etz2bcPabqxed18-iyqqb-kx3Er2aT6GeUJY,24060
+pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc,,
+pip/_internal/resolution/resolvelib/base.py,sha256=_AoP0ZWlaSct8CRDn2ol3CbNn4zDtnh_0zQGjXASDKI,5047
+pip/_internal/resolution/resolvelib/candidates.py,sha256=dblosDcMumdT075Y8D1yXiJrWF_wDgIGe_8hUQIneTw,20208
+pip/_internal/resolution/resolvelib/factory.py,sha256=XdCpLq59oVIHMMekc2cgD7imcVD00_ioTnu9_k3iq3E,32577
+pip/_internal/resolution/resolvelib/found_candidates.py,sha256=8bZYDCZLXSdLHy_s1o5f4r15HmKvqFUhzBUQOF21Lr4,6018
+pip/_internal/resolution/resolvelib/provider.py,sha256=1TJC2o7F02aTMaoqa0Ayz45PrE-pQ5XshgGUmweESkk,11144
+pip/_internal/resolution/resolvelib/reporter.py,sha256=atiTh1bnKc-KfG841nRw3dk0WbOhr_L8luJHcY0JoSs,3270
+pip/_internal/resolution/resolvelib/requirements.py,sha256=z0gXmWfo03ynOnhF8kpj5SycgroerDhQV0VWzmAKAfg,8076
+pip/_internal/resolution/resolvelib/resolver.py,sha256=f0fmYzB9G4wWxssfj4qerDi_F_8vjAaYPbGLb7N7tQw,13617
+pip/_internal/self_outdated_check.py,sha256=wfikZmcGVIrnepL413-0rnQ3jeOA0unOKPle0Ovwoho,8326
+pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_internal/utils/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/_log.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/compat.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/datetime.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/glibc.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/hashes.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/logging.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/misc.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/packaging.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/retry.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/urls.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc,,
+pip/_internal/utils/__pycache__/wheel.cpython-312.pyc,,
+pip/_internal/utils/_jaraco_text.py,sha256=M15uUPIh5NpP1tdUGBxRau6q1ZAEtI8-XyLEETscFfE,3350
+pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015
+pip/_internal/utils/appdirs.py,sha256=LrzDPZMKVh0rubtCx9vu3XlZbLCSug6VSj4Qsvt66BA,1681
+pip/_internal/utils/compat.py,sha256=C9LHXJAKkwAH8Hn3nPkz9EYK3rqPBeO_IXkOG2zzsdQ,2514
+pip/_internal/utils/compatibility_tags.py,sha256=DiNSLqpuruXUamGQwOJ2WZByDGLTGaXi9O-Xf8fOi34,6630
+pip/_internal/utils/datetime.py,sha256=Gt29Ml4ToPSM88j54iu43WKtrU9A-moP4QmMiiqzedU,241
+pip/_internal/utils/deprecation.py,sha256=HVhvyO5qiRFcG88PhZlp_87qdKQNwPTUIIHWtsTR2yI,3696
+pip/_internal/utils/direct_url_helpers.py,sha256=ttKv4GMUqlRwPPog9_CUopy6SDgoxVILzeBJzgfn2tg,3200
+pip/_internal/utils/egg_link.py,sha256=YWfsrbmfcrfWgqQYy6OuIjsyb9IfL1q_2v4zsms1WjI,2459
+pip/_internal/utils/entrypoints.py,sha256=uPjAyShKObdotjQjJUzprQ6r3xQvDIZwUYfHHqZ7Dok,3324
+pip/_internal/utils/filesystem.py,sha256=du4lOOlTOBq22V5kf0yXMydo1KU2Cs-cMtYs3bEk13c,4988
+pip/_internal/utils/filetypes.py,sha256=sEMa38qaqjvx1Zid3OCAUja31BOBU-USuSMPBvU3yjo,689
+pip/_internal/utils/glibc.py,sha256=sEh8RJJLYSdRvTqAO4THVPPA-YSDVLD4SI9So-bxX1U,3726
+pip/_internal/utils/hashes.py,sha256=d32UI1en8nyqZzdZQvxUVdfeBoe4ADWx7HtrIM4-XQ4,4998
+pip/_internal/utils/logging.py,sha256=RtRe7Vp0COC4UBewYdfKicXjCTmHXpDZHdReTzJvB78,12108
+pip/_internal/utils/misc.py,sha256=1jEpqjfqYmQ6K3D4_O8xXSPn8aEfH2uMOlNM7KPvSrg,23374
+pip/_internal/utils/packaging.py,sha256=s5tpUmFumwV0H9JSTzryrIY4JwQM8paGt7Sm7eNwt2Y,1601
+pip/_internal/utils/retry.py,sha256=83wReEB2rcntMZ5VLd7ascaYSjn_kLdlQCqxILxWkPM,1461
+pip/_internal/utils/setuptools_build.py,sha256=0RK4K07qpaBgnYm50_f5d5VdedYPk1fl9QNKaOa60XM,4499
+pip/_internal/utils/subprocess.py,sha256=r4-Ba_Yc3uZXQpi0K4pZFsCT_QqdSvtF3XJ-204QWaA,8983
+pip/_internal/utils/temp_dir.py,sha256=D9c8D7WOProOO8GGDqpBeVSj10NGFmunG0o2TodjjIU,9307
+pip/_internal/utils/unpacking.py,sha256=4tY2D-sbtBt2Lcws98Em3MPAPdHnXSBXnpSU0LoGUZQ,11939
+pip/_internal/utils/urls.py,sha256=aF_eg9ul5d8bMCxfSSSxQcfs-OpJdbStYqZHoy2K1RE,1601
+pip/_internal/utils/virtualenv.py,sha256=mX-UPyw1MPxhwUxKhbqWWX70J6PHXAJjVVrRnG0h9mc,3455
+pip/_internal/utils/wheel.py,sha256=YdRuj6MicG-Q9Mg03FbUv1WTLam6Lc7AgijY4voVyis,4468
+pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596
+pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc,,
+pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc,,
+pip/_internal/vcs/__pycache__/git.cpython-312.pyc,,
+pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc,,
+pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc,,
+pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc,,
+pip/_internal/vcs/bazaar.py,sha256=3W1eHjkYx2vc6boeb2NBh4I_rlGAXM-vrzfNhLm1Rxg,3734
+pip/_internal/vcs/git.py,sha256=TTeqDuzS-_BFSNuUStVWmE2nGDpKuvUhBBJk_CCQXV0,19144
+pip/_internal/vcs/mercurial.py,sha256=w1ZJWLKqNP1onEjkfjlwBVnMqPZNSIER8ayjQcnTq4w,5575
+pip/_internal/vcs/subversion.py,sha256=uUgdPvxmvEB8Qwtjr0Hc0XgFjbiNi5cbvI4vARLOJXo,11787
+pip/_internal/vcs/versioncontrol.py,sha256=d-v1mcLxofg2FaIqBrV-e-ZcjOgQhS0oxXpki1v1yXs,22502
+pip/_internal/wheel_builder.py,sha256=PDF2w6pxeec5skP3gLIrR_VrJrAO4pHRpUnkNbJ8R5Q,11225
+pip/_vendor/__init__.py,sha256=WzusPTGWIMeQQWSVJ0h2rafGkVTa9WKJ2HT-2-EoZrU,4907
+pip/_vendor/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__init__.py,sha256=BF2n5OeQz1QW2xSey2LxfNCtwbjnTadXdIH2toqJecg,677
+pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc,,
+pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc,,
+pip/_vendor/cachecontrol/_cmd.py,sha256=iist2EpzJvDVIhMAxXq8iFnTBsiZAd6iplxfmNboNyk,1737
+pip/_vendor/cachecontrol/adapter.py,sha256=8y6rTPXOzVHmDKCW5CR9sivLVuDv-cpdGcZYdRWNaPw,6599
+pip/_vendor/cachecontrol/cache.py,sha256=OXwv7Fn2AwnKNiahJHnjtvaKLndvVLv_-zO-ltlV9qI,1953
+pip/_vendor/cachecontrol/caches/__init__.py,sha256=dtrrroK5BnADR1GWjCZ19aZ0tFsMfvFBtLQQU1sp_ag,303
+pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc,,
+pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc,,
+pip/_vendor/cachecontrol/caches/file_cache.py,sha256=d8upFmy_zwaCmlbWEVBlLXFddt8Zw8c5SFpxeOZsdfw,4117
+pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=9rmqwtYu_ljVkW6_oLqbC7EaX_a8YT_yLuna-eS0dgo,1386
+pip/_vendor/cachecontrol/controller.py,sha256=cx0Hl8xLZgUuXuy78Gih9AYjCtqurmYjVJxyA4yWt7w,19101
+pip/_vendor/cachecontrol/filewrapper.py,sha256=2ktXNPE0KqnyzF24aOsKCA58HQq1xeC6l2g6_zwjghc,4291
+pip/_vendor/cachecontrol/heuristics.py,sha256=gqMXU8w0gQuEQiSdu3Yg-0vd9kW7nrWKbLca75rheGE,4881
+pip/_vendor/cachecontrol/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/cachecontrol/serialize.py,sha256=HQd2IllQ05HzPkVLMXTF2uX5mjEQjDBkxCqUJUODpZk,5163
+pip/_vendor/cachecontrol/wrapper.py,sha256=hsGc7g8QGQTT-4f8tgz3AM5qwScg6FO0BSdLSRdEvpU,1417
+pip/_vendor/certifi/__init__.py,sha256=dvNDUdAXp-hzoYcf09PXzLmHIlPfypaBQPFp5esDXyo,94
+pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255
+pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/certifi/__pycache__/core.cpython-312.pyc,,
+pip/_vendor/certifi/cacert.pem,sha256=lm3cYJxEv9SoAx4Atc3NiT1D92d965vcID6H39f_93o,290057
+pip/_vendor/certifi/core.py,sha256=gu_ECVI1m3Rq0ytpsNE61hgQGcKaOAt9Rs9G8KsTCOI,3442
+pip/_vendor/certifi/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/dependency_groups/__init__.py,sha256=C3OFu0NGwDzQ4LOmmSOFPsRSvkbBn-mdd4j_5YqJw-s,250
+pip/_vendor/dependency_groups/__main__.py,sha256=UNTM7P5mfVtT7wDi9kOTXWgV3fu3e8bTrt1Qp1jvjKo,1709
+pip/_vendor/dependency_groups/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/dependency_groups/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc,,
+pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-312.pyc,,
+pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-312.pyc,,
+pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-312.pyc,,
+pip/_vendor/dependency_groups/_implementation.py,sha256=Gqb2DlQELRakeHlKf6QtQSW0M-bcEomxHw4JsvID1ls,8041
+pip/_vendor/dependency_groups/_lint_dependency_groups.py,sha256=yp-DDqKXtbkDTNa0ifa-FmOA8ra24lPZEXftW-R5AuI,1710
+pip/_vendor/dependency_groups/_pip_wrapper.py,sha256=nuVW_w_ntVxpE26ELEvngMY0N04sFLsijXRyZZROFG8,1865
+pip/_vendor/dependency_groups/_toml_compat.py,sha256=BHnXnFacm3DeolsA35GjI6qkDApvua-1F20kv3BfZWE,285
+pip/_vendor/dependency_groups/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/distlib/__init__.py,sha256=Deo3uo98aUyIfdKJNqofeSEFWwDzrV2QeGLXLsgq0Ag,625
+pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc,,
+pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc,,
+pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc,,
+pip/_vendor/distlib/__pycache__/util.cpython-312.pyc,,
+pip/_vendor/distlib/compat.py,sha256=2jRSjRI4o-vlXeTK2BCGIUhkc6e9ZGhSsacRM5oseTw,41467
+pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820
+pip/_vendor/distlib/scripts.py,sha256=Qvp76E9Jc3IgyYubnpqI9fS7eseGOe4FjpeVKqKt9Iw,18612
+pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792
+pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784
+pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032
+pip/_vendor/distlib/util.py,sha256=vMPGvsS4j9hF6Y9k3Tyom1aaHLb0rFmZAEyzeAdel9w,66682
+pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648
+pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448
+pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888
+pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981
+pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64
+pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/distro/__pycache__/distro.cpython-312.pyc,,
+pip/_vendor/distro/distro.py,sha256=XqbefacAhDT4zr_trnbA15eY8vdK4GTghgmvUGrEM_4,49430
+pip/_vendor/distro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/idna/__init__.py,sha256=MPqNDLZbXqGaNdXxAFhiqFPKEQXju2jNQhCey6-5eJM,868
+pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/codec.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/compat.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/core.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc,,
+pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc,,
+pip/_vendor/idna/codec.py,sha256=PEew3ItwzjW4hymbasnty2N2OXvNcgHB-JjrBuxHPYY,3422
+pip/_vendor/idna/compat.py,sha256=RzLy6QQCdl9784aFhb2EX9EKGCJjg0P3PilGdeXXcx8,316
+pip/_vendor/idna/core.py,sha256=YJYyAMnwiQEPjVC4-Fqu_p4CJ6yKKuDGmppBNQNQpFs,13239
+pip/_vendor/idna/idnadata.py,sha256=W30GcIGvtOWYwAjZj4ZjuouUutC6ffgNuyjJy7fZ-lo,78306
+pip/_vendor/idna/intranges.py,sha256=amUtkdhYcQG8Zr-CoMM_kVRacxkivC1WgxN1b63KKdU,1898
+pip/_vendor/idna/package_data.py,sha256=q59S3OXsc5VI8j6vSD0sGBMyk6zZ4vWFREE88yCJYKs,21
+pip/_vendor/idna/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/idna/uts46data.py,sha256=rt90K9J40gUSwppDPCrhjgi5AA6pWM65dEGRSf6rIhM,239289
+pip/_vendor/msgpack/__init__.py,sha256=q2T5PRsITVpeytgS0WiSqok9IY8V_aFiC8VVlXTCTgA,1109
+pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc,,
+pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc,,
+pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc,,
+pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081
+pip/_vendor/msgpack/ext.py,sha256=kteJv03n9tYzd5oo3xYopVTo4vRaAxonBQQJhXohZZo,5726
+pip/_vendor/msgpack/fallback.py,sha256=0g1Pzp0vtmBEmJ5w9F3s_-JMVURP8RS4G1cc5TRaAsI,32390
+pip/_vendor/packaging/__init__.py,sha256=_0cDiPVf2S-bNfVmZguxxzmrIYWlyASxpqph4qsJWUc,494
+pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc,,
+pip/_vendor/packaging/__pycache__/version.cpython-312.pyc,,
+pip/_vendor/packaging/_elffile.py,sha256=UkrbDtW7aeq3qqoAfU16ojyHZ1xsTvGke_WqMTKAKd0,3286
+pip/_vendor/packaging/_manylinux.py,sha256=t4y_-dTOcfr36gLY-ztiOpxxJFGO2ikC11HgfysGxiM,9596
+pip/_vendor/packaging/_musllinux.py,sha256=p9ZqNYiOItGee8KcZFeHF_YcdhVwGHdK6r-8lgixvGQ,2694
+pip/_vendor/packaging/_parser.py,sha256=gYfnj0pRHflVc4RHZit13KNTyN9iiVcU2RUCGi22BwM,10221
+pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431
+pip/_vendor/packaging/_tokenizer.py,sha256=OYzt7qKxylOAJ-q0XyK1qAycyPRYLfMPdGQKRXkZWyI,5310
+pip/_vendor/packaging/licenses/__init__.py,sha256=3bx-gryo4sRv5LsrwApouy65VIs3u6irSORJzALkrzU,5727
+pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-312.pyc,,
+pip/_vendor/packaging/licenses/_spdx.py,sha256=oAm1ztPFwlsmCKe7lAAsv_OIOfS1cWDu9bNBkeu-2ns,48398
+pip/_vendor/packaging/markers.py,sha256=P0we27jm1xUzgGMJxBjtUFCIWeBxTsMeJTOJ6chZmAY,12049
+pip/_vendor/packaging/metadata.py,sha256=8IZErqQQnNm53dZZuYq4FGU4_dpyinMeH1QFBIWIkfE,34739
+pip/_vendor/packaging/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/packaging/requirements.py,sha256=gYyRSAdbrIyKDY66ugIDUQjRMvxkH2ALioTmX3tnL6o,2947
+pip/_vendor/packaging/specifiers.py,sha256=yc9D_MycJEmwUpZvcs1OZL9HfiNFmyw0RZaeHRNHkPw,40079
+pip/_vendor/packaging/tags.py,sha256=41s97W9Zatrq2Ed7Rc3qeBDaHe8pKKvYq2mGjwahfXk,22745
+pip/_vendor/packaging/utils.py,sha256=0F3Hh9OFuRgrhTgGZUl5K22Fv1YP2tZl1z_2gO6kJiA,5050
+pip/_vendor/packaging/version.py,sha256=oiHqzTUv_p12hpjgsLDVcaF5hT7pDaSOViUNMD4GTW0,16688
+pip/_vendor/pkg_resources/__init__.py,sha256=vbTJ0_ruUgGxQjlEqsruFmiNPVyh2t9q-zyTDT053xI,124451
+pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/platformdirs/__init__.py,sha256=UfeSHWl8AeTtbOBOoHAxK4dODOWkZtfy-m_i7cWdJ8c,22344
+pip/_vendor/platformdirs/__main__.py,sha256=jBJ8zb7Mpx5ebcqF83xrpO94MaeCpNGHVf9cvDN2JLg,1505
+pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc,,
+pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc,,
+pip/_vendor/platformdirs/android.py,sha256=r0DshVBf-RO1jXJGX8C4Til7F1XWt-bkdWMgmvEiaYg,9013
+pip/_vendor/platformdirs/api.py,sha256=U9EzI3EYxcXWUCtIGRllqrcN99i2LSY1mq2-GtsUwEQ,9277
+pip/_vendor/platformdirs/macos.py,sha256=UlbyFZ8Rzu3xndCqQEHrfsYTeHwYdFap1Ioz-yxveT4,6154
+pip/_vendor/platformdirs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/platformdirs/unix.py,sha256=WZmkUA--L3JNRGmz32s35YfoD3ica6xKIPdCV_HhLcs,10458
+pip/_vendor/platformdirs/version.py,sha256=ddN3EcUPfer7CbqmyFNmg03R3u-qDn32T_fLsx25-Ck,511
+pip/_vendor/platformdirs/windows.py,sha256=IFpiohUBwxPtCzlyKwNtxyW4Jk8haa6W8o59mfrDXVo,10125
+pip/_vendor/pygments/__init__.py,sha256=8uNqJCCwXqbEx5aSsBr0FykUQOBDKBihO5mPqiw1aqo,2983
+pip/_vendor/pygments/__main__.py,sha256=WrndpSe6i1ckX_SQ1KaxD9CTKGzD0EuCOFxcbwFpoLU,353
+pip/_vendor/pygments/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/console.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/filter.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/formatter.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/lexer.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/modeline.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/plugin.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/regexopt.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/scanner.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/sphinxext.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/style.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/token.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/unistring.cpython-312.pyc,,
+pip/_vendor/pygments/__pycache__/util.cpython-312.pyc,,
+pip/_vendor/pygments/console.py,sha256=AagDWqwea2yBWf10KC9ptBgMpMjxKp8yABAmh-NQOVk,1718
+pip/_vendor/pygments/filter.py,sha256=YLtpTnZiu07nY3oK9nfR6E9Y1FBHhP5PX8gvkJWcfag,1910
+pip/_vendor/pygments/filters/__init__.py,sha256=4U4jtA0X3iP83uQnB9-TI-HDSw8E8y8zMYHa0UjbbaI,40392
+pip/_vendor/pygments/filters/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pygments/formatter.py,sha256=KZQMmyo_xkOIkQG8g66LYEkBh1bx7a0HyGCBcvhI9Ew,4390
+pip/_vendor/pygments/formatters/__init__.py,sha256=KTwBmnXlaopJhQDOemVHYHskiDghuq-08YtP6xPNJPg,5385
+pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-312.pyc,,
+pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176
+pip/_vendor/pygments/lexer.py,sha256=_kBrOJ_NT5Tl0IVM0rA9c8eysP6_yrlGzEQI0eVYB-A,35349
+pip/_vendor/pygments/lexers/__init__.py,sha256=wbIME35GH7bI1B9rNPJFqWT-ij_RApZDYPUlZycaLzA,12115
+pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-312.pyc,,
+pip/_vendor/pygments/lexers/__pycache__/python.cpython-312.pyc,,
+pip/_vendor/pygments/lexers/_mapping.py,sha256=l4tCXM8e9aPC2BD6sjIr0deT-J-z5tHgCwL-p1fS0PE,77602
+pip/_vendor/pygments/lexers/python.py,sha256=vxjn1cOHclIKJKxoyiBsQTY65GHbkZtZRuKQ2AVCKaw,53853
+pip/_vendor/pygments/modeline.py,sha256=K5eSkR8GS1r5OkXXTHOcV0aM_6xpk9eWNEIAW-OOJ2g,1005
+pip/_vendor/pygments/plugin.py,sha256=tPx0rJCTIZ9ioRgLNYG4pifCbAwTRUZddvLw-NfAk2w,1891
+pip/_vendor/pygments/regexopt.py,sha256=wXaP9Gjp_hKAdnICqoDkRxAOQJSc4v3X6mcxx3z-TNs,3072
+pip/_vendor/pygments/scanner.py,sha256=nNcETRR1tRuiTaHmHSTTECVYFPcLf6mDZu1e4u91A9E,3092
+pip/_vendor/pygments/sphinxext.py,sha256=5x7Zh9YlU6ISJ31dMwduiaanb5dWZnKg3MyEQsseNnQ,7981
+pip/_vendor/pygments/style.py,sha256=PlOZqlsnTVd58RGy50vkA2cXQ_lP5bF5EGMEBTno6DA,6420
+pip/_vendor/pygments/styles/__init__.py,sha256=x9ebctfyvCAFpMTlMJ5YxwcNYBzjgq6zJaKkNm78r4M,2042
+pip/_vendor/pygments/styles/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pygments/styles/__pycache__/_mapping.cpython-312.pyc,,
+pip/_vendor/pygments/styles/_mapping.py,sha256=6lovFUE29tz6EsV3XYY4hgozJ7q1JL7cfO3UOlgnS8w,3312
+pip/_vendor/pygments/token.py,sha256=WbdWGhYm_Vosb0DDxW9lHNPgITXfWTsQmHt6cy9RbcM,6226
+pip/_vendor/pygments/unistring.py,sha256=al-_rBemRuGvinsrM6atNsHTmJ6DUbw24q2O2Ru1cBc,63208
+pip/_vendor/pygments/util.py,sha256=oRtSpiAo5jM9ulntkvVbgXUdiAW57jnuYGB7t9fYuhc,10031
+pip/_vendor/pyproject_hooks/__init__.py,sha256=cPB_a9LXz5xvsRbX1o2qyAdjLatZJdQ_Lc5McNX-X7Y,691
+pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-312.pyc,,
+pip/_vendor/pyproject_hooks/_impl.py,sha256=jY-raxnmyRyB57ruAitrJRUzEexuAhGTpgMygqx67Z4,14936
+pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=MJNPpfIxcO-FghxpBbxkG1rFiQf6HOUbV4U5mq0HFns,557
+pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-312.pyc,,
+pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=qcXMhmx__MIJq10gGHW3mA4Tl8dy8YzHMccwnNoKlw0,12216
+pip/_vendor/pyproject_hooks/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/requests/__init__.py,sha256=HlB_HzhrzGtfD_aaYUwUh1zWXLZ75_YCLyit75d0Vz8,5057
+pip/_vendor/requests/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/__version__.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/_internal_utils.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/adapters.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/api.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/auth.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/certs.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/compat.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/cookies.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/exceptions.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/help.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/hooks.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/models.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/packages.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/sessions.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/status_codes.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/structures.cpython-312.pyc,,
+pip/_vendor/requests/__pycache__/utils.cpython-312.pyc,,
+pip/_vendor/requests/__version__.py,sha256=FDq681Y3EvBjdDp5UqplMZ28uTTYlM_Jib0sAV-NpXc,435
+pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495
+pip/_vendor/requests/adapters.py,sha256=J7VeVxKBvawbtlX2DERVo05J9BXTcWYLMHNd1Baa-bk,27607
+pip/_vendor/requests/api.py,sha256=_Zb9Oa7tzVIizTKwFrPjDEY9ejtm_OnSRERnADxGsQs,6449
+pip/_vendor/requests/auth.py,sha256=kF75tqnLctZ9Mf_hm9TZIj4cQWnN5uxRz8oWsx5wmR0,10186
+pip/_vendor/requests/certs.py,sha256=kHDlkK_beuHXeMPc5jta2wgl8gdKeUWt5f2nTDVrvt8,441
+pip/_vendor/requests/compat.py,sha256=QfbmdTFiZzjSHMXiMrd4joCRU6RabtQ9zIcPoVaHIus,1822
+pip/_vendor/requests/cookies.py,sha256=bNi-iqEj4NPZ00-ob-rHvzkvObzN3lEpgw3g6paS3Xw,18590
+pip/_vendor/requests/exceptions.py,sha256=D1wqzYWne1mS2rU43tP9CeN1G7QAy7eqL9o1god6Ejw,4272
+pip/_vendor/requests/help.py,sha256=hRKaf9u0G7fdwrqMHtF3oG16RKktRf6KiwtSq2Fo1_0,3813
+pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733
+pip/_vendor/requests/models.py,sha256=taljlg6vJ4b-xMu2TaMNFFkaiwMex_VsEQ6qUTN3wzY,35575
+pip/_vendor/requests/packages.py,sha256=_ZQDCJTJ8SP3kVWunSqBsRZNPzj2c1WFVqbdr08pz3U,1057
+pip/_vendor/requests/sessions.py,sha256=ykTI8UWGSltOfH07HKollH7kTBGw4WhiBVaQGmckTw4,30495
+pip/_vendor/requests/status_codes.py,sha256=iJUAeA25baTdw-6PfD0eF4qhpINDJRJI-yaMqxs4LEI,4322
+pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912
+pip/_vendor/requests/utils.py,sha256=WS3wHSQaaEfceu1syiFo5jf4e_CWKUTep_IabOVI_J0,33225
+pip/_vendor/resolvelib/__init__.py,sha256=T0LcAr9Sfai6ZXanpwavdHEea-Anw2QZGx16zd3lMKY,541
+pip/_vendor/resolvelib/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/resolvelib/__pycache__/providers.cpython-312.pyc,,
+pip/_vendor/resolvelib/__pycache__/reporters.cpython-312.pyc,,
+pip/_vendor/resolvelib/__pycache__/structs.cpython-312.pyc,,
+pip/_vendor/resolvelib/providers.py,sha256=pIWJbIdJJ9GFtNbtwTH0Ia43Vj6hYCEJj2DOLue15FM,8914
+pip/_vendor/resolvelib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/resolvelib/reporters.py,sha256=pNJf4nFxLpAeKxlBUi2GEj0a2Ij1nikY0UabTKXesT4,2037
+pip/_vendor/resolvelib/resolvers/__init__.py,sha256=728M3EvmnPbVXS7ExXlv2kMu6b7wEsoPutEfl-uVk_I,640
+pip/_vendor/resolvelib/resolvers/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/resolvelib/resolvers/__pycache__/abstract.cpython-312.pyc,,
+pip/_vendor/resolvelib/resolvers/__pycache__/criterion.cpython-312.pyc,,
+pip/_vendor/resolvelib/resolvers/__pycache__/exceptions.cpython-312.pyc,,
+pip/_vendor/resolvelib/resolvers/__pycache__/resolution.cpython-312.pyc,,
+pip/_vendor/resolvelib/resolvers/abstract.py,sha256=jZOBVigE4PUub9i3F-bTvBwaIXX8S9EU3CGASBvFqEU,1558
+pip/_vendor/resolvelib/resolvers/criterion.py,sha256=lcmZGv5sKHOnFD_RzZwvlGSj19MeA-5rCMpdf2Sgw7Y,1768
+pip/_vendor/resolvelib/resolvers/exceptions.py,sha256=ln_jaQtgLlRUSFY627yiHG2gD7AgaXzRKaElFVh7fDQ,1768
+pip/_vendor/resolvelib/resolvers/resolution.py,sha256=qU64VKtN-HxoFynmnI6oP8aMPzaiKZtb_1hASH3HTHI,23994
+pip/_vendor/resolvelib/structs.py,sha256=pu-EJiR2IBITr2SQeNPRa0rXhjlStfmO_GEgAhr3004,6420
+pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090
+pip/_vendor/rich/__main__.py,sha256=e_aVC-tDzarWQW9SuZMuCgBr6ODV_iDNV2Wh2xkxOlw,7896
+pip/_vendor/rich/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/__main__.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_cell_widths.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_emoji_codes.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_emoji_replace.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_export_format.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_extension.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_fileno.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_inspect.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_log_render.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_loop.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_null_file.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_palettes.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_pick.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_ratio.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_spinners.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_stack.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_timer.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_win32_console.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_windows.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_windows_renderer.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/_wrap.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/abc.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/align.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/ansi.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/bar.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/box.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/cells.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/color.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/color_triplet.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/columns.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/console.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/constrain.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/containers.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/control.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/default_styles.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/diagnose.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/emoji.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/errors.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/file_proxy.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/filesize.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/highlighter.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/json.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/jupyter.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/layout.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/live.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/live_render.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/logging.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/markup.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/measure.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/padding.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/pager.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/palette.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/panel.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/pretty.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/progress.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/progress_bar.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/prompt.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/protocol.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/region.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/repr.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/rule.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/scope.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/screen.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/segment.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/spinner.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/status.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/style.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/styled.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/syntax.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/table.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/terminal_theme.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/text.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/theme.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/themes.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/traceback.cpython-312.pyc,,
+pip/_vendor/rich/__pycache__/tree.cpython-312.pyc,,
+pip/_vendor/rich/_cell_widths.py,sha256=fbmeyetEdHjzE_Vx2l1uK7tnPOhMs2X1lJfO3vsKDpA,10209
+pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235
+pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064
+pip/_vendor/rich/_export_format.py,sha256=RI08pSrm5tBSzPMvnbTqbD9WIalaOoN5d4M1RTmLq1Y,2128
+pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265
+pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799
+pip/_vendor/rich/_inspect.py,sha256=ROT0PLC2GMWialWZkqJIjmYq7INRijQQkoSokWTaAiI,9656
+pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225
+pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236
+pip/_vendor/rich/_null_file.py,sha256=ADGKp1yt-k70FMKV6tnqCqecB-rSJzp-WQsD7LPL-kg,1394
+pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063
+pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423
+pip/_vendor/rich/_ratio.py,sha256=IOtl78sQCYZsmHyxhe45krkb68u9xVz7zFsXVJD-b2Y,5325
+pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919
+pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351
+pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417
+pip/_vendor/rich/_win32_console.py,sha256=BSaDRIMwBLITn_m0mTRLPqME5q-quGdSMuYMpYeYJwc,22755
+pip/_vendor/rich/_windows.py,sha256=aBwaD_S56SbgopIvayVmpk0Y28uwY2C5Bab1wl3Bp-I,1925
+pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783
+pip/_vendor/rich/_wrap.py,sha256=FlSsom5EX0LVkA3KWy34yHnCfLtqX-ZIepXKh-70rpc,3404
+pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890
+pip/_vendor/rich/align.py,sha256=dg-7uY0ukMLLlUEsBDRLva22_sQgIJD4BK0dmZHFHug,10324
+pip/_vendor/rich/ansi.py,sha256=Avs1LHbSdcyOvDOdpELZUoULcBiYewY76eNBp6uFBhs,6921
+pip/_vendor/rich/bar.py,sha256=ldbVHOzKJOnflVNuv1xS7g6dLX2E3wMnXkdPbpzJTcs,3263
+pip/_vendor/rich/box.py,sha256=kmavBc_dn73L_g_8vxWSwYJD2uzBXOUFTtJOfpbczcM,10686
+pip/_vendor/rich/cells.py,sha256=KrQkj5-LghCCpJLSNQIyAZjndc4bnEqOEmi5YuZ9UCY,5130
+pip/_vendor/rich/color.py,sha256=3HSULVDj7qQkXUdFWv78JOiSZzfy5y1nkcYhna296V0,18211
+pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054
+pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131
+pip/_vendor/rich/console.py,sha256=t9azZpmRMVU5cphVBZSShNsmBxd2-IAWcTTlhor-E1s,100849
+pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288
+pip/_vendor/rich/containers.py,sha256=c_56TxcedGYqDepHBMTuZdUIijitAQgnox-Qde0Z1qo,5502
+pip/_vendor/rich/control.py,sha256=EUTSUFLQbxY6Zmo_sdM-5Ls323vIHTBfN8TPulqeHUY,6487
+pip/_vendor/rich/default_styles.py,sha256=khQFqqaoDs3bprMqWpHw8nO5UpG2DN6QtuTd6LzZwYc,8257
+pip/_vendor/rich/diagnose.py,sha256=fJl1TItRn19gGwouqTg-8zPUW3YqQBqGltrfPQs1H9w,1025
+pip/_vendor/rich/emoji.py,sha256=Wd4bQubZdSy6-PyrRQNuMHtn2VkljK9uPZPVlu2cmx0,2367
+pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642
+pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683
+pip/_vendor/rich/filesize.py,sha256=_iz9lIpRgvW7MNSeCZnLg-HwzbP4GETg543WqD8SFs0,2484
+pip/_vendor/rich/highlighter.py,sha256=G_sn-8DKjM1sEjLG_oc4ovkWmiUpWvj8bXi0yed2LnY,9586
+pip/_vendor/rich/json.py,sha256=vVEoKdawoJRjAFayPwXkMBPLy7RSTs-f44wSQDR2nJ0,5031
+pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252
+pip/_vendor/rich/layout.py,sha256=ajkSFAtEVv9EFTcFs-w4uZfft7nEXhNzL7ZVdgrT5rI,14004
+pip/_vendor/rich/live.py,sha256=tF3ukAAJZ_N2ZbGclqZ-iwLoIoZ8f0HHUz79jAyJqj8,15180
+pip/_vendor/rich/live_render.py,sha256=It_39YdzrBm8o3LL0kaGorPFg-BfZWAcrBjLjFokbx4,3521
+pip/_vendor/rich/logging.py,sha256=5KaPPSMP9FxcXPBcKM4cGd_zW78PMgf-YbMVnvfSw0o,12468
+pip/_vendor/rich/markup.py,sha256=3euGKP5s41NCQwaSjTnJxus5iZMHjxpIM0W6fCxra38,8451
+pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305
+pip/_vendor/rich/padding.py,sha256=KVEI3tOwo9sgK1YNSuH__M1_jUWmLZwRVV_KmOtVzyM,4908
+pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828
+pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396
+pip/_vendor/rich/panel.py,sha256=9sQl00hPIqH5G2gALQo4NepFwpP0k9wT-s_gOms5pIc,11157
+pip/_vendor/rich/pretty.py,sha256=gy3S72u4FRg2ytoo7N1ZDWDIvB4unbzd5iUGdgm-8fc,36391
+pip/_vendor/rich/progress.py,sha256=CUc2lkU-X59mVdGfjMCBkZeiGPL3uxdONjhNJF2T7wY,60408
+pip/_vendor/rich/progress_bar.py,sha256=mZTPpJUwcfcdgQCTTz3kyY-fc79ddLwtx6Ghhxfo064,8162
+pip/_vendor/rich/prompt.py,sha256=l0RhQU-0UVTV9e08xW1BbIj0Jq2IXyChX4lC0lFNzt4,12447
+pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391
+pip/_vendor/rich/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166
+pip/_vendor/rich/repr.py,sha256=5MZJZmONgC6kud-QW-_m1okXwL2aR6u6y-pUcUCJz28,4431
+pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602
+pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843
+pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591
+pip/_vendor/rich/segment.py,sha256=otnKeKGEV-WRlQVosfJVeFDcDxAKHpvJ_hLzSu5lumM,24743
+pip/_vendor/rich/spinner.py,sha256=onIhpKlljRHppTZasxO8kXgtYyCHUkpSgKglRJ3o51g,4214
+pip/_vendor/rich/status.py,sha256=kkPph3YeAZBo-X-4wPp8gTqZyU466NLwZBA4PZTTewo,4424
+pip/_vendor/rich/style.py,sha256=xpj4uMBZMtuNuNomfUiamigl3p1sDvTCZwrG1tcTVeg,27059
+pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258
+pip/_vendor/rich/syntax.py,sha256=eDKIRwl--eZ0Lwo2da2RRtfutXGavrJO61Cl5OkS59U,36371
+pip/_vendor/rich/table.py,sha256=ZmT7V7MMCOYKw7TGY9SZLyYDf6JdM-WVf07FdVuVhTI,40049
+pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370
+pip/_vendor/rich/text.py,sha256=AO7JPCz6-gaN1thVLXMBntEmDPVYFgFNG1oM61_sanU,47552
+pip/_vendor/rich/theme.py,sha256=oNyhXhGagtDlbDye3tVu3esWOWk0vNkuxFw-_unlaK0,3771
+pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102
+pip/_vendor/rich/traceback.py,sha256=c0WmB_L04_UfZbLaoH982_U_s7eosxKMUiAVmDPdRYU,35861
+pip/_vendor/rich/tree.py,sha256=yWnQ6rAvRGJ3qZGqBrxS2SW2TKBTNrP0SdY8QxOFPuw,9451
+pip/_vendor/tomli/__init__.py,sha256=PhNw_eyLgdn7McJ6nrAN8yIm3dXC75vr1sVGVVwDSpA,314
+pip/_vendor/tomli/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/tomli/__pycache__/_parser.cpython-312.pyc,,
+pip/_vendor/tomli/__pycache__/_re.cpython-312.pyc,,
+pip/_vendor/tomli/__pycache__/_types.cpython-312.pyc,,
+pip/_vendor/tomli/_parser.py,sha256=9w8LG0jB7fwmZZWB0vVXbeejDHcl4ANIJxB2scEnDlA,25591
+pip/_vendor/tomli/_re.py,sha256=sh4sBDRgO94KJZwNIrgdcyV_qQast50YvzOAUGpRDKA,3171
+pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254
+pip/_vendor/tomli/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
+pip/_vendor/tomli_w/__init__.py,sha256=0F8yDtXx3Uunhm874KrAcP76srsM98y7WyHQwCulZbo,169
+pip/_vendor/tomli_w/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/tomli_w/__pycache__/_writer.cpython-312.pyc,,
+pip/_vendor/tomli_w/_writer.py,sha256=dsifFS2xYf1i76mmRyfz9y125xC7Z_HQ845ZKhJsYXs,6961
+pip/_vendor/tomli_w/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
+pip/_vendor/truststore/__init__.py,sha256=2wRSVijjRzPLVXUzWqvdZLNsEOhDfopKLd2EKAYLwKU,1320
+pip/_vendor/truststore/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/truststore/__pycache__/_api.cpython-312.pyc,,
+pip/_vendor/truststore/__pycache__/_macos.cpython-312.pyc,,
+pip/_vendor/truststore/__pycache__/_openssl.cpython-312.pyc,,
+pip/_vendor/truststore/__pycache__/_ssl_constants.cpython-312.pyc,,
+pip/_vendor/truststore/__pycache__/_windows.cpython-312.pyc,,
+pip/_vendor/truststore/_api.py,sha256=af8gEZG_vhsudia9vz4es3Vh8xAqhzQz4Cbjs6_rxus,11234
+pip/_vendor/truststore/_macos.py,sha256=nZlLkOmszUE0g6ryRwBVGY5COzPyudcsiJtDWarM5LQ,20503
+pip/_vendor/truststore/_openssl.py,sha256=LLUZ7ZGaio-i5dpKKjKCSeSufmn6T8pi9lDcFnvSyq0,2324
+pip/_vendor/truststore/_ssl_constants.py,sha256=NUD4fVKdSD02ri7-db0tnO0VqLP9aHuzmStcW7tAl08,1130
+pip/_vendor/truststore/_windows.py,sha256=rAHyKYD8M7t-bXfG8VgOVa3TpfhVhbt4rZQlO45YuP8,17993
+pip/_vendor/truststore/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333
+pip/_vendor/urllib3/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/_collections.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/_version.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/connection.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/connectionpool.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/exceptions.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/fields.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/filepost.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/poolmanager.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/request.cpython-312.pyc,,
+pip/_vendor/urllib3/__pycache__/response.cpython-312.pyc,,
+pip/_vendor/urllib3/_collections.py,sha256=pyASJJhW7wdOpqJj9QJA8FyGRfr8E8uUUhqUvhF0728,11372
+pip/_vendor/urllib3/_version.py,sha256=t9wGB6ooOTXXgiY66K1m6BZS1CJyXHAU8EoWDTe6Shk,64
+pip/_vendor/urllib3/connection.py,sha256=ttIA909BrbTUzwkqEe_TzZVh4JOOj7g61Ysei2mrwGg,20314
+pip/_vendor/urllib3/connectionpool.py,sha256=e2eiAwNbFNCKxj4bwDKNK-w7HIdSz3OmMxU_TIt-evQ,40408
+pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957
+pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-312.pyc,,
+pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632
+pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922
+pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036
+pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528
+pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081
+pip/_vendor/urllib3/contrib/securetransport.py,sha256=Fef1IIUUFHqpevzXiDPbIGkDKchY2FVKeVeLGR1Qq3g,34446
+pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097
+pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217
+pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579
+pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440
+pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/packages/__pycache__/six.cpython-312.pyc,,
+pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
+pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-312.pyc,,
+pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-312.pyc,,
+pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417
+pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343
+pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665
+pip/_vendor/urllib3/poolmanager.py,sha256=aWyhXRtNO4JUnCSVVqKTKQd8EXTvUm1VN9pgs2bcONo,19990
+pip/_vendor/urllib3/request.py,sha256=YTWFNr7QIwh7E1W9dde9LM77v2VWTJ5V78XuTTw7D1A,6691
+pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641
+pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155
+pip/_vendor/urllib3/util/__pycache__/__init__.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/connection.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/proxy.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/queue.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/request.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/response.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/retry.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/timeout.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/url.cpython-312.pyc,,
+pip/_vendor/urllib3/util/__pycache__/wait.cpython-312.pyc,,
+pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901
+pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605
+pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498
+pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997
+pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510
+pip/_vendor/urllib3/util/retry.py,sha256=6ENvOZ8PBDzh8kgixpql9lIrb2dxH-k7ZmBanJF2Ng4,22050
+pip/_vendor/urllib3/util/ssl_.py,sha256=QDuuTxPSCj1rYtZ4xpD7Ux-r20TD50aHyqKyhQ7Bq4A,17460
+pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758
+pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895
+pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168
+pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296
+pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403
+pip/_vendor/vendor.txt,sha256=fawq8T1XFfBhs4rjjSl4fUA3Px9P2mtG2evqqPyhbhc,343
+pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/REQUESTED b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/REQUESTED
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/WHEEL
similarity index 65%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/WHEEL
index 98c0d20b..e7fa31b6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/WHEEL
@@ -1,5 +1,5 @@
Wheel-Version: 1.0
-Generator: bdist_wheel (0.42.0)
+Generator: setuptools (80.9.0)
Root-Is-Purelib: true
Tag: py3-none-any
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/entry_points.txt
similarity index 69%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/entry_points.txt
index 26fa3616..25fcf7e2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/entry_points.txt
@@ -1,4 +1,3 @@
[console_scripts]
pip = pip._internal.cli.main:main
pip3 = pip._internal.cli.main:main
-pip3.12 = pip._internal.cli.main:main
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/AUTHORS.txt
similarity index 90%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/AUTHORS.txt
index 0e635489..c8a7c68f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/AUTHORS.txt
@@ -7,9 +7,12 @@ abs51295
AceGentile
Adam Chainz
Adam Tse
+Adam Turner
Adam Wentz
admin
+Adolfo Ochagavía
Adrien Morison
+Agus
ahayrapetyan
Ahilya
AinsworthK
@@ -28,6 +31,7 @@ Alex Hedges
Alex Loosley
Alex Morega
Alex Stachowiak
+Alexander Regueiro
Alexander Shtyrov
Alexandre Conrad
Alexey Popravka
@@ -55,6 +59,7 @@ Anthony Sottile
Antoine Musso
Anton Ovchinnikov
Anton Patrushev
+Anton Zelenov
Antonio Alvarado Hernandez
Antony Lee
Antti Kaihola
@@ -63,8 +68,11 @@ Anudit Nagar
Anuj Godase
AQNOUCH Mohammed
AraHaan
+arena
+arenasys
Arindam Choudhury
Armin Ronacher
+Arnon Yaari
Artem
Arun Babu Neelicattu
Ashley Manton
@@ -100,8 +108,11 @@ Bogdan Opanchuk
BorisZZZ
Brad Erickson
Bradley Ayers
+Bradley Reynolds
+Branch Vincent
Brandon L. Reiss
Brandt Bucher
+Brannon Dorsey
Brett Randall
Brett Rosen
Brian Cristante
@@ -117,6 +128,7 @@ burrows
Bussonnier Matthias
bwoodsend
c22
+Caleb Brown
Caleb Martinez
Calvin Smith
Carl Meyer
@@ -125,11 +137,14 @@ Carol Willing
Carter Thayer
Cass
Chandrasekhar Atina
+Charlie Marsh
+charwick
Chih-Hsuan Yen
Chris Brinker
Chris Hunt
Chris Jerdonek
Chris Kuehl
+Chris Markiewicz
Chris McDonough
Chris Pawley
Chris Pryer
@@ -140,6 +155,7 @@ Christian Oudard
Christoph Reiter
Christopher Hunt
Christopher Snyder
+chrysle
cjc7373
Clark Boylan
Claudio Jolowicz
@@ -157,6 +173,7 @@ Craig Kerstiens
Cristian Sorinel
Cristina
Cristina Muñoz
+ctg123
Curtis Doty
cytolentino
Daan De Meyer
@@ -194,6 +211,7 @@ David Evans
David Hewitt
David Linke
David Poggi
+David Poznik
David Pursehouse
David Runge
David Tucker
@@ -202,16 +220,21 @@ Davidovich
ddelange
Deepak Sharma
Deepyaman Datta
+Denis Roussel (ACSONE)
Denise Yu
dependabot[bot]
derwolfe
Desetude
+developer
+Devesh Kumar
Devesh Kumar Singh
+devsagul
Diego Caraballo
Diego Ramirez
DiegoCaraballo
Dimitri Merejkowsky
Dimitri Papadopoulos
+Dimitri Papadopoulos Orfanos
Dirk Stolle
Dmitry Gladkov
Dmitry Volodin
@@ -224,6 +247,7 @@ Dos Moonen
Douglas Thor
DrFeathers
Dustin Ingram
+Dustin Rodrigues
Dwayne Bailey
Ed Morley
Edgar Ramírez
@@ -265,13 +289,17 @@ Florian Briand
Florian Rathgeber
Francesco
Francesco Montesano
+Fredrik Orderud
+Fredrik Roubert
Frost Ming
Gabriel Curio
Gabriel de Perthuis
Garry Polley
gavin
gdanielson
+Gene Wood
Geoffrey Sneddon
+George Margaritis
George Song
Georgi Valkov
Georgy Pchelkin
@@ -308,6 +336,7 @@ Hugo Lopes Tavares
Hugo van Kemenade
Hugues Bruant
Hynek Schlawack
+iamsrp-deshaw
Ian Bicking
Ian Cordasco
Ian Lee
@@ -315,6 +344,7 @@ Ian Stapleton Cordasco
Ian Wienand
Igor Kuzmitshov
Igor Sobreira
+Ikko Ashimine
Ilan Schnell
Illia Volochii
Ilya Baryshev
@@ -322,11 +352,13 @@ Inada Naoki
Ionel Cristian Mărieș
Ionel Maries Cristian
Itamar Turner-Trauring
+iTrooz
Ivan Pozdeev
J. Nick Koston
Jacob Kim
Jacob Walls
Jaime Sanz
+Jake Lishman
jakirkham
Jakub Kuczys
Jakub Stasiak
@@ -353,17 +385,22 @@ Jeff Dairiki
Jeff Widman
Jelmer Vernooij
jenix21
+Jeremy Fleischman
Jeremy Stanley
Jeremy Zafran
Jesse Rittner
Jiashuo Li
Jim Fisher
Jim Garrison
+Jinzhe Zeng
Jiun Bae
Jivan Amara
+Joa
Joe Bylund
Joe Michelini
+Johannes Altmanninger
John Paton
+John Sirois
John T. Wodder II
John-Scott Atlakson
johnthagen
@@ -378,21 +415,26 @@ Jorge Niedbalski
Joseph Bylund
Joseph Long
Josh Bronson
+Josh Cannon
Josh Hansen
Josh Schneier
Joshua
+JoshuaPerdue
Juan Luis Cano Rodríguez
Juanjo Bazán
Judah Rand
Julian Berman
Julian Gethmann
Julien Demoor
+July Tikhonov
Jussi Kukkonen
+Justin van Heek
jwg4
Jyrki Pulliainen
Kai Chen
Kai Mueller
Kamal Bin Mustafa
+Karolina Surma
kasium
kaustav haldar
keanemind
@@ -408,9 +450,12 @@ Kexuan Sun
Kit Randel
Klaas van Schelven
KOLANICH
+konstin
kpinc
+Krishan Bhasin
Krishna Oza
Kumar McMillan
+Kuntal Majumder
Kurt McKee
Kyle Persohn
lakshmanaram
@@ -428,6 +473,7 @@ lorddavidiii
Loren Carvalho
Lucas Cimon
Ludovic Gasc
+Luis Medel
Lukas Geiger
Lukas Juhrich
Luke Macken
@@ -436,16 +482,18 @@ luojiebin
luz.paz
László Kiss Kollár
M00nL1ght
+Malcolm Smith
Marc Abramowitz
Marc Tamlyn
Marcus Smith
Mariatta
Mark Kohler
+Mark McLoughlin
Mark Williams
Markus Hametner
Martey Dodoo
Martin Fischer
-Martin Häcker
+Martin Häcker
Martin Pavlasek
Masaki
Masklinn
@@ -457,10 +505,12 @@ Matt Bacchi
Matt Good
Matt Maker
Matt Robenolt
+Matt Wozniski
matthew
Matthew Einhorn
Matthew Feickert
Matthew Gilliard
+Matthew Hughes
Matthew Iversen
Matthew Treinish
Matthew Trumbell
@@ -473,6 +523,7 @@ Maxim Kurnikov
Maxime Rouyrre
mayeut
mbaluna
+Md Sujauddin Sekh
mdebi
memoselyk
meowmeowcat
@@ -495,7 +546,9 @@ Miro Hrončok
Monica Baluna
montefra
Monty Taylor
-Muha Ajjan
+morotti
+mrKazzila
+Muha Ajjan
Nadav Wexler
Nahuel Ambrosini
Nate Coraor
@@ -522,10 +575,12 @@ Noah
Noah Gorny
Nowell Strite
NtaleGrey
+nucccc
nvdv
OBITORASU
Ofek Lev
ofrinevo
+Oleg Burnaev
Oliver Freund
Oliver Jeeves
Oliver Mannion
@@ -559,7 +614,9 @@ Paweł Szramowski
Pekka Klärck
Peter Gessler
Peter Lisák
+Peter Shen
Peter Waller
+Petr Viktorin
petr-tik
Phaneendra Chiruvella
Phil Elson
@@ -587,11 +644,14 @@ Pulkit Goyal
q0w
Qiangning Hong
Qiming Xu
+qraqras
Quentin Lee
Quentin Pradet
R. David Murray
Rafael Caricio
Ralf Schmitt
+Ran Benita
+Randy Döring
Razzi Abuissa
rdb
Reece Dunham
@@ -603,12 +663,14 @@ Richard Jones
Richard Si
Ricky Ng-Adam
Rishi
+rmorotti
RobberPhex
Robert Collins
Robert McGibbon
Robert Pollak
Robert T. McGibbon
robin elisha robinson
+Rodney, Tiara
Roey Berman
Rohan Jain
Roman Bogorodskiy
@@ -624,6 +686,8 @@ Russell Keith-Magee
Ryan Shepherd
Ryan Wooden
ryneeverett
+Ryuma Asai
+S. Guliaev
Sachi King
Salvatore Rinchiera
sandeepkiran-js
@@ -637,13 +701,17 @@ Sebastian Jordan
Sebastian Schaetz
Segev Finer
SeongSoo Cho
+Sepehr Rasouli
+sepehrrasooli
Sergey Vasilyev
Seth Michael Larson
Seth Woodworth
Shahar Epstein
Shantanu
+shenxianpeng
shireenrao
Shivansh-007
+Shixian Sheng
Shlomi Fish
Shovan Maity
Simeon Visser
@@ -655,10 +723,12 @@ snook92
socketubs
Sorin Sbarnea
Srinivas Nyayapati
+Srishti Hegde
Stavros Korokithakis
Stefan Scherfke
Stefano Rivera
Stephan Erb
+Stephen Payne
Stephen Rosen
stepshal
Steve (Gadget) Barnes
@@ -675,6 +745,7 @@ Stéphane Klein
Sumana Harihareswara
Surbhi Sharma
Sviatoslav Sydorenko
+Sviatoslav Sydorenko (Святослав Сидоренко)
Swat009
Sylvain
Takayuki SHIMIZUKAWA
@@ -741,6 +812,7 @@ Wolfgang Maier
Wu Zhenyu
XAMES3
Xavier Fernandez
+Xianpeng Shen
xoviat
xtreak
YAMAMOTO Takashi
@@ -749,7 +821,9 @@ Yeray Diaz Diaz
Yoval P
Yu Jian
Yuan Jing Vincent Yan
+Yuki Kobayashi
Yusuke Hayashi
+zackzack38
Zearin
Zhiping Deng
ziebam
@@ -757,4 +831,3 @@ Zvezdan Petkovic
Łukasz Langa
Роман Донченко
Семён Марьясин
-rekcäH nitraM
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/LICENSE.txt
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/LICENSE.txt
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt
new file mode 100644
index 00000000..d8b3b56d
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/cachecontrol/LICENSE.txt
@@ -0,0 +1,13 @@
+Copyright 2012-2021 Eric Larson
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/certifi/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/certifi/LICENSE
new file mode 100644
index 00000000..62b076cd
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/certifi/LICENSE
@@ -0,0 +1,20 @@
+This package contains a modified version of ca-bundle.crt:
+
+ca-bundle.crt -- Bundle of CA Root Certificates
+
+This is a bundle of X.509 certificates of public Certificate Authorities
+(CA). These were automatically extracted from Mozilla's root certificates
+file (certdata.txt). This file can be found in the mozilla source tree:
+https://hg.mozilla.org/mozilla-central/file/tip/security/nss/lib/ckfw/builtins/certdata.txt
+It contains the certificates in PEM format and therefore
+can be directly used with curl / libcurl / php_curl, or with
+an Apache+mod_ssl webserver for SSL client authentication.
+Just configure this file as the SSLCACertificateFile.#
+
+***** BEGIN LICENSE BLOCK *****
+This Source Code Form is subject to the terms of the Mozilla Public License,
+v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
+one at http://mozilla.org/MPL/2.0/.
+
+***** END LICENSE BLOCK *****
+@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt
new file mode 100644
index 00000000..b9723b85
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/dependency_groups/LICENSE.txt
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) 2024-present Stephen Rosen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt
new file mode 100644
index 00000000..c31ac56d
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distlib/LICENSE.txt
@@ -0,0 +1,284 @@
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC. Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team. In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com). In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property. Zope Corporation is a sponsoring member of
+the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition). Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+ Release Derived Year Owner GPL-
+ from compatible? (1)
+
+ 0.9.0 thru 1.2 1991-1995 CWI yes
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
+ 1.6 1.5.2 2000 CNRI no
+ 2.0 1.6 2000 BeOpen.com no
+ 1.6.1 1.6 2001 CNRI yes (2)
+ 2.1 2.0+1.6.1 2001 PSF no
+ 2.0.1 2.0+1.6.1 2001 PSF yes
+ 2.1.1 2.1+2.0.1 2001 PSF yes
+ 2.2 2.1.1 2001 PSF yes
+ 2.1.2 2.1.1 2002 PSF yes
+ 2.1.3 2.1.2 2002 PSF yes
+ 2.2.1 2.2 2002 PSF yes
+ 2.2.2 2.2.1 2002 PSF yes
+ 2.2.3 2.2.2 2003 PSF yes
+ 2.3 2.2.2 2002-2003 PSF yes
+ 2.3.1 2.3 2002-2003 PSF yes
+ 2.3.2 2.3.1 2002-2003 PSF yes
+ 2.3.3 2.3.2 2002-2003 PSF yes
+ 2.3.4 2.3.3 2004 PSF yes
+ 2.3.5 2.3.4 2005 PSF yes
+ 2.4 2.3 2004 PSF yes
+ 2.4.1 2.4 2005 PSF yes
+ 2.4.2 2.4.1 2005 PSF yes
+ 2.4.3 2.4.2 2006 PSF yes
+ 2.4.4 2.4.3 2006 PSF yes
+ 2.5 2.4 2006 PSF yes
+ 2.5.1 2.5 2007 PSF yes
+ 2.5.2 2.5.1 2008 PSF yes
+ 2.5.3 2.5.2 2008 PSF yes
+ 2.6 2.5 2008 PSF yes
+ 2.6.1 2.6 2008 PSF yes
+ 2.6.2 2.6.1 2009 PSF yes
+ 2.6.3 2.6.2 2009 PSF yes
+ 2.6.4 2.6.3 2009 PSF yes
+ 2.6.5 2.6.4 2010 PSF yes
+ 3.0 2.6 2008 PSF yes
+ 3.0.1 3.0 2009 PSF yes
+ 3.1 3.0.1 2009 PSF yes
+ 3.1.1 3.1 2009 PSF yes
+ 3.1.2 3.1 2010 PSF yes
+ 3.2 3.1 2010 PSF yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+ the GPL. All Python licenses, unlike the GPL, let you distribute
+ a modified version without making your changes open source. The
+ GPL-compatible licenses make it possible to combine Python with
+ other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+ because its license has a choice of law clause. According to
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+ is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
+--------------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using this software ("Python") in source or binary form and
+its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF hereby
+grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
+analyze, test, perform and/or display publicly, prepare derivative works,
+distribute, and otherwise use Python alone or in any derivative version,
+provided, however, that PSF's License Agreement and PSF's notice of copyright,
+i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+Python Software Foundation; All Rights Reserved" are retained in Python alone or
+in any derivative version prepared by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python.
+
+4. PSF is making Python available to Licensee on an "AS IS"
+basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee. This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions. Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee. This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party. As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee. Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement. This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013. This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee. This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+ ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands. All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distro/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distro/LICENSE
new file mode 100644
index 00000000..e06d2081
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/distro/LICENSE
@@ -0,0 +1,202 @@
+Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright {yyyy} {name of copyright owner}
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md
new file mode 100644
index 00000000..19b6b452
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/idna/LICENSE.md
@@ -0,0 +1,31 @@
+BSD 3-Clause License
+
+Copyright (c) 2013-2024, Kim Davies and contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/msgpack/COPYING b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/msgpack/COPYING
new file mode 100644
index 00000000..f067af3a
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/msgpack/COPYING
@@ -0,0 +1,14 @@
+Copyright (C) 2008-2011 INADA Naoki
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE
new file mode 100644
index 00000000..6f62d44e
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE
@@ -0,0 +1,3 @@
+This software is made available under the terms of *either* of the licenses
+found in LICENSE.APACHE or LICENSE.BSD. Contributions to this software is made
+under the terms of *both* these licenses.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE
new file mode 100644
index 00000000..f433b1a5
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.APACHE
@@ -0,0 +1,177 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD
new file mode 100644
index 00000000..42ce7b75
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/packaging/LICENSE.BSD
@@ -0,0 +1,23 @@
+Copyright (c) Donald Stufft and individual contributors.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE
new file mode 100644
index 00000000..1bb5a443
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pkg_resources/LICENSE
@@ -0,0 +1,17 @@
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE
new file mode 100644
index 00000000..f35fed91
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/platformdirs/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010-202x The platformdirs developers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pygments/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pygments/LICENSE
new file mode 100644
index 00000000..446a1a80
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pygments/LICENSE
@@ -0,0 +1,25 @@
+Copyright (c) 2006-2022 by the respective authors (see AUTHORS file).
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE
new file mode 100644
index 00000000..b0ae9dbc
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/pyproject_hooks/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2017 Thomas Kluyver
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/requests/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/requests/LICENSE
new file mode 100644
index 00000000..67db8588
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/requests/LICENSE
@@ -0,0 +1,175 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE
new file mode 100644
index 00000000..b9077766
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/resolvelib/LICENSE
@@ -0,0 +1,13 @@
+Copyright (c) 2018, Tzu-ping Chung
+
+Permission to use, copy, modify, and distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/rich/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/rich/LICENSE
new file mode 100644
index 00000000..44155055
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/rich/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2020 Will McGugan
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE
new file mode 100644
index 00000000..e859590f
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER
new file mode 100644
index 00000000..aba78dd2
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli/LICENSE-HEADER
@@ -0,0 +1,3 @@
+SPDX-License-Identifier: MIT
+SPDX-FileCopyrightText: 2021 Taneli Hukkinen
+Licensed to PSF under a Contributor Agreement.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE
new file mode 100644
index 00000000..e859590f
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/tomli_w/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Taneli Hukkinen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/truststore/LICENSE b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/truststore/LICENSE
new file mode 100644
index 00000000..7ec568c1
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/truststore/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2022 Seth Michael Larson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt
new file mode 100644
index 00000000..429a1767
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/licenses/src/pip/_vendor/urllib3/LICENSE.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2008-2020 Andrey Petrov and contributors (see CONTRIBUTORS.txt)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt b/gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/top_level.txt
similarity index 100%
rename from gnx-react/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt
rename to gnx-react/venv/lib/python3.12/site-packages/pip-25.2.dist-info/top_level.txt
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/__init__.py
index be0e3edb..c81f3818 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/__init__.py
@@ -1,9 +1,9 @@
-from typing import List, Optional
+from __future__ import annotations
-__version__ = "24.0"
+__version__ = "25.2"
-def main(args: Optional[List[str]] = None) -> int:
+def main(args: list[str] | None = None) -> int:
"""This is an internal API only meant for use by pip's own console scripts.
For additional details, see https://github.com/pypa/pip/issues/7498.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/__pip-runner__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/__pip-runner__.py
index 49a148a0..d6be1578 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/__pip-runner__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/__pip-runner__.py
@@ -8,8 +8,8 @@ an import statement.
import sys
-# Copied from setup.py
-PYTHON_REQUIRES = (3, 7)
+# Copied from pyproject.toml
+PYTHON_REQUIRES = (3, 9)
def version_str(version): # type: ignore
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc
index 62b4f80a..eed57d76 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc
index 4a5e160d..db157184 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc
index 1c21a805..bef1a59c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/__pycache__/__pip-runner__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__init__.py
index 96c6b88c..24d0baf0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__init__.py
@@ -1,4 +1,4 @@
-from typing import List, Optional
+from __future__ import annotations
from pip._internal.utils import _log
@@ -7,7 +7,7 @@ from pip._internal.utils import _log
_log.init_logging()
-def main(args: (Optional[List[str]]) = None) -> int:
+def main(args: list[str] | None = None) -> int:
"""This is preserved for old console scripts that may still be referencing
it.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc
index 7e4433cc..18d4ffbe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc
index 92624dd2..68878df1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/build_env.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc
index 7363f5f7..86af85a7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc
index 32889efe..a0c780b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/configuration.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc
index ff9be736..658917e0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc
index d418b757..538ed74c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/main.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc
index 3506bd04..6fe8fa66 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/pyproject.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc
index e74c563c..0b4f7bfc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc
index 90a1ed8c..ddcbf1e2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/build_env.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/build_env.py
index 4f704a35..3a246a1e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/build_env.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/build_env.py
@@ -1,5 +1,6 @@
-"""Build Environment used for isolation during sdist building
-"""
+"""Build Environment used for isolation during sdist building"""
+
+from __future__ import annotations
import logging
import os
@@ -8,27 +9,29 @@ import site
import sys
import textwrap
from collections import OrderedDict
+from collections.abc import Iterable
from types import TracebackType
-from typing import TYPE_CHECKING, Iterable, List, Optional, Set, Tuple, Type, Union
+from typing import TYPE_CHECKING, Protocol
-from pip._vendor.certifi import where
-from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.version import Version
from pip import __file__ as pip_location
from pip._internal.cli.spinners import open_spinner
from pip._internal.locations import get_platlib, get_purelib, get_scheme
from pip._internal.metadata import get_default_environment, get_environment
+from pip._internal.utils.logging import VERBOSE
+from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.subprocess import call_subprocess
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
if TYPE_CHECKING:
from pip._internal.index.package_finder import PackageFinder
+ from pip._internal.req.req_install import InstallRequirement
logger = logging.getLogger(__name__)
-def _dedup(a: str, b: str) -> Union[Tuple[str], Tuple[str, str]]:
+def _dedup(a: str, b: str) -> tuple[str] | tuple[str, str]:
return (a, b) if a != b else (a,)
@@ -57,7 +60,7 @@ def get_runnable_pip() -> str:
return os.fsdecode(source / "__pip-runner__.py")
-def _get_system_sitepackages() -> Set[str]:
+def _get_system_sitepackages() -> set[str]:
"""Get system site packages
Usually from site.getsitepackages,
@@ -77,10 +80,108 @@ def _get_system_sitepackages() -> Set[str]:
return {os.path.normcase(path) for path in system_sites}
+class BuildEnvironmentInstaller(Protocol):
+ """
+ Interface for installing build dependencies into an isolated build
+ environment.
+ """
+
+ def install(
+ self,
+ requirements: Iterable[str],
+ prefix: _Prefix,
+ *,
+ kind: str,
+ for_req: InstallRequirement | None,
+ ) -> None: ...
+
+
+class SubprocessBuildEnvironmentInstaller:
+ """
+ Install build dependencies by calling pip in a subprocess.
+ """
+
+ def __init__(self, finder: PackageFinder) -> None:
+ self.finder = finder
+
+ def install(
+ self,
+ requirements: Iterable[str],
+ prefix: _Prefix,
+ *,
+ kind: str,
+ for_req: InstallRequirement | None,
+ ) -> None:
+ finder = self.finder
+ args: list[str] = [
+ sys.executable,
+ get_runnable_pip(),
+ "install",
+ "--ignore-installed",
+ "--no-user",
+ "--prefix",
+ prefix.path,
+ "--no-warn-script-location",
+ "--disable-pip-version-check",
+ # As the build environment is ephemeral, it's wasteful to
+ # pre-compile everything, especially as not every Python
+ # module will be used/compiled in most cases.
+ "--no-compile",
+ # The prefix specified two lines above, thus
+ # target from config file or env var should be ignored
+ "--target",
+ "",
+ ]
+ if logger.getEffectiveLevel() <= logging.DEBUG:
+ args.append("-vv")
+ elif logger.getEffectiveLevel() <= VERBOSE:
+ args.append("-v")
+ for format_control in ("no_binary", "only_binary"):
+ formats = getattr(finder.format_control, format_control)
+ args.extend(
+ (
+ "--" + format_control.replace("_", "-"),
+ ",".join(sorted(formats or {":none:"})),
+ )
+ )
+
+ index_urls = finder.index_urls
+ if index_urls:
+ args.extend(["-i", index_urls[0]])
+ for extra_index in index_urls[1:]:
+ args.extend(["--extra-index-url", extra_index])
+ else:
+ args.append("--no-index")
+ for link in finder.find_links:
+ args.extend(["--find-links", link])
+
+ if finder.proxy:
+ args.extend(["--proxy", finder.proxy])
+ for host in finder.trusted_hosts:
+ args.extend(["--trusted-host", host])
+ if finder.custom_cert:
+ args.extend(["--cert", finder.custom_cert])
+ if finder.client_cert:
+ args.extend(["--client-cert", finder.client_cert])
+ if finder.allow_all_prereleases:
+ args.append("--pre")
+ if finder.prefer_binary:
+ args.append("--prefer-binary")
+ args.append("--")
+ args.extend(requirements)
+ with open_spinner(f"Installing {kind}") as spinner:
+ call_subprocess(
+ args,
+ command_desc=f"pip subprocess to install {kind}",
+ spinner=spinner,
+ )
+
+
class BuildEnvironment:
"""Creates and manages an isolated environment to install build deps"""
- def __init__(self) -> None:
+ def __init__(self, installer: BuildEnvironmentInstaller) -> None:
+ self.installer = installer
temp_dir = TempDirectory(kind=tempdir_kinds.BUILD_ENV, globally_managed=True)
self._prefixes = OrderedDict(
@@ -88,8 +189,8 @@ class BuildEnvironment:
for name in ("normal", "overlay")
)
- self._bin_dirs: List[str] = []
- self._lib_dirs: List[str] = []
+ self._bin_dirs: list[str] = []
+ self._lib_dirs: list[str] = []
for prefix in reversed(list(self._prefixes.values())):
self._bin_dirs.append(prefix.bin_dir)
self._lib_dirs.extend(prefix.lib_dirs)
@@ -157,9 +258,9 @@ class BuildEnvironment:
def __exit__(
self,
- exc_type: Optional[Type[BaseException]],
- exc_val: Optional[BaseException],
- exc_tb: Optional[TracebackType],
+ exc_type: type[BaseException] | None,
+ exc_val: BaseException | None,
+ exc_tb: TracebackType | None,
) -> None:
for varname, old_value in self._save_env.items():
if old_value is None:
@@ -169,7 +270,7 @@ class BuildEnvironment:
def check_requirements(
self, reqs: Iterable[str]
- ) -> Tuple[Set[Tuple[str, str]], Set[str]]:
+ ) -> tuple[set[tuple[str, str]], set[str]]:
"""Return 2 sets:
- conflicting requirements: set of (installed, wanted) reqs tuples
- missing requirements: set of reqs
@@ -183,7 +284,7 @@ class BuildEnvironment:
else get_default_environment()
)
for req_str in reqs:
- req = Requirement(req_str)
+ req = get_requirement(req_str)
# We're explicitly evaluating with an empty extra value, since build
# environments are not provided any mechanism to select specific extras.
if req.marker is not None and not req.marker.evaluate({"extra": ""}):
@@ -203,81 +304,18 @@ class BuildEnvironment:
def install_requirements(
self,
- finder: "PackageFinder",
requirements: Iterable[str],
prefix_as_string: str,
*,
kind: str,
+ for_req: InstallRequirement | None = None,
) -> None:
prefix = self._prefixes[prefix_as_string]
assert not prefix.setup
prefix.setup = True
if not requirements:
return
- self._install_requirements(
- get_runnable_pip(),
- finder,
- requirements,
- prefix,
- kind=kind,
- )
-
- @staticmethod
- def _install_requirements(
- pip_runnable: str,
- finder: "PackageFinder",
- requirements: Iterable[str],
- prefix: _Prefix,
- *,
- kind: str,
- ) -> None:
- args: List[str] = [
- sys.executable,
- pip_runnable,
- "install",
- "--ignore-installed",
- "--no-user",
- "--prefix",
- prefix.path,
- "--no-warn-script-location",
- ]
- if logger.getEffectiveLevel() <= logging.DEBUG:
- args.append("-v")
- for format_control in ("no_binary", "only_binary"):
- formats = getattr(finder.format_control, format_control)
- args.extend(
- (
- "--" + format_control.replace("_", "-"),
- ",".join(sorted(formats or {":none:"})),
- )
- )
-
- index_urls = finder.index_urls
- if index_urls:
- args.extend(["-i", index_urls[0]])
- for extra_index in index_urls[1:]:
- args.extend(["--extra-index-url", extra_index])
- else:
- args.append("--no-index")
- for link in finder.find_links:
- args.extend(["--find-links", link])
-
- for host in finder.trusted_hosts:
- args.extend(["--trusted-host", host])
- if finder.allow_all_prereleases:
- args.append("--pre")
- if finder.prefer_binary:
- args.append("--prefer-binary")
- args.append("--")
- args.extend(requirements)
- extra_environ = {"_PIP_STANDALONE_CERT": where()}
- with open_spinner(f"Installing {kind}") as spinner:
- call_subprocess(
- args,
- command_desc=f"pip subprocess to install {kind}",
- spinner=spinner,
- extra_environ=extra_environ,
- )
+ self.installer.install(requirements, prefix, kind=kind, for_req=for_req)
class NoOpBuildEnvironment(BuildEnvironment):
@@ -291,9 +329,9 @@ class NoOpBuildEnvironment(BuildEnvironment):
def __exit__(
self,
- exc_type: Optional[Type[BaseException]],
- exc_val: Optional[BaseException],
- exc_tb: Optional[TracebackType],
+ exc_type: type[BaseException] | None,
+ exc_val: BaseException | None,
+ exc_tb: TracebackType | None,
) -> None:
pass
@@ -302,10 +340,10 @@ class NoOpBuildEnvironment(BuildEnvironment):
def install_requirements(
self,
- finder: "PackageFinder",
requirements: Iterable[str],
prefix_as_string: str,
*,
kind: str,
+ for_req: InstallRequirement | None = None,
) -> None:
raise NotImplementedError()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cache.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cache.py
index f45ac23e..ce98f288 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cache.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cache.py
@@ -1,12 +1,13 @@
-"""Cache Management
-"""
+"""Cache Management"""
+
+from __future__ import annotations
import hashlib
import json
import logging
import os
from pathlib import Path
-from typing import Any, Dict, List, Optional
+from typing import Any
from pip._vendor.packaging.tags import Tag, interpreter_name, interpreter_version
from pip._vendor.packaging.utils import canonicalize_name
@@ -23,7 +24,7 @@ logger = logging.getLogger(__name__)
ORIGIN_JSON_NAME = "origin.json"
-def _hash_dict(d: Dict[str, str]) -> str:
+def _hash_dict(d: dict[str, str]) -> str:
"""Return a stable sha224 of a dictionary."""
s = json.dumps(d, sort_keys=True, separators=(",", ":"), ensure_ascii=True)
return hashlib.sha224(s.encode("ascii")).hexdigest()
@@ -40,11 +41,11 @@ class Cache:
assert not cache_dir or os.path.isabs(cache_dir)
self.cache_dir = cache_dir or None
- def _get_cache_path_parts(self, link: Link) -> List[str]:
+ def _get_cache_path_parts(self, link: Link) -> list[str]:
"""Get parts of part that must be os.path.joined with cache_dir"""
# We want to generate an url to use as our cache key, we don't want to
- # just re-use the URL because it might have other items in the fragment
+ # just reuse the URL because it might have other items in the fragment
# and we don't care about those.
key_parts = {"url": link.url_without_fragment}
if link.hash_name is not None and link.hash is not None:
@@ -73,7 +74,7 @@ class Cache:
return parts
- def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]:
+ def _get_candidates(self, link: Link, canonical_package_name: str) -> list[Any]:
can_not_cache = not self.cache_dir or not canonical_package_name or not link
if can_not_cache:
return []
@@ -90,8 +91,8 @@ class Cache:
def get(
self,
link: Link,
- package_name: Optional[str],
- supported_tags: List[Tag],
+ package_name: str | None,
+ supported_tags: list[Tag],
) -> Link:
"""Returns a link to a cached item if it exists, otherwise returns the
passed link.
@@ -128,8 +129,8 @@ class SimpleWheelCache(Cache):
def get(
self,
link: Link,
- package_name: Optional[str],
- supported_tags: List[Tag],
+ package_name: str | None,
+ supported_tags: list[Tag],
) -> Link:
candidates = []
@@ -189,7 +190,7 @@ class CacheEntry:
):
self.link = link
self.persistent = persistent
- self.origin: Optional[DirectUrl] = None
+ self.origin: DirectUrl | None = None
origin_direct_url_path = Path(self.link.file_path).parent / ORIGIN_JSON_NAME
if origin_direct_url_path.exists():
try:
@@ -226,8 +227,8 @@ class WheelCache(Cache):
def get(
self,
link: Link,
- package_name: Optional[str],
- supported_tags: List[Tag],
+ package_name: str | None,
+ supported_tags: list[Tag],
) -> Link:
cache_entry = self.get_cache_entry(link, package_name, supported_tags)
if cache_entry is None:
@@ -237,9 +238,9 @@ class WheelCache(Cache):
def get_cache_entry(
self,
link: Link,
- package_name: Optional[str],
- supported_tags: List[Tag],
- ) -> Optional[CacheEntry]:
+ package_name: str | None,
+ supported_tags: list[Tag],
+ ) -> CacheEntry | None:
"""Returns a CacheEntry with a link to a cached item if it exists or
None. The cache entry indicates if the item was found in the persistent
or ephemeral cache.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py
index e589bb91..5fcddf5d 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py
@@ -1,4 +1,3 @@
-"""Subpackage containing all of pip's command line interface related code
-"""
+"""Subpackage containing all of pip's command line interface related code"""
# This file intentionally does not import submodules
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc
index f81735ae..6708ef44 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc
index 6011d36f..e3a23dd6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc
index 494e6473..be43649e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc
index 61da5c9b..8d1f34e1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc
index 582f407f..aab04208 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc
new file mode 100644
index 00000000..9cac7a4e
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/index_command.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc
index 5dbb39c9..f7a7ddb7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc
index 665ca908..a7c4545f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc
index ef686c1b..070fc8ad 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc
index 2783aeec..e3fd1687 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc
index 30e58084..aa008010 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc
index a67596b8..ea8d6fee 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc
index 714fd928..1a1f8453 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py
index e5950b90..f22cd115 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py
@@ -1,11 +1,13 @@
-"""Logic that powers autocompletion installed by ``pip completion``.
-"""
+"""Logic that powers autocompletion installed by ``pip completion``."""
+
+from __future__ import annotations
import optparse
import os
import sys
+from collections.abc import Iterable
from itertools import chain
-from typing import Any, Iterable, List, Optional
+from typing import Any
from pip._internal.cli.main_parser import create_main_parser
from pip._internal.commands import commands_dict, create_command
@@ -17,6 +19,10 @@ def autocomplete() -> None:
# Don't complete if user hasn't sourced bash_completion file.
if "PIP_AUTO_COMPLETE" not in os.environ:
return
+ # Don't complete if autocompletion environment variables
+ # are not present
+ if not os.environ.get("COMP_WORDS") or not os.environ.get("COMP_CWORD"):
+ return
cwords = os.environ["COMP_WORDS"].split()[1:]
cword = int(os.environ["COMP_CWORD"])
try:
@@ -29,7 +35,7 @@ def autocomplete() -> None:
options = []
# subcommand
- subcommand_name: Optional[str] = None
+ subcommand_name: str | None = None
for word in cwords:
if word in subcommands:
subcommand_name = word
@@ -97,6 +103,12 @@ def autocomplete() -> None:
if option[1] and option[0][:2] == "--":
opt_label += "="
print(opt_label)
+
+ # Complete sub-commands (unless one is already given).
+ if not any(name in cwords for name in subcommand.handler_map()):
+ for handler_name in subcommand.handler_map():
+ if handler_name.startswith(current):
+ print(handler_name)
else:
# show main parser options only when necessary
@@ -118,8 +130,8 @@ def autocomplete() -> None:
def get_path_completion_type(
- cwords: List[str], cword: int, opts: Iterable[Any]
-) -> Optional[str]:
+ cwords: list[str], cword: int, opts: Iterable[Any]
+) -> str | None:
"""Get the type of path completion (``file``, ``dir``, ``path`` or None)
:param cwords: same as the environmental variable ``COMP_WORDS``
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
index db9d5cc6..7acc29cb 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
@@ -1,6 +1,7 @@
"""Base Command class, and related routines"""
-import functools
+from __future__ import annotations
+
import logging
import logging.config
import optparse
@@ -8,8 +9,9 @@ import os
import sys
import traceback
from optparse import Values
-from typing import Any, Callable, List, Optional, Tuple
+from typing import Callable
+from pip._vendor.rich import reconfigure
from pip._vendor.rich import traceback as rich_traceback
from pip._internal.cli import cmdoptions
@@ -28,7 +30,6 @@ from pip._internal.exceptions import (
InstallationError,
NetworkConnectionError,
PreviousBuildDirError,
- UninstallationError,
)
from pip._internal.utils.filesystem import check_path_owner
from pip._internal.utils.logging import BrokenStdoutLoggingError, setup_logging
@@ -61,7 +62,7 @@ class Command(CommandContextMixIn):
isolated=isolated,
)
- self.tempdir_registry: Optional[TempDirRegistry] = None
+ self.tempdir_registry: TempDirRegistry | None = None
# Commands should add options to this option group
optgroup_name = f"{self.name.capitalize()} Options"
@@ -88,21 +89,78 @@ class Command(CommandContextMixIn):
# are present.
assert not hasattr(options, "no_index")
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
raise NotImplementedError
- def parse_args(self, args: List[str]) -> Tuple[Values, List[str]]:
+ def _run_wrapper(self, level_number: int, options: Values, args: list[str]) -> int:
+ def _inner_run() -> int:
+ try:
+ return self.run(options, args)
+ finally:
+ self.handle_pip_version_check(options)
+
+ if options.debug_mode:
+ rich_traceback.install(show_locals=True)
+ return _inner_run()
+
+ try:
+ status = _inner_run()
+ assert isinstance(status, int)
+ return status
+ except DiagnosticPipError as exc:
+ logger.error("%s", exc, extra={"rich": True})
+ logger.debug("Exception information:", exc_info=True)
+
+ return ERROR
+ except PreviousBuildDirError as exc:
+ logger.critical(str(exc))
+ logger.debug("Exception information:", exc_info=True)
+
+ return PREVIOUS_BUILD_DIR_ERROR
+ except (
+ InstallationError,
+ BadCommand,
+ NetworkConnectionError,
+ ) as exc:
+ logger.critical(str(exc))
+ logger.debug("Exception information:", exc_info=True)
+
+ return ERROR
+ except CommandError as exc:
+ logger.critical("%s", exc)
+ logger.debug("Exception information:", exc_info=True)
+
+ return ERROR
+ except BrokenStdoutLoggingError:
+ # Bypass our logger and write any remaining messages to
+ # stderr because stdout no longer works.
+ print("ERROR: Pipe to stdout was broken", file=sys.stderr)
+ if level_number <= logging.DEBUG:
+ traceback.print_exc(file=sys.stderr)
+
+ return ERROR
+ except KeyboardInterrupt:
+ logger.critical("Operation cancelled by user")
+ logger.debug("Exception information:", exc_info=True)
+
+ return ERROR
+ except BaseException:
+ logger.critical("Exception:", exc_info=True)
+
+ return UNKNOWN_ERROR
+
+ def parse_args(self, args: list[str]) -> tuple[Values, list[str]]:
# factored out for testability
return self.parser.parse_args(args)
- def main(self, args: List[str]) -> int:
+ def main(self, args: list[str]) -> int:
try:
with self.main_context():
return self._main(args)
finally:
logging.shutdown()
- def _main(self, args: List[str]) -> int:
+ def _main(self, args: list[str]) -> int:
# We must initialize this before the tempdir manager, otherwise the
# configuration would not be accessible by the time we clean up the
# tempdir manager.
@@ -115,7 +173,13 @@ class Command(CommandContextMixIn):
# Set verbosity so that it can be used elsewhere.
self.verbosity = options.verbose - options.quiet
+ if options.debug_mode:
+ self.verbosity = 2
+ if hasattr(options, "progress_bar") and options.progress_bar == "auto":
+ options.progress_bar = "on" if self.verbosity >= 0 else "off"
+
+ reconfigure(no_color=options.no_color)
level_number = setup_logging(
verbosity=self.verbosity,
no_color=options.no_color,
@@ -171,66 +235,10 @@ class Command(CommandContextMixIn):
)
options.cache_dir = None
- def intercepts_unhandled_exc(
- run_func: Callable[..., int]
- ) -> Callable[..., int]:
- @functools.wraps(run_func)
- def exc_logging_wrapper(*args: Any) -> int:
- try:
- status = run_func(*args)
- assert isinstance(status, int)
- return status
- except DiagnosticPipError as exc:
- logger.error("%s", exc, extra={"rich": True})
- logger.debug("Exception information:", exc_info=True)
+ return self._run_wrapper(level_number, options, args)
- return ERROR
- except PreviousBuildDirError as exc:
- logger.critical(str(exc))
- logger.debug("Exception information:", exc_info=True)
-
- return PREVIOUS_BUILD_DIR_ERROR
- except (
- InstallationError,
- UninstallationError,
- BadCommand,
- NetworkConnectionError,
- ) as exc:
- logger.critical(str(exc))
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except CommandError as exc:
- logger.critical("%s", exc)
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except BrokenStdoutLoggingError:
- # Bypass our logger and write any remaining messages to
- # stderr because stdout no longer works.
- print("ERROR: Pipe to stdout was broken", file=sys.stderr)
- if level_number <= logging.DEBUG:
- traceback.print_exc(file=sys.stderr)
-
- return ERROR
- except KeyboardInterrupt:
- logger.critical("Operation cancelled by user")
- logger.debug("Exception information:", exc_info=True)
-
- return ERROR
- except BaseException:
- logger.critical("Exception:", exc_info=True)
-
- return UNKNOWN_ERROR
-
- return exc_logging_wrapper
-
- try:
- if not options.debug_mode:
- run = intercepts_unhandled_exc(self.run)
- else:
- run = self.run
- rich_traceback.install(show_locals=True)
- return run(options, args)
- finally:
- self.handle_pip_version_check(options)
+ def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
+ """
+ map of names to handler actions for commands with sub-actions
+ """
+ return {}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py
index d6432560..3519dadf 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py
@@ -9,15 +9,17 @@ pass on state. To be consistent, all options will follow this design.
# The following comment should be removed at some point in the future.
# mypy: strict-optional=False
+from __future__ import annotations
import importlib.util
import logging
import os
+import pathlib
import textwrap
from functools import partial
from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser, Values
from textwrap import dedent
-from typing import Any, Callable, Dict, Optional, Tuple
+from typing import Any, Callable
from pip._vendor.packaging.utils import canonicalize_name
@@ -47,7 +49,7 @@ def raise_option_error(parser: OptionParser, option: Option, msg: str) -> None:
parser.error(msg)
-def make_option_group(group: Dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
+def make_option_group(group: dict[str, Any], parser: ConfigOptionParser) -> OptionGroup:
"""
Return an OptionGroup object
group -- assumed to be dict with 'name' and 'options' keys
@@ -226,9 +228,13 @@ progress_bar: Callable[..., Option] = partial(
"--progress-bar",
dest="progress_bar",
type="choice",
- choices=["on", "off"],
- default="on",
- help="Specify whether the progress bar should be used [on, off] (default: on)",
+ choices=["auto", "on", "off", "raw"],
+ default="auto",
+ help=(
+ "Specify whether the progress bar should be used. In 'auto'"
+ " mode, --quiet will suppress all progress bars."
+ " [auto, on, off, raw] (default: auto)"
+ ),
)
log: Callable[..., Option] = partial(
@@ -260,8 +266,8 @@ keyring_provider: Callable[..., Option] = partial(
default="auto",
help=(
"Enable the credential lookup via the keyring library if user input is allowed."
- " Specify which mechanism to use [disabled, import, subprocess]."
- " (default: disabled)"
+ " Specify which mechanism to use [auto, disabled, import, subprocess]."
+ " (default: %default)"
),
)
@@ -280,8 +286,17 @@ retries: Callable[..., Option] = partial(
dest="retries",
type="int",
default=5,
- help="Maximum number of retries each connection should attempt "
- "(default %default times).",
+ help="Maximum attempts to establish a new HTTP connection. (default: %default)",
+)
+
+resume_retries: Callable[..., Option] = partial(
+ Option,
+ "--resume-retries",
+ dest="resume_retries",
+ type="int",
+ default=5,
+ help="Maximum attempts to resume or restart an incomplete download. "
+ "(default: %default)",
)
timeout: Callable[..., Option] = partial(
@@ -545,7 +560,7 @@ platforms: Callable[..., Option] = partial(
# This was made a separate function for unit-testing purposes.
-def _convert_python_version(value: str) -> Tuple[Tuple[int, ...], Optional[str]]:
+def _convert_python_version(value: str) -> tuple[tuple[int, ...], str | None]:
"""
Convert a version string like "3", "37", or "3.7.3" into a tuple of ints.
@@ -733,6 +748,46 @@ no_deps: Callable[..., Option] = partial(
help="Don't install package dependencies.",
)
+
+def _handle_dependency_group(
+ option: Option, opt: str, value: str, parser: OptionParser
+) -> None:
+ """
+ Process a value provided for the --group option.
+
+ Splits on the rightmost ":", and validates that the path (if present) ends
+ in `pyproject.toml`. Defaults the path to `pyproject.toml` when one is not given.
+
+ `:` cannot appear in dependency group names, so this is a safe and simple parse.
+
+ This is an optparse.Option callback for the dependency_groups option.
+ """
+ path, sep, groupname = value.rpartition(":")
+ if not sep:
+ path = "pyproject.toml"
+ else:
+ # check for 'pyproject.toml' filenames using pathlib
+ if pathlib.PurePath(path).name != "pyproject.toml":
+ msg = "group paths use 'pyproject.toml' filenames"
+ raise_option_error(parser, option=option, msg=msg)
+
+ parser.values.dependency_groups.append((path, groupname))
+
+
+dependency_groups: Callable[..., Option] = partial(
+ Option,
+ "--group",
+ dest="dependency_groups",
+ default=[],
+ type=str,
+ action="callback",
+ callback=_handle_dependency_group,
+ metavar="[path:]group",
+ help='Install a named dependency-group from a "pyproject.toml" file. '
+ 'If a path is given, the name of the file must be "pyproject.toml". '
+ 'Defaults to using "pyproject.toml" in the current directory.',
+)
+
ignore_requires_python: Callable[..., Option] = partial(
Option,
"--ignore-requires-python",
@@ -783,9 +838,9 @@ def _handle_no_use_pep517(
"""
raise_option_error(parser, option=option, msg=msg)
- # If user doesn't wish to use pep517, we check if setuptools and wheel are installed
+ # If user doesn't wish to use pep517, we check if setuptools is installed
# and raise error if it is not.
- packages = ("setuptools", "wheel")
+ packages = ("setuptools",)
if not all(importlib.util.find_spec(package) for package in packages):
msg = (
f"It is not possible to use --no-use-pep517 "
@@ -887,12 +942,20 @@ pre: Callable[..., Option] = partial(
"pip only finds stable versions.",
)
+json: Callable[..., Option] = partial(
+ Option,
+ "--json",
+ action="store_true",
+ default=False,
+ help="Output data in a machine-readable JSON format.",
+)
+
disable_pip_version_check: Callable[..., Option] = partial(
Option,
"--disable-pip-version-check",
dest="disable_pip_version_check",
action="store_true",
- default=True,
+ default=False,
help="Don't periodically check PyPI to determine whether a new version "
"of pip is available for download. Implied with --no-index.",
)
@@ -903,7 +966,7 @@ root_user_action: Callable[..., Option] = partial(
dest="root_user_action",
default="warn",
choices=["warn", "ignore"],
- help="Action if pip is run as a root user. By default, a warning message is shown.",
+ help="Action if pip is run as a root user [warn, ignore] (default: warn)",
)
@@ -990,12 +1053,13 @@ no_python_version_warning: Callable[..., Option] = partial(
dest="no_python_version_warning",
action="store_true",
default=False,
- help="Silence deprecation warnings for upcoming unsupported Pythons.",
+ help=SUPPRESS_HELP, # No-op, a hold-over from the Python 2->3 transition.
)
# Features that are now always on. A warning is printed if they are used.
ALWAYS_ENABLED_FEATURES = [
+ "truststore", # always on since 24.2
"no-binary-enable-wheel-cache", # always on since 23.1
]
@@ -1008,7 +1072,6 @@ use_new_feature: Callable[..., Option] = partial(
default=[],
choices=[
"fast-deps",
- "truststore",
]
+ ALWAYS_ENABLED_FEATURES,
help="Enable new functionality, that may be backward incompatible.",
@@ -1023,16 +1086,16 @@ use_deprecated_feature: Callable[..., Option] = partial(
default=[],
choices=[
"legacy-resolver",
+ "legacy-certs",
],
help=("Enable deprecated functionality, that will be removed in the future."),
)
-
##########
# groups #
##########
-general_group: Dict[str, Any] = {
+general_group: dict[str, Any] = {
"name": "General Options",
"options": [
help_,
@@ -1060,10 +1123,11 @@ general_group: Dict[str, Any] = {
no_python_version_warning,
use_new_feature,
use_deprecated_feature,
+ resume_retries,
],
}
-index_group: Dict[str, Any] = {
+index_group: dict[str, Any] = {
"name": "Package Index Options",
"options": [
index_url,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
index 139995ac..9c167bdc 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
@@ -1,5 +1,6 @@
-from contextlib import ExitStack, contextmanager
-from typing import ContextManager, Generator, TypeVar
+from collections.abc import Generator
+from contextlib import AbstractContextManager, ExitStack, contextmanager
+from typing import TypeVar
_T = TypeVar("_T", covariant=True)
@@ -21,7 +22,7 @@ class CommandContextMixIn:
finally:
self._in_main_context = False
- def enter_context(self, context_provider: ContextManager[_T]) -> _T:
+ def enter_context(self, context_provider: AbstractContextManager[_T]) -> _T:
assert self._in_main_context
return self._main_context.enter_context(context_provider)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/index_command.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/index_command.py
new file mode 100644
index 00000000..f6a82c8a
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/index_command.py
@@ -0,0 +1,175 @@
+"""
+Contains command classes which may interact with an index / the network.
+
+Unlike its sister module, req_command, this module still uses lazy imports
+so commands which don't always hit the network (e.g. list w/o --outdated or
+--uptodate) don't need waste time importing PipSession and friends.
+"""
+
+from __future__ import annotations
+
+import logging
+import os
+import sys
+from functools import lru_cache
+from optparse import Values
+from typing import TYPE_CHECKING
+
+from pip._vendor import certifi
+
+from pip._internal.cli.base_command import Command
+from pip._internal.cli.command_context import CommandContextMixIn
+
+if TYPE_CHECKING:
+ from ssl import SSLContext
+
+ from pip._internal.network.session import PipSession
+
+logger = logging.getLogger(__name__)
+
+
+@lru_cache
+def _create_truststore_ssl_context() -> SSLContext | None:
+ if sys.version_info < (3, 10):
+ logger.debug("Disabling truststore because Python version isn't 3.10+")
+ return None
+
+ try:
+ import ssl
+ except ImportError:
+ logger.warning("Disabling truststore since ssl support is missing")
+ return None
+
+ try:
+ from pip._vendor import truststore
+ except ImportError:
+ logger.warning("Disabling truststore because platform isn't supported")
+ return None
+
+ ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
+ ctx.load_verify_locations(certifi.where())
+ return ctx
+
+
+class SessionCommandMixin(CommandContextMixIn):
+ """
+ A class mixin for command classes needing _build_session().
+ """
+
+ def __init__(self) -> None:
+ super().__init__()
+ self._session: PipSession | None = None
+
+ @classmethod
+ def _get_index_urls(cls, options: Values) -> list[str] | None:
+ """Return a list of index urls from user-provided options."""
+ index_urls = []
+ if not getattr(options, "no_index", False):
+ url = getattr(options, "index_url", None)
+ if url:
+ index_urls.append(url)
+ urls = getattr(options, "extra_index_urls", None)
+ if urls:
+ index_urls.extend(urls)
+ # Return None rather than an empty list
+ return index_urls or None
+
+ def get_default_session(self, options: Values) -> PipSession:
+ """Get a default-managed session."""
+ if self._session is None:
+ self._session = self.enter_context(self._build_session(options))
+ # there's no type annotation on requests.Session, so it's
+ # automatically ContextManager[Any] and self._session becomes Any,
+ # then https://github.com/python/mypy/issues/7696 kicks in
+ assert self._session is not None
+ return self._session
+
+ def _build_session(
+ self,
+ options: Values,
+ retries: int | None = None,
+ timeout: int | None = None,
+ ) -> PipSession:
+ from pip._internal.network.session import PipSession
+
+ cache_dir = options.cache_dir
+ assert not cache_dir or os.path.isabs(cache_dir)
+
+ if "legacy-certs" not in options.deprecated_features_enabled:
+ ssl_context = _create_truststore_ssl_context()
+ else:
+ ssl_context = None
+
+ session = PipSession(
+ cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
+ retries=retries if retries is not None else options.retries,
+ trusted_hosts=options.trusted_hosts,
+ index_urls=self._get_index_urls(options),
+ ssl_context=ssl_context,
+ )
+
+ # Handle custom ca-bundles from the user
+ if options.cert:
+ session.verify = options.cert
+
+ # Handle SSL client certificate
+ if options.client_cert:
+ session.cert = options.client_cert
+
+ # Handle timeouts
+ if options.timeout or timeout:
+ session.timeout = timeout if timeout is not None else options.timeout
+
+ # Handle configured proxies
+ if options.proxy:
+ session.proxies = {
+ "http": options.proxy,
+ "https": options.proxy,
+ }
+ session.trust_env = False
+ session.pip_proxy = options.proxy
+
+ # Determine if we can prompt the user for authentication or not
+ session.auth.prompting = not options.no_input
+ session.auth.keyring_provider = options.keyring_provider
+
+ return session
+
+
+def _pip_self_version_check(session: PipSession, options: Values) -> None:
+ from pip._internal.self_outdated_check import pip_self_version_check as check
+
+ check(session, options)
+
+
+class IndexGroupCommand(Command, SessionCommandMixin):
+ """
+ Abstract base class for commands with the index_group options.
+
+ This also corresponds to the commands that permit the pip version check.
+ """
+
+ def handle_pip_version_check(self, options: Values) -> None:
+ """
+ Do the pip version check if not disabled.
+
+ This overrides the default behavior of not doing the check.
+ """
+ # Make sure the index_group options are present.
+ assert hasattr(options, "no_index")
+
+ if options.disable_pip_version_check or options.no_index:
+ return
+
+ try:
+ # Otherwise, check if we're using the latest version of pip available.
+ session = self._build_session(
+ options,
+ retries=0,
+ timeout=min(5, options.timeout),
+ )
+ with session:
+ _pip_self_version_check(session, options)
+ except Exception:
+ logger.warning("There was an error checking the latest version of pip.")
+ logger.debug("See below for error", exc_info=True)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py
index 7e061f5b..9a161fd1 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py
@@ -1,11 +1,12 @@
-"""Primary application entrypoint.
-"""
+"""Primary application entrypoint."""
+
+from __future__ import annotations
+
import locale
import logging
import os
import sys
import warnings
-from typing import List, Optional
from pip._internal.cli.autocompletion import autocomplete
from pip._internal.cli.main_parser import parse_command
@@ -43,7 +44,7 @@ logger = logging.getLogger(__name__)
# main, this should not be an issue in practice.
-def main(args: Optional[List[str]] = None) -> int:
+def main(args: list[str] | None = None) -> int:
if args is None:
args = sys.argv[1:]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
index 5ade356b..5ce9f5a0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
@@ -1,10 +1,10 @@
-"""A single place for constructing and exposing the main parser
-"""
+"""A single place for constructing and exposing the main parser"""
+
+from __future__ import annotations
import os
import subprocess
import sys
-from typing import List, Optional, Tuple
from pip._internal.build_env import get_runnable_pip
from pip._internal.cli import cmdoptions
@@ -47,7 +47,7 @@ def create_main_parser() -> ConfigOptionParser:
return parser
-def identify_python_interpreter(python: str) -> Optional[str]:
+def identify_python_interpreter(python: str) -> str | None:
# If the named file exists, use it.
# If it's a directory, assume it's a virtual environment and
# look for the environment's Python executable.
@@ -66,7 +66,7 @@ def identify_python_interpreter(python: str) -> Optional[str]:
return None
-def parse_command(args: List[str]) -> Tuple[str, List[str]]:
+def parse_command(args: list[str]) -> tuple[str, list[str]]:
parser = create_main_parser()
# Note: parser calls disable_interspersed_args(), so the result of this
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
index ae554b24..f8b8ac43 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
@@ -1,12 +1,15 @@
"""Base option parser setup"""
+from __future__ import annotations
+
import logging
import optparse
import shutil
import sys
import textwrap
+from collections.abc import Generator
from contextlib import suppress
-from typing import Any, Dict, Generator, List, Tuple
+from typing import Any, NoReturn
from pip._internal.cli.status_codes import UNKNOWN_ERROR
from pip._internal.configuration import Configuration, ConfigurationError
@@ -67,7 +70,7 @@ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
msg = "\nUsage: {}\n".format(self.indent_lines(textwrap.dedent(usage), " "))
return msg
- def format_description(self, description: str) -> str:
+ def format_description(self, description: str | None) -> str:
# leave full control over description to us
if description:
if hasattr(self.parser, "main"):
@@ -85,7 +88,7 @@ class PrettyHelpFormatter(optparse.IndentedHelpFormatter):
else:
return ""
- def format_epilog(self, epilog: str) -> str:
+ def format_epilog(self, epilog: str | None) -> str:
# leave full control over epilog to us
if epilog:
return epilog
@@ -142,7 +145,7 @@ class CustomOptionParser(optparse.OptionParser):
return group
@property
- def option_list_all(self) -> List[optparse.Option]:
+ def option_list_all(self) -> list[optparse.Option]:
"""Get a list of all options, including those in option groups."""
res = self.option_list[:]
for i in self.option_groups:
@@ -177,33 +180,34 @@ class ConfigOptionParser(CustomOptionParser):
def _get_ordered_configuration_items(
self,
- ) -> Generator[Tuple[str, Any], None, None]:
+ ) -> Generator[tuple[str, Any], None, None]:
# Configuration gives keys in an unordered manner. Order them.
override_order = ["global", self.name, ":env:"]
# Pool the options into different groups
- section_items: Dict[str, List[Tuple[str, Any]]] = {
+ section_items: dict[str, list[tuple[str, Any]]] = {
name: [] for name in override_order
}
- for section_key, val in self.config.items():
- # ignore empty values
- if not val:
- logger.debug(
- "Ignoring configuration key '%s' as it's value is empty.",
- section_key,
- )
- continue
- section, key = section_key.split(".", 1)
- if section in override_order:
- section_items[section].append((key, val))
+ for _, value in self.config.items(): # noqa: PERF102
+ for section_key, val in value.items():
+ # ignore empty values
+ if not val:
+ logger.debug(
+ "Ignoring configuration key '%s' as its value is empty.",
+ section_key,
+ )
+ continue
- # Yield each group in their override order
- for section in override_order:
- for key, val in section_items[section]:
- yield key, val
+ section, key = section_key.split(".", 1)
+ if section in override_order:
+ section_items[section].append((key, val))
- def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]:
+ # Yield each group in their override order
+ for section in override_order:
+ yield from section_items[section]
+
+ def _update_defaults(self, defaults: dict[str, Any]) -> dict[str, Any]:
"""Updates the given defaults with values from the config files and
the environ. Does a little special handling for certain types of
options (lists)."""
@@ -289,6 +293,6 @@ class ConfigOptionParser(CustomOptionParser):
defaults[option.dest] = option.check_value(opt_str, default)
return optparse.Values(defaults)
- def error(self, msg: str) -> None:
+ def error(self, msg: str) -> NoReturn:
self.print_usage(sys.stderr)
self.exit(UNKNOWN_ERROR, f"{msg}\n")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
index 0ad14031..af1bb6a5 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
@@ -1,10 +1,15 @@
+from __future__ import annotations
+
import functools
-from typing import Callable, Generator, Iterable, Iterator, Optional, Tuple
+import sys
+from collections.abc import Generator, Iterable, Iterator
+from typing import Callable, Literal, TypeVar
from pip._vendor.rich.progress import (
BarColumn,
DownloadColumn,
FileSizeColumn,
+ MofNCompleteColumn,
Progress,
ProgressColumn,
SpinnerColumn,
@@ -14,22 +19,27 @@ from pip._vendor.rich.progress import (
TransferSpeedColumn,
)
-from pip._internal.utils.logging import get_indentation
+from pip._internal.cli.spinners import RateLimiter
+from pip._internal.req.req_install import InstallRequirement
+from pip._internal.utils.logging import get_console, get_indentation
-DownloadProgressRenderer = Callable[[Iterable[bytes]], Iterator[bytes]]
+T = TypeVar("T")
+ProgressRenderer = Callable[[Iterable[T]], Iterator[T]]
+BarType = Literal["on", "off", "raw"]
-def _rich_progress_bar(
+def _rich_download_progress_bar(
iterable: Iterable[bytes],
*,
- bar_type: str,
- size: int,
+ bar_type: BarType,
+ size: int | None,
+ initial_progress: int | None = None,
) -> Generator[bytes, None, None]:
assert bar_type == "on", "This should only be used in the default mode."
if not size:
total = float("inf")
- columns: Tuple[ProgressColumn, ...] = (
+ columns: tuple[ProgressColumn, ...] = (
TextColumn("[progress.description]{task.description}"),
SpinnerColumn("line", speed=1.5),
FileSizeColumn(),
@@ -43,26 +53,99 @@ def _rich_progress_bar(
BarColumn(),
DownloadColumn(),
TransferSpeedColumn(),
- TextColumn("eta"),
- TimeRemainingColumn(),
+ TextColumn("{task.fields[time_description]}"),
+ TimeRemainingColumn(elapsed_when_finished=True),
)
- progress = Progress(*columns, refresh_per_second=30)
- task_id = progress.add_task(" " * (get_indentation() + 2), total=total)
+ progress = Progress(*columns, refresh_per_second=5)
+ task_id = progress.add_task(
+ " " * (get_indentation() + 2), total=total, time_description="eta"
+ )
+ if initial_progress is not None:
+ progress.update(task_id, advance=initial_progress)
with progress:
for chunk in iterable:
yield chunk
progress.update(task_id, advance=len(chunk))
+ progress.update(task_id, time_description="")
+
+
+def _rich_install_progress_bar(
+ iterable: Iterable[InstallRequirement], *, total: int
+) -> Iterator[InstallRequirement]:
+ columns = (
+ TextColumn("{task.fields[indent]}"),
+ BarColumn(),
+ MofNCompleteColumn(),
+ TextColumn("{task.description}"),
+ )
+ console = get_console()
+
+ bar = Progress(*columns, refresh_per_second=6, console=console, transient=True)
+ # Hiding the progress bar at initialization forces a refresh cycle to occur
+ # until the bar appears, avoiding very short flashes.
+ task = bar.add_task("", total=total, indent=" " * get_indentation(), visible=False)
+ with bar:
+ for req in iterable:
+ bar.update(task, description=rf"\[{req.name}]", visible=True)
+ yield req
+ bar.advance(task)
+
+
+def _raw_progress_bar(
+ iterable: Iterable[bytes],
+ *,
+ size: int | None,
+ initial_progress: int | None = None,
+) -> Generator[bytes, None, None]:
+ def write_progress(current: int, total: int) -> None:
+ sys.stdout.write(f"Progress {current} of {total}\n")
+ sys.stdout.flush()
+
+ current = initial_progress or 0
+ total = size or 0
+ rate_limiter = RateLimiter(0.25)
+
+ write_progress(current, total)
+ for chunk in iterable:
+ current += len(chunk)
+ if rate_limiter.ready() or current == total:
+ write_progress(current, total)
+ rate_limiter.reset()
+ yield chunk
def get_download_progress_renderer(
- *, bar_type: str, size: Optional[int] = None
-) -> DownloadProgressRenderer:
+ *, bar_type: BarType, size: int | None = None, initial_progress: int | None = None
+) -> ProgressRenderer[bytes]:
"""Get an object that can be used to render the download progress.
Returns a callable, that takes an iterable to "wrap".
"""
if bar_type == "on":
- return functools.partial(_rich_progress_bar, bar_type=bar_type, size=size)
+ return functools.partial(
+ _rich_download_progress_bar,
+ bar_type=bar_type,
+ size=size,
+ initial_progress=initial_progress,
+ )
+ elif bar_type == "raw":
+ return functools.partial(
+ _raw_progress_bar,
+ size=size,
+ initial_progress=initial_progress,
+ )
else:
return iter # no-op, when passed an iterator
+
+
+def get_install_progress_renderer(
+ *, bar_type: BarType, total: int
+) -> ProgressRenderer[InstallRequirement]:
+ """Get an object that can be used to render the install progress.
+ Returns a callable, that takes an iterable to "wrap".
+ """
+ if bar_type == "on":
+ return functools.partial(_rich_install_progress_bar, total=total)
+ else:
+ return iter
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
index 6f2f79c6..dc1328ff 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
@@ -1,21 +1,22 @@
-"""Contains the Command base classes that depend on PipSession.
+"""Contains the RequirementCommand base class.
-The classes in this module are in a separate module so the commands not
-needing download / PackageFinder capability don't unnecessarily import the
+This class is in a separate module so the commands that do not always
+need PackageFinder capability don't unnecessarily import the
PackageFinder machinery and all its vendored dependencies, etc.
"""
+from __future__ import annotations
+
import logging
-import os
-import sys
from functools import partial
from optparse import Values
-from typing import TYPE_CHECKING, Any, List, Optional, Tuple
+from typing import Any
+from pip._internal.build_env import SubprocessBuildEnvironmentInstaller
from pip._internal.cache import WheelCache
from pip._internal.cli import cmdoptions
-from pip._internal.cli.base_command import Command
-from pip._internal.cli.command_context import CommandContextMixIn
+from pip._internal.cli.index_command import IndexGroupCommand
+from pip._internal.cli.index_command import SessionCommandMixin as SessionCommandMixin
from pip._internal.exceptions import CommandError, PreviousBuildDirError
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
@@ -30,164 +31,19 @@ from pip._internal.req.constructors import (
install_req_from_parsed_requirement,
install_req_from_req_string,
)
+from pip._internal.req.req_dependency_group import parse_dependency_groups
from pip._internal.req.req_file import parse_requirements
from pip._internal.req.req_install import InstallRequirement
from pip._internal.resolution.base import BaseResolver
-from pip._internal.self_outdated_check import pip_self_version_check
from pip._internal.utils.temp_dir import (
TempDirectory,
TempDirectoryTypeRegistry,
tempdir_kinds,
)
-from pip._internal.utils.virtualenv import running_under_virtualenv
-
-if TYPE_CHECKING:
- from ssl import SSLContext
logger = logging.getLogger(__name__)
-def _create_truststore_ssl_context() -> Optional["SSLContext"]:
- if sys.version_info < (3, 10):
- raise CommandError("The truststore feature is only available for Python 3.10+")
-
- try:
- import ssl
- except ImportError:
- logger.warning("Disabling truststore since ssl support is missing")
- return None
-
- try:
- from pip._vendor import truststore
- except ImportError as e:
- raise CommandError(f"The truststore feature is unavailable: {e}")
-
- return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
-
-
-class SessionCommandMixin(CommandContextMixIn):
-
- """
- A class mixin for command classes needing _build_session().
- """
-
- def __init__(self) -> None:
- super().__init__()
- self._session: Optional[PipSession] = None
-
- @classmethod
- def _get_index_urls(cls, options: Values) -> Optional[List[str]]:
- """Return a list of index urls from user-provided options."""
- index_urls = []
- if not getattr(options, "no_index", False):
- url = getattr(options, "index_url", None)
- if url:
- index_urls.append(url)
- urls = getattr(options, "extra_index_urls", None)
- if urls:
- index_urls.extend(urls)
- # Return None rather than an empty list
- return index_urls or None
-
- def get_default_session(self, options: Values) -> PipSession:
- """Get a default-managed session."""
- if self._session is None:
- self._session = self.enter_context(self._build_session(options))
- # there's no type annotation on requests.Session, so it's
- # automatically ContextManager[Any] and self._session becomes Any,
- # then https://github.com/python/mypy/issues/7696 kicks in
- assert self._session is not None
- return self._session
-
- def _build_session(
- self,
- options: Values,
- retries: Optional[int] = None,
- timeout: Optional[int] = None,
- fallback_to_certifi: bool = False,
- ) -> PipSession:
- cache_dir = options.cache_dir
- assert not cache_dir or os.path.isabs(cache_dir)
-
- if "truststore" in options.features_enabled:
- try:
- ssl_context = _create_truststore_ssl_context()
- except Exception:
- if not fallback_to_certifi:
- raise
- ssl_context = None
- else:
- ssl_context = None
-
- session = PipSession(
- cache=os.path.join(cache_dir, "http-v2") if cache_dir else None,
- retries=retries if retries is not None else options.retries,
- trusted_hosts=options.trusted_hosts,
- index_urls=self._get_index_urls(options),
- ssl_context=ssl_context,
- )
-
- # Handle custom ca-bundles from the user
- if options.cert:
- session.verify = options.cert
-
- # Handle SSL client certificate
- if options.client_cert:
- session.cert = options.client_cert
-
- # Handle timeouts
- if options.timeout or timeout:
- session.timeout = timeout if timeout is not None else options.timeout
-
- # Handle configured proxies
- if options.proxy:
- session.proxies = {
- "http": options.proxy,
- "https": options.proxy,
- }
-
- # Determine if we can prompt the user for authentication or not
- session.auth.prompting = not options.no_input
- session.auth.keyring_provider = options.keyring_provider
-
- return session
-
-
-class IndexGroupCommand(Command, SessionCommandMixin):
-
- """
- Abstract base class for commands with the index_group options.
-
- This also corresponds to the commands that permit the pip version check.
- """
-
- def handle_pip_version_check(self, options: Values) -> None:
- """
- Do the pip version check if not disabled.
-
- This overrides the default behavior of not doing the check.
- """
- # Make sure the index_group options are present.
- assert hasattr(options, "no_index")
-
- if options.disable_pip_version_check or options.no_index:
- return
-
- # Otherwise, check if we're using the latest version of pip available.
- session = self._build_session(
- options,
- retries=0,
- timeout=min(5, options.timeout),
- # This is set to ensure the function does not fail when truststore is
- # specified in use-feature but cannot be loaded. This usually raises a
- # CommandError and shows a nice user-facing error, but this function is not
- # called in that try-except block.
- fallback_to_certifi=True,
- )
- with session:
- pip_self_version_check(session, options)
-
-
KEEPABLE_TEMPDIR_TYPES = [
tempdir_kinds.BUILD_ENV,
tempdir_kinds.EPHEM_WHEEL_CACHE,
@@ -195,36 +51,6 @@ KEEPABLE_TEMPDIR_TYPES = [
]
-def warn_if_run_as_root() -> None:
- """Output a warning for sudo users on Unix.
-
- In a virtual environment, sudo pip still writes to virtualenv.
- On Windows, users may run pip as Administrator without issues.
- This warning only applies to Unix root users outside of virtualenv.
- """
- if running_under_virtualenv():
- return
- if not hasattr(os, "getuid"):
- return
- # On Windows, there are no "system managed" Python packages. Installing as
- # Administrator via pip is the correct way of updating system environments.
- #
- # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
- # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
- if sys.platform == "win32" or sys.platform == "cygwin":
- return
-
- if os.getuid() != 0:
- return
-
- logger.warning(
- "Running pip as the 'root' user can result in broken permissions and "
- "conflicting behaviour with the system package manager. "
- "It is recommended to use a virtual environment instead: "
- "https://pip.pypa.io/warnings/venv"
- )
-
-
def with_cleanup(func: Any) -> Any:
"""Decorator for common logic related to managing temporary
directories.
@@ -235,8 +61,8 @@ def with_cleanup(func: Any) -> Any:
registry.set_delete(t, False)
def wrapper(
- self: RequirementCommand, options: Values, args: List[Any]
- ) -> Optional[int]:
+ self: RequirementCommand, options: Values, args: list[Any]
+ ) -> int | None:
assert self.tempdir_registry is not None
if options.no_clean:
configure_tempdir_registry(self.tempdir_registry)
@@ -257,6 +83,7 @@ class RequirementCommand(IndexGroupCommand):
def __init__(self, *args: Any, **kw: Any) -> None:
super().__init__(*args, **kw)
+ self.cmd_opts.add_option(cmdoptions.dependency_groups())
self.cmd_opts.add_option(cmdoptions.no_clean())
@staticmethod
@@ -276,7 +103,7 @@ class RequirementCommand(IndexGroupCommand):
session: PipSession,
finder: PackageFinder,
use_user_site: bool,
- download_dir: Optional[str] = None,
+ download_dir: str | None = None,
verbosity: int = 0,
) -> RequirementPreparer:
"""
@@ -310,6 +137,7 @@ class RequirementCommand(IndexGroupCommand):
src_dir=options.src_dir,
download_dir=download_dir,
build_isolation=options.build_isolation,
+ build_isolation_installer=SubprocessBuildEnvironmentInstaller(finder),
check_build_deps=options.check_build_deps,
build_tracker=build_tracker,
session=session,
@@ -320,6 +148,7 @@ class RequirementCommand(IndexGroupCommand):
lazy_wheel=lazy_wheel,
verbosity=verbosity,
legacy_resolver=legacy_resolver,
+ resume_retries=options.resume_retries,
)
@classmethod
@@ -328,14 +157,14 @@ class RequirementCommand(IndexGroupCommand):
preparer: RequirementPreparer,
finder: PackageFinder,
options: Values,
- wheel_cache: Optional[WheelCache] = None,
+ wheel_cache: WheelCache | None = None,
use_user_site: bool = False,
ignore_installed: bool = True,
ignore_requires_python: bool = False,
force_reinstall: bool = False,
upgrade_strategy: str = "to-satisfy-only",
- use_pep517: Optional[bool] = None,
- py_version_info: Optional[Tuple[int, ...]] = None,
+ use_pep517: bool | None = None,
+ py_version_info: tuple[int, ...] | None = None,
) -> BaseResolver:
"""
Create a Resolver instance for the given parameters.
@@ -383,15 +212,15 @@ class RequirementCommand(IndexGroupCommand):
def get_requirements(
self,
- args: List[str],
+ args: list[str],
options: Values,
finder: PackageFinder,
session: PipSession,
- ) -> List[InstallRequirement]:
+ ) -> list[InstallRequirement]:
"""
Parse command-line arguments into the corresponding requirements.
"""
- requirements: List[InstallRequirement] = []
+ requirements: list[InstallRequirement] = []
for filename in options.constraints:
for parsed_req in parse_requirements(
filename,
@@ -418,6 +247,16 @@ class RequirementCommand(IndexGroupCommand):
)
requirements.append(req_to_add)
+ if options.dependency_groups:
+ for req in parse_dependency_groups(options.dependency_groups):
+ req_to_add = install_req_from_req_string(
+ req,
+ isolated=options.isolated_mode,
+ use_pep517=options.use_pep517,
+ user_supplied=True,
+ )
+ requirements.append(req_to_add)
+
for req in options.editables:
req_to_add = install_req_from_editable(
req,
@@ -438,9 +277,11 @@ class RequirementCommand(IndexGroupCommand):
isolated=options.isolated_mode,
use_pep517=options.use_pep517,
user_supplied=True,
- config_settings=parsed_req.options.get("config_settings")
- if parsed_req.options
- else None,
+ config_settings=(
+ parsed_req.options.get("config_settings")
+ if parsed_req.options
+ else None
+ ),
)
requirements.append(req_to_add)
@@ -448,7 +289,12 @@ class RequirementCommand(IndexGroupCommand):
if any(req.has_hash_options for req in requirements):
options.require_hashes = True
- if not (args or options.editables or options.requirements):
+ if not (
+ args
+ or options.editables
+ or options.requirements
+ or options.dependency_groups
+ ):
opts = {"name": self.name}
if options.find_links:
raise CommandError(
@@ -480,8 +326,8 @@ class RequirementCommand(IndexGroupCommand):
self,
options: Values,
session: PipSession,
- target_python: Optional[TargetPython] = None,
- ignore_requires_python: Optional[bool] = None,
+ target_python: TargetPython | None = None,
+ ignore_requires_python: bool | None = None,
) -> PackageFinder:
"""
Create a package finder appropriate to this requirement command.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
index cf2b976f..58aad285 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
@@ -1,15 +1,31 @@
+from __future__ import annotations
+
import contextlib
import itertools
import logging
import sys
import time
-from typing import IO, Generator, Optional
+from collections.abc import Generator
+from typing import IO, Final
+
+from pip._vendor.rich.console import (
+ Console,
+ ConsoleOptions,
+ RenderableType,
+ RenderResult,
+)
+from pip._vendor.rich.live import Live
+from pip._vendor.rich.measure import Measurement
+from pip._vendor.rich.text import Text
from pip._internal.utils.compat import WINDOWS
-from pip._internal.utils.logging import get_indentation
+from pip._internal.utils.logging import get_console, get_indentation
logger = logging.getLogger(__name__)
+SPINNER_CHARS: Final = r"-\|/"
+SPINS_PER_SECOND: Final = 8
+
class SpinnerInterface:
def spin(self) -> None:
@@ -23,10 +39,10 @@ class InteractiveSpinner(SpinnerInterface):
def __init__(
self,
message: str,
- file: Optional[IO[str]] = None,
- spin_chars: str = "-\\|/",
+ file: IO[str] | None = None,
+ spin_chars: str = SPINNER_CHARS,
# Empirically, 8 updates/second looks nice
- min_update_interval_seconds: float = 0.125,
+ min_update_interval_seconds: float = 1 / SPINS_PER_SECOND,
):
self._message = message
if file is None:
@@ -136,6 +152,66 @@ def open_spinner(message: str) -> Generator[SpinnerInterface, None, None]:
spinner.finish("done")
+class _PipRichSpinner:
+ """
+ Custom rich spinner that matches the style of the legacy spinners.
+
+ (*) Updates will be handled in a background thread by a rich live panel
+ which will call render() automatically at the appropriate time.
+ """
+
+ def __init__(self, label: str) -> None:
+ self.label = label
+ self._spin_cycle = itertools.cycle(SPINNER_CHARS)
+ self._spinner_text = ""
+ self._finished = False
+ self._indent = get_indentation() * " "
+
+ def __rich_console__(
+ self, console: Console, options: ConsoleOptions
+ ) -> RenderResult:
+ yield self.render()
+
+ def __rich_measure__(
+ self, console: Console, options: ConsoleOptions
+ ) -> Measurement:
+ text = self.render()
+ return Measurement.get(console, options, text)
+
+ def render(self) -> RenderableType:
+ if not self._finished:
+ self._spinner_text = next(self._spin_cycle)
+
+ return Text.assemble(self._indent, self.label, " ... ", self._spinner_text)
+
+ def finish(self, status: str) -> None:
+ """Stop spinning and set a final status message."""
+ self._spinner_text = status
+ self._finished = True
+
+
+@contextlib.contextmanager
+def open_rich_spinner(label: str, console: Console | None = None) -> Generator[None]:
+ if not logger.isEnabledFor(logging.INFO):
+ # Don't show spinner if --quiet is given.
+ yield
+ return
+
+ console = console or get_console()
+ spinner = _PipRichSpinner(label)
+ with Live(spinner, refresh_per_second=SPINS_PER_SECOND, console=console):
+ try:
+ yield
+ except KeyboardInterrupt:
+ spinner.finish("canceled")
+ raise
+ except Exception:
+ spinner.finish("error")
+ raise
+ else:
+ spinner.finish("done")
+
+
HIDE_CURSOR = "\x1b[?25l"
SHOW_CURSOR = "\x1b[?25h"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py
index 858a4101..bedeca9e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py
@@ -2,9 +2,11 @@
Package containing all pip commands
"""
+from __future__ import annotations
+
import importlib
from collections import namedtuple
-from typing import Any, Dict, Optional
+from typing import Any
from pip._internal.cli.base_command import Command
@@ -17,12 +19,17 @@ CommandInfo = namedtuple("CommandInfo", "module_path, class_name, summary")
# Even though the module path starts with the same "pip._internal.commands"
# prefix, the full path makes testing easier (specifically when modifying
# `commands_dict` in test setup / teardown).
-commands_dict: Dict[str, CommandInfo] = {
+commands_dict: dict[str, CommandInfo] = {
"install": CommandInfo(
"pip._internal.commands.install",
"InstallCommand",
"Install packages.",
),
+ "lock": CommandInfo(
+ "pip._internal.commands.lock",
+ "LockCommand",
+ "Generate a lock file.",
+ ),
"download": CommandInfo(
"pip._internal.commands.download",
"DownloadCommand",
@@ -118,7 +125,7 @@ def create_command(name: str, **kwargs: Any) -> Command:
return command
-def get_similar_commands(name: str) -> Optional[str]:
+def get_similar_commands(name: str) -> str | None:
"""Command name auto-correct."""
from difflib import get_close_matches
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc
index 83479e5e..94d3c086 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc
index 6e8388f8..9443ab37 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc
index aa040d30..7b07253b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/check.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc
index ef49a86f..ecab2498 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/completion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc
index c2988db9..6df5201e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc
index 71b7e1bb..c8e4e140 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/debug.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc
index 48c9c267..ba8e2edf 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/download.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc
index c8b1d516..d54fcf8c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc
index bf406932..2a7d7a8c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/hash.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc
index e4486ffe..ab0fe8a1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/help.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc
index 30d64bdd..df9f8292 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/index.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc
index 39902cfb..61832414 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc
index b54fd044..acd5d828 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/install.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc
index d4cc11f9..5beb3b9a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/list.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/lock.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/lock.cpython-312.pyc
new file mode 100644
index 00000000..2dc815a1
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/lock.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc
index 0e75b1b9..197a6016 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/search.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc
index fd0cbf52..7f61e25a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/show.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc
index a68a3e86..a4437b21 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc
index 7a88ef3b..2aa0229d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py
index 32833615..c8e7aede 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py
@@ -1,13 +1,14 @@
import os
import textwrap
from optparse import Values
-from typing import Any, List
+from typing import Callable
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS
from pip._internal.exceptions import CommandError, PipError
from pip._internal.utils import filesystem
from pip._internal.utils.logging import getLogger
+from pip._internal.utils.misc import format_size
logger = getLogger(__name__)
@@ -48,8 +49,8 @@ class CacheCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
- handlers = {
+ def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
+ return {
"dir": self.get_cache_dir,
"info": self.get_cache_info,
"list": self.list_cache_items,
@@ -57,15 +58,18 @@ class CacheCommand(Command):
"purge": self.purge_cache,
}
+ def run(self, options: Values, args: list[str]) -> int:
+ handler_map = self.handler_map()
+
if not options.cache_dir:
logger.error("pip cache commands can not function since cache is disabled.")
return ERROR
# Determine action
- if not args or args[0] not in handlers:
+ if not args or args[0] not in handler_map:
logger.error(
"Need an action (%s) to perform.",
- ", ".join(sorted(handlers)),
+ ", ".join(sorted(handler_map)),
)
return ERROR
@@ -73,20 +77,20 @@ class CacheCommand(Command):
# Error handling happens here, not in the action-handlers.
try:
- handlers[action](options, args[1:])
+ handler_map[action](options, args[1:])
except PipError as e:
logger.error(e.args[0])
return ERROR
return SUCCESS
- def get_cache_dir(self, options: Values, args: List[Any]) -> None:
+ def get_cache_dir(self, options: Values, args: list[str]) -> None:
if args:
raise CommandError("Too many arguments")
logger.info(options.cache_dir)
- def get_cache_info(self, options: Values, args: List[Any]) -> None:
+ def get_cache_info(self, options: Values, args: list[str]) -> None:
if args:
raise CommandError("Too many arguments")
@@ -128,7 +132,7 @@ class CacheCommand(Command):
logger.info(message)
- def list_cache_items(self, options: Values, args: List[Any]) -> None:
+ def list_cache_items(self, options: Values, args: list[str]) -> None:
if len(args) > 1:
raise CommandError("Too many arguments")
@@ -143,7 +147,7 @@ class CacheCommand(Command):
else:
self.format_for_abspath(files)
- def format_for_human(self, files: List[str]) -> None:
+ def format_for_human(self, files: list[str]) -> None:
if not files:
logger.info("No locally built wheels cached.")
return
@@ -156,11 +160,11 @@ class CacheCommand(Command):
logger.info("Cache contents:\n")
logger.info("\n".join(sorted(results)))
- def format_for_abspath(self, files: List[str]) -> None:
+ def format_for_abspath(self, files: list[str]) -> None:
if files:
logger.info("\n".join(sorted(files)))
- def remove_cache_items(self, options: Values, args: List[Any]) -> None:
+ def remove_cache_items(self, options: Values, args: list[str]) -> None:
if len(args) > 1:
raise CommandError("Too many arguments")
@@ -180,12 +184,14 @@ class CacheCommand(Command):
if not files:
logger.warning(no_matching_msg)
+ bytes_removed = 0
for filename in files:
+ bytes_removed += os.stat(filename).st_size
os.unlink(filename)
logger.verbose("Removed %s", filename)
- logger.info("Files removed: %s", len(files))
+ logger.info("Files removed: %s (%s)", len(files), format_size(bytes_removed))
- def purge_cache(self, options: Values, args: List[Any]) -> None:
+ def purge_cache(self, options: Values, args: list[str]) -> None:
if args:
raise CommandError("Too many arguments")
@@ -194,14 +200,14 @@ class CacheCommand(Command):
def _cache_dir(self, options: Values, subdir: str) -> str:
return os.path.join(options.cache_dir, subdir)
- def _find_http_files(self, options: Values) -> List[str]:
+ def _find_http_files(self, options: Values) -> list[str]:
old_http_dir = self._cache_dir(options, "http")
new_http_dir = self._cache_dir(options, "http-v2")
return filesystem.find_files(old_http_dir, "*") + filesystem.find_files(
new_http_dir, "*"
)
- def _find_wheels(self, options: Values, pattern: str) -> List[str]:
+ def _find_wheels(self, options: Values, pattern: str) -> list[str]:
wheel_dir = self._cache_dir(options, "wheels")
# The wheel filename format, as specified in PEP 427, is:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py
index 5efd0a34..516757ee 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py
@@ -1,14 +1,15 @@
import logging
from optparse import Values
-from typing import List
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS
+from pip._internal.metadata import get_default_environment
from pip._internal.operations.check import (
check_package_set,
+ check_unsupported,
create_package_set_from_installed,
- warn_legacy_versions_and_specifiers,
)
+from pip._internal.utils.compatibility_tags import get_supported
from pip._internal.utils.misc import write_output
logger = logging.getLogger(__name__)
@@ -17,13 +18,19 @@ logger = logging.getLogger(__name__)
class CheckCommand(Command):
"""Verify installed packages have compatible dependencies."""
+ ignore_require_venv = True
usage = """
%prog [options]"""
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
package_set, parsing_probs = create_package_set_from_installed()
- warn_legacy_versions_and_specifiers(package_set)
missing, conflicting = check_package_set(package_set)
+ unsupported = list(
+ check_unsupported(
+ get_default_environment().iter_installed_distributions(),
+ get_supported(),
+ )
+ )
for project_name in missing:
version = package_set[project_name].version
@@ -46,8 +53,13 @@ class CheckCommand(Command):
dep_name,
dep_version,
)
-
- if missing or conflicting or parsing_probs:
+ for package in unsupported:
+ write_output(
+ "%s %s is not supported on this platform",
+ package.raw_name,
+ package.version,
+ )
+ if missing or conflicting or parsing_probs or unsupported:
return ERROR
else:
write_output("No broken requirements found.")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py
index 9e89e279..6d9597bd 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py
@@ -1,7 +1,6 @@
import sys
import textwrap
from optparse import Values
-from typing import List
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import SUCCESS
@@ -38,12 +37,18 @@ COMPLETION_SCRIPTS = {
""",
"fish": """
function __fish_complete_pip
- set -lx COMP_WORDS (commandline -o) ""
- set -lx COMP_CWORD ( \\
- math (contains -i -- (commandline -t) $COMP_WORDS)-1 \\
- )
+ set -lx COMP_WORDS \\
+ (commandline --current-process --tokenize --cut-at-cursor) \\
+ (commandline --current-token --cut-at-cursor)
+ set -lx COMP_CWORD (math (count $COMP_WORDS) - 1)
set -lx PIP_AUTO_COMPLETE 1
- string split \\ -- (eval $COMP_WORDS[1])
+ set -l completions
+ if string match -q '2.*' $version
+ set completions (eval $COMP_WORDS[1])
+ else
+ set completions ($COMP_WORDS[1])
+ end
+ string split \\ -- $completions
end
complete -fa "(__fish_complete_pip)" -c {prog}
""",
@@ -113,7 +118,7 @@ class CompletionCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
"""Prints the completion code of the given shell"""
shells = COMPLETION_SCRIPTS.keys()
shell_options = ["--" + shell for shell in sorted(shells)]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
index 1a1dc6b6..7bcea043 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
@@ -1,8 +1,10 @@
+from __future__ import annotations
+
import logging
import os
import subprocess
from optparse import Values
-from typing import Any, List, Optional
+from typing import Any, Callable
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS
@@ -93,8 +95,8 @@ class ConfigurationCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
- handlers = {
+ def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
+ return {
"list": self.list_values,
"edit": self.open_in_editor,
"get": self.get_name,
@@ -103,11 +105,14 @@ class ConfigurationCommand(Command):
"debug": self.list_config_values,
}
+ def run(self, options: Values, args: list[str]) -> int:
+ handler_map = self.handler_map()
+
# Determine action
- if not args or args[0] not in handlers:
+ if not args or args[0] not in handler_map:
logger.error(
"Need an action (%s) to perform.",
- ", ".join(sorted(handlers)),
+ ", ".join(sorted(handler_map)),
)
return ERROR
@@ -131,14 +136,14 @@ class ConfigurationCommand(Command):
# Error handling happens here, not in the action-handlers.
try:
- handlers[action](options, args[1:])
+ handler_map[action](options, args[1:])
except PipError as e:
logger.error(e.args[0])
return ERROR
return SUCCESS
- def _determine_file(self, options: Values, need_value: bool) -> Optional[Kind]:
+ def _determine_file(self, options: Values, need_value: bool) -> Kind | None:
file_options = [
key
for key, value in (
@@ -168,31 +173,32 @@ class ConfigurationCommand(Command):
"(--user, --site, --global) to perform."
)
- def list_values(self, options: Values, args: List[str]) -> None:
+ def list_values(self, options: Values, args: list[str]) -> None:
self._get_n_args(args, "list", n=0)
for key, value in sorted(self.configuration.items()):
- write_output("%s=%r", key, value)
+ for key, value in sorted(value.items()):
+ write_output("%s=%r", key, value)
- def get_name(self, options: Values, args: List[str]) -> None:
+ def get_name(self, options: Values, args: list[str]) -> None:
key = self._get_n_args(args, "get [name]", n=1)
value = self.configuration.get_value(key)
write_output("%s", value)
- def set_name_value(self, options: Values, args: List[str]) -> None:
+ def set_name_value(self, options: Values, args: list[str]) -> None:
key, value = self._get_n_args(args, "set [name] [value]", n=2)
self.configuration.set_value(key, value)
self._save_configuration()
- def unset_name(self, options: Values, args: List[str]) -> None:
+ def unset_name(self, options: Values, args: list[str]) -> None:
key = self._get_n_args(args, "unset [name]", n=1)
self.configuration.unset_value(key)
self._save_configuration()
- def list_config_values(self, options: Values, args: List[str]) -> None:
+ def list_config_values(self, options: Values, args: list[str]) -> None:
"""List config key-value pairs across different config files"""
self._get_n_args(args, "debug", n=0)
@@ -206,13 +212,15 @@ class ConfigurationCommand(Command):
file_exists = os.path.exists(fname)
write_output("%s, exists: %r", fname, file_exists)
if file_exists:
- self.print_config_file_values(variant)
+ self.print_config_file_values(variant, fname)
- def print_config_file_values(self, variant: Kind) -> None:
+ def print_config_file_values(self, variant: Kind, fname: str) -> None:
"""Get key-value pairs from the file of a variant"""
for name, value in self.configuration.get_values_in_config(variant).items():
with indent_log():
- write_output("%s: %s", name, value)
+ if name == fname:
+ for confname, confvalue in value.items():
+ write_output("%s: %s", confname, confvalue)
def print_env_var_values(self) -> None:
"""Get key-values pairs present as environment variables"""
@@ -222,7 +230,7 @@ class ConfigurationCommand(Command):
env_var = f"PIP_{key.upper()}"
write_output("%s=%r", env_var, value)
- def open_in_editor(self, options: Values, args: List[str]) -> None:
+ def open_in_editor(self, options: Values, args: list[str]) -> None:
editor = self._determine_editor(options)
fname = self.configuration.get_file_to_edit()
@@ -244,7 +252,7 @@ class ConfigurationCommand(Command):
except subprocess.CalledProcessError as e:
raise PipError(f"Editor Subprocess exited with exit code {e.returncode}")
- def _get_n_args(self, args: List[str], example: str, n: int) -> Any:
+ def _get_n_args(self, args: list[str], example: str, n: int) -> Any:
"""Helper to make sure the command got the right number of arguments"""
if len(args) != n:
msg = (
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py
index 7e5271c9..0e187e79 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py
@@ -1,11 +1,12 @@
-import importlib.resources
+from __future__ import annotations
+
import locale
import logging
import os
import sys
from optparse import Values
from types import ModuleType
-from typing import Any, Dict, List, Optional
+from typing import Any
import pip._vendor
from pip._vendor.certifi import where
@@ -17,6 +18,7 @@ from pip._internal.cli.cmdoptions import make_target_python
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.configuration import Configuration
from pip._internal.metadata import get_environment
+from pip._internal.utils.compat import open_text_resource
from pip._internal.utils.logging import indent_log
from pip._internal.utils.misc import get_pip_version
@@ -34,8 +36,8 @@ def show_sys_implementation() -> None:
show_value("name", implementation_name)
-def create_vendor_txt_map() -> Dict[str, str]:
- with importlib.resources.open_text("pip._vendor", "vendor.txt") as f:
+def create_vendor_txt_map() -> dict[str, str]:
+ with open_text_resource("pip._vendor", "vendor.txt") as f:
# Purge non version specifying lines.
# Also, remove any space prefix or suffixes (including comments).
lines = [
@@ -46,7 +48,7 @@ def create_vendor_txt_map() -> Dict[str, str]:
return dict(line.split("==", 1) for line in lines)
-def get_module_from_module_name(module_name: str) -> Optional[ModuleType]:
+def get_module_from_module_name(module_name: str) -> ModuleType | None:
# Module name can be uppercase in vendor.txt for some reason...
module_name = module_name.lower().replace("-", "_")
# PATCH: setuptools is actually only pkg_resources.
@@ -64,7 +66,7 @@ def get_module_from_module_name(module_name: str) -> Optional[ModuleType]:
raise
-def get_vendor_version_from_module(module_name: str) -> Optional[str]:
+def get_vendor_version_from_module(module_name: str) -> str | None:
module = get_module_from_module_name(module_name)
version = getattr(module, "__version__", None)
@@ -79,7 +81,7 @@ def get_vendor_version_from_module(module_name: str) -> Optional[str]:
return version
-def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None:
+def show_actual_vendor_versions(vendor_txt_versions: dict[str, str]) -> None:
"""Log the actual version and print extra info if there is
a conflict or if the actual version could not be imported.
"""
@@ -169,7 +171,7 @@ class DebugCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
self.parser.config.load()
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
logger.warning(
"This command is only meant for debugging. "
"Do not use this with automation for parsing and getting these "
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py
index 54247a78..900fb403 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py
@@ -1,7 +1,6 @@
import logging
import os
from optparse import Values
-from typing import List
from pip._internal.cli import cmdoptions
from pip._internal.cli.cmdoptions import make_target_python
@@ -75,7 +74,7 @@ class DownloadCommand(RequirementCommand):
self.parser.insert_option_group(0, self.cmd_opts)
@with_cleanup
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
options.ignore_installed = True
# editable doesn't really make sense for `pip download`, but the bowels
# of the RequirementSet code require that property.
@@ -131,7 +130,7 @@ class DownloadCommand(RequirementCommand):
requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
- downloaded: List[str] = []
+ downloaded: list[str] = []
for req in requirement_set.requirements.values():
if req.satisfied_by is None:
assert req.name is not None
@@ -139,7 +138,6 @@ class DownloadCommand(RequirementCommand):
downloaded.append(req.name)
preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
- requirement_set.warn_legacy_versions_and_specifiers()
if downloaded:
write_output("Successfully downloaded %s", " ".join(downloaded))
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py
index e64cb3d4..7794857c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py
@@ -1,6 +1,5 @@
import sys
from optparse import Values
-from typing import AbstractSet, List
from pip._internal.cli import cmdoptions
from pip._internal.cli.base_command import Command
@@ -13,12 +12,11 @@ def _should_suppress_build_backends() -> bool:
return sys.version_info < (3, 12)
-def _dev_pkgs() -> AbstractSet[str]:
+def _dev_pkgs() -> set[str]:
pkgs = {"pip"}
if _should_suppress_build_backends():
pkgs |= {"setuptools", "distribute", "wheel"}
- pkgs |= {"setuptools", "distribute", "wheel", "pkg-resources"}
return pkgs
@@ -30,9 +28,9 @@ class FreezeCommand(Command):
packages are listed in a case-insensitive sorted order.
"""
+ ignore_require_venv = True
usage = """
%prog [options]"""
- log_streams = ("ext://sys.stderr", "ext://sys.stderr")
def add_options(self) -> None:
self.cmd_opts.add_option(
@@ -86,7 +84,7 @@ class FreezeCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
skip = set(stdlib_pkgs)
if not options.freeze_all:
skip.update(_dev_pkgs())
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py
index 042dac81..271a4c91 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py
@@ -2,7 +2,6 @@ import hashlib
import logging
import sys
from optparse import Values
-from typing import List
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import ERROR, SUCCESS
@@ -37,7 +36,7 @@ class HashCommand(Command):
)
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
if not args:
self.parser.print_usage(sys.stderr)
return ERROR
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py
index 62066318..2ae658ff 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py
@@ -1,5 +1,4 @@
from optparse import Values
-from typing import List
from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import SUCCESS
@@ -13,7 +12,7 @@ class HelpCommand(Command):
%prog """
ignore_require_venv = True
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
from pip._internal.commands import (
commands_dict,
create_command,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py
index f55e9e49..ecac9988 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py
@@ -1,13 +1,20 @@
-import logging
-from optparse import Values
-from typing import Any, Iterable, List, Optional, Union
+from __future__ import annotations
-from pip._vendor.packaging.version import LegacyVersion, Version
+import json
+import logging
+from collections.abc import Iterable
+from optparse import Values
+from typing import Any, Callable
+
+from pip._vendor.packaging.version import Version
from pip._internal.cli import cmdoptions
from pip._internal.cli.req_command import IndexGroupCommand
from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.commands.search import print_dist_installation_info
+from pip._internal.commands.search import (
+ get_installed_distribution,
+ print_dist_installation_info,
+)
from pip._internal.exceptions import CommandError, DistributionNotFound, PipError
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
@@ -34,6 +41,7 @@ class IndexCommand(IndexGroupCommand):
self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
self.cmd_opts.add_option(cmdoptions.pre())
+ self.cmd_opts.add_option(cmdoptions.json())
self.cmd_opts.add_option(cmdoptions.no_binary())
self.cmd_opts.add_option(cmdoptions.only_binary())
@@ -45,22 +53,19 @@ class IndexCommand(IndexGroupCommand):
self.parser.insert_option_group(0, index_opts)
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
- handlers = {
+ def handler_map(self) -> dict[str, Callable[[Values, list[str]], None]]:
+ return {
"versions": self.get_available_package_versions,
}
- logger.warning(
- "pip index is currently an experimental command. "
- "It may be removed/changed in a future release "
- "without prior warning."
- )
+ def run(self, options: Values, args: list[str]) -> int:
+ handler_map = self.handler_map()
# Determine action
- if not args or args[0] not in handlers:
+ if not args or args[0] not in handler_map:
logger.error(
"Need an action (%s) to perform.",
- ", ".join(sorted(handlers)),
+ ", ".join(sorted(handler_map)),
)
return ERROR
@@ -68,7 +73,7 @@ class IndexCommand(IndexGroupCommand):
# Error handling happens here, not in the action-handlers.
try:
- handlers[action](options, args[1:])
+ handler_map[action](options, args[1:])
except PipError as e:
logger.error(e.args[0])
return ERROR
@@ -79,8 +84,8 @@ class IndexCommand(IndexGroupCommand):
self,
options: Values,
session: PipSession,
- target_python: Optional[TargetPython] = None,
- ignore_requires_python: Optional[bool] = None,
+ target_python: TargetPython | None = None,
+ ignore_requires_python: bool | None = None,
) -> PackageFinder:
"""
Create a package finder appropriate to the index command.
@@ -100,7 +105,7 @@ class IndexCommand(IndexGroupCommand):
target_python=target_python,
)
- def get_available_package_versions(self, options: Values, args: List[Any]) -> None:
+ def get_available_package_versions(self, options: Values, args: list[Any]) -> None:
if len(args) != 1:
raise CommandError("You need to specify exactly one argument")
@@ -115,7 +120,7 @@ class IndexCommand(IndexGroupCommand):
ignore_requires_python=options.ignore_requires_python,
)
- versions: Iterable[Union[LegacyVersion, Version]] = (
+ versions: Iterable[Version] = (
candidate.version for candidate in finder.find_all_candidates(query)
)
@@ -134,6 +139,21 @@ class IndexCommand(IndexGroupCommand):
formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)]
latest = formatted_versions[0]
- write_output(f"{query} ({latest})")
- write_output("Available versions: {}".format(", ".join(formatted_versions)))
- print_dist_installation_info(query, latest)
+ dist = get_installed_distribution(query)
+
+ if options.json:
+ structured_output = {
+ "name": query,
+ "versions": formatted_versions,
+ "latest": latest,
+ }
+
+ if dist is not None:
+ structured_output["installed_version"] = str(dist.version)
+
+ write_output(json.dumps(structured_output))
+
+ else:
+ write_output(f"{query} ({latest})")
+ write_output("Available versions: {}".format(", ".join(formatted_versions)))
+ print_dist_installation_info(latest, dist)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py
index 27c8fa3d..e262012e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py
@@ -1,13 +1,13 @@
import logging
from optparse import Values
-from typing import Any, Dict, List
+from typing import Any
from pip._vendor.packaging.markers import default_environment
from pip._vendor.rich import print_json
from pip import __version__
from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import Command
+from pip._internal.cli.base_command import Command
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.metadata import BaseDistribution, get_environment
from pip._internal.utils.compat import stdlib_pkgs
@@ -45,7 +45,7 @@ class InspectCommand(Command):
self.cmd_opts.add_option(cmdoptions.list_path())
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
cmdoptions.check_list_path_option(options)
dists = get_environment(options.path).iter_installed_distributions(
local_only=options.local,
@@ -62,8 +62,8 @@ class InspectCommand(Command):
print_json(data=output)
return SUCCESS
- def _dist_to_dict(self, dist: BaseDistribution) -> Dict[str, Any]:
- res: Dict[str, Any] = {
+ def _dist_to_dict(self, dist: BaseDistribution) -> dict[str, Any]:
+ res: dict[str, Any] = {
"metadata": dist.metadata_dict,
"metadata_location": dist.info_location,
}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
index e944bb95..1ef7a0f4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import errno
import json
import operator
@@ -5,20 +7,32 @@ import os
import shutil
import site
from optparse import SUPPRESS_HELP, Values
-from typing import List, Optional
+from pathlib import Path
+from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.requests.exceptions import InvalidProxyURL
from pip._vendor.rich import print_json
+# Eagerly import self_outdated_check to avoid crashes. Otherwise,
+# this module would be imported *after* pip was replaced, resulting
+# in crashes if the new self_outdated_check module was incompatible
+# with the rest of pip that's already imported, or allowing a
+# wheel to execute arbitrary code on install by replacing
+# self_outdated_check.
+import pip._internal.self_outdated_check # noqa: F401
from pip._internal.cache import WheelCache
from pip._internal.cli import cmdoptions
from pip._internal.cli.cmdoptions import make_target_python
from pip._internal.cli.req_command import (
RequirementCommand,
- warn_if_run_as_root,
with_cleanup,
)
from pip._internal.cli.status_codes import ERROR, SUCCESS
-from pip._internal.exceptions import CommandError, InstallationError
+from pip._internal.exceptions import (
+ CommandError,
+ InstallationError,
+ InstallWheelBuildError,
+)
from pip._internal.locations import get_scheme
from pip._internal.metadata import get_environment
from pip._internal.models.installation_report import InstallationReport
@@ -37,6 +51,7 @@ from pip._internal.utils.misc import (
ensure_dir,
get_pip_version,
protect_pip_from_modification_on_windows,
+ warn_if_run_as_root,
write_output,
)
from pip._internal.utils.temp_dir import TempDirectory
@@ -263,7 +278,7 @@ class InstallCommand(RequirementCommand):
)
@with_cleanup
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
if options.use_user_site and options.target_dir is not None:
raise CommandError("Can not combine '--user' and '--target'")
@@ -299,8 +314,8 @@ class InstallCommand(RequirementCommand):
isolated_mode=options.isolated_mode,
)
- target_temp_dir: Optional[TempDirectory] = None
- target_temp_dir_path: Optional[str] = None
+ target_temp_dir: TempDirectory | None = None
+ target_temp_dir_path: str | None = None
if options.target_dir:
options.ignore_installed = True
options.target_dir = os.path.abspath(options.target_dir)
@@ -370,6 +385,7 @@ class InstallCommand(RequirementCommand):
force_reinstall=options.force_reinstall,
upgrade_strategy=upgrade_strategy,
use_pep517=options.use_pep517,
+ py_version_info=options.python_version,
)
self.trace_basic_info(finder)
@@ -387,9 +403,6 @@ class InstallCommand(RequirementCommand):
json.dump(report.to_dict(), f, indent=2, ensure_ascii=False)
if options.dry_run:
- # In non dry-run mode, the legacy versions and specifiers check
- # will be done as part of conflict detection.
- requirement_set.warn_legacy_versions_and_specifiers()
would_install_items = sorted(
(r.metadata["name"], r.metadata["version"])
for r in requirement_set.requirements_to_install
@@ -413,7 +426,7 @@ class InstallCommand(RequirementCommand):
reqs_to_build = [
r
- for r in requirement_set.requirements.values()
+ for r in requirement_set.requirements_to_install
if should_build_for_install_command(r)
]
@@ -426,17 +439,12 @@ class InstallCommand(RequirementCommand):
)
if build_failures:
- raise InstallationError(
- "Could not build wheels for {}, which is required to "
- "install pyproject.toml-based projects".format(
- ", ".join(r.name for r in build_failures) # type: ignore
- )
- )
+ raise InstallWheelBuildError(build_failures)
to_install = resolver.get_installation_order(requirement_set)
# Check for conflicts in the package set we're installing.
- conflicts: Optional[ConflictDetails] = None
+ conflicts: ConflictDetails | None = None
should_warn_about_conflicts = (
not options.ignore_dependencies and options.warn_about_conflicts
)
@@ -458,6 +466,7 @@ class InstallCommand(RequirementCommand):
warn_script_location=warn_script_location,
use_user_site=options.use_user_site,
pycompile=options.compile,
+ progress_bar=options.progress_bar,
)
lib_locations = get_lib_location_guesses(
@@ -469,17 +478,21 @@ class InstallCommand(RequirementCommand):
)
env = get_environment(lib_locations)
+ # Display a summary of installed packages, with extra care to
+ # display a package name as it was requested by the user.
installed.sort(key=operator.attrgetter("name"))
- items = []
- for result in installed:
- item = result.name
- try:
- installed_dist = env.get_distribution(item)
- if installed_dist is not None:
- item = f"{item}-{installed_dist.version}"
- except Exception:
- pass
- items.append(item)
+ summary = []
+ installed_versions = {}
+ for distribution in env.iter_all_distributions():
+ installed_versions[distribution.canonical_name] = distribution.version
+ for package in installed:
+ display_name = package.name
+ version = installed_versions.get(canonicalize_name(display_name), None)
+ if version:
+ text = f"{display_name}-{version}"
+ else:
+ text = display_name
+ summary.append(text)
if conflicts is not None:
self._warn_about_conflicts(
@@ -487,7 +500,7 @@ class InstallCommand(RequirementCommand):
resolver_variant=self.determine_resolver_variant(options),
)
- installed_desc = " ".join(items)
+ installed_desc = " ".join(summary)
if installed_desc:
write_output(
"Successfully installed %s",
@@ -569,8 +582,8 @@ class InstallCommand(RequirementCommand):
shutil.move(os.path.join(lib_dir, item), target_item_dir)
def _determine_conflicts(
- self, to_install: List[InstallRequirement]
- ) -> Optional[ConflictDetails]:
+ self, to_install: list[InstallRequirement]
+ ) -> ConflictDetails | None:
try:
return check_install_conflicts(to_install)
except Exception:
@@ -587,7 +600,7 @@ class InstallCommand(RequirementCommand):
if not missing and not conflicting:
return
- parts: List[str] = []
+ parts: list[str] = []
if resolver_variant == "legacy":
parts.append(
"pip's legacy dependency resolver does not consider dependency "
@@ -633,11 +646,11 @@ class InstallCommand(RequirementCommand):
def get_lib_location_guesses(
user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
isolated: bool = False,
- prefix: Optional[str] = None,
-) -> List[str]:
+ prefix: str | None = None,
+) -> list[str]:
scheme = get_scheme(
"",
user=user,
@@ -649,7 +662,7 @@ def get_lib_location_guesses(
return [scheme.purelib, scheme.platlib]
-def site_packages_writable(root: Optional[str], isolated: bool) -> bool:
+def site_packages_writable(root: str | None, isolated: bool) -> bool:
return all(
test_writable_dir(d)
for d in set(get_lib_location_guesses(root=root, isolated=isolated))
@@ -657,10 +670,10 @@ def site_packages_writable(root: Optional[str], isolated: bool) -> bool:
def decide_user_install(
- use_user_site: Optional[bool],
- prefix_path: Optional[str] = None,
- target_dir: Optional[str] = None,
- root_path: Optional[str] = None,
+ use_user_site: bool | None,
+ prefix_path: str | None = None,
+ target_dir: str | None = None,
+ root_path: str | None = None,
isolated_mode: bool = False,
) -> bool:
"""Determine whether to do a user install based on the input options.
@@ -755,20 +768,31 @@ def create_os_error_message(
parts.append(permissions_part)
parts.append(".\n")
- # Suggest the user to enable Long Paths if path length is
- # more than 260
- if (
- WINDOWS
- and error.errno == errno.ENOENT
- and error.filename
- and len(error.filename) > 260
- ):
+ # Suggest to check "pip config debug" in case of invalid proxy
+ if type(error) is InvalidProxyURL:
parts.append(
- "HINT: This error might have occurred since "
- "this system does not have Windows Long Path "
- "support enabled. You can find information on "
- "how to enable this at "
- "https://pip.pypa.io/warnings/enable-long-paths\n"
+ 'Consider checking your local proxy configuration with "pip config debug"'
)
+ parts.append(".\n")
+ # On Windows, errors like EINVAL or ENOENT may occur
+ # if a file or folder name exceeds 255 characters,
+ # or if the full path exceeds 260 characters and long path support isn't enabled.
+ # This condition checks for such cases and adds a hint to the error output.
+
+ if WINDOWS and error.errno in (errno.EINVAL, errno.ENOENT) and error.filename:
+ if any(len(part) > 255 for part in Path(error.filename).parts):
+ parts.append(
+ "HINT: This error might be caused by a file or folder name exceeding "
+ "255 characters, which is a Windows limitation even if long paths "
+ "are enabled.\n "
+ )
+ if len(error.filename) > 260:
+ parts.append(
+ "HINT: This error might have occurred since "
+ "this system does not have Windows Long Path "
+ "support enabled. You can find information on "
+ "how to enable this at "
+ "https://pip.pypa.io/warnings/enable-long-paths\n"
+ )
return "".join(parts).strip() + "\n"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py
index 32fb19b2..ad27e45c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py
@@ -1,24 +1,27 @@
+from __future__ import annotations
+
import json
import logging
+from collections.abc import Generator, Sequence
+from email.parser import Parser
from optparse import Values
-from typing import TYPE_CHECKING, Generator, List, Optional, Sequence, Tuple, cast
+from typing import TYPE_CHECKING, cast
from pip._vendor.packaging.utils import canonicalize_name
+from pip._vendor.packaging.version import InvalidVersion, Version
from pip._internal.cli import cmdoptions
-from pip._internal.cli.req_command import IndexGroupCommand
+from pip._internal.cli.index_command import IndexGroupCommand
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.exceptions import CommandError
-from pip._internal.index.collector import LinkCollector
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import BaseDistribution, get_environment
from pip._internal.models.selection_prefs import SelectionPreferences
-from pip._internal.network.session import PipSession
from pip._internal.utils.compat import stdlib_pkgs
from pip._internal.utils.misc import tabulate, write_output
if TYPE_CHECKING:
- from pip._internal.metadata.base import DistributionVersion
+ from pip._internal.index.package_finder import PackageFinder
+ from pip._internal.network.session import PipSession
class _DistWithLatestInfo(BaseDistribution):
"""Give the distribution object a couple of extra fields.
@@ -27,14 +30,12 @@ if TYPE_CHECKING:
makes the rest of the code much cleaner.
"""
- latest_version: DistributionVersion
+ latest_version: Version
latest_filetype: str
_ProcessedDists = Sequence[_DistWithLatestInfo]
-from pip._vendor.packaging.version import parse
-
logger = logging.getLogger(__name__)
@@ -128,7 +129,7 @@ class ListCommand(IndexGroupCommand):
"--include-editable",
action="store_true",
dest="include_editable",
- help="Include editable package from output.",
+ help="Include editable package in output.",
default=True,
)
self.cmd_opts.add_option(cmdoptions.list_exclude())
@@ -137,12 +138,20 @@ class ListCommand(IndexGroupCommand):
self.parser.insert_option_group(0, index_opts)
self.parser.insert_option_group(0, self.cmd_opts)
+ def handle_pip_version_check(self, options: Values) -> None:
+ if options.outdated or options.uptodate:
+ super().handle_pip_version_check(options)
+
def _build_package_finder(
self, options: Values, session: PipSession
) -> PackageFinder:
"""
Create a package finder appropriate to this list command.
"""
+ # Lazy import the heavy index modules as most list invocations won't need 'em.
+ from pip._internal.index.collector import LinkCollector
+ from pip._internal.index.package_finder import PackageFinder
+
link_collector = LinkCollector.create(session, options=options)
# Pass allow_yanked=False to ignore yanked versions.
@@ -156,7 +165,7 @@ class ListCommand(IndexGroupCommand):
selection_prefs=selection_prefs,
)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
if options.outdated and options.uptodate:
raise CommandError("Options --outdated and --uptodate cannot be combined.")
@@ -171,7 +180,7 @@ class ListCommand(IndexGroupCommand):
if options.excludes:
skip.update(canonicalize_name(n) for n in options.excludes)
- packages: "_ProcessedDists" = [
+ packages: _ProcessedDists = [
cast("_DistWithLatestInfo", d)
for d in get_environment(options.path).iter_installed_distributions(
local_only=options.local,
@@ -198,26 +207,26 @@ class ListCommand(IndexGroupCommand):
return SUCCESS
def get_outdated(
- self, packages: "_ProcessedDists", options: Values
- ) -> "_ProcessedDists":
+ self, packages: _ProcessedDists, options: Values
+ ) -> _ProcessedDists:
return [
dist
for dist in self.iter_packages_latest_infos(packages, options)
- if parse(str(dist.latest_version)) > parse(str(dist.version))
+ if dist.latest_version > dist.version
]
def get_uptodate(
- self, packages: "_ProcessedDists", options: Values
- ) -> "_ProcessedDists":
+ self, packages: _ProcessedDists, options: Values
+ ) -> _ProcessedDists:
return [
dist
for dist in self.iter_packages_latest_infos(packages, options)
- if parse(str(dist.latest_version)) == parse(str(dist.version))
+ if dist.latest_version == dist.version
]
def get_not_required(
- self, packages: "_ProcessedDists", options: Values
- ) -> "_ProcessedDists":
+ self, packages: _ProcessedDists, options: Values
+ ) -> _ProcessedDists:
dep_keys = {
canonicalize_name(dep.name)
for dist in packages
@@ -230,14 +239,14 @@ class ListCommand(IndexGroupCommand):
return list({pkg for pkg in packages if pkg.canonical_name not in dep_keys})
def iter_packages_latest_infos(
- self, packages: "_ProcessedDists", options: Values
- ) -> Generator["_DistWithLatestInfo", None, None]:
+ self, packages: _ProcessedDists, options: Values
+ ) -> Generator[_DistWithLatestInfo, None, None]:
with self._build_session(options) as session:
finder = self._build_package_finder(options, session)
def latest_info(
- dist: "_DistWithLatestInfo",
- ) -> Optional["_DistWithLatestInfo"]:
+ dist: _DistWithLatestInfo,
+ ) -> _DistWithLatestInfo | None:
all_candidates = finder.find_all_candidates(dist.canonical_name)
if not options.pre:
# Remove prereleases
@@ -268,7 +277,7 @@ class ListCommand(IndexGroupCommand):
yield dist
def output_package_listing(
- self, packages: "_ProcessedDists", options: Values
+ self, packages: _ProcessedDists, options: Values
) -> None:
packages = sorted(
packages,
@@ -279,17 +288,19 @@ class ListCommand(IndexGroupCommand):
self.output_package_listing_columns(data, header)
elif options.list_format == "freeze":
for dist in packages:
+ try:
+ req_string = f"{dist.raw_name}=={dist.version}"
+ except InvalidVersion:
+ req_string = f"{dist.raw_name}==={dist.raw_version}"
if options.verbose >= 1:
- write_output(
- "%s==%s (%s)", dist.raw_name, dist.version, dist.location
- )
+ write_output("%s (%s)", req_string, dist.location)
else:
- write_output("%s==%s", dist.raw_name, dist.version)
+ write_output(req_string)
elif options.list_format == "json":
write_output(format_for_json(packages, options))
def output_package_listing_columns(
- self, data: List[List[str]], header: List[str]
+ self, data: list[list[str]], header: list[str]
) -> None:
# insert the header first: we need to know the size of column names
if len(data) > 0:
@@ -306,8 +317,8 @@ class ListCommand(IndexGroupCommand):
def format_for_columns(
- pkgs: "_ProcessedDists", options: Values
-) -> Tuple[List[List[str]], List[str]]:
+ pkgs: _ProcessedDists, options: Values
+) -> tuple[list[list[str]], list[str]]:
"""
Convert the package data into something usable
by output_package_listing_columns.
@@ -318,25 +329,40 @@ def format_for_columns(
if running_outdated:
header.extend(["Latest", "Type"])
- has_editables = any(x.editable for x in pkgs)
- if has_editables:
- header.append("Editable project location")
+ def wheel_build_tag(dist: BaseDistribution) -> str | None:
+ try:
+ wheel_file = dist.read_text("WHEEL")
+ except FileNotFoundError:
+ return None
+ return Parser().parsestr(wheel_file).get("Build")
+
+ build_tags = [wheel_build_tag(p) for p in pkgs]
+ has_build_tags = any(build_tags)
+ if has_build_tags:
+ header.append("Build")
if options.verbose >= 1:
header.append("Location")
if options.verbose >= 1:
header.append("Installer")
+ has_editables = any(x.editable for x in pkgs)
+ if has_editables:
+ header.append("Editable project location")
+
data = []
- for proj in pkgs:
+ for i, proj in enumerate(pkgs):
# if we're working on the 'outdated' list, separate out the
# latest_version and type
- row = [proj.raw_name, str(proj.version)]
+ row = [proj.raw_name, proj.raw_version]
if running_outdated:
row.append(str(proj.latest_version))
row.append(proj.latest_filetype)
+ if has_build_tags:
+ row.append(build_tags[i] or "")
+
if has_editables:
row.append(proj.editable_project_location or "")
@@ -350,12 +376,16 @@ def format_for_columns(
return data, header
-def format_for_json(packages: "_ProcessedDists", options: Values) -> str:
+def format_for_json(packages: _ProcessedDists, options: Values) -> str:
data = []
for dist in packages:
+ try:
+ version = str(dist.version)
+ except InvalidVersion:
+ version = dist.raw_version
info = {
"name": dist.raw_name,
- "version": str(dist.version),
+ "version": version,
}
if options.verbose >= 1:
info["location"] = dist.location or ""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/lock.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/lock.py
new file mode 100644
index 00000000..e4a978d5
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/lock.py
@@ -0,0 +1,170 @@
+import sys
+from optparse import Values
+from pathlib import Path
+
+from pip._internal.cache import WheelCache
+from pip._internal.cli import cmdoptions
+from pip._internal.cli.req_command import (
+ RequirementCommand,
+ with_cleanup,
+)
+from pip._internal.cli.status_codes import SUCCESS
+from pip._internal.models.pylock import Pylock, is_valid_pylock_file_name
+from pip._internal.operations.build.build_tracker import get_build_tracker
+from pip._internal.req.req_install import (
+ check_legacy_setup_py_options,
+)
+from pip._internal.utils.logging import getLogger
+from pip._internal.utils.misc import (
+ get_pip_version,
+)
+from pip._internal.utils.temp_dir import TempDirectory
+
+logger = getLogger(__name__)
+
+
+class LockCommand(RequirementCommand):
+ """
+ EXPERIMENTAL - Lock packages and their dependencies from:
+
+ - PyPI (and other indexes) using requirement specifiers.
+ - VCS project urls.
+ - Local project directories.
+ - Local or remote source archives.
+
+ pip also supports locking from "requirements files", which provide an easy
+ way to specify a whole environment to be installed.
+
+ The generated lock file is only guaranteed to be valid for the current
+ python version and platform.
+ """
+
+ usage = """
+ %prog [options] [-e] ...
+ %prog [options] [package-index-options] ...
+ %prog [options] -r [package-index-options] ...
+ %prog [options] ..."""
+
+ def add_options(self) -> None:
+ self.cmd_opts.add_option(
+ cmdoptions.PipOption(
+ "--output",
+ "-o",
+ dest="output_file",
+ metavar="path",
+ type="path",
+ default="pylock.toml",
+ help="Lock file name (default=pylock.toml). Use - for stdout.",
+ )
+ )
+ self.cmd_opts.add_option(cmdoptions.requirements())
+ self.cmd_opts.add_option(cmdoptions.constraints())
+ self.cmd_opts.add_option(cmdoptions.no_deps())
+ self.cmd_opts.add_option(cmdoptions.pre())
+
+ self.cmd_opts.add_option(cmdoptions.editable())
+
+ self.cmd_opts.add_option(cmdoptions.src())
+
+ self.cmd_opts.add_option(cmdoptions.ignore_requires_python())
+ self.cmd_opts.add_option(cmdoptions.no_build_isolation())
+ self.cmd_opts.add_option(cmdoptions.use_pep517())
+ self.cmd_opts.add_option(cmdoptions.no_use_pep517())
+ self.cmd_opts.add_option(cmdoptions.check_build_deps())
+
+ self.cmd_opts.add_option(cmdoptions.config_settings())
+
+ self.cmd_opts.add_option(cmdoptions.no_binary())
+ self.cmd_opts.add_option(cmdoptions.only_binary())
+ self.cmd_opts.add_option(cmdoptions.prefer_binary())
+ self.cmd_opts.add_option(cmdoptions.require_hashes())
+ self.cmd_opts.add_option(cmdoptions.progress_bar())
+
+ index_opts = cmdoptions.make_option_group(
+ cmdoptions.index_group,
+ self.parser,
+ )
+
+ self.parser.insert_option_group(0, index_opts)
+ self.parser.insert_option_group(0, self.cmd_opts)
+
+ @with_cleanup
+ def run(self, options: Values, args: list[str]) -> int:
+ logger.verbose("Using %s", get_pip_version())
+
+ logger.warning(
+ "pip lock is currently an experimental command. "
+ "It may be removed/changed in a future release "
+ "without prior warning."
+ )
+
+ session = self.get_default_session(options)
+
+ finder = self._build_package_finder(
+ options=options,
+ session=session,
+ ignore_requires_python=options.ignore_requires_python,
+ )
+ build_tracker = self.enter_context(get_build_tracker())
+
+ directory = TempDirectory(
+ delete=not options.no_clean,
+ kind="install",
+ globally_managed=True,
+ )
+
+ reqs = self.get_requirements(args, options, finder, session)
+ check_legacy_setup_py_options(options, reqs)
+
+ wheel_cache = WheelCache(options.cache_dir)
+
+ # Only when installing is it permitted to use PEP 660.
+ # In other circumstances (pip wheel, pip download) we generate
+ # regular (i.e. non editable) metadata and wheels.
+ for req in reqs:
+ req.permit_editable_wheels = True
+
+ preparer = self.make_requirement_preparer(
+ temp_build_dir=directory,
+ options=options,
+ build_tracker=build_tracker,
+ session=session,
+ finder=finder,
+ use_user_site=False,
+ verbosity=self.verbosity,
+ )
+ resolver = self.make_resolver(
+ preparer=preparer,
+ finder=finder,
+ options=options,
+ wheel_cache=wheel_cache,
+ use_user_site=False,
+ ignore_installed=True,
+ ignore_requires_python=options.ignore_requires_python,
+ upgrade_strategy="to-satisfy-only",
+ use_pep517=options.use_pep517,
+ )
+
+ self.trace_basic_info(finder)
+
+ requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
+
+ if options.output_file == "-":
+ base_dir = Path.cwd()
+ else:
+ output_file_path = Path(options.output_file)
+ if not is_valid_pylock_file_name(output_file_path):
+ logger.warning(
+ "%s is not a valid lock file name.",
+ output_file_path,
+ )
+ base_dir = output_file_path.parent
+ pylock_toml = Pylock.from_install_requirements(
+ requirement_set.requirements.values(), base_dir=base_dir
+ ).as_toml()
+ if options.output_file == "-":
+ sys.stdout.write(pylock_toml)
+ else:
+ output_file_path.write_text(pylock_toml, encoding="utf-8")
+
+ return SUCCESS
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
index 03ed925b..b8dbc27d 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import logging
import shutil
import sys
@@ -5,7 +7,7 @@ import textwrap
import xmlrpc.client
from collections import OrderedDict
from optparse import Values
-from typing import TYPE_CHECKING, Dict, List, Optional
+from typing import TypedDict
from pip._vendor.packaging.version import parse as parse_version
@@ -14,18 +16,17 @@ from pip._internal.cli.req_command import SessionCommandMixin
from pip._internal.cli.status_codes import NO_MATCHES_FOUND, SUCCESS
from pip._internal.exceptions import CommandError
from pip._internal.metadata import get_default_environment
+from pip._internal.metadata.base import BaseDistribution
from pip._internal.models.index import PyPI
from pip._internal.network.xmlrpc import PipXmlrpcTransport
from pip._internal.utils.logging import indent_log
from pip._internal.utils.misc import write_output
-if TYPE_CHECKING:
- from typing import TypedDict
- class TransformedHit(TypedDict):
- name: str
- summary: str
- versions: List[str]
+class TransformedHit(TypedDict):
+ name: str
+ summary: str
+ versions: list[str]
logger = logging.getLogger(__name__)
@@ -50,7 +51,7 @@ class SearchCommand(Command, SessionCommandMixin):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
if not args:
raise CommandError("Missing required argument (search query).")
query = args
@@ -66,7 +67,7 @@ class SearchCommand(Command, SessionCommandMixin):
return SUCCESS
return NO_MATCHES_FOUND
- def search(self, query: List[str], options: Values) -> List[Dict[str, str]]:
+ def search(self, query: list[str], options: Values) -> list[dict[str, str]]:
index_url = options.index
session = self.get_default_session(options)
@@ -76,22 +77,21 @@ class SearchCommand(Command, SessionCommandMixin):
try:
hits = pypi.search({"name": query, "summary": query}, "or")
except xmlrpc.client.Fault as fault:
- message = "XMLRPC request failed [code: {code}]\n{string}".format(
- code=fault.faultCode,
- string=fault.faultString,
+ message = (
+ f"XMLRPC request failed [code: {fault.faultCode}]\n{fault.faultString}"
)
raise CommandError(message)
assert isinstance(hits, list)
return hits
-def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
+def transform_hits(hits: list[dict[str, str]]) -> list[TransformedHit]:
"""
The list from pypi is really a list of versions. We want a list of
packages with the list of versions stored inline. This converts the
list from pypi into one we can use.
"""
- packages: Dict[str, "TransformedHit"] = OrderedDict()
+ packages: dict[str, TransformedHit] = OrderedDict()
for hit in hits:
name = hit["name"]
summary = hit["summary"]
@@ -113,9 +113,7 @@ def transform_hits(hits: List[Dict[str, str]]) -> List["TransformedHit"]:
return list(packages.values())
-def print_dist_installation_info(name: str, latest: str) -> None:
- env = get_default_environment()
- dist = env.get_distribution(name)
+def print_dist_installation_info(latest: str, dist: BaseDistribution | None) -> None:
if dist is not None:
with indent_log():
if dist.version == latest:
@@ -132,10 +130,15 @@ def print_dist_installation_info(name: str, latest: str) -> None:
write_output("LATEST: %s", latest)
+def get_installed_distribution(name: str) -> BaseDistribution | None:
+ env = get_default_environment()
+ return env.get_distribution(name)
+
+
def print_results(
- hits: List["TransformedHit"],
- name_column_width: Optional[int] = None,
- terminal_width: Optional[int] = None,
+ hits: list[TransformedHit],
+ name_column_width: int | None = None,
+ terminal_width: int | None = None,
) -> None:
if not hits:
return
@@ -165,10 +168,11 @@ def print_results(
line = f"{name_latest:{name_column_width}} - {summary}"
try:
write_output(line)
- print_dist_installation_info(name, latest)
+ dist = get_installed_distribution(name)
+ print_dist_installation_info(latest, dist)
except UnicodeEncodeError:
pass
-def highest_version(versions: List[str]) -> str:
+def highest_version(versions: list[str]) -> str:
return max(versions, key=parse_version)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py
index 3f10701f..f9fcfa60 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py
@@ -1,7 +1,12 @@
-import logging
-from optparse import Values
-from typing import Generator, Iterable, Iterator, List, NamedTuple, Optional
+from __future__ import annotations
+import logging
+import string
+from collections.abc import Generator, Iterable, Iterator
+from optparse import Values
+from typing import NamedTuple
+
+from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.cli.base_command import Command
@@ -12,6 +17,13 @@ from pip._internal.utils.misc import write_output
logger = logging.getLogger(__name__)
+def normalize_project_url_label(label: str) -> str:
+ # This logic is from PEP 753 (Well-known Project URLs in Metadata).
+ chars_to_remove = string.punctuation + string.whitespace
+ removal_map = str.maketrans("", "", chars_to_remove)
+ return label.translate(removal_map).lower()
+
+
class ShowCommand(Command):
"""
Show information about one or more installed packages.
@@ -35,7 +47,7 @@ class ShowCommand(Command):
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
if not args:
logger.warning("ERROR: Please provide a package name or names.")
return ERROR
@@ -53,23 +65,24 @@ class _PackageInfo(NamedTuple):
name: str
version: str
location: str
- editable_project_location: Optional[str]
- requires: List[str]
- required_by: List[str]
+ editable_project_location: str | None
+ requires: list[str]
+ required_by: list[str]
installer: str
metadata_version: str
- classifiers: List[str]
+ classifiers: list[str]
summary: str
homepage: str
- project_urls: List[str]
+ project_urls: list[str]
author: str
author_email: str
license: str
- entry_points: List[str]
- files: Optional[List[str]]
+ license_expression: str
+ entry_points: list[str]
+ files: list[str] | None
-def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None]:
+def search_packages_info(query: list[str]) -> Generator[_PackageInfo, None, None]:
"""
Gather details from installed distributions. Print distribution name,
version, location, and installed files. Installed files requires a
@@ -100,8 +113,19 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
except KeyError:
continue
- requires = sorted((req.name for req in dist.iter_dependencies()), key=str.lower)
- required_by = sorted(_get_requiring_packages(dist), key=str.lower)
+ try:
+ requires = sorted(
+ # Avoid duplicates in requirements (e.g. due to environment markers).
+ {req.name for req in dist.iter_dependencies()},
+ key=str.lower,
+ )
+ except InvalidRequirement:
+ requires = sorted(dist.iter_raw_dependencies(), key=str.lower)
+
+ try:
+ required_by = sorted(_get_requiring_packages(dist), key=str.lower)
+ except InvalidRequirement:
+ required_by = ["#N/A"]
try:
entry_points_text = dist.read_text("entry_points.txt")
@@ -111,15 +135,27 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
files_iter = dist.iter_declared_entries()
if files_iter is None:
- files: Optional[List[str]] = None
+ files: list[str] | None = None
else:
files = sorted(files_iter)
metadata = dist.metadata
+ project_urls = metadata.get_all("Project-URL", [])
+ homepage = metadata.get("Home-page", "")
+ if not homepage:
+ # It's common that there is a "homepage" Project-URL, but Home-page
+ # remains unset (especially as PEP 621 doesn't surface the field).
+ for url in project_urls:
+ url_label, url = url.split(",", maxsplit=1)
+ normalized_label = normalize_project_url_label(url_label)
+ if normalized_label == "homepage":
+ homepage = url.strip()
+ break
+
yield _PackageInfo(
name=dist.raw_name,
- version=str(dist.version),
+ version=dist.raw_version,
location=dist.location or "",
editable_project_location=dist.editable_project_location,
requires=requires,
@@ -128,11 +164,12 @@ def search_packages_info(query: List[str]) -> Generator[_PackageInfo, None, None
metadata_version=dist.metadata_version or "",
classifiers=metadata.get_all("Classifier", []),
summary=metadata.get("Summary", ""),
- homepage=metadata.get("Home-page", ""),
- project_urls=metadata.get_all("Project-URL", []),
+ homepage=homepage,
+ project_urls=project_urls,
author=metadata.get("Author", ""),
author_email=metadata.get("Author-email", ""),
license=metadata.get("License", ""),
+ license_expression=metadata.get("License-Expression", ""),
entry_points=entry_points,
files=files,
)
@@ -152,13 +189,18 @@ def print_results(
if i > 0:
write_output("---")
+ metadata_version_tuple = tuple(map(int, dist.metadata_version.split(".")))
+
write_output("Name: %s", dist.name)
write_output("Version: %s", dist.version)
write_output("Summary: %s", dist.summary)
write_output("Home-page: %s", dist.homepage)
write_output("Author: %s", dist.author)
write_output("Author-email: %s", dist.author_email)
- write_output("License: %s", dist.license)
+ if metadata_version_tuple >= (2, 4) and dist.license_expression:
+ write_output("License-Expression: %s", dist.license_expression)
+ else:
+ write_output("License: %s", dist.license)
write_output("Location: %s", dist.location)
if dist.editable_project_location is not None:
write_output(
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py
index f198fc31..9c4f031f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py
@@ -1,12 +1,11 @@
import logging
from optparse import Values
-from typing import List
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.cli import cmdoptions
from pip._internal.cli.base_command import Command
-from pip._internal.cli.req_command import SessionCommandMixin, warn_if_run_as_root
+from pip._internal.cli.index_command import SessionCommandMixin
from pip._internal.cli.status_codes import SUCCESS
from pip._internal.exceptions import InstallationError
from pip._internal.req import parse_requirements
@@ -17,6 +16,7 @@ from pip._internal.req.constructors import (
from pip._internal.utils.misc import (
check_externally_managed,
protect_pip_from_modification_on_windows,
+ warn_if_run_as_root,
)
logger = logging.getLogger(__name__)
@@ -61,7 +61,7 @@ class UninstallCommand(Command, SessionCommandMixin):
self.cmd_opts.add_option(cmdoptions.override_externally_managed())
self.parser.insert_option_group(0, self.cmd_opts)
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
session = self.get_default_session(options)
reqs_to_uninstall = {}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
index ed578aa2..61be2549 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
@@ -2,7 +2,6 @@ import logging
import os
import shutil
from optparse import Values
-from typing import List
from pip._internal.cache import WheelCache
from pip._internal.cli import cmdoptions
@@ -16,7 +15,7 @@ from pip._internal.req.req_install import (
)
from pip._internal.utils.misc import ensure_dir, normalize_path
from pip._internal.utils.temp_dir import TempDirectory
-from pip._internal.wheel_builder import build, should_build_for_wheel_command
+from pip._internal.wheel_builder import build
logger = logging.getLogger(__name__)
@@ -101,7 +100,7 @@ class WheelCommand(RequirementCommand):
self.parser.insert_option_group(0, self.cmd_opts)
@with_cleanup
- def run(self, options: Values, args: List[str]) -> int:
+ def run(self, options: Values, args: list[str]) -> int:
session = self.get_default_session(options)
finder = self._build_package_finder(options, session)
@@ -146,15 +145,14 @@ class WheelCommand(RequirementCommand):
requirement_set = resolver.resolve(reqs, check_supported_wheels=True)
- reqs_to_build: List[InstallRequirement] = []
+ reqs_to_build: list[InstallRequirement] = []
for req in requirement_set.requirements.values():
if req.is_wheel:
preparer.save_linked_requirement(req)
- elif should_build_for_wheel_command(req):
+ else:
reqs_to_build.append(req)
preparer.prepare_linked_requirements_more(requirement_set.requirements.values())
- requirement_set.warn_legacy_versions_and_specifiers()
# build wheels
build_successes, build_failures = build(
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/configuration.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/configuration.py
index c25273d5..f581a2c9 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/configuration.py
@@ -11,11 +11,14 @@ Some terminology:
A single word describing where the configuration key-value pair came from
"""
+from __future__ import annotations
+
import configparser
import locale
import os
import sys
-from typing import Any, Dict, Iterable, List, NewType, Optional, Tuple
+from collections.abc import Iterable
+from typing import Any, NewType
from pip._internal.exceptions import (
ConfigurationError,
@@ -55,7 +58,7 @@ def _normalize_name(name: str) -> str:
return name
-def _disassemble_key(name: str) -> List[str]:
+def _disassemble_key(name: str) -> list[str]:
if "." not in name:
error_message = (
"Key does not contain dot separated section and key. "
@@ -65,7 +68,7 @@ def _disassemble_key(name: str) -> List[str]:
return name.split(".", 1)
-def get_configuration_files() -> Dict[Kind, List[str]]:
+def get_configuration_files() -> dict[Kind, list[str]]:
global_config_files = [
os.path.join(path, CONFIG_BASENAME) for path in appdirs.site_config_dirs("pip")
]
@@ -98,7 +101,7 @@ class Configuration:
and the data stored is also nice.
"""
- def __init__(self, isolated: bool, load_only: Optional[Kind] = None) -> None:
+ def __init__(self, isolated: bool, load_only: Kind | None = None) -> None:
super().__init__()
if load_only is not None and load_only not in VALID_LOAD_ONLY:
@@ -111,13 +114,13 @@ class Configuration:
self.load_only = load_only
# Because we keep track of where we got the data from
- self._parsers: Dict[Kind, List[Tuple[str, RawConfigParser]]] = {
+ self._parsers: dict[Kind, list[tuple[str, RawConfigParser]]] = {
variant: [] for variant in OVERRIDE_ORDER
}
- self._config: Dict[Kind, Dict[str, Any]] = {
+ self._config: dict[Kind, dict[str, dict[str, Any]]] = {
variant: {} for variant in OVERRIDE_ORDER
}
- self._modified_parsers: List[Tuple[str, RawConfigParser]] = []
+ self._modified_parsers: list[tuple[str, RawConfigParser]] = []
def load(self) -> None:
"""Loads configuration from configuration files and environment"""
@@ -125,7 +128,7 @@ class Configuration:
if not self.isolated:
self._load_environment_vars()
- def get_file_to_edit(self) -> Optional[str]:
+ def get_file_to_edit(self) -> str | None:
"""Returns the file with highest priority in configuration"""
assert self.load_only is not None, "Need to be specified a file to be editing"
@@ -134,7 +137,7 @@ class Configuration:
except IndexError:
return None
- def items(self) -> Iterable[Tuple[str, Any]]:
+ def items(self) -> Iterable[tuple[str, Any]]:
"""Returns key-value pairs like dict.items() representing the loaded
configuration
"""
@@ -145,7 +148,10 @@ class Configuration:
orig_key = key
key = _normalize_name(key)
try:
- return self._dictionary[key]
+ clean_config: dict[str, Any] = {}
+ for file_values in self._dictionary.values():
+ clean_config.update(file_values)
+ return clean_config[key]
except KeyError:
# disassembling triggers a more useful error message than simply
# "No such key" in the case that the key isn't in the form command.option
@@ -168,7 +174,8 @@ class Configuration:
parser.add_section(section)
parser.set(section, name, value)
- self._config[self.load_only][key] = value
+ self._config[self.load_only].setdefault(fname, {})
+ self._config[self.load_only][fname][key] = value
self._mark_as_modified(fname, parser)
def unset_value(self, key: str) -> None:
@@ -178,11 +185,14 @@ class Configuration:
self._ensure_have_load_only()
assert self.load_only
- if key not in self._config[self.load_only]:
- raise ConfigurationError(f"No such key - {orig_key}")
-
fname, parser = self._get_parser_to_modify()
+ if (
+ key not in self._config[self.load_only][fname]
+ and key not in self._config[self.load_only]
+ ):
+ raise ConfigurationError(f"No such key - {orig_key}")
+
if parser is not None:
section, name = _disassemble_key(key)
if not (
@@ -197,8 +207,10 @@ class Configuration:
if not parser.items(section):
parser.remove_section(section)
self._mark_as_modified(fname, parser)
-
- del self._config[self.load_only][key]
+ try:
+ del self._config[self.load_only][fname][key]
+ except KeyError:
+ del self._config[self.load_only][key]
def save(self) -> None:
"""Save the current in-memory state."""
@@ -230,7 +242,7 @@ class Configuration:
logger.debug("Will be working with %s variant only", self.load_only)
@property
- def _dictionary(self) -> Dict[str, Any]:
+ def _dictionary(self) -> dict[str, dict[str, Any]]:
"""A dictionary representing the loaded configuration."""
# NOTE: Dictionaries are not populated if not loaded. So, conditionals
# are not needed here.
@@ -270,7 +282,8 @@ class Configuration:
for section in parser.sections():
items = parser.items(section)
- self._config[variant].update(self._normalized_keys(section, items))
+ self._config[variant].setdefault(fname, {})
+ self._config[variant][fname].update(self._normalized_keys(section, items))
return parser
@@ -297,13 +310,14 @@ class Configuration:
def _load_environment_vars(self) -> None:
"""Loads configuration from environment variables"""
- self._config[kinds.ENV_VAR].update(
+ self._config[kinds.ENV_VAR].setdefault(":env:", {})
+ self._config[kinds.ENV_VAR][":env:"].update(
self._normalized_keys(":env:", self.get_environ_vars())
)
def _normalized_keys(
- self, section: str, items: Iterable[Tuple[str, Any]]
- ) -> Dict[str, Any]:
+ self, section: str, items: Iterable[tuple[str, Any]]
+ ) -> dict[str, Any]:
"""Normalizes items to construct a dictionary with normalized keys.
This routine is where the names become keys and are made the same
@@ -315,7 +329,7 @@ class Configuration:
normalized[key] = val
return normalized
- def get_environ_vars(self) -> Iterable[Tuple[str, str]]:
+ def get_environ_vars(self) -> Iterable[tuple[str, str]]:
"""Returns a generator with all environmental vars with prefix PIP_"""
for key, val in os.environ.items():
if key.startswith("PIP_"):
@@ -324,13 +338,13 @@ class Configuration:
yield name, val
# XXX: This is patched in the tests.
- def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]:
+ def iter_config_files(self) -> Iterable[tuple[Kind, list[str]]]:
"""Yields variant and configuration files associated with it.
This should be treated like items of a dictionary. The order
here doesn't affect what gets overridden. That is controlled
by OVERRIDE_ORDER. However this does control the order they are
- displayed to the user. It's probably most ergononmic to display
+ displayed to the user. It's probably most ergonomic to display
things in the same order as OVERRIDE_ORDER
"""
# SMELL: Move the conditions out of this function
@@ -356,11 +370,11 @@ class Configuration:
else:
yield kinds.ENV, []
- def get_values_in_config(self, variant: Kind) -> Dict[str, Any]:
+ def get_values_in_config(self, variant: Kind) -> dict[str, Any]:
"""Get values present in a config file"""
return self._config[variant]
- def _get_parser_to_modify(self) -> Tuple[str, RawConfigParser]:
+ def _get_parser_to_modify(self) -> tuple[str, RawConfigParser]:
# Determine which parser to modify
assert self.load_only
parsers = self._parsers[self.load_only]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc
index 678a3b27..26192d0d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc
index 47f454cf..2411fa3e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc
index b8a61a9d..283b7f9d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc
index 9f8a9604..6e961975 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc
index 4f11a00d..f37bec63 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py
index 6fb0d7b7..ea61f350 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py
@@ -1,10 +1,14 @@
-import abc
-from typing import Optional
+from __future__ import annotations
+
+import abc
+from typing import TYPE_CHECKING
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata.base import BaseDistribution
from pip._internal.req import InstallRequirement
+if TYPE_CHECKING:
+ from pip._internal.build_env import BuildEnvironmentInstaller
+
class AbstractDistribution(metaclass=abc.ABCMeta):
"""A base class for handling installable artifacts.
@@ -30,7 +34,7 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
self.req = req
@abc.abstractproperty
- def build_tracker_id(self) -> Optional[str]:
+ def build_tracker_id(self) -> str | None:
"""A string that uniquely identifies this requirement to the build tracker.
If None, then this dist has no work to do in the build tracker, and
@@ -44,7 +48,7 @@ class AbstractDistribution(metaclass=abc.ABCMeta):
@abc.abstractmethod
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ build_env_installer: BuildEnvironmentInstaller,
build_isolation: bool,
check_build_deps: bool,
) -> None:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
index ab8d53be..b6a67df2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
@@ -1,9 +1,13 @@
-from typing import Optional
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import BaseDistribution
+if TYPE_CHECKING:
+ from pip._internal.build_env import BuildEnvironmentInstaller
+
class InstalledDistribution(AbstractDistribution):
"""Represents an installed package.
@@ -13,7 +17,7 @@ class InstalledDistribution(AbstractDistribution):
"""
@property
- def build_tracker_id(self) -> Optional[str]:
+ def build_tracker_id(self) -> str | None:
return None
def get_metadata_distribution(self) -> BaseDistribution:
@@ -22,7 +26,7 @@ class InstalledDistribution(AbstractDistribution):
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ build_env_installer: BuildEnvironmentInstaller,
build_isolation: bool,
check_build_deps: bool,
) -> None:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
index 15ff42b7..e2821f89 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
@@ -1,13 +1,18 @@
+from __future__ import annotations
+
import logging
-from typing import Iterable, Optional, Set, Tuple
+from collections.abc import Iterable
+from typing import TYPE_CHECKING
from pip._internal.build_env import BuildEnvironment
from pip._internal.distributions.base import AbstractDistribution
from pip._internal.exceptions import InstallationError
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import BaseDistribution
from pip._internal.utils.subprocess import runner_with_spinner_message
+if TYPE_CHECKING:
+ from pip._internal.build_env import BuildEnvironmentInstaller
+
logger = logging.getLogger(__name__)
@@ -19,7 +24,7 @@ class SourceDistribution(AbstractDistribution):
"""
@property
- def build_tracker_id(self) -> Optional[str]:
+ def build_tracker_id(self) -> str | None:
"""Identify this requirement uniquely by its link."""
assert self.req.link
return self.req.link.url_without_fragment
@@ -29,7 +34,7 @@ class SourceDistribution(AbstractDistribution):
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ build_env_installer: BuildEnvironmentInstaller,
build_isolation: bool,
check_build_deps: bool,
) -> None:
@@ -41,7 +46,7 @@ class SourceDistribution(AbstractDistribution):
if should_isolate:
# Setup an isolated environment and install the build backend static
# requirements in it.
- self._prepare_build_backend(finder)
+ self._prepare_build_backend(build_env_installer)
# Check that if the requirement is editable, it either supports PEP 660 or
# has a setup.py or a setup.cfg. This cannot be done earlier because we need
# to setup the build backend to verify it supports build_editable, nor can
@@ -51,7 +56,7 @@ class SourceDistribution(AbstractDistribution):
# without setup.py nor setup.cfg.
self.req.isolated_editable_sanity_check()
# Install the dynamic build requirements.
- self._install_build_reqs(finder)
+ self._install_build_reqs(build_env_installer)
# Check if the current environment provides build dependencies
should_check_deps = self.req.use_pep517 and check_build_deps
if should_check_deps:
@@ -66,15 +71,17 @@ class SourceDistribution(AbstractDistribution):
self._raise_missing_reqs(missing)
self.req.prepare_metadata()
- def _prepare_build_backend(self, finder: PackageFinder) -> None:
+ def _prepare_build_backend(
+ self, build_env_installer: BuildEnvironmentInstaller
+ ) -> None:
# Isolate in a BuildEnvironment and install the build-time
# requirements.
pyproject_requires = self.req.pyproject_requires
assert pyproject_requires is not None
- self.req.build_env = BuildEnvironment()
+ self.req.build_env = BuildEnvironment(build_env_installer)
self.req.build_env.install_requirements(
- finder, pyproject_requires, "overlay", kind="build dependencies"
+ pyproject_requires, "overlay", kind="build dependencies", for_req=self.req
)
conflicting, missing = self.req.build_env.check_requirements(
self.req.requirements_to_check
@@ -110,14 +117,16 @@ class SourceDistribution(AbstractDistribution):
with backend.subprocess_runner(runner):
return backend.get_requires_for_build_editable()
- def _install_build_reqs(self, finder: PackageFinder) -> None:
+ def _install_build_reqs(
+ self, build_env_installer: BuildEnvironmentInstaller
+ ) -> None:
# Install any extra build dependencies that the backend requests.
# This must be done in a second pass, as the pyproject.toml
# dependencies must be installed before we can call the backend.
if (
self.req.editable
and self.req.permit_editable_wheels
- and self.req.supports_pyproject_editable()
+ and self.req.supports_pyproject_editable
):
build_reqs = self._get_build_requires_editable()
else:
@@ -126,11 +135,11 @@ class SourceDistribution(AbstractDistribution):
if conflicting:
self._raise_conflicts("the backend dependencies", conflicting)
self.req.build_env.install_requirements(
- finder, missing, "normal", kind="backend dependencies"
+ missing, "normal", kind="backend dependencies", for_req=self.req
)
def _raise_conflicts(
- self, conflicting_with: str, conflicting_reqs: Set[Tuple[str, str]]
+ self, conflicting_with: str, conflicting_reqs: set[tuple[str, str]]
) -> None:
format_string = (
"Some build dependencies for {requirement} "
@@ -146,7 +155,7 @@ class SourceDistribution(AbstractDistribution):
)
raise InstallationError(error_message)
- def _raise_missing_reqs(self, missing: Set[str]) -> None:
+ def _raise_missing_reqs(self, missing: set[str]) -> None:
format_string = (
"Some build dependencies for {requirement} are missing: {missing}."
)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
index eb16e25c..ee12bfad 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
@@ -1,15 +1,19 @@
-from typing import Optional
+from __future__ import annotations
+
+from typing import TYPE_CHECKING
from pip._vendor.packaging.utils import canonicalize_name
from pip._internal.distributions.base import AbstractDistribution
-from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import (
BaseDistribution,
FilesystemWheel,
get_wheel_distribution,
)
+if TYPE_CHECKING:
+ from pip._internal.build_env import BuildEnvironmentInstaller
+
class WheelDistribution(AbstractDistribution):
"""Represents a wheel distribution.
@@ -18,7 +22,7 @@ class WheelDistribution(AbstractDistribution):
"""
@property
- def build_tracker_id(self) -> Optional[str]:
+ def build_tracker_id(self) -> str | None:
return None
def get_metadata_distribution(self) -> BaseDistribution:
@@ -33,7 +37,7 @@ class WheelDistribution(AbstractDistribution):
def prepare_distribution_metadata(
self,
- finder: PackageFinder,
+ build_env_installer: BuildEnvironmentInstaller,
build_isolation: bool,
check_build_deps: bool,
) -> None:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
index 5007a622..98f95494 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
@@ -5,6 +5,8 @@ operate. This is expected to be importable from any/all files within the
subpackage and, thus, should not depend on them.
"""
+from __future__ import annotations
+
import configparser
import contextlib
import locale
@@ -12,19 +14,23 @@ import logging
import pathlib
import re
import sys
+from collections.abc import Iterator
from itertools import chain, groupby, repeat
-from typing import TYPE_CHECKING, Dict, Iterator, List, Optional, Union
+from typing import TYPE_CHECKING, Literal
-from pip._vendor.requests.models import Request, Response
+from pip._vendor.packaging.requirements import InvalidRequirement
+from pip._vendor.packaging.version import InvalidVersion
from pip._vendor.rich.console import Console, ConsoleOptions, RenderResult
from pip._vendor.rich.markup import escape
from pip._vendor.rich.text import Text
if TYPE_CHECKING:
from hashlib import _Hash
- from typing import Literal
+
+ from pip._vendor.requests.models import Request, Response
from pip._internal.metadata import BaseDistribution
+ from pip._internal.network.download import _FileDownload
from pip._internal.req.req_install import InstallRequirement
logger = logging.getLogger(__name__)
@@ -38,7 +44,7 @@ def _is_kebab_case(s: str) -> bool:
def _prefix_with_indent(
- s: Union[Text, str],
+ s: Text | str,
console: Console,
*,
prefix: str,
@@ -74,13 +80,13 @@ class DiagnosticPipError(PipError):
def __init__(
self,
*,
- kind: 'Literal["error", "warning"]' = "error",
- reference: Optional[str] = None,
- message: Union[str, Text],
- context: Optional[Union[str, Text]],
- hint_stmt: Optional[Union[str, Text]],
- note_stmt: Optional[Union[str, Text]] = None,
- link: Optional[str] = None,
+ kind: Literal["error", "warning"] = "error",
+ reference: str | None = None,
+ message: str | Text,
+ context: str | Text | None,
+ hint_stmt: str | Text | None,
+ note_stmt: str | Text | None = None,
+ link: str | None = None,
) -> None:
# Ensure a proper reference is provided.
if reference is None:
@@ -184,10 +190,6 @@ class InstallationError(PipError):
"""General exception during installation"""
-class UninstallationError(PipError):
- """General exception during uninstallation"""
-
-
class MissingPyProjectBuildRequires(DiagnosticPipError):
"""Raised when pyproject.toml has `build-system`, but no `build-system.requires`."""
@@ -233,7 +235,7 @@ class NoneMetadataError(PipError):
def __init__(
self,
- dist: "BaseDistribution",
+ dist: BaseDistribution,
metadata_name: str,
) -> None:
"""
@@ -294,8 +296,8 @@ class NetworkConnectionError(PipError):
def __init__(
self,
error_msg: str,
- response: Optional[Response] = None,
- request: Optional[Request] = None,
+ response: Response | None = None,
+ request: Request | None = None,
) -> None:
"""
Initialize NetworkConnectionError with `request` and `response`
@@ -344,7 +346,7 @@ class MetadataInconsistent(InstallationError):
"""
def __init__(
- self, ireq: "InstallRequirement", field: str, f_val: str, m_val: str
+ self, ireq: InstallRequirement, field: str, f_val: str, m_val: str
) -> None:
self.ireq = ireq
self.field = field
@@ -358,6 +360,17 @@ class MetadataInconsistent(InstallationError):
)
+class MetadataInvalid(InstallationError):
+ """Metadata is invalid."""
+
+ def __init__(self, ireq: InstallRequirement, error: str) -> None:
+ self.ireq = ireq
+ self.error = error
+
+ def __str__(self) -> str:
+ return f"Requested {self.ireq} has invalid metadata: {self.error}"
+
+
class InstallationSubprocessError(DiagnosticPipError, InstallationError):
"""A subprocess call failed."""
@@ -368,7 +381,7 @@ class InstallationSubprocessError(DiagnosticPipError, InstallationError):
*,
command_description: str,
exit_code: int,
- output_lines: Optional[List[str]],
+ output_lines: list[str] | None,
) -> None:
if output_lines is None:
output_prompt = Text("See above for output.")
@@ -422,9 +435,9 @@ class HashErrors(InstallationError):
"""Multiple HashError instances rolled into one for reporting"""
def __init__(self) -> None:
- self.errors: List["HashError"] = []
+ self.errors: list[HashError] = []
- def append(self, error: "HashError") -> None:
+ def append(self, error: HashError) -> None:
self.errors.append(error)
def __str__(self) -> str:
@@ -458,7 +471,7 @@ class HashError(InstallationError):
"""
- req: Optional["InstallRequirement"] = None
+ req: InstallRequirement | None = None
head = ""
order: int = -1
@@ -580,7 +593,7 @@ class HashMismatch(HashError):
"someone may have tampered with them."
)
- def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> None:
+ def __init__(self, allowed: dict[str, list[str]], gots: dict[str, _Hash]) -> None:
"""
:param allowed: A dict of algorithm names pointing to lists of allowed
hex digests
@@ -605,12 +618,12 @@ class HashMismatch(HashError):
"""
- def hash_then_or(hash_name: str) -> "chain[str]":
+ def hash_then_or(hash_name: str) -> chain[str]:
# For now, all the decent hashes have 6-char names, so we can get
# away with hard-coding space literals.
return chain([hash_name], repeat(" or"))
- lines: List[str] = []
+ lines: list[str] = []
for hash_name, expecteds in self.allowed.items():
prefix = hash_then_or(hash_name)
lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds)
@@ -631,8 +644,8 @@ class ConfigurationFileCouldNotBeLoaded(ConfigurationError):
def __init__(
self,
reason: str = "could not be loaded",
- fname: Optional[str] = None,
- error: Optional[configparser.Error] = None,
+ fname: str | None = None,
+ error: configparser.Error | None = None,
) -> None:
super().__init__(error)
self.reason = reason
@@ -667,7 +680,7 @@ class ExternallyManagedEnvironment(DiagnosticPipError):
reference = "externally-managed-environment"
- def __init__(self, error: Optional[str]) -> None:
+ def __init__(self, error: str | None) -> None:
if error is None:
context = Text(_DEFAULT_EXTERNALLY_MANAGED_ERROR)
else:
@@ -694,7 +707,7 @@ class ExternallyManagedEnvironment(DiagnosticPipError):
try:
category = locale.LC_MESSAGES
except AttributeError:
- lang: Optional[str] = None
+ lang: str | None = None
else:
lang, _ = locale.getlocale(category)
if lang is not None:
@@ -709,8 +722,8 @@ class ExternallyManagedEnvironment(DiagnosticPipError):
@classmethod
def from_config(
cls,
- config: Union[pathlib.Path, str],
- ) -> "ExternallyManagedEnvironment":
+ config: pathlib.Path | str,
+ ) -> ExternallyManagedEnvironment:
parser = configparser.ConfigParser(interpolation=None)
try:
parser.read(config, encoding="utf-8")
@@ -726,3 +739,143 @@ class ExternallyManagedEnvironment(DiagnosticPipError):
exc_info = logger.isEnabledFor(VERBOSE)
logger.warning("Failed to read %s", config, exc_info=exc_info)
return cls(None)
+
+
+class UninstallMissingRecord(DiagnosticPipError):
+ reference = "uninstall-no-record-file"
+
+ def __init__(self, *, distribution: BaseDistribution) -> None:
+ installer = distribution.installer
+ if not installer or installer == "pip":
+ dep = f"{distribution.raw_name}=={distribution.version}"
+ hint = Text.assemble(
+ "You might be able to recover from this via: ",
+ (f"pip install --force-reinstall --no-deps {dep}", "green"),
+ )
+ else:
+ hint = Text(
+ f"The package was installed by {installer}. "
+ "You should check if it can uninstall the package."
+ )
+
+ super().__init__(
+ message=Text(f"Cannot uninstall {distribution}"),
+ context=(
+ "The package's contents are unknown: "
+ f"no RECORD file was found for {distribution.raw_name}."
+ ),
+ hint_stmt=hint,
+ )
+
+
+class LegacyDistutilsInstall(DiagnosticPipError):
+ reference = "uninstall-distutils-installed-package"
+
+ def __init__(self, *, distribution: BaseDistribution) -> None:
+ super().__init__(
+ message=Text(f"Cannot uninstall {distribution}"),
+ context=(
+ "It is a distutils installed project and thus we cannot accurately "
+ "determine which files belong to it which would lead to only a partial "
+ "uninstall."
+ ),
+ hint_stmt=None,
+ )
+
+
+class InvalidInstalledPackage(DiagnosticPipError):
+ reference = "invalid-installed-package"
+
+ def __init__(
+ self,
+ *,
+ dist: BaseDistribution,
+ invalid_exc: InvalidRequirement | InvalidVersion,
+ ) -> None:
+ installed_location = dist.installed_location
+
+ if isinstance(invalid_exc, InvalidRequirement):
+ invalid_type = "requirement"
+ else:
+ invalid_type = "version"
+
+ super().__init__(
+ message=Text(
+ f"Cannot process installed package {dist} "
+ + (f"in {installed_location!r} " if installed_location else "")
+ + f"because it has an invalid {invalid_type}:\n{invalid_exc.args[0]}"
+ ),
+ context=(
+ "Starting with pip 24.1, packages with invalid "
+ f"{invalid_type}s can not be processed."
+ ),
+ hint_stmt="To proceed this package must be uninstalled.",
+ )
+
+
+class IncompleteDownloadError(DiagnosticPipError):
+ """Raised when the downloader receives fewer bytes than advertised
+ in the Content-Length header."""
+
+ reference = "incomplete-download"
+
+ def __init__(self, download: _FileDownload) -> None:
+ # Dodge circular import.
+ from pip._internal.utils.misc import format_size
+
+ assert download.size is not None
+ download_status = (
+ f"{format_size(download.bytes_received)}/{format_size(download.size)}"
+ )
+ if download.reattempts:
+ retry_status = f"after {download.reattempts + 1} attempts "
+ hint = "Use --resume-retries to configure resume attempt limit."
+ else:
+ # Download retrying is not enabled.
+ retry_status = ""
+ hint = "Consider using --resume-retries to enable download resumption."
+ message = Text(
+ f"Download failed {retry_status}because not enough bytes "
+ f"were received ({download_status})"
+ )
+
+ super().__init__(
+ message=message,
+ context=f"URL: {download.link.redacted_url}",
+ hint_stmt=hint,
+ note_stmt="This is an issue with network connectivity, not pip.",
+ )
+
+
+class ResolutionTooDeepError(DiagnosticPipError):
+ """Raised when the dependency resolver exceeds the maximum recursion depth."""
+
+ reference = "resolution-too-deep"
+
+ def __init__(self) -> None:
+ super().__init__(
+ message="Dependency resolution exceeded maximum depth",
+ context=(
+ "Pip cannot resolve the current dependencies as the dependency graph "
+ "is too complex for pip to solve efficiently."
+ ),
+ hint_stmt=(
+ "Try adding lower bounds to constrain your dependencies, "
+ "for example: 'package>=2.0.0' instead of just 'package'. "
+ ),
+ link="https://pip.pypa.io/en/stable/topics/dependency-resolution/#handling-resolution-too-deep-errors",
+ )
+
+
+class InstallWheelBuildError(DiagnosticPipError):
+ reference = "failed-wheel-build-for-install"
+
+ def __init__(self, failed: list[InstallRequirement]) -> None:
+ super().__init__(
+ message=(
+ "Failed to build installable wheels for some "
+ "pyproject.toml based projects"
+ ),
+ context=", ".join(r.name for r in failed), # type: ignore
+ hint_stmt=None,
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py
index 7a17b7b3..197dd757 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py
@@ -1,2 +1 @@
-"""Index interaction code
-"""
+"""Index interaction code"""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc
index 438ee914..68fa2df7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc
index 79ca22b8..db9934f0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/collector.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc
index 054e8278..6e6c11f3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc
index 1a001f68..7c3c72c9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/__pycache__/sources.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py
index 08c8bddc..00d66daa 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py
@@ -2,6 +2,8 @@
The main purpose of this module is to expose LinkCollector.collect_sources().
"""
+from __future__ import annotations
+
import collections
import email.message
import functools
@@ -11,20 +13,14 @@ import logging
import os
import urllib.parse
import urllib.request
+from collections.abc import Iterable, MutableMapping, Sequence
+from dataclasses import dataclass
from html.parser import HTMLParser
from optparse import Values
from typing import (
- TYPE_CHECKING,
Callable,
- Dict,
- Iterable,
- List,
- MutableMapping,
NamedTuple,
- Optional,
- Sequence,
- Tuple,
- Union,
+ Protocol,
)
from pip._vendor import requests
@@ -42,17 +38,12 @@ from pip._internal.vcs import vcs
from .sources import CandidatesFromPage, LinkSource, build_source
-if TYPE_CHECKING:
- from typing import Protocol
-else:
- Protocol = object
-
logger = logging.getLogger(__name__)
ResponseHeaders = MutableMapping[str, str]
-def _match_vcs_scheme(url: str) -> Optional[str]:
+def _match_vcs_scheme(url: str) -> str | None:
"""Look for VCS schemes in the URL.
Returns the matched VCS scheme, or None if there's no match.
@@ -177,7 +168,7 @@ def _get_simple_response(url: str, session: PipSession) -> Response:
return resp
-def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
+def _get_encoding_from_headers(headers: ResponseHeaders) -> str | None:
"""Determine if we have any encoding information in our headers."""
if headers and "Content-Type" in headers:
m = email.message.Message()
@@ -189,7 +180,7 @@ def _get_encoding_from_headers(headers: ResponseHeaders) -> Optional[str]:
class CacheablePageContent:
- def __init__(self, page: "IndexContent") -> None:
+ def __init__(self, page: IndexContent) -> None:
assert page.cache_link_parsing
self.page = page
@@ -201,8 +192,7 @@ class CacheablePageContent:
class ParseLinks(Protocol):
- def __call__(self, page: "IndexContent") -> Iterable[Link]:
- ...
+ def __call__(self, page: IndexContent) -> Iterable[Link]: ...
def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
@@ -212,12 +202,12 @@ def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
`page` has `page.cache_link_parsing == False`.
"""
- @functools.lru_cache(maxsize=None)
- def wrapper(cacheable_page: CacheablePageContent) -> List[Link]:
+ @functools.cache
+ def wrapper(cacheable_page: CacheablePageContent) -> list[Link]:
return list(fn(cacheable_page.page))
@functools.wraps(fn)
- def wrapper_wrapper(page: "IndexContent") -> List[Link]:
+ def wrapper_wrapper(page: IndexContent) -> list[Link]:
if page.cache_link_parsing:
return wrapper(CacheablePageContent(page))
return list(fn(page))
@@ -226,7 +216,7 @@ def with_cached_index_content(fn: ParseLinks) -> ParseLinks:
@with_cached_index_content
-def parse_links(page: "IndexContent") -> Iterable[Link]:
+def parse_links(page: IndexContent) -> Iterable[Link]:
"""
Parse a Simple API's Index Content, and yield its anchor elements as Link objects.
"""
@@ -254,29 +244,22 @@ def parse_links(page: "IndexContent") -> Iterable[Link]:
yield link
+@dataclass(frozen=True)
class IndexContent:
- """Represents one response (or page), along with its URL"""
+ """Represents one response (or page), along with its URL.
- def __init__(
- self,
- content: bytes,
- content_type: str,
- encoding: Optional[str],
- url: str,
- cache_link_parsing: bool = True,
- ) -> None:
- """
- :param encoding: the encoding to decode the given content.
- :param url: the URL from which the HTML was downloaded.
- :param cache_link_parsing: whether links parsed from this page's url
- should be cached. PyPI index urls should
- have this set to False, for example.
- """
- self.content = content
- self.content_type = content_type
- self.encoding = encoding
- self.url = url
- self.cache_link_parsing = cache_link_parsing
+ :param encoding: the encoding to decode the given content.
+ :param url: the URL from which the HTML was downloaded.
+ :param cache_link_parsing: whether links parsed from this page's url
+ should be cached. PyPI index urls should
+ have this set to False, for example.
+ """
+
+ content: bytes
+ content_type: str
+ encoding: str | None
+ url: str
+ cache_link_parsing: bool = True
def __str__(self) -> str:
return redact_auth_from_url(self.url)
@@ -292,10 +275,10 @@ class HTMLLinkParser(HTMLParser):
super().__init__(convert_charrefs=True)
self.url: str = url
- self.base_url: Optional[str] = None
- self.anchors: List[Dict[str, Optional[str]]] = []
+ self.base_url: str | None = None
+ self.anchors: list[dict[str, str | None]] = []
- def handle_starttag(self, tag: str, attrs: List[Tuple[str, Optional[str]]]) -> None:
+ def handle_starttag(self, tag: str, attrs: list[tuple[str, str | None]]) -> None:
if tag == "base" and self.base_url is None:
href = self.get_href(attrs)
if href is not None:
@@ -303,7 +286,7 @@ class HTMLLinkParser(HTMLParser):
elif tag == "a":
self.anchors.append(dict(attrs))
- def get_href(self, attrs: List[Tuple[str, Optional[str]]]) -> Optional[str]:
+ def get_href(self, attrs: list[tuple[str, str | None]]) -> str | None:
for name, value in attrs:
if name == "href":
return value
@@ -312,8 +295,8 @@ class HTMLLinkParser(HTMLParser):
def _handle_get_simple_fail(
link: Link,
- reason: Union[str, Exception],
- meth: Optional[Callable[..., None]] = None,
+ reason: str | Exception,
+ meth: Callable[..., None] | None = None,
) -> None:
if meth is None:
meth = logger.debug
@@ -333,7 +316,7 @@ def _make_index_content(
)
-def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexContent"]:
+def _get_index_content(link: Link, *, session: PipSession) -> IndexContent | None:
url = link.url.split("#", 1)[0]
# Check for VCS schemes that do not support lookup as web pages.
@@ -395,12 +378,11 @@ def _get_index_content(link: Link, *, session: PipSession) -> Optional["IndexCon
class CollectedSources(NamedTuple):
- find_links: Sequence[Optional[LinkSource]]
- index_urls: Sequence[Optional[LinkSource]]
+ find_links: Sequence[LinkSource | None]
+ index_urls: Sequence[LinkSource | None]
class LinkCollector:
-
"""
Responsible for collecting Link objects from all configured locations,
making network requests as needed.
@@ -422,7 +404,7 @@ class LinkCollector:
session: PipSession,
options: Values,
suppress_no_index: bool = False,
- ) -> "LinkCollector":
+ ) -> LinkCollector:
"""
:param session: The Session to use to make requests.
:param suppress_no_index: Whether to ignore the --no-index option
@@ -451,10 +433,10 @@ class LinkCollector:
return link_collector
@property
- def find_links(self) -> List[str]:
+ def find_links(self) -> list[str]:
return self.search_scope.find_links
- def fetch_response(self, location: Link) -> Optional[IndexContent]:
+ def fetch_response(self, location: Link) -> IndexContent | None:
"""
Fetch an HTML page containing package links.
"""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
index ec9ebc36..bc523cd4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
@@ -1,16 +1,24 @@
"""Routines related to PyPI, indexes"""
+from __future__ import annotations
+
import enum
import functools
import itertools
import logging
import re
-from typing import TYPE_CHECKING, FrozenSet, Iterable, List, Optional, Set, Tuple, Union
+from collections.abc import Iterable
+from dataclasses import dataclass
+from typing import (
+ TYPE_CHECKING,
+ Optional,
+ Union,
+)
from pip._vendor.packaging import specifiers
from pip._vendor.packaging.tags import Tag
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import _BaseVersion
+from pip._vendor.packaging.version import InvalidVersion, _BaseVersion
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import (
@@ -37,20 +45,20 @@ from pip._internal.utils.packaging import check_requires_python
from pip._internal.utils.unpacking import SUPPORTED_EXTENSIONS
if TYPE_CHECKING:
- from pip._vendor.typing_extensions import TypeGuard
+ from typing_extensions import TypeGuard
__all__ = ["FormatControl", "BestCandidateResult", "PackageFinder"]
logger = getLogger(__name__)
-BuildTag = Union[Tuple[()], Tuple[int, str]]
-CandidateSortingKey = Tuple[int, int, int, _BaseVersion, Optional[int], BuildTag]
+BuildTag = Union[tuple[()], tuple[int, str]]
+CandidateSortingKey = tuple[int, int, int, _BaseVersion, Optional[int], BuildTag]
def _check_link_requires_python(
link: Link,
- version_info: Tuple[int, int, int],
+ version_info: tuple[int, int, int],
ignore_requires_python: bool = False,
) -> bool:
"""
@@ -106,7 +114,6 @@ class LinkType(enum.Enum):
class LinkEvaluator:
-
"""
Responsible for evaluating links for a particular project.
"""
@@ -121,10 +128,10 @@ class LinkEvaluator:
self,
project_name: str,
canonical_name: str,
- formats: FrozenSet[str],
+ formats: frozenset[str],
target_python: TargetPython,
allow_yanked: bool,
- ignore_requires_python: Optional[bool] = None,
+ ignore_requires_python: bool | None = None,
) -> None:
"""
:param project_name: The user supplied package name.
@@ -154,7 +161,7 @@ class LinkEvaluator:
self.project_name = project_name
- def evaluate_link(self, link: Link) -> Tuple[LinkType, str]:
+ def evaluate_link(self, link: Link) -> tuple[LinkType, str]:
"""
Determine whether a link is a candidate for installation.
@@ -241,7 +248,19 @@ class LinkEvaluator:
ignore_requires_python=self._ignore_requires_python,
)
if not supports_python:
- reason = f"{version} Requires-Python {link.requires_python}"
+ requires_python = link.requires_python
+ if requires_python:
+
+ def get_version_sort_key(v: str) -> tuple[int, ...]:
+ return tuple(int(s) for s in v.split(".") if s.isdigit())
+
+ requires_python = ",".join(
+ sorted(
+ (str(s) for s in specifiers.SpecifierSet(requires_python)),
+ key=get_version_sort_key,
+ )
+ )
+ reason = f"{version} Requires-Python {requires_python}"
return (LinkType.requires_python_mismatch, reason)
logger.debug("Found link %s, version: %s", link, version)
@@ -250,10 +269,10 @@ class LinkEvaluator:
def filter_unallowed_hashes(
- candidates: List[InstallationCandidate],
- hashes: Optional[Hashes],
+ candidates: list[InstallationCandidate],
+ hashes: Hashes | None,
project_name: str,
-) -> List[InstallationCandidate]:
+) -> list[InstallationCandidate]:
"""
Filter out candidates whose hashes aren't allowed, and return a new
list of candidates.
@@ -323,67 +342,44 @@ def filter_unallowed_hashes(
return filtered
+@dataclass
class CandidatePreferences:
-
"""
Encapsulates some of the preferences for filtering and sorting
InstallationCandidate objects.
"""
- def __init__(
- self,
- prefer_binary: bool = False,
- allow_all_prereleases: bool = False,
- ) -> None:
- """
- :param allow_all_prereleases: Whether to allow all pre-releases.
- """
- self.allow_all_prereleases = allow_all_prereleases
- self.prefer_binary = prefer_binary
+ prefer_binary: bool = False
+ allow_all_prereleases: bool = False
+@dataclass(frozen=True)
class BestCandidateResult:
"""A collection of candidates, returned by `PackageFinder.find_best_candidate`.
This class is only intended to be instantiated by CandidateEvaluator's
`compute_best_candidate()` method.
+
+ :param all_candidates: A sequence of all available candidates found.
+ :param applicable_candidates: The applicable candidates.
+ :param best_candidate: The most preferred candidate found, or None
+ if no applicable candidates were found.
"""
- def __init__(
- self,
- candidates: List[InstallationCandidate],
- applicable_candidates: List[InstallationCandidate],
- best_candidate: Optional[InstallationCandidate],
- ) -> None:
- """
- :param candidates: A sequence of all available candidates found.
- :param applicable_candidates: The applicable candidates.
- :param best_candidate: The most preferred candidate found, or None
- if no applicable candidates were found.
- """
- assert set(applicable_candidates) <= set(candidates)
+ all_candidates: list[InstallationCandidate]
+ applicable_candidates: list[InstallationCandidate]
+ best_candidate: InstallationCandidate | None
- if best_candidate is None:
- assert not applicable_candidates
+ def __post_init__(self) -> None:
+ assert set(self.applicable_candidates) <= set(self.all_candidates)
+
+ if self.best_candidate is None:
+ assert not self.applicable_candidates
else:
- assert best_candidate in applicable_candidates
-
- self._applicable_candidates = applicable_candidates
- self._candidates = candidates
-
- self.best_candidate = best_candidate
-
- def iter_all(self) -> Iterable[InstallationCandidate]:
- """Iterate through all candidates."""
- return iter(self._candidates)
-
- def iter_applicable(self) -> Iterable[InstallationCandidate]:
- """Iterate through the applicable candidates."""
- return iter(self._applicable_candidates)
+ assert self.best_candidate in self.applicable_candidates
class CandidateEvaluator:
-
"""
Responsible for filtering and sorting candidates for installation based
on what tags are valid.
@@ -393,12 +389,12 @@ class CandidateEvaluator:
def create(
cls,
project_name: str,
- target_python: Optional[TargetPython] = None,
+ target_python: TargetPython | None = None,
prefer_binary: bool = False,
allow_all_prereleases: bool = False,
- specifier: Optional[specifiers.BaseSpecifier] = None,
- hashes: Optional[Hashes] = None,
- ) -> "CandidateEvaluator":
+ specifier: specifiers.BaseSpecifier | None = None,
+ hashes: Hashes | None = None,
+ ) -> CandidateEvaluator:
"""Create a CandidateEvaluator object.
:param target_python: The target Python interpreter to use when
@@ -428,11 +424,11 @@ class CandidateEvaluator:
def __init__(
self,
project_name: str,
- supported_tags: List[Tag],
+ supported_tags: list[Tag],
specifier: specifiers.BaseSpecifier,
prefer_binary: bool = False,
allow_all_prereleases: bool = False,
- hashes: Optional[Hashes] = None,
+ hashes: Hashes | None = None,
) -> None:
"""
:param supported_tags: The PEP 425 tags supported by the target
@@ -453,32 +449,31 @@ class CandidateEvaluator:
def get_applicable_candidates(
self,
- candidates: List[InstallationCandidate],
- ) -> List[InstallationCandidate]:
+ candidates: list[InstallationCandidate],
+ ) -> list[InstallationCandidate]:
"""
Return the applicable candidates from a list of candidates.
"""
# Using None infers from the specifier instead.
allow_prereleases = self._allow_all_prereleases or None
specifier = self._specifier
- versions = {
- str(v)
- for v in specifier.filter(
- # We turn the version object into a str here because otherwise
- # when we're debundled but setuptools isn't, Python will see
- # packaging.version.Version and
- # pkg_resources._vendor.packaging.version.Version as different
- # types. This way we'll use a str as a common data interchange
- # format. If we stop using the pkg_resources provided specifier
- # and start using our own, we can drop the cast to str().
- (str(c.version) for c in candidates),
+
+ # We turn the version object into a str here because otherwise
+ # when we're debundled but setuptools isn't, Python will see
+ # packaging.version.Version and
+ # pkg_resources._vendor.packaging.version.Version as different
+ # types. This way we'll use a str as a common data interchange
+ # format. If we stop using the pkg_resources provided specifier
+ # and start using our own, we can drop the cast to str().
+ candidates_and_versions = [(c, str(c.version)) for c in candidates]
+ versions = set(
+ specifier.filter(
+ (v for _, v in candidates_and_versions),
prereleases=allow_prereleases,
)
- }
-
- # Again, converting version to str to deal with debundling.
- applicable_candidates = [c for c in candidates if str(c.version) in versions]
+ )
+ applicable_candidates = [c for c, v in candidates_and_versions if v in versions]
filtered_applicable_candidates = filter_unallowed_hashes(
candidates=applicable_candidates,
hashes=self._hashes,
@@ -538,11 +533,7 @@ class CandidateEvaluator:
)
if self._prefer_binary:
binary_preference = 1
- if wheel.build_tag is not None:
- match = re.match(r"^(\d+)(.*)$", wheel.build_tag)
- assert match is not None, "guaranteed by filename validation"
- build_tag_groups = match.groups()
- build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
+ build_tag = wheel.build_tag
else: # sdist
pri = -(support_num)
has_allowed_hash = int(link.is_hash_allowed(self._hashes))
@@ -558,8 +549,8 @@ class CandidateEvaluator:
def sort_best_candidate(
self,
- candidates: List[InstallationCandidate],
- ) -> Optional[InstallationCandidate]:
+ candidates: list[InstallationCandidate],
+ ) -> InstallationCandidate | None:
"""
Return the best candidate per the instance's sort order, or None if
no candidate is acceptable.
@@ -571,7 +562,7 @@ class CandidateEvaluator:
def compute_best_candidate(
self,
- candidates: List[InstallationCandidate],
+ candidates: list[InstallationCandidate],
) -> BestCandidateResult:
"""
Compute and return a `BestCandidateResult` instance.
@@ -599,9 +590,9 @@ class PackageFinder:
link_collector: LinkCollector,
target_python: TargetPython,
allow_yanked: bool,
- format_control: Optional[FormatControl] = None,
- candidate_prefs: Optional[CandidatePreferences] = None,
- ignore_requires_python: Optional[bool] = None,
+ format_control: FormatControl | None = None,
+ candidate_prefs: CandidatePreferences | None = None,
+ ignore_requires_python: bool | None = None,
) -> None:
"""
This constructor is primarily meant to be used by the create() class
@@ -627,7 +618,14 @@ class PackageFinder:
self.format_control = format_control
# These are boring links that have already been logged somehow.
- self._logged_links: Set[Tuple[Link, LinkType, str]] = set()
+ self._logged_links: set[tuple[Link, LinkType, str]] = set()
+
+ # Cache of the result of finding candidates
+ self._all_candidates: dict[str, list[InstallationCandidate]] = {}
+ self._best_candidates: dict[
+ tuple[str, specifiers.BaseSpecifier | None, Hashes | None],
+ BestCandidateResult,
+ ] = {}
# Don't include an allow_yanked default value to make sure each call
# site considers whether yanked releases are allowed. This also causes
@@ -638,8 +636,8 @@ class PackageFinder:
cls,
link_collector: LinkCollector,
selection_prefs: SelectionPreferences,
- target_python: Optional[TargetPython] = None,
- ) -> "PackageFinder":
+ target_python: TargetPython | None = None,
+ ) -> PackageFinder:
"""Create a PackageFinder.
:param selection_prefs: The candidate selection preferences, as a
@@ -678,18 +676,36 @@ class PackageFinder:
self._link_collector.search_scope = search_scope
@property
- def find_links(self) -> List[str]:
+ def find_links(self) -> list[str]:
return self._link_collector.find_links
@property
- def index_urls(self) -> List[str]:
+ def index_urls(self) -> list[str]:
return self.search_scope.index_urls
+ @property
+ def proxy(self) -> str | None:
+ return self._link_collector.session.pip_proxy
+
@property
def trusted_hosts(self) -> Iterable[str]:
for host_port in self._link_collector.session.pip_trusted_origins:
yield build_netloc(*host_port)
+ @property
+ def custom_cert(self) -> str | None:
+ # session.verify is either a boolean (use default bundle/no SSL
+ # verification) or a string path to a custom CA bundle to use. We only
+ # care about the latter.
+ verify = self._link_collector.session.verify
+ return verify if isinstance(verify, str) else None
+
+ @property
+ def client_cert(self) -> str | None:
+ cert = self._link_collector.session.cert
+ assert not isinstance(cert, tuple), "pip only supports PEM client certs"
+ return cert
+
@property
def allow_all_prereleases(self) -> bool:
return self._candidate_prefs.allow_all_prereleases
@@ -704,7 +720,7 @@ class PackageFinder:
def set_prefer_binary(self) -> None:
self._candidate_prefs.prefer_binary = True
- def requires_python_skipped_reasons(self) -> List[str]:
+ def requires_python_skipped_reasons(self) -> list[str]:
reasons = {
detail
for _, result, detail in self._logged_links
@@ -725,13 +741,13 @@ class PackageFinder:
ignore_requires_python=self._ignore_requires_python,
)
- def _sort_links(self, links: Iterable[Link]) -> List[Link]:
+ def _sort_links(self, links: Iterable[Link]) -> list[Link]:
"""
Returns elements of links in order, non-egg links first, egg links
second, while eliminating duplicates
"""
eggs, no_eggs = [], []
- seen: Set[Link] = set()
+ seen: set[Link] = set()
for link in links:
if link not in seen:
seen.add(link)
@@ -751,7 +767,7 @@ class PackageFinder:
def get_install_candidate(
self, link_evaluator: LinkEvaluator, link: Link
- ) -> Optional[InstallationCandidate]:
+ ) -> InstallationCandidate | None:
"""
If the link is a candidate for install, convert it to an
InstallationCandidate and return it. Otherwise, return None.
@@ -761,15 +777,18 @@ class PackageFinder:
self._log_skipped_link(link, result, detail)
return None
- return InstallationCandidate(
- name=link_evaluator.project_name,
- link=link,
- version=detail,
- )
+ try:
+ return InstallationCandidate(
+ name=link_evaluator.project_name,
+ link=link,
+ version=detail,
+ )
+ except InvalidVersion:
+ return None
def evaluate_links(
self, link_evaluator: LinkEvaluator, links: Iterable[Link]
- ) -> List[InstallationCandidate]:
+ ) -> list[InstallationCandidate]:
"""
Convert links that are candidates to InstallationCandidate objects.
"""
@@ -783,7 +802,7 @@ class PackageFinder:
def process_project_url(
self, project_url: Link, link_evaluator: LinkEvaluator
- ) -> List[InstallationCandidate]:
+ ) -> list[InstallationCandidate]:
logger.debug(
"Fetching project page and analyzing links: %s",
project_url,
@@ -802,8 +821,7 @@ class PackageFinder:
return package_links
- @functools.lru_cache(maxsize=None)
- def find_all_candidates(self, project_name: str) -> List[InstallationCandidate]:
+ def find_all_candidates(self, project_name: str) -> list[InstallationCandidate]:
"""Find all available InstallationCandidate for project_name
This checks index_urls and find_links.
@@ -812,6 +830,9 @@ class PackageFinder:
See LinkEvaluator.evaluate_link() for details on which files
are accepted.
"""
+ if project_name in self._all_candidates:
+ return self._all_candidates[project_name]
+
link_evaluator = self.make_link_evaluator(project_name)
collected_sources = self._link_collector.collect_sources(
@@ -853,13 +874,15 @@ class PackageFinder:
logger.debug("Local files found: %s", ", ".join(paths))
# This is an intentional priority ordering
- return file_candidates + page_candidates
+ self._all_candidates[project_name] = file_candidates + page_candidates
+
+ return self._all_candidates[project_name]
def make_candidate_evaluator(
self,
project_name: str,
- specifier: Optional[specifiers.BaseSpecifier] = None,
- hashes: Optional[Hashes] = None,
+ specifier: specifiers.BaseSpecifier | None = None,
+ hashes: Hashes | None = None,
) -> CandidateEvaluator:
"""Create a CandidateEvaluator object to use."""
candidate_prefs = self._candidate_prefs
@@ -872,12 +895,11 @@ class PackageFinder:
hashes=hashes,
)
- @functools.lru_cache(maxsize=None)
def find_best_candidate(
self,
project_name: str,
- specifier: Optional[specifiers.BaseSpecifier] = None,
- hashes: Optional[Hashes] = None,
+ specifier: specifiers.BaseSpecifier | None = None,
+ hashes: Hashes | None = None,
) -> BestCandidateResult:
"""Find matches for the given project and specifier.
@@ -887,32 +909,42 @@ class PackageFinder:
:return: A `BestCandidateResult` instance.
"""
+ if (project_name, specifier, hashes) in self._best_candidates:
+ return self._best_candidates[project_name, specifier, hashes]
+
candidates = self.find_all_candidates(project_name)
candidate_evaluator = self.make_candidate_evaluator(
project_name=project_name,
specifier=specifier,
hashes=hashes,
)
- return candidate_evaluator.compute_best_candidate(candidates)
+ self._best_candidates[project_name, specifier, hashes] = (
+ candidate_evaluator.compute_best_candidate(candidates)
+ )
+
+ return self._best_candidates[project_name, specifier, hashes]
def find_requirement(
self, req: InstallRequirement, upgrade: bool
- ) -> Optional[InstallationCandidate]:
+ ) -> InstallationCandidate | None:
"""Try to find a Link matching req
Expects req, an InstallRequirement and upgrade, a boolean
Returns a InstallationCandidate if found,
Raises DistributionNotFound or BestVersionAlreadyInstalled otherwise
"""
+ name = req.name
+ assert name is not None, "find_requirement() called with no name"
+
hashes = req.hashes(trust_internet=False)
best_candidate_result = self.find_best_candidate(
- req.name,
+ name,
specifier=req.specifier,
hashes=hashes,
)
best_candidate = best_candidate_result.best_candidate
- installed_version: Optional[_BaseVersion] = None
+ installed_version: _BaseVersion | None = None
if req.satisfied_by is not None:
installed_version = req.satisfied_by.version
@@ -936,14 +968,14 @@ class PackageFinder:
"Could not find a version that satisfies the requirement %s "
"(from versions: %s)",
req,
- _format_versions(best_candidate_result.iter_all()),
+ _format_versions(best_candidate_result.all_candidates),
)
raise DistributionNotFound(f"No matching distribution found for {req}")
def _should_install_candidate(
- candidate: Optional[InstallationCandidate],
- ) -> "TypeGuard[InstallationCandidate]":
+ candidate: InstallationCandidate | None,
+ ) -> TypeGuard[InstallationCandidate]:
if installed_version is None:
return True
if best_candidate is None:
@@ -970,7 +1002,7 @@ class PackageFinder:
logger.debug(
"Using version %s (newest of versions: %s)",
best_candidate.version,
- _format_versions(best_candidate_result.iter_applicable()),
+ _format_versions(best_candidate_result.applicable_candidates),
)
return best_candidate
@@ -978,7 +1010,7 @@ class PackageFinder:
logger.debug(
"Installed version (%s) is most up-to-date (past versions: %s)",
installed_version,
- _format_versions(best_candidate_result.iter_applicable()),
+ _format_versions(best_candidate_result.applicable_candidates),
)
raise BestVersionAlreadyInstalled
@@ -1009,7 +1041,7 @@ def _find_name_version_sep(fragment: str, canonical_name: str) -> int:
raise ValueError(f"{fragment} does not match {canonical_name}")
-def _extract_version_from_fragment(fragment: str, canonical_name: str) -> Optional[str]:
+def _extract_version_from_fragment(fragment: str, canonical_name: str) -> str | None:
"""Parse the version string from a + filename
"fragment" (stem) or egg fragment.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py
index f4626d71..c67c4d73 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py
@@ -1,12 +1,14 @@
+from __future__ import annotations
+
import logging
import mimetypes
import os
from collections import defaultdict
-from typing import Callable, Dict, Iterable, List, Optional, Tuple
+from collections.abc import Iterable
+from typing import Callable
from pip._vendor.packaging.utils import (
InvalidSdistFilename,
- InvalidVersion,
InvalidWheelFilename,
canonicalize_name,
parse_sdist_filename,
@@ -28,7 +30,7 @@ PageValidator = Callable[[Link], bool]
class LinkSource:
@property
- def link(self) -> Optional[Link]:
+ def link(self) -> Link | None:
"""Returns the underlying link, if there's one."""
raise NotImplementedError()
@@ -50,8 +52,8 @@ class _FlatDirectoryToUrls:
def __init__(self, path: str) -> None:
self._path = path
- self._page_candidates: List[str] = []
- self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list)
+ self._page_candidates: list[str] = []
+ self._project_name_to_urls: dict[str, list[str]] = defaultdict(list)
self._scanned_directory = False
def _scan_directory(self) -> None:
@@ -68,24 +70,24 @@ class _FlatDirectoryToUrls:
# otherwise not worth considering as a package
try:
project_filename = parse_wheel_filename(entry.name)[0]
- except (InvalidWheelFilename, InvalidVersion):
+ except InvalidWheelFilename:
try:
project_filename = parse_sdist_filename(entry.name)[0]
- except (InvalidSdistFilename, InvalidVersion):
+ except InvalidSdistFilename:
continue
self._project_name_to_urls[project_filename].append(url)
self._scanned_directory = True
@property
- def page_candidates(self) -> List[str]:
+ def page_candidates(self) -> list[str]:
if not self._scanned_directory:
self._scan_directory()
return self._page_candidates
@property
- def project_name_to_urls(self) -> Dict[str, List[str]]:
+ def project_name_to_urls(self) -> dict[str, list[str]]:
if not self._scanned_directory:
self._scan_directory()
@@ -101,7 +103,7 @@ class _FlatDirectorySource(LinkSource):
* ``file_candidates``: Archives in the directory.
"""
- _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {}
+ _paths_to_urls: dict[str, _FlatDirectoryToUrls] = {}
def __init__(
self,
@@ -120,7 +122,7 @@ class _FlatDirectorySource(LinkSource):
self._paths_to_urls[path] = self._path_to_urls
@property
- def link(self) -> Optional[Link]:
+ def link(self) -> Link | None:
return None
def page_candidates(self) -> FoundCandidates:
@@ -151,7 +153,7 @@ class _LocalFileSource(LinkSource):
self._link = link
@property
- def link(self) -> Optional[Link]:
+ def link(self) -> Link | None:
return self._link
def page_candidates(self) -> FoundCandidates:
@@ -185,7 +187,7 @@ class _RemoteFileSource(LinkSource):
self._link = link
@property
- def link(self) -> Optional[Link]:
+ def link(self) -> Link | None:
return self._link
def page_candidates(self) -> FoundCandidates:
@@ -213,7 +215,7 @@ class _IndexDirectorySource(LinkSource):
self._link = link
@property
- def link(self) -> Optional[Link]:
+ def link(self) -> Link | None:
return self._link
def page_candidates(self) -> FoundCandidates:
@@ -231,9 +233,9 @@ def build_source(
expand_dir: bool,
cache_link_parsing: bool,
project_name: str,
-) -> Tuple[Optional[str], Optional[LinkSource]]:
- path: Optional[str] = None
- url: Optional[str] = None
+) -> tuple[str | None, LinkSource | None]:
+ path: str | None = None
+ url: str | None = None
if os.path.exists(location): # Is a local path.
url = path_to_url(location)
path = location
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py
index d54bc63e..9f2c4fe3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py
@@ -1,10 +1,12 @@
+from __future__ import annotations
+
import functools
import logging
import os
import pathlib
import sys
import sysconfig
-from typing import Any, Dict, Generator, Optional, Tuple
+from typing import Any
from pip._internal.models.scheme import SCHEME_KEYS, Scheme
from pip._internal.utils.compat import WINDOWS
@@ -87,7 +89,7 @@ def _looks_like_bpo_44860() -> bool:
return unix_user_platlib == "$usersite"
-def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool:
+def _looks_like_red_hat_patched_platlib_purelib(scheme: dict[str, str]) -> bool:
platlib = scheme["platlib"]
if "/$platlibdir/" in platlib:
platlib = platlib.replace("/$platlibdir/", f"/{_PLATLIBDIR}/")
@@ -97,7 +99,7 @@ def _looks_like_red_hat_patched_platlib_purelib(scheme: Dict[str, str]) -> bool:
return unpatched.replace("$platbase/", "$base/") == scheme["purelib"]
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _looks_like_red_hat_lib() -> bool:
"""Red Hat patches platlib in unix_prefix and unix_home, but not purelib.
@@ -112,7 +114,7 @@ def _looks_like_red_hat_lib() -> bool:
)
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _looks_like_debian_scheme() -> bool:
"""Debian adds two additional schemes."""
from distutils.command.install import INSTALL_SCHEMES
@@ -120,7 +122,7 @@ def _looks_like_debian_scheme() -> bool:
return "deb_system" in INSTALL_SCHEMES and "unix_local" in INSTALL_SCHEMES
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _looks_like_red_hat_scheme() -> bool:
"""Red Hat patches ``sys.prefix`` and ``sys.exec_prefix``.
@@ -140,7 +142,7 @@ def _looks_like_red_hat_scheme() -> bool:
)
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _looks_like_slackware_scheme() -> bool:
"""Slackware patches sysconfig but fails to patch distutils and site.
@@ -156,7 +158,7 @@ def _looks_like_slackware_scheme() -> bool:
return "/lib64/" in paths["purelib"] and "/lib64/" not in user_site
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _looks_like_msys2_mingw_scheme() -> bool:
"""MSYS2 patches distutils and sysconfig to use a UNIX-like scheme.
@@ -174,23 +176,7 @@ def _looks_like_msys2_mingw_scheme() -> bool:
)
-def _fix_abiflags(parts: Tuple[str]) -> Generator[str, None, None]:
- ldversion = sysconfig.get_config_var("LDVERSION")
- abiflags = getattr(sys, "abiflags", None)
-
- # LDVERSION does not end with sys.abiflags. Just return the path unchanged.
- if not ldversion or not abiflags or not ldversion.endswith(abiflags):
- yield from parts
- return
-
- # Strip sys.abiflags from LDVERSION-based path components.
- for part in parts:
- if part.endswith(ldversion):
- part = part[: (0 - len(abiflags))]
- yield part
-
-
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _warn_mismatched(old: pathlib.Path, new: pathlib.Path, *, key: str) -> None:
issue_url = "https://github.com/pypa/pip/issues/10151"
message = (
@@ -208,13 +194,13 @@ def _warn_if_mismatch(old: pathlib.Path, new: pathlib.Path, *, key: str) -> bool
return True
-@functools.lru_cache(maxsize=None)
+@functools.cache
def _log_context(
*,
user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
- prefix: Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
+ prefix: str | None = None,
) -> None:
parts = [
"Additional context:",
@@ -230,10 +216,10 @@ def _log_context(
def get_scheme(
dist_name: str,
user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
isolated: bool = False,
- prefix: Optional[str] = None,
+ prefix: str | None = None,
) -> Scheme:
new = _sysconfig.get_scheme(
dist_name,
@@ -297,14 +283,13 @@ def get_scheme(
continue
# On Python 3.9+, sysconfig's posix_user scheme sets platlib against
- # sys.platlibdir, but distutils's unix_user incorrectly coninutes
+ # sys.platlibdir, but distutils's unix_user incorrectly continues
# using the same $usersite for both platlib and purelib. This creates a
# mismatch when sys.platlibdir is not "lib".
skip_bpo_44860 = (
user
and k == "platlib"
and not WINDOWS
- and sys.version_info >= (3, 9)
and _PLATLIBDIR != "lib"
and _looks_like_bpo_44860()
)
@@ -336,17 +321,6 @@ def get_scheme(
if skip_linux_system_special_case:
continue
- # On Python 3.7 and earlier, sysconfig does not include sys.abiflags in
- # the "pythonX.Y" part of the path, but distutils does.
- skip_sysconfig_abiflag_bug = (
- sys.version_info < (3, 8)
- and not WINDOWS
- and k in ("headers", "platlib", "purelib")
- and tuple(_fix_abiflags(old_v.parts)) == new_v.parts
- )
- if skip_sysconfig_abiflag_bug:
- continue
-
# MSYS2 MINGW's sysconfig patch does not include the "site-packages"
# part of the path. This is incorrect and will be fixed in MSYS.
skip_msys2_mingw_bug = (
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc
index a51bb81e..bbbc016f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc
index 0b46ad45..6de16226 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc
index d81ebf8d..ae6f8d00 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc
index 4dbd5341..bb9d9d4e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
index 0e18c6e1..28c066bc 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
@@ -9,6 +9,8 @@
#
# See https://github.com/pypa/pip/issues/8761 for the original discussion and
# rationale for why this is done within pip.
+from __future__ import annotations
+
try:
__import__("_distutils_hack").remove_shim()
except (ImportError, AttributeError):
@@ -21,7 +23,6 @@ from distutils.cmd import Command as DistutilsCommand
from distutils.command.install import SCHEME_KEYS
from distutils.command.install import install as distutils_install_command
from distutils.sysconfig import get_python_lib
-from typing import Dict, List, Optional, Union, cast
from pip._internal.models.scheme import Scheme
from pip._internal.utils.compat import WINDOWS
@@ -35,19 +36,19 @@ logger = logging.getLogger(__name__)
def distutils_scheme(
dist_name: str,
user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
isolated: bool = False,
- prefix: Optional[str] = None,
+ prefix: str | None = None,
*,
ignore_config_files: bool = False,
-) -> Dict[str, str]:
+) -> dict[str, str]:
"""
Return a distutils install scheme
"""
from distutils.dist import Distribution
- dist_args: Dict[str, Union[str, List[str]]] = {"name": dist_name}
+ dist_args: dict[str, str | list[str]] = {"name": dist_name}
if isolated:
dist_args["script_args"] = ["--no-user-cfg"]
@@ -61,10 +62,10 @@ def distutils_scheme(
"Ignore distutils configs in %s due to encoding errors.",
", ".join(os.path.basename(p) for p in paths),
)
- obj: Optional[DistutilsCommand] = None
+ obj: DistutilsCommand | None = None
obj = d.get_command_obj("install", create=True)
assert obj is not None
- i = cast(distutils_install_command, obj)
+ i: distutils_install_command = obj
# NOTE: setting user or home has the side-effect of creating the home dir
# or user base for installations during finalize_options()
# ideally, we'd prefer a scheme class that has no side-effects.
@@ -78,7 +79,7 @@ def distutils_scheme(
i.root = root or i.root
i.finalize_options()
- scheme = {}
+ scheme: dict[str, str] = {}
for key in SCHEME_KEYS:
scheme[key] = getattr(i, "install_" + key)
@@ -115,10 +116,10 @@ def distutils_scheme(
def get_scheme(
dist_name: str,
user: bool = False,
- home: Optional[str] = None,
- root: Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
isolated: bool = False,
- prefix: Optional[str] = None,
+ prefix: str | None = None,
) -> Scheme:
"""
Get the "scheme" corresponding to the input parameters. The distutils
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py
index 97aef1f1..d4a448ec 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py
@@ -1,8 +1,9 @@
+from __future__ import annotations
+
import logging
import os
import sys
import sysconfig
-import typing
from pip._internal.exceptions import InvalidSchemeCombination, UserInstallationInvalid
from pip._internal.models.scheme import SCHEME_KEYS, Scheme
@@ -124,10 +125,10 @@ if sysconfig.get_config_var("userbase") is not None:
def get_scheme(
dist_name: str,
user: bool = False,
- home: typing.Optional[str] = None,
- root: typing.Optional[str] = None,
+ home: str | None = None,
+ root: str | None = None,
isolated: bool = False,
- prefix: typing.Optional[str] = None,
+ prefix: str | None = None,
) -> Scheme:
"""
Get the "scheme" corresponding to the input parameters.
@@ -192,9 +193,10 @@ def get_scheme(
data=paths["data"],
)
if root is not None:
+ converted_keys = {}
for key in SCHEME_KEYS:
- value = change_root(root, getattr(scheme, key))
- setattr(scheme, key, value)
+ converted_keys[key] = change_root(root, getattr(scheme, key))
+ scheme = Scheme(**converted_keys)
return scheme
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py
index 3f9f896e..17cd0e87 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py
@@ -1,9 +1,10 @@
+from __future__ import annotations
+
import functools
import os
import site
import sys
import sysconfig
-import typing
from pip._internal.exceptions import InstallationError
from pip._internal.utils import appdirs
@@ -71,11 +72,11 @@ def get_src_prefix() -> str:
try:
# Use getusersitepackages if this is present, as it ensures that the
# value is initialised properly.
- user_site: typing.Optional[str] = site.getusersitepackages()
+ user_site: str | None = site.getusersitepackages()
except AttributeError:
user_site = site.USER_SITE
-@functools.lru_cache(maxsize=None)
+@functools.cache
def is_osx_framework() -> bool:
return bool(sysconfig.get_config_var("PYTHONFRAMEWORK"))
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/main.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/main.py
index 33c6d24c..ec52c4e0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/main.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/main.py
@@ -1,7 +1,7 @@
-from typing import List, Optional
+from __future__ import annotations
-def main(args: Optional[List[str]] = None) -> int:
+def main(args: list[str] | None = None) -> int:
"""This is preserved for old console scripts that may still be referencing
it.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py
index aa232b6c..927e375c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py
@@ -1,18 +1,16 @@
+from __future__ import annotations
+
import contextlib
import functools
import os
import sys
-from typing import TYPE_CHECKING, List, Optional, Type, cast
+from typing import Literal, Protocol, cast
+from pip._internal.utils.deprecation import deprecated
from pip._internal.utils.misc import strtobool
from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel
-if TYPE_CHECKING:
- from typing import Literal, Protocol
-else:
- Protocol = object
-
__all__ = [
"BaseDistribution",
"BaseEnvironment",
@@ -30,37 +28,75 @@ def _should_use_importlib_metadata() -> bool:
"""Whether to use the ``importlib.metadata`` or ``pkg_resources`` backend.
By default, pip uses ``importlib.metadata`` on Python 3.11+, and
- ``pkg_resourcess`` otherwise. This can be overridden by a couple of ways:
+ ``pkg_resources`` otherwise. Up to Python 3.13, This can be
+ overridden by a couple of ways:
* If environment variable ``_PIP_USE_IMPORTLIB_METADATA`` is set, it
- dictates whether ``importlib.metadata`` is used, regardless of Python
- version.
- * On Python 3.11+, Python distributors can patch ``importlib.metadata``
- to add a global constant ``_PIP_USE_IMPORTLIB_METADATA = False``. This
- makes pip use ``pkg_resources`` (unless the user set the aforementioned
- environment variable to *True*).
+ dictates whether ``importlib.metadata`` is used, for Python <3.14.
+ * On Python 3.11, 3.12 and 3.13, Python distributors can patch
+ ``importlib.metadata`` to add a global constant
+ ``_PIP_USE_IMPORTLIB_METADATA = False``. This makes pip use
+ ``pkg_resources`` (unless the user set the aforementioned environment
+ variable to *True*).
+
+ On Python 3.14+, the ``pkg_resources`` backend cannot be used.
"""
+ if sys.version_info >= (3, 14):
+ # On Python >=3.14 we only support importlib.metadata.
+ return True
with contextlib.suppress(KeyError, ValueError):
+ # On Python <3.14, if the environment variable is set, we obey what it says.
return bool(strtobool(os.environ["_PIP_USE_IMPORTLIB_METADATA"]))
if sys.version_info < (3, 11):
+ # On Python <3.11, we always use pkg_resources, unless the environment
+ # variable was set.
return False
+ # On Python 3.11, 3.12 and 3.13, we check if the global constant is set.
import importlib.metadata
return bool(getattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA", True))
+def _emit_pkg_resources_deprecation_if_needed() -> None:
+ if sys.version_info < (3, 11):
+ # All pip versions supporting Python<=3.11 will support pkg_resources,
+ # and pkg_resources is the default for these, so let's not bother users.
+ return
+
+ import importlib.metadata
+
+ if hasattr(importlib.metadata, "_PIP_USE_IMPORTLIB_METADATA"):
+ # The Python distributor has set the global constant, so we don't
+ # warn, since it is not a user decision.
+ return
+
+ # The user has decided to use pkg_resources, so we warn.
+ deprecated(
+ reason="Using the pkg_resources metadata backend is deprecated.",
+ replacement=(
+ "to use the default importlib.metadata backend, "
+ "by unsetting the _PIP_USE_IMPORTLIB_METADATA environment variable"
+ ),
+ gone_in="26.3",
+ issue=13317,
+ )
+
+
class Backend(Protocol):
- NAME: 'Literal["importlib", "pkg_resources"]'
- Distribution: Type[BaseDistribution]
- Environment: Type[BaseEnvironment]
+ NAME: Literal["importlib", "pkg_resources"]
+ Distribution: type[BaseDistribution]
+ Environment: type[BaseEnvironment]
-@functools.lru_cache(maxsize=None)
+@functools.cache
def select_backend() -> Backend:
if _should_use_importlib_metadata():
from . import importlib
return cast(Backend, importlib)
+
+ _emit_pkg_resources_deprecation_if_needed()
+
from . import pkg_resources
return cast(Backend, pkg_resources)
@@ -71,12 +107,12 @@ def get_default_environment() -> BaseEnvironment:
This returns an Environment instance from the chosen backend. The default
Environment instance should be built from ``sys.path`` and may use caching
- to share instance state accorss calls.
+ to share instance state across calls.
"""
return select_backend().Environment.default()
-def get_environment(paths: Optional[List[str]]) -> BaseEnvironment:
+def get_environment(paths: list[str] | None) -> BaseEnvironment:
"""Get a representation of the environment specified by ``paths``.
This returns an Environment instance from the chosen backend based on the
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc
index 91c7dd50..d4796a72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc
index 51b71473..cb082715 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc
index 5a4a1a7c..920409b8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc
index a158b35d..7d5cb1a2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py
index 27362fc7..b39ac054 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py
@@ -1,8 +1,9 @@
# Extracted from https://github.com/pfmoore/pkg_metadata
+from __future__ import annotations
from email.header import Header, decode_header, make_header
from email.message import Message
-from typing import Any, Dict, List, Union
+from typing import Any, cast
METADATA_FIELDS = [
# Name, Multiple-Use
@@ -23,6 +24,8 @@ METADATA_FIELDS = [
("Maintainer", False),
("Maintainer-email", False),
("License", False),
+ ("License-Expression", False),
+ ("License-File", True),
("Classifier", True),
("Requires-Dist", True),
("Requires-Python", False),
@@ -38,10 +41,10 @@ def json_name(field: str) -> str:
return field.lower().replace("-", "_")
-def msg_to_json(msg: Message) -> Dict[str, Any]:
+def msg_to_json(msg: Message) -> dict[str, Any]:
"""Convert a Message object into a JSON-compatible dictionary."""
- def sanitise_header(h: Union[Header, str]) -> str:
+ def sanitise_header(h: Header | str) -> str:
if isinstance(h, Header):
chunks = []
for bytes, encoding in decode_header(h):
@@ -63,7 +66,7 @@ def msg_to_json(msg: Message) -> Dict[str, Any]:
continue
key = json_name(field)
if multi:
- value: Union[str, List[str]] = [
+ value: str | list[str] = [
sanitise_header(v) for v in msg.get_all(field) # type: ignore
]
else:
@@ -77,7 +80,7 @@ def msg_to_json(msg: Message) -> Dict[str, Any]:
value = value.split()
result[key] = value
- payload = msg.get_payload()
+ payload = cast(str, msg.get_payload())
if payload:
result["description"] = payload
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py
index 92491244..230e1147 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import csv
import email.message
import functools
@@ -6,26 +8,19 @@ import logging
import pathlib
import re
import zipfile
+from collections.abc import Collection, Container, Iterable, Iterator
from typing import (
IO,
- TYPE_CHECKING,
Any,
- Collection,
- Container,
- Dict,
- Iterable,
- Iterator,
- List,
NamedTuple,
- Optional,
- Tuple,
+ Protocol,
Union,
)
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion, Version
+from pip._vendor.packaging.version import Version
from pip._internal.exceptions import NoneMetadataError
from pip._internal.locations import site_packages, user_site
@@ -41,13 +36,6 @@ from pip._internal.utils.urls import url_to_path
from ._json import msg_to_json
-if TYPE_CHECKING:
- from typing import Protocol
-else:
- Protocol = object
-
-DistributionVersion = Union[LegacyVersion, Version]
-
InfoPath = Union[str, pathlib.PurePath]
logger = logging.getLogger(__name__)
@@ -68,8 +56,8 @@ class BaseEntryPoint(Protocol):
def _convert_installed_files_path(
- entry: Tuple[str, ...],
- info: Tuple[str, ...],
+ entry: tuple[str, ...],
+ info: tuple[str, ...],
) -> str:
"""Convert a legacy installed-files.txt path into modern RECORD path.
@@ -105,7 +93,7 @@ class RequiresEntry(NamedTuple):
class BaseDistribution(Protocol):
@classmethod
- def from_directory(cls, directory: str) -> "BaseDistribution":
+ def from_directory(cls, directory: str) -> BaseDistribution:
"""Load the distribution from a metadata directory.
:param directory: Path to a metadata directory, e.g. ``.dist-info``.
@@ -118,7 +106,7 @@ class BaseDistribution(Protocol):
metadata_contents: bytes,
filename: str,
project_name: str,
- ) -> "BaseDistribution":
+ ) -> BaseDistribution:
"""Load the distribution from the contents of a METADATA file.
This is used to implement PEP 658 by generating a "shallow" dist object that can
@@ -131,7 +119,7 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
@classmethod
- def from_wheel(cls, wheel: "Wheel", name: str) -> "BaseDistribution":
+ def from_wheel(cls, wheel: Wheel, name: str) -> BaseDistribution:
"""Load the distribution from a given wheel.
:param wheel: A concrete wheel definition.
@@ -145,13 +133,13 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
def __repr__(self) -> str:
- return f"{self.raw_name} {self.version} ({self.location})"
+ return f"{self.raw_name} {self.raw_version} ({self.location})"
def __str__(self) -> str:
- return f"{self.raw_name} {self.version}"
+ return f"{self.raw_name} {self.raw_version}"
@property
- def location(self) -> Optional[str]:
+ def location(self) -> str | None:
"""Where the distribution is loaded from.
A string value is not necessarily a filesystem path, since distributions
@@ -165,7 +153,7 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
@property
- def editable_project_location(self) -> Optional[str]:
+ def editable_project_location(self) -> str | None:
"""The project location for editable distributions.
This is the directory where pyproject.toml or setup.py is located.
@@ -187,7 +175,7 @@ class BaseDistribution(Protocol):
return None
@property
- def installed_location(self) -> Optional[str]:
+ def installed_location(self) -> str | None:
"""The distribution's "installed" location.
This should generally be a ``site-packages`` directory. This is
@@ -200,7 +188,7 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
@property
- def info_location(self) -> Optional[str]:
+ def info_location(self) -> str | None:
"""Location of the .[egg|dist]-info directory or file.
Similarly to ``location``, a string value is not necessarily a
@@ -238,7 +226,9 @@ class BaseDistribution(Protocol):
location = self.location
if not location:
return False
- return location.endswith(".egg")
+ # XXX if the distribution is a zipped egg, location has a trailing /
+ # so we resort to pathlib.Path to check the suffix in a reliable way.
+ return pathlib.Path(location).suffix == ".egg"
@property
def installed_with_setuptools_egg_info(self) -> bool:
@@ -279,7 +269,11 @@ class BaseDistribution(Protocol):
raise NotImplementedError()
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
+ raise NotImplementedError()
+
+ @property
+ def raw_version(self) -> str:
raise NotImplementedError()
@property
@@ -291,7 +285,7 @@ class BaseDistribution(Protocol):
return self.raw_name.replace("-", "_")
@property
- def direct_url(self) -> Optional[DirectUrl]:
+ def direct_url(self) -> DirectUrl | None:
"""Obtain a DirectUrl from this distribution.
Returns None if the distribution has no `direct_url.json` metadata,
@@ -385,15 +379,7 @@ class BaseDistribution(Protocol):
def _metadata_impl(self) -> email.message.Message:
raise NotImplementedError()
- @functools.lru_cache(maxsize=1)
- def _metadata_cached(self) -> email.message.Message:
- # When we drop python 3.7 support, move this to the metadata property and use
- # functools.cached_property instead of lru_cache.
- metadata = self._metadata_impl()
- self._add_egg_info_requires(metadata)
- return metadata
-
- @property
+ @functools.cached_property
def metadata(self) -> email.message.Message:
"""Metadata of distribution parsed from e.g. METADATA or PKG-INFO.
@@ -402,10 +388,12 @@ class BaseDistribution(Protocol):
:raises NoneMetadataError: If the metadata file is available, but does
not contain valid metadata.
"""
- return self._metadata_cached()
+ metadata = self._metadata_impl()
+ self._add_egg_info_requires(metadata)
+ return metadata
@property
- def metadata_dict(self) -> Dict[str, Any]:
+ def metadata_dict(self) -> dict[str, Any]:
"""PEP 566 compliant JSON-serializable representation of METADATA or PKG-INFO.
This should return an empty dict if the metadata file is unavailable.
@@ -416,7 +404,7 @@ class BaseDistribution(Protocol):
return msg_to_json(self.metadata)
@property
- def metadata_version(self) -> Optional[str]:
+ def metadata_version(self) -> str | None:
"""Value of "Metadata-Version:" in distribution metadata, if available."""
return self.metadata.get("Metadata-Version")
@@ -454,28 +442,23 @@ class BaseDistribution(Protocol):
"""
raise NotImplementedError()
- def iter_provided_extras(self) -> Iterable[str]:
+ def iter_raw_dependencies(self) -> Iterable[str]:
+ """Raw Requires-Dist metadata."""
+ return self.metadata.get_all("Requires-Dist", [])
+
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
"""Extras provided by this distribution.
For modern .dist-info distributions, this is the collection of
"Provides-Extra:" entries in distribution metadata.
- The return value of this function is not particularly useful other than
- display purposes due to backward compatibility issues and the extra
- names being poorly normalized prior to PEP 685. If you want to perform
- logic operations on extras, use :func:`is_extra_provided` instead.
+ The return value of this function is expected to be normalised names,
+ per PEP 685, with the returned value being handled appropriately by
+ `iter_dependencies`.
"""
raise NotImplementedError()
- def is_extra_provided(self, extra: str) -> bool:
- """Check whether an extra is provided by this distribution.
-
- This is needed mostly for compatibility issues with pkg_resources not
- following the extra normalization rules defined in PEP 685.
- """
- raise NotImplementedError()
-
- def _iter_declared_entries_from_record(self) -> Optional[Iterator[str]]:
+ def _iter_declared_entries_from_record(self) -> Iterator[str] | None:
try:
text = self.read_text("RECORD")
except FileNotFoundError:
@@ -483,7 +466,7 @@ class BaseDistribution(Protocol):
# This extra Path-str cast normalizes entries.
return (str(pathlib.Path(row[0])) for row in csv.reader(text.splitlines()))
- def _iter_declared_entries_from_legacy(self) -> Optional[Iterator[str]]:
+ def _iter_declared_entries_from_legacy(self) -> Iterator[str] | None:
try:
text = self.read_text("installed-files.txt")
except FileNotFoundError:
@@ -504,7 +487,7 @@ class BaseDistribution(Protocol):
for p in paths
)
- def iter_declared_entries(self) -> Optional[Iterator[str]]:
+ def iter_declared_entries(self) -> Iterator[str] | None:
"""Iterate through file entries declared in this distribution.
For modern .dist-info distributions, this is the files listed in the
@@ -597,14 +580,14 @@ class BaseEnvironment:
"""An environment containing distributions to introspect."""
@classmethod
- def default(cls) -> "BaseEnvironment":
+ def default(cls) -> BaseEnvironment:
raise NotImplementedError()
@classmethod
- def from_paths(cls, paths: Optional[List[str]]) -> "BaseEnvironment":
+ def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
raise NotImplementedError()
- def get_distribution(self, name: str) -> Optional["BaseDistribution"]:
+ def get_distribution(self, name: str) -> BaseDistribution | None:
"""Given a requirement name, return the installed distributions.
The name may not be normalized. The implementation must canonicalize
@@ -612,7 +595,7 @@ class BaseEnvironment:
"""
raise NotImplementedError()
- def _iter_distributions(self) -> Iterator["BaseDistribution"]:
+ def _iter_distributions(self) -> Iterator[BaseDistribution]:
"""Iterate through installed distributions.
This function should be implemented by subclass, but never called
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc
index a0f43b6f..7fb573b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc
index 2146a4db..9e753935 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc
index 3b3d1c76..39f17ae3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc
index 1d70f8b5..5825fa48 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py
index 593bff23..7de614d7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py
@@ -1,5 +1,10 @@
+from __future__ import annotations
+
import importlib.metadata
-from typing import Any, Optional, Protocol, cast
+import os
+from typing import Any, Protocol, cast
+
+from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
class BadMetadata(ValueError):
@@ -27,11 +32,11 @@ class BasePath(Protocol):
raise NotImplementedError()
@property
- def parent(self) -> "BasePath":
+ def parent(self) -> BasePath:
raise NotImplementedError()
-def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]:
+def get_info_location(d: importlib.metadata.Distribution) -> BasePath | None:
"""Find the path to the distribution's metadata directory.
HACK: This relies on importlib.metadata's private ``_path`` attribute. Not
@@ -43,13 +48,40 @@ def get_info_location(d: importlib.metadata.Distribution) -> Optional[BasePath]:
return getattr(d, "_path", None)
-def get_dist_name(dist: importlib.metadata.Distribution) -> str:
- """Get the distribution's project name.
+def parse_name_and_version_from_info_directory(
+ dist: importlib.metadata.Distribution,
+) -> tuple[str | None, str | None]:
+ """Get a name and version from the metadata directory name.
+
+ This is much faster than reading distribution metadata.
+ """
+ info_location = get_info_location(dist)
+ if info_location is None:
+ return None, None
+
+ stem, suffix = os.path.splitext(info_location.name)
+ if suffix == ".dist-info":
+ name, sep, version = stem.partition("-")
+ if sep:
+ return name, version
+
+ if suffix == ".egg-info":
+ name = stem.split("-", 1)[0]
+ return name, None
+
+ return None, None
+
+
+def get_dist_canonical_name(dist: importlib.metadata.Distribution) -> NormalizedName:
+ """Get the distribution's normalized name.
The ``name`` attribute is only available in Python 3.10 or later. We are
targeting exactly that, but Mypy does not know this.
"""
+ if name := parse_name_and_version_from_info_directory(dist)[0]:
+ return canonicalize_name(name)
+
name = cast(Any, dist).name
if not isinstance(name, str):
raise BadMetadata(dist, reason="invalid metadata entry 'name'")
- return name
+ return canonicalize_name(name)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py
index 26370fac..97363af9 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py
@@ -1,36 +1,37 @@
+from __future__ import annotations
+
import email.message
import importlib.metadata
-import os
import pathlib
import zipfile
+from collections.abc import Collection, Iterable, Iterator, Mapping, Sequence
+from os import PathLike
from typing import (
- Collection,
- Dict,
- Iterable,
- Iterator,
- Mapping,
- Optional,
- Sequence,
cast,
)
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import InvalidWheel, UnsupportedWheel
from pip._internal.metadata.base import (
BaseDistribution,
BaseEntryPoint,
- DistributionVersion,
InfoPath,
Wheel,
)
from pip._internal.utils.misc import normalize_path
+from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.temp_dir import TempDirectory
from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file
-from ._compat import BasePath, get_dist_name
+from ._compat import (
+ BasePath,
+ get_dist_canonical_name,
+ parse_name_and_version_from_info_directory,
+)
class WheelDistribution(importlib.metadata.Distribution):
@@ -58,7 +59,7 @@ class WheelDistribution(importlib.metadata.Distribution):
zf: zipfile.ZipFile,
name: str,
location: str,
- ) -> "WheelDistribution":
+ ) -> WheelDistribution:
info_dir, _ = parse_wheel(zf, name)
paths = (
(name, pathlib.PurePosixPath(name.split("/", 1)[-1]))
@@ -78,7 +79,7 @@ class WheelDistribution(importlib.metadata.Distribution):
return iter(self._files)
raise FileNotFoundError(path)
- def read_text(self, filename: str) -> Optional[str]:
+ def read_text(self, filename: str) -> str | None:
try:
data = self._files[pathlib.PurePosixPath(filename)]
except KeyError:
@@ -91,13 +92,18 @@ class WheelDistribution(importlib.metadata.Distribution):
raise UnsupportedWheel(error)
return text
+ def locate_file(self, path: str | PathLike[str]) -> pathlib.Path:
+ # This method doesn't make sense for our in-memory wheel, but the API
+ # requires us to define it.
+ raise NotImplementedError
+
class Distribution(BaseDistribution):
def __init__(
self,
dist: importlib.metadata.Distribution,
- info_location: Optional[BasePath],
- installed_location: Optional[BasePath],
+ info_location: BasePath | None,
+ installed_location: BasePath | None,
) -> None:
self._dist = dist
self._info_location = info_location
@@ -133,49 +139,40 @@ class Distribution(BaseDistribution):
dist = WheelDistribution.from_zipfile(zf, name, wheel.location)
except zipfile.BadZipFile as e:
raise InvalidWheel(wheel.location, name) from e
- except UnsupportedWheel as e:
- raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
return cls(dist, dist.info_location, pathlib.PurePosixPath(wheel.location))
@property
- def location(self) -> Optional[str]:
+ def location(self) -> str | None:
if self._info_location is None:
return None
return str(self._info_location.parent)
@property
- def info_location(self) -> Optional[str]:
+ def info_location(self) -> str | None:
if self._info_location is None:
return None
return str(self._info_location)
@property
- def installed_location(self) -> Optional[str]:
+ def installed_location(self) -> str | None:
if self._installed_location is None:
return None
return normalize_path(str(self._installed_location))
- def _get_dist_name_from_location(self) -> Optional[str]:
- """Try to get the name from the metadata directory name.
-
- This is much faster than reading metadata.
- """
- if self._info_location is None:
- return None
- stem, suffix = os.path.splitext(self._info_location.name)
- if suffix not in (".dist-info", ".egg-info"):
- return None
- return stem.split("-", 1)[0]
-
@property
def canonical_name(self) -> NormalizedName:
- name = self._get_dist_name_from_location() or get_dist_name(self._dist)
- return canonicalize_name(name)
+ return get_dist_canonical_name(self._dist)
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
+ if version := parse_name_and_version_from_info_directory(self._dist)[1]:
+ return parse_version(version)
return parse_version(self._dist.version)
+ @property
+ def raw_version(self) -> str:
+ return self._dist.version
+
def is_file(self, path: InfoPath) -> bool:
return self._dist.read_text(str(path)) is not None
@@ -195,7 +192,7 @@ class Distribution(BaseDistribution):
return content
def iter_entry_points(self) -> Iterable[BaseEntryPoint]:
- # importlib.metadata's EntryPoint structure sasitfies BaseEntryPoint.
+ # importlib.metadata's EntryPoint structure satisfies BaseEntryPoint.
return self._dist.entry_points
def _metadata_impl(self) -> email.message.Message:
@@ -206,19 +203,18 @@ class Distribution(BaseDistribution):
# until upstream can improve the protocol. (python/cpython#94952)
return cast(email.message.Message, self._dist.metadata)
- def iter_provided_extras(self) -> Iterable[str]:
- return self.metadata.get_all("Provides-Extra", [])
-
- def is_extra_provided(self, extra: str) -> bool:
- return any(
- canonicalize_name(provided_extra) == canonicalize_name(extra)
- for provided_extra in self.metadata.get_all("Provides-Extra", [])
- )
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
+ return [
+ canonicalize_name(extra)
+ for extra in self.metadata.get_all("Provides-Extra", [])
+ ]
def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
- contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras]
+ contexts: Sequence[dict[str, str]] = [{"extra": e} for e in extras]
for req_string in self.metadata.get_all("Requires-Dist", []):
- req = Requirement(req_string)
+ # strip() because email.message.Message.get_all() may return a leading \n
+ # in case a long header was wrapped.
+ req = get_requirement(req_string.strip())
if not req.marker:
yield req
elif not extras and req.marker.evaluate({"extra": ""}):
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py
index 048dc55d..71a73b73 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py
@@ -1,21 +1,25 @@
-import functools
+from __future__ import annotations
+
import importlib.metadata
import logging
import os
import pathlib
import sys
import zipfile
-import zipimport
-from typing import Iterator, List, Optional, Sequence, Set, Tuple
+from collections.abc import Iterator, Sequence
+from typing import Optional
-from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.utils import (
+ InvalidWheelFilename,
+ NormalizedName,
+ canonicalize_name,
+ parse_wheel_filename,
+)
from pip._internal.metadata.base import BaseDistribution, BaseEnvironment
-from pip._internal.models.wheel import Wheel
-from pip._internal.utils.deprecation import deprecated
from pip._internal.utils.filetypes import WHEEL_EXTENSION
-from ._compat import BadMetadata, BasePath, get_dist_name, get_info_location
+from ._compat import BadMetadata, BasePath, get_dist_canonical_name, get_info_location
from ._dists import Distribution
logger = logging.getLogger(__name__)
@@ -26,7 +30,9 @@ def _looks_like_wheel(location: str) -> bool:
return False
if not os.path.isfile(location):
return False
- if not Wheel.wheel_file_re.match(os.path.basename(location)):
+ try:
+ parse_wheel_filename(os.path.basename(location))
+ except InvalidWheelFilename:
return False
return zipfile.is_zipfile(location)
@@ -44,10 +50,10 @@ class _DistributionFinder:
installations as well. It's useful feature, after all.
"""
- FoundResult = Tuple[importlib.metadata.Distribution, Optional[BasePath]]
+ FoundResult = tuple[importlib.metadata.Distribution, Optional[BasePath]]
def __init__(self) -> None:
- self._found_names: Set[NormalizedName] = set()
+ self._found_names: set[NormalizedName] = set()
def _find_impl(self, location: str) -> Iterator[FoundResult]:
"""Find distributions in a location."""
@@ -61,14 +67,13 @@ class _DistributionFinder:
for dist in importlib.metadata.distributions(path=[location]):
info_location = get_info_location(dist)
try:
- raw_name = get_dist_name(dist)
+ name = get_dist_canonical_name(dist)
except BadMetadata as e:
logger.warning("Skipping %s due to %s", info_location, e.reason)
continue
- normalized_name = canonicalize_name(raw_name)
- if normalized_name in self._found_names:
+ if name in self._found_names:
continue
- self._found_names.add(normalized_name)
+ self._found_names.add(name)
yield dist, info_location
def find(self, location: str) -> Iterator[BaseDistribution]:
@@ -78,12 +83,12 @@ class _DistributionFinder:
"""
for dist, info_location in self._find_impl(location):
if info_location is None:
- installed_location: Optional[BasePath] = None
+ installed_location: BasePath | None = None
else:
installed_location = info_location.parent
yield Distribution(dist, info_location, installed_location)
- def find_linked(self, location: str) -> Iterator[BaseDistribution]:
+ def find_legacy_editables(self, location: str) -> Iterator[BaseDistribution]:
"""Read location in egg-link files and return distributions in there.
The path should be a directory; otherwise this returns nothing. This
@@ -107,54 +112,6 @@ class _DistributionFinder:
for dist, info_location in self._find_impl(target_location):
yield Distribution(dist, info_location, path)
- def _find_eggs_in_dir(self, location: str) -> Iterator[BaseDistribution]:
- from pip._vendor.pkg_resources import find_distributions
-
- from pip._internal.metadata import pkg_resources as legacy
-
- with os.scandir(location) as it:
- for entry in it:
- if not entry.name.endswith(".egg"):
- continue
- for dist in find_distributions(entry.path):
- yield legacy.Distribution(dist)
-
- def _find_eggs_in_zip(self, location: str) -> Iterator[BaseDistribution]:
- from pip._vendor.pkg_resources import find_eggs_in_zip
-
- from pip._internal.metadata import pkg_resources as legacy
-
- try:
- importer = zipimport.zipimporter(location)
- except zipimport.ZipImportError:
- return
- for dist in find_eggs_in_zip(importer, location):
- yield legacy.Distribution(dist)
-
- def find_eggs(self, location: str) -> Iterator[BaseDistribution]:
- """Find eggs in a location.
-
- This actually uses the old *pkg_resources* backend. We likely want to
- deprecate this so we can eventually remove the *pkg_resources*
- dependency entirely. Before that, this should first emit a deprecation
- warning for some versions when using the fallback since importing
- *pkg_resources* is slow for those who don't need it.
- """
- if os.path.isdir(location):
- yield from self._find_eggs_in_dir(location)
- if zipfile.is_zipfile(location):
- yield from self._find_eggs_in_zip(location)
-
-
-@functools.lru_cache(maxsize=None) # Warn a distribution exactly once.
-def _emit_egg_deprecation(location: Optional[str]) -> None:
- deprecated(
- reason=f"Loading egg at {location} is deprecated.",
- replacement="to use pip for package installation.",
- gone_in="24.3",
- issue=12330,
- )
-
class Environment(BaseEnvironment):
def __init__(self, paths: Sequence[str]) -> None:
@@ -165,7 +122,7 @@ class Environment(BaseEnvironment):
return cls(sys.path)
@classmethod
- def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
+ def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
if paths is None:
return cls(sys.path)
return cls(paths)
@@ -174,16 +131,13 @@ class Environment(BaseEnvironment):
finder = _DistributionFinder()
for location in self._paths:
yield from finder.find(location)
- for dist in finder.find_eggs(location):
- _emit_egg_deprecation(dist.location)
- yield dist
- # This must go last because that's how pkg_resources tie-breaks.
- yield from finder.find_linked(location)
+ yield from finder.find_legacy_editables(location)
- def get_distribution(self, name: str) -> Optional[BaseDistribution]:
+ def get_distribution(self, name: str) -> BaseDistribution | None:
+ canonical_name = canonicalize_name(name)
matches = (
distribution
for distribution in self.iter_all_distributions()
- if distribution.canonical_name == canonicalize_name(name)
+ if distribution.canonical_name == canonical_name
)
return next(matches, None)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
index bb11e5bd..89fce8b6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
@@ -1,13 +1,19 @@
+from __future__ import annotations
+
import email.message
import email.parser
import logging
import os
import zipfile
-from typing import Collection, Iterable, Iterator, List, Mapping, NamedTuple, Optional
+from collections.abc import Collection, Iterable, Iterator, Mapping
+from typing import (
+ NamedTuple,
+)
from pip._vendor import pkg_resources
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.exceptions import InvalidWheel, NoneMetadataError, UnsupportedWheel
@@ -19,7 +25,6 @@ from .base import (
BaseDistribution,
BaseEntryPoint,
BaseEnvironment,
- DistributionVersion,
InfoPath,
Wheel,
)
@@ -65,7 +70,7 @@ class InMemoryMetadata:
def metadata_isdir(self, name: str) -> bool:
return False
- def metadata_listdir(self, name: str) -> List[str]:
+ def metadata_listdir(self, name: str) -> list[str]:
return []
def run_script(self, script_name: str, namespace: str) -> None:
@@ -75,6 +80,18 @@ class InMemoryMetadata:
class Distribution(BaseDistribution):
def __init__(self, dist: pkg_resources.Distribution) -> None:
self._dist = dist
+ # This is populated lazily, to avoid loading metadata for all possible
+ # distributions eagerly.
+ self.__extra_mapping: Mapping[NormalizedName, str] | None = None
+
+ @property
+ def _extra_mapping(self) -> Mapping[NormalizedName, str]:
+ if self.__extra_mapping is None:
+ self.__extra_mapping = {
+ canonicalize_name(extra): extra for extra in self._dist.extras
+ }
+
+ return self.__extra_mapping
@classmethod
def from_directory(cls, directory: str) -> BaseDistribution:
@@ -135,11 +152,11 @@ class Distribution(BaseDistribution):
return cls(dist)
@property
- def location(self) -> Optional[str]:
+ def location(self) -> str | None:
return self._dist.location
@property
- def installed_location(self) -> Optional[str]:
+ def installed_location(self) -> str | None:
egg_link = egg_link_path_from_location(self.raw_name)
if egg_link:
location = egg_link
@@ -150,7 +167,7 @@ class Distribution(BaseDistribution):
return normalize_path(location)
@property
- def info_location(self) -> Optional[str]:
+ def info_location(self) -> str | None:
return self._dist.egg_info
@property
@@ -168,9 +185,13 @@ class Distribution(BaseDistribution):
return canonicalize_name(self._dist.project_name)
@property
- def version(self) -> DistributionVersion:
+ def version(self) -> Version:
return parse_version(self._dist.version)
+ @property
+ def raw_version(self) -> str:
+ return self._dist.version
+
def is_file(self, path: InfoPath) -> bool:
return self._dist.has_metadata(str(path))
@@ -215,16 +236,15 @@ class Distribution(BaseDistribution):
return feed_parser.close()
def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]:
- if extras: # pkg_resources raises on invalid extras, so we sanitize.
- extras = frozenset(pkg_resources.safe_extra(e) for e in extras)
- extras = extras.intersection(self._dist.extras)
+ if extras:
+ relevant_extras = set(self._extra_mapping) & set(
+ map(canonicalize_name, extras)
+ )
+ extras = [self._extra_mapping[extra] for extra in relevant_extras]
return self._dist.requires(extras)
- def iter_provided_extras(self) -> Iterable[str]:
- return self._dist.extras
-
- def is_extra_provided(self, extra: str) -> bool:
- return pkg_resources.safe_extra(extra) in self._dist.extras
+ def iter_provided_extras(self) -> Iterable[NormalizedName]:
+ return self._extra_mapping.keys()
class Environment(BaseEnvironment):
@@ -236,14 +256,14 @@ class Environment(BaseEnvironment):
return cls(pkg_resources.working_set)
@classmethod
- def from_paths(cls, paths: Optional[List[str]]) -> BaseEnvironment:
+ def from_paths(cls, paths: list[str] | None) -> BaseEnvironment:
return cls(pkg_resources.WorkingSet(paths))
def _iter_distributions(self) -> Iterator[BaseDistribution]:
for dist in self._ws:
yield Distribution(dist)
- def _search_distribution(self, name: str) -> Optional[BaseDistribution]:
+ def _search_distribution(self, name: str) -> BaseDistribution | None:
"""Find a distribution matching the ``name`` in the environment.
This searches from *all* distributions available in the environment, to
@@ -255,7 +275,7 @@ class Environment(BaseEnvironment):
return dist
return None
- def get_distribution(self, name: str) -> Optional[BaseDistribution]:
+ def get_distribution(self, name: str) -> BaseDistribution | None:
# Search the distribution by looking through the working set.
dist = self._search_distribution(name)
if dist:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py
index 7855226e..7b1fc295 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py
@@ -1,2 +1 @@
-"""A package that contains models that represent entities.
-"""
+"""A package that contains models that represent entities."""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc
index 9304f46a..9a27ceb7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc
index 591fbc40..7329e4bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/candidate.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc
index dedfa3ff..6434cc07 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc
index ba37014b..cd4fc13a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/format_control.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc
index 481bcf9d..c3f1281d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/index.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc
index 029fe4ae..be73b24a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc
index 4eae0c8a..1d4ae73b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/link.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc
new file mode 100644
index 00000000..0643940c
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/pylock.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc
index a9468512..bf398cdb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/scheme.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc
index 5462bc5a..15c635da 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc
index aaeb938c..1f01a379 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc
index 52e1d083..2647b539 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/target_python.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc
index 5e7d41eb..bd7707ca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py
index 9184a902..f27f2831 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py
@@ -1,30 +1,25 @@
+from dataclasses import dataclass
+
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._internal.models.link import Link
-from pip._internal.utils.models import KeyBasedCompareMixin
-class InstallationCandidate(KeyBasedCompareMixin):
+@dataclass(frozen=True)
+class InstallationCandidate:
"""Represents a potential "candidate" for installation."""
__slots__ = ["name", "version", "link"]
+ name: str
+ version: Version
+ link: Link
+
def __init__(self, name: str, version: str, link: Link) -> None:
- self.name = name
- self.version = parse_version(version)
- self.link = link
-
- super().__init__(
- key=(self.name, self.version, self.link),
- defining_class=InstallationCandidate,
- )
-
- def __repr__(self) -> str:
- return "".format(
- self.name,
- self.version,
- self.link,
- )
+ object.__setattr__(self, "name", name)
+ object.__setattr__(self, "version", parse_version(version))
+ object.__setattr__(self, "link", link)
def __str__(self) -> str:
return f"{self.name!r} candidate (version {self.version} at {self.link})"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
index 0af884bd..aefc670c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
@@ -1,8 +1,13 @@
-""" PEP 610 """
+"""PEP 610"""
+
+from __future__ import annotations
+
import json
import re
import urllib.parse
-from typing import Any, Dict, Iterable, Optional, Type, TypeVar, Union
+from collections.abc import Iterable
+from dataclasses import dataclass
+from typing import Any, ClassVar, TypeVar, Union
__all__ = [
"DirectUrl",
@@ -23,8 +28,8 @@ class DirectUrlValidationError(Exception):
def _get(
- d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
-) -> Optional[T]:
+ d: dict[str, Any], expected_type: type[T], key: str, default: T | None = None
+) -> T | None:
"""Get value from dictionary and verify expected type."""
if key not in d:
return default
@@ -37,7 +42,7 @@ def _get(
def _get_required(
- d: Dict[str, Any], expected_type: Type[T], key: str, default: Optional[T] = None
+ d: dict[str, Any], expected_type: type[T], key: str, default: T | None = None
) -> T:
value = _get(d, expected_type, key, default)
if value is None:
@@ -45,7 +50,7 @@ def _get_required(
return value
-def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType":
+def _exactly_one_of(infos: Iterable[InfoType | None]) -> InfoType:
infos = [info for info in infos if info is not None]
if not infos:
raise DirectUrlValidationError(
@@ -59,26 +64,21 @@ def _exactly_one_of(infos: Iterable[Optional["InfoType"]]) -> "InfoType":
return infos[0]
-def _filter_none(**kwargs: Any) -> Dict[str, Any]:
+def _filter_none(**kwargs: Any) -> dict[str, Any]:
"""Make dict excluding None values."""
return {k: v for k, v in kwargs.items() if v is not None}
+@dataclass
class VcsInfo:
- name = "vcs_info"
+ name: ClassVar = "vcs_info"
- def __init__(
- self,
- vcs: str,
- commit_id: str,
- requested_revision: Optional[str] = None,
- ) -> None:
- self.vcs = vcs
- self.requested_revision = requested_revision
- self.commit_id = commit_id
+ vcs: str
+ commit_id: str
+ requested_revision: str | None = None
@classmethod
- def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["VcsInfo"]:
+ def _from_dict(cls, d: dict[str, Any] | None) -> VcsInfo | None:
if d is None:
return None
return cls(
@@ -87,7 +87,7 @@ class VcsInfo:
requested_revision=_get(d, str, "requested_revision"),
)
- def _to_dict(self) -> Dict[str, Any]:
+ def _to_dict(self) -> dict[str, Any]:
return _filter_none(
vcs=self.vcs,
requested_revision=self.requested_revision,
@@ -100,19 +100,19 @@ class ArchiveInfo:
def __init__(
self,
- hash: Optional[str] = None,
- hashes: Optional[Dict[str, str]] = None,
+ hash: str | None = None,
+ hashes: dict[str, str] | None = None,
) -> None:
# set hashes before hash, since the hash setter will further populate hashes
self.hashes = hashes
self.hash = hash
@property
- def hash(self) -> Optional[str]:
+ def hash(self) -> str | None:
return self._hash
@hash.setter
- def hash(self, value: Optional[str]) -> None:
+ def hash(self, value: str | None) -> None:
if value is not None:
# Auto-populate the hashes key to upgrade to the new format automatically.
# We don't back-populate the legacy hash key from hashes.
@@ -130,47 +130,39 @@ class ArchiveInfo:
self._hash = value
@classmethod
- def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["ArchiveInfo"]:
+ def _from_dict(cls, d: dict[str, Any] | None) -> ArchiveInfo | None:
if d is None:
return None
return cls(hash=_get(d, str, "hash"), hashes=_get(d, dict, "hashes"))
- def _to_dict(self) -> Dict[str, Any]:
+ def _to_dict(self) -> dict[str, Any]:
return _filter_none(hash=self.hash, hashes=self.hashes)
+@dataclass
class DirInfo:
- name = "dir_info"
+ name: ClassVar = "dir_info"
- def __init__(
- self,
- editable: bool = False,
- ) -> None:
- self.editable = editable
+ editable: bool = False
@classmethod
- def _from_dict(cls, d: Optional[Dict[str, Any]]) -> Optional["DirInfo"]:
+ def _from_dict(cls, d: dict[str, Any] | None) -> DirInfo | None:
if d is None:
return None
return cls(editable=_get_required(d, bool, "editable", default=False))
- def _to_dict(self) -> Dict[str, Any]:
+ def _to_dict(self) -> dict[str, Any]:
return _filter_none(editable=self.editable or None)
InfoType = Union[ArchiveInfo, DirInfo, VcsInfo]
+@dataclass
class DirectUrl:
- def __init__(
- self,
- url: str,
- info: InfoType,
- subdirectory: Optional[str] = None,
- ) -> None:
- self.url = url
- self.info = info
- self.subdirectory = subdirectory
+ url: str
+ info: InfoType
+ subdirectory: str | None = None
def _remove_auth_from_netloc(self, netloc: str) -> str:
if "@" not in netloc:
@@ -203,7 +195,7 @@ class DirectUrl:
self.from_dict(self.to_dict())
@classmethod
- def from_dict(cls, d: Dict[str, Any]) -> "DirectUrl":
+ def from_dict(cls, d: dict[str, Any]) -> DirectUrl:
return DirectUrl(
url=_get_required(d, str, "url"),
subdirectory=_get(d, str, "subdirectory"),
@@ -216,7 +208,7 @@ class DirectUrl:
),
)
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
res = _filter_none(
url=self.redacted_url,
subdirectory=self.subdirectory,
@@ -225,7 +217,7 @@ class DirectUrl:
return res
@classmethod
- def from_json(cls, s: str) -> "DirectUrl":
+ def from_json(cls, s: str) -> DirectUrl:
return cls.from_dict(json.loads(s))
def to_json(self) -> str:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py
index ccd11272..9f07e3f3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py
@@ -1,4 +1,4 @@
-from typing import FrozenSet, Optional, Set
+from __future__ import annotations
from pip._vendor.packaging.utils import canonicalize_name
@@ -12,8 +12,8 @@ class FormatControl:
def __init__(
self,
- no_binary: Optional[Set[str]] = None,
- only_binary: Optional[Set[str]] = None,
+ no_binary: set[str] | None = None,
+ only_binary: set[str] | None = None,
) -> None:
if no_binary is None:
no_binary = set()
@@ -36,7 +36,7 @@ class FormatControl:
return f"{self.__class__.__name__}({self.no_binary}, {self.only_binary})"
@staticmethod
- def handle_mutual_excludes(value: str, target: Set[str], other: Set[str]) -> None:
+ def handle_mutual_excludes(value: str, target: set[str], other: set[str]) -> None:
if value.startswith("-"):
raise CommandError(
"--no-binary / --only-binary option requires 1 argument."
@@ -58,7 +58,7 @@ class FormatControl:
other.discard(name)
target.add(name)
- def get_allowed_formats(self, canonical_name: str) -> FrozenSet[str]:
+ def get_allowed_formats(self, canonical_name: str) -> frozenset[str]:
result = {"binary", "source"}
if canonical_name in self.only_binary:
result.discard("source")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
index b9c6330d..3e8e9683 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
@@ -1,4 +1,5 @@
-from typing import Any, Dict, Sequence
+from collections.abc import Sequence
+from typing import Any
from pip._vendor.packaging.markers import default_environment
@@ -11,7 +12,7 @@ class InstallationReport:
self._install_requirements = install_requirements
@classmethod
- def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]:
+ def _install_req_to_dict(cls, ireq: InstallRequirement) -> dict[str, Any]:
assert ireq.download_info, f"No download_info for {ireq}"
res = {
# PEP 610 json for the download URL. download_info.archive_info.hashes may
@@ -39,7 +40,7 @@ class InstallationReport:
res["requested_extras"] = sorted(ireq.extras)
return res
- def to_dict(self) -> Dict[str, Any]:
+ def to_dict(self) -> dict[str, Any]:
return {
"version": "1",
"pip_version": __version__,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/link.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/link.py
index 73041b86..2e2c0f83 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/link.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import functools
import itertools
import logging
@@ -5,17 +7,12 @@ import os
import posixpath
import re
import urllib.parse
+from collections.abc import Mapping
from dataclasses import dataclass
from typing import (
TYPE_CHECKING,
Any,
- Dict,
- List,
- Mapping,
NamedTuple,
- Optional,
- Tuple,
- Union,
)
from pip._internal.utils.deprecation import deprecated
@@ -27,7 +24,6 @@ from pip._internal.utils.misc import (
split_auth_from_netloc,
splitext,
)
-from pip._internal.utils.models import KeyBasedCompareMixin
from pip._internal.utils.urls import path_to_url, url_to_path
if TYPE_CHECKING:
@@ -70,8 +66,8 @@ class LinkHash:
assert self.name in _SUPPORTED_HASHES
@classmethod
- @functools.lru_cache(maxsize=None)
- def find_hash_url_fragment(cls, url: str) -> Optional["LinkHash"]:
+ @functools.cache
+ def find_hash_url_fragment(cls, url: str) -> LinkHash | None:
"""Search a string for a checksum algorithm name and encoded output value."""
match = cls._hash_url_fragment_re.search(url)
if match is None:
@@ -79,14 +75,14 @@ class LinkHash:
name, value = match.groups()
return cls(name=name, value=value)
- def as_dict(self) -> Dict[str, str]:
+ def as_dict(self) -> dict[str, str]:
return {self.name: self.value}
def as_hashes(self) -> Hashes:
"""Return a Hashes instance which checks only for the current hash."""
return Hashes({self.name: [self.value]})
- def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
+ def is_hash_allowed(self, hashes: Hashes | None) -> bool:
"""
Return True if the current hash is allowed by `hashes`.
"""
@@ -99,14 +95,14 @@ class LinkHash:
class MetadataFile:
"""Information about a core metadata file associated with a distribution."""
- hashes: Optional[Dict[str, str]]
+ hashes: dict[str, str] | None
def __post_init__(self) -> None:
if self.hashes is not None:
assert all(name in _SUPPORTED_HASHES for name in self.hashes)
-def supported_hashes(hashes: Optional[Dict[str, str]]) -> Optional[Dict[str, str]]:
+def supported_hashes(hashes: dict[str, str] | None) -> dict[str, str] | None:
# Remove any unsupported hash types from the mapping. If this leaves no
# supported hashes, return None
if hashes is None:
@@ -135,7 +131,11 @@ def _clean_file_url_path(part: str) -> str:
# should not be quoted. On Linux where drive letters do not
# exist, the colon should be quoted. We rely on urllib.request
# to do the right thing here.
- return urllib.request.pathname2url(urllib.request.url2pathname(part))
+ ret = urllib.request.pathname2url(urllib.request.url2pathname(part))
+ if ret.startswith("///"):
+ # Remove any URL authority section, leaving only the URL path.
+ ret = ret.removeprefix("//")
+ return ret
# percent-encoded: /
@@ -171,20 +171,37 @@ def _ensure_quoted_url(url: str) -> str:
and without double-quoting other characters.
"""
# Split the URL into parts according to the general structure
- # `scheme://netloc/path;parameters?query#fragment`.
- result = urllib.parse.urlparse(url)
+ # `scheme://netloc/path?query#fragment`.
+ result = urllib.parse.urlsplit(url)
# If the netloc is empty, then the URL refers to a local filesystem path.
is_local_path = not result.netloc
path = _clean_url_path(result.path, is_local_path=is_local_path)
- return urllib.parse.urlunparse(result._replace(path=path))
+ # Temporarily replace scheme with file to ensure the URL generated by
+ # urlunsplit() contains an empty netloc (file://) as per RFC 1738.
+ ret = urllib.parse.urlunsplit(result._replace(scheme="file", path=path))
+ ret = result.scheme + ret[4:] # Restore original scheme.
+ return ret
-class Link(KeyBasedCompareMixin):
+def _absolute_link_url(base_url: str, url: str) -> str:
+ """
+ A faster implementation of urllib.parse.urljoin with a shortcut
+ for absolute http/https URLs.
+ """
+ if url.startswith(("https://", "http://")):
+ return url
+ else:
+ return urllib.parse.urljoin(base_url, url)
+
+
+@functools.total_ordering
+class Link:
"""Represents a parsed link from a Package Index's simple URL"""
__slots__ = [
"_parsed_url",
"_url",
+ "_path",
"_hashes",
"comes_from",
"requires_python",
@@ -197,12 +214,12 @@ class Link(KeyBasedCompareMixin):
def __init__(
self,
url: str,
- comes_from: Optional[Union[str, "IndexContent"]] = None,
- requires_python: Optional[str] = None,
- yanked_reason: Optional[str] = None,
- metadata_file_data: Optional[MetadataFile] = None,
+ comes_from: str | IndexContent | None = None,
+ requires_python: str | None = None,
+ yanked_reason: str | None = None,
+ metadata_file_data: MetadataFile | None = None,
cache_link_parsing: bool = True,
- hashes: Optional[Mapping[str, str]] = None,
+ hashes: Mapping[str, str] | None = None,
) -> None:
"""
:param url: url of the resource pointed to (href of the link)
@@ -241,6 +258,8 @@ class Link(KeyBasedCompareMixin):
# Store the url as a private attribute to prevent accidentally
# trying to set a new value.
self._url = url
+ # The .path property is hot, so calculate its value ahead of time.
+ self._path = urllib.parse.unquote(self._parsed_url.path)
link_hash = LinkHash.find_hash_url_fragment(url)
hashes_from_link = {} if link_hash is None else link_hash.as_dict()
@@ -254,17 +273,15 @@ class Link(KeyBasedCompareMixin):
self.yanked_reason = yanked_reason
self.metadata_file_data = metadata_file_data
- super().__init__(key=url, defining_class=Link)
-
self.cache_link_parsing = cache_link_parsing
self.egg_fragment = self._egg_fragment()
@classmethod
def from_json(
cls,
- file_data: Dict[str, Any],
+ file_data: dict[str, Any],
page_url: str,
- ) -> Optional["Link"]:
+ ) -> Link | None:
"""
Convert an pypi json document from a simple repository page into a Link.
"""
@@ -272,7 +289,7 @@ class Link(KeyBasedCompareMixin):
if file_url is None:
return None
- url = _ensure_quoted_url(urllib.parse.urljoin(page_url, file_url))
+ url = _ensure_quoted_url(_absolute_link_url(page_url, file_url))
pyrequire = file_data.get("requires-python")
yanked_reason = file_data.get("yanked")
hashes = file_data.get("hashes", {})
@@ -313,10 +330,10 @@ class Link(KeyBasedCompareMixin):
@classmethod
def from_element(
cls,
- anchor_attribs: Dict[str, Optional[str]],
+ anchor_attribs: dict[str, str | None],
page_url: str,
base_url: str,
- ) -> Optional["Link"]:
+ ) -> Link | None:
"""
Convert an anchor element's attributes in a simple repository page to a Link.
"""
@@ -324,7 +341,7 @@ class Link(KeyBasedCompareMixin):
if not href:
return None
- url = _ensure_quoted_url(urllib.parse.urljoin(base_url, href))
+ url = _ensure_quoted_url(_absolute_link_url(base_url, href))
pyrequire = anchor_attribs.get("data-requires-python")
yanked_reason = anchor_attribs.get("data-yanked")
@@ -368,17 +385,34 @@ class Link(KeyBasedCompareMixin):
else:
rp = ""
if self.comes_from:
- return f"{redact_auth_from_url(self._url)} (from {self.comes_from}){rp}"
+ return f"{self.redacted_url} (from {self.comes_from}){rp}"
else:
- return redact_auth_from_url(str(self._url))
+ return self.redacted_url
def __repr__(self) -> str:
return f" "
+ def __hash__(self) -> int:
+ return hash(self.url)
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Link):
+ return NotImplemented
+ return self.url == other.url
+
+ def __lt__(self, other: Any) -> bool:
+ if not isinstance(other, Link):
+ return NotImplemented
+ return self.url < other.url
+
@property
def url(self) -> str:
return self._url
+ @property
+ def redacted_url(self) -> str:
+ return redact_auth_from_url(self.url)
+
@property
def filename(self) -> str:
path = self.path.rstrip("/")
@@ -410,9 +444,9 @@ class Link(KeyBasedCompareMixin):
@property
def path(self) -> str:
- return urllib.parse.unquote(self._parsed_url.path)
+ return self._path
- def splitext(self) -> Tuple[str, str]:
+ def splitext(self) -> tuple[str, str]:
return splitext(posixpath.basename(self.path.rstrip("/")))
@property
@@ -431,7 +465,7 @@ class Link(KeyBasedCompareMixin):
r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE
)
- def _egg_fragment(self) -> Optional[str]:
+ def _egg_fragment(self) -> str | None:
match = self._egg_fragment_re.search(self._url)
if not match:
return None
@@ -441,10 +475,10 @@ class Link(KeyBasedCompareMixin):
project_name = match.group(1)
if not self._project_name_re.match(project_name):
deprecated(
- reason=f"{self} contains an egg fragment with a non-PEP 508 name",
+ reason=f"{self} contains an egg fragment with a non-PEP 508 name.",
replacement="to use the req @ url syntax, and remove the egg fragment",
- gone_in="25.0",
- issue=11617,
+ gone_in="25.3",
+ issue=13157,
)
return project_name
@@ -452,13 +486,13 @@ class Link(KeyBasedCompareMixin):
_subdirectory_fragment_re = re.compile(r"[#&]subdirectory=([^&]*)")
@property
- def subdirectory_fragment(self) -> Optional[str]:
+ def subdirectory_fragment(self) -> str | None:
match = self._subdirectory_fragment_re.search(self._url)
if not match:
return None
return match.group(1)
- def metadata_link(self) -> Optional["Link"]:
+ def metadata_link(self) -> Link | None:
"""Return a link to the associated core metadata file (if any)."""
if self.metadata_file_data is None:
return None
@@ -471,11 +505,11 @@ class Link(KeyBasedCompareMixin):
return Hashes({k: [v] for k, v in self._hashes.items()})
@property
- def hash(self) -> Optional[str]:
+ def hash(self) -> str | None:
return next(iter(self._hashes.values()), None)
@property
- def hash_name(self) -> Optional[str]:
+ def hash_name(self) -> str | None:
return next(iter(self._hashes), None)
@property
@@ -507,7 +541,7 @@ class Link(KeyBasedCompareMixin):
def has_hash(self) -> bool:
return bool(self._hashes)
- def is_hash_allowed(self, hashes: Optional[Hashes]) -> bool:
+ def is_hash_allowed(self, hashes: Hashes | None) -> bool:
"""
Return True if the link has a hash and it is allowed by `hashes`.
"""
@@ -543,9 +577,9 @@ class _CleanResult(NamedTuple):
"""
parsed: urllib.parse.SplitResult
- query: Dict[str, List[str]]
+ query: dict[str, list[str]]
subdirectory: str
- hashes: Dict[str, str]
+ hashes: dict[str, str]
def _clean_link(link: Link) -> _CleanResult:
@@ -574,6 +608,6 @@ def _clean_link(link: Link) -> _CleanResult:
)
-@functools.lru_cache(maxsize=None)
+@functools.cache
def links_equivalent(link1: Link, link2: Link) -> bool:
return _clean_link(link1) == _clean_link(link2)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/pylock.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/pylock.py
new file mode 100644
index 00000000..1b6b8c12
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/pylock.py
@@ -0,0 +1,188 @@
+from __future__ import annotations
+
+import dataclasses
+import re
+from collections.abc import Iterable
+from dataclasses import dataclass
+from pathlib import Path
+from typing import TYPE_CHECKING, Any
+
+from pip._vendor import tomli_w
+
+from pip._internal.models.direct_url import ArchiveInfo, DirInfo, VcsInfo
+from pip._internal.models.link import Link
+from pip._internal.req.req_install import InstallRequirement
+from pip._internal.utils.urls import url_to_path
+
+if TYPE_CHECKING:
+ from typing_extensions import Self
+
+PYLOCK_FILE_NAME_RE = re.compile(r"^pylock\.([^.]+)\.toml$")
+
+
+def is_valid_pylock_file_name(path: Path) -> bool:
+ return path.name == "pylock.toml" or bool(re.match(PYLOCK_FILE_NAME_RE, path.name))
+
+
+def _toml_dict_factory(data: list[tuple[str, Any]]) -> dict[str, Any]:
+ return {key.replace("_", "-"): value for key, value in data if value is not None}
+
+
+@dataclass
+class PackageVcs:
+ type: str
+ url: str | None
+ # (not supported) path: Optional[str]
+ requested_revision: str | None
+ commit_id: str
+ subdirectory: str | None
+
+
+@dataclass
+class PackageDirectory:
+ path: str
+ editable: bool | None
+ subdirectory: str | None
+
+
+@dataclass
+class PackageArchive:
+ url: str | None
+ # (not supported) path: Optional[str]
+ # (not supported) size: Optional[int]
+ # (not supported) upload_time: Optional[datetime]
+ hashes: dict[str, str]
+ subdirectory: str | None
+
+
+@dataclass
+class PackageSdist:
+ name: str
+ # (not supported) upload_time: Optional[datetime]
+ url: str | None
+ # (not supported) path: Optional[str]
+ # (not supported) size: Optional[int]
+ hashes: dict[str, str]
+
+
+@dataclass
+class PackageWheel:
+ name: str
+ # (not supported) upload_time: Optional[datetime]
+ url: str | None
+ # (not supported) path: Optional[str]
+ # (not supported) size: Optional[int]
+ hashes: dict[str, str]
+
+
+@dataclass
+class Package:
+ name: str
+ version: str | None = None
+ # (not supported) marker: Optional[str]
+ # (not supported) requires_python: Optional[str]
+ # (not supported) dependencies
+ vcs: PackageVcs | None = None
+ directory: PackageDirectory | None = None
+ archive: PackageArchive | None = None
+ # (not supported) index: Optional[str]
+ sdist: PackageSdist | None = None
+ wheels: list[PackageWheel] | None = None
+ # (not supported) attestation_identities: Optional[List[Dict[str, Any]]]
+ # (not supported) tool: Optional[Dict[str, Any]]
+
+ @classmethod
+ def from_install_requirement(cls, ireq: InstallRequirement, base_dir: Path) -> Self:
+ base_dir = base_dir.resolve()
+ dist = ireq.get_dist()
+ download_info = ireq.download_info
+ assert download_info
+ package = cls(name=dist.canonical_name)
+ if ireq.is_direct:
+ if isinstance(download_info.info, VcsInfo):
+ package.vcs = PackageVcs(
+ type=download_info.info.vcs,
+ url=download_info.url,
+ requested_revision=download_info.info.requested_revision,
+ commit_id=download_info.info.commit_id,
+ subdirectory=download_info.subdirectory,
+ )
+ elif isinstance(download_info.info, DirInfo):
+ package.directory = PackageDirectory(
+ path=(
+ Path(url_to_path(download_info.url))
+ .resolve()
+ .relative_to(base_dir)
+ .as_posix()
+ ),
+ editable=(
+ download_info.info.editable
+ if download_info.info.editable
+ else None
+ ),
+ subdirectory=download_info.subdirectory,
+ )
+ elif isinstance(download_info.info, ArchiveInfo):
+ if not download_info.info.hashes:
+ raise NotImplementedError()
+ package.archive = PackageArchive(
+ url=download_info.url,
+ hashes=download_info.info.hashes,
+ subdirectory=download_info.subdirectory,
+ )
+ else:
+ # should never happen
+ raise NotImplementedError()
+ else:
+ package.version = str(dist.version)
+ if isinstance(download_info.info, ArchiveInfo):
+ if not download_info.info.hashes:
+ raise NotImplementedError()
+ link = Link(download_info.url)
+ if link.is_wheel:
+ package.wheels = [
+ PackageWheel(
+ name=link.filename,
+ url=download_info.url,
+ hashes=download_info.info.hashes,
+ )
+ ]
+ else:
+ package.sdist = PackageSdist(
+ name=link.filename,
+ url=download_info.url,
+ hashes=download_info.info.hashes,
+ )
+ else:
+ # should never happen
+ raise NotImplementedError()
+ return package
+
+
+@dataclass
+class Pylock:
+ lock_version: str = "1.0"
+ # (not supported) environments: Optional[List[str]]
+ # (not supported) requires_python: Optional[str]
+ # (not supported) extras: List[str] = []
+ # (not supported) dependency_groups: List[str] = []
+ created_by: str = "pip"
+ packages: list[Package] = dataclasses.field(default_factory=list)
+ # (not supported) tool: Optional[Dict[str, Any]]
+
+ def as_toml(self) -> str:
+ return tomli_w.dumps(dataclasses.asdict(self, dict_factory=_toml_dict_factory))
+
+ @classmethod
+ def from_install_requirements(
+ cls, install_requirements: Iterable[InstallRequirement], base_dir: Path
+ ) -> Self:
+ return cls(
+ packages=sorted(
+ (
+ Package.from_install_requirement(ireq, base_dir)
+ for ireq in install_requirements
+ ),
+ key=lambda p: p.name,
+ )
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py
index f51190ac..06a9a550 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py
@@ -5,10 +5,12 @@ For a general overview of available schemes and their context, see
https://docs.python.org/3/install/index.html#alternate-installation.
"""
+from dataclasses import dataclass
SCHEME_KEYS = ["platlib", "purelib", "headers", "scripts", "data"]
+@dataclass(frozen=True)
class Scheme:
"""A Scheme holds paths which are used as the base directories for
artifacts associated with a Python package.
@@ -16,16 +18,8 @@ class Scheme:
__slots__ = SCHEME_KEYS
- def __init__(
- self,
- platlib: str,
- purelib: str,
- headers: str,
- scripts: str,
- data: str,
- ) -> None:
- self.platlib = platlib
- self.purelib = purelib
- self.headers = headers
- self.scripts = scripts
- self.data = data
+ platlib: str
+ purelib: str
+ headers: str
+ scripts: str
+ data: str
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py
index fe61e811..136163ca 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py
@@ -3,7 +3,7 @@ import logging
import os
import posixpath
import urllib.parse
-from typing import List
+from dataclasses import dataclass
from pip._vendor.packaging.utils import canonicalize_name
@@ -14,19 +14,23 @@ from pip._internal.utils.misc import normalize_path, redact_auth_from_url
logger = logging.getLogger(__name__)
+@dataclass(frozen=True)
class SearchScope:
-
"""
Encapsulates the locations that pip is configured to search.
"""
__slots__ = ["find_links", "index_urls", "no_index"]
+ find_links: list[str]
+ index_urls: list[str]
+ no_index: bool
+
@classmethod
def create(
cls,
- find_links: List[str],
- index_urls: List[str],
+ find_links: list[str],
+ index_urls: list[str],
no_index: bool,
) -> "SearchScope":
"""
@@ -37,7 +41,7 @@ class SearchScope:
# it and if it exists, use the normalized version.
# This is deliberately conservative - it might be fine just to
# blindly normalize anything starting with a ~...
- built_find_links: List[str] = []
+ built_find_links: list[str] = []
for link in find_links:
if link.startswith("~"):
new_link = normalize_path(link)
@@ -64,16 +68,6 @@ class SearchScope:
no_index=no_index,
)
- def __init__(
- self,
- find_links: List[str],
- index_urls: List[str],
- no_index: bool,
- ) -> None:
- self.find_links = find_links
- self.index_urls = index_urls
- self.no_index = no_index
-
def get_formatted_locations(self) -> str:
lines = []
redacted_index_urls = []
@@ -109,7 +103,7 @@ class SearchScope:
)
return "\n".join(lines)
- def get_index_urls_locations(self, project_name: str) -> List[str]:
+ def get_index_urls_locations(self, project_name: str) -> list[str]:
"""Returns the locations found via self.index_urls
Checks the url_name on the main (first in the list) index and
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py
index 977bc4ca..8d5b42df 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py
@@ -1,8 +1,10 @@
-from typing import Optional
+from __future__ import annotations
from pip._internal.models.format_control import FormatControl
+# TODO: This needs Python 3.10's improved slots support for dataclasses
+# to be converted into a dataclass.
class SelectionPreferences:
"""
Encapsulates the candidate selection preferences for downloading
@@ -25,9 +27,9 @@ class SelectionPreferences:
self,
allow_yanked: bool,
allow_all_prereleases: bool = False,
- format_control: Optional[FormatControl] = None,
+ format_control: FormatControl | None = None,
prefer_binary: bool = False,
- ignore_requires_python: Optional[bool] = None,
+ ignore_requires_python: bool | None = None,
) -> None:
"""Create a SelectionPreferences object.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py
index 67ea5da7..8c38392d 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py
@@ -1,5 +1,6 @@
+from __future__ import annotations
+
import sys
-from typing import List, Optional, Set, Tuple
from pip._vendor.packaging.tags import Tag
@@ -8,7 +9,6 @@ from pip._internal.utils.misc import normalize_version_info
class TargetPython:
-
"""
Encapsulates the properties of a Python interpreter one is targeting
for a package install, download, etc.
@@ -27,10 +27,10 @@ class TargetPython:
def __init__(
self,
- platforms: Optional[List[str]] = None,
- py_version_info: Optional[Tuple[int, ...]] = None,
- abis: Optional[List[str]] = None,
- implementation: Optional[str] = None,
+ platforms: list[str] | None = None,
+ py_version_info: tuple[int, ...] | None = None,
+ abis: list[str] | None = None,
+ implementation: str | None = None,
) -> None:
"""
:param platforms: A list of strings or None. If None, searches for
@@ -63,8 +63,8 @@ class TargetPython:
self.py_version_info = py_version_info
# This is used to cache the return value of get_(un)sorted_tags.
- self._valid_tags: Optional[List[Tag]] = None
- self._valid_tags_set: Optional[Set[Tag]] = None
+ self._valid_tags: list[Tag] | None = None
+ self._valid_tags_set: set[Tag] | None = None
def format_given(self) -> str:
"""
@@ -86,7 +86,7 @@ class TargetPython:
f"{key}={value!r}" for key, value in key_values if value is not None
)
- def get_sorted_tags(self) -> List[Tag]:
+ def get_sorted_tags(self) -> list[Tag]:
"""
Return the supported PEP 425 tags to check wheel candidates against.
@@ -111,7 +111,7 @@ class TargetPython:
return self._valid_tags
- def get_unsorted_tags(self) -> Set[Tag]:
+ def get_unsorted_tags(self) -> set[Tag]:
"""Exactly the same as get_sorted_tags, but returns a set.
This is important for performance.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py
index a5dc12bd..60e97cb7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py
@@ -1,18 +1,26 @@
"""Represents a wheel file and provides access to the various parts of the
name that have meaning.
"""
+
+from __future__ import annotations
+
import re
-from typing import Dict, Iterable, List
+from collections.abc import Iterable
from pip._vendor.packaging.tags import Tag
+from pip._vendor.packaging.utils import BuildTag, parse_wheel_filename
+from pip._vendor.packaging.utils import (
+ InvalidWheelFilename as _PackagingInvalidWheelFilename,
+)
from pip._internal.exceptions import InvalidWheelFilename
+from pip._internal.utils.deprecation import deprecated
class Wheel:
"""A wheel file"""
- wheel_file_re = re.compile(
+ legacy_wheel_file_re = re.compile(
r"""^(?P(?P[^\s-]+?)-(?P[^\s-]*?))
((-(?P\d[^-]*?))?-(?P[^\s-]+?)-(?P[^\s-]+?)-(?P[^\s-]+?)
\.whl|\.dist-info)$""",
@@ -20,32 +28,73 @@ class Wheel:
)
def __init__(self, filename: str) -> None:
- """
- :raises InvalidWheelFilename: when the filename is invalid for a wheel
- """
- wheel_info = self.wheel_file_re.match(filename)
- if not wheel_info:
- raise InvalidWheelFilename(f"{filename} is not a valid wheel filename.")
self.filename = filename
- self.name = wheel_info.group("name").replace("_", "-")
- # we'll assume "_" means "-" due to wheel naming scheme
- # (https://github.com/pypa/pip/issues/1150)
- self.version = wheel_info.group("ver").replace("_", "-")
- self.build_tag = wheel_info.group("build")
- self.pyversions = wheel_info.group("pyver").split(".")
- self.abis = wheel_info.group("abi").split(".")
- self.plats = wheel_info.group("plat").split(".")
- # All the tag combinations from this file
- self.file_tags = {
- Tag(x, y, z) for x in self.pyversions for y in self.abis for z in self.plats
- }
+ # To make mypy happy specify type hints that can come from either
+ # parse_wheel_filename or the legacy_wheel_file_re match.
+ self.name: str
+ self._build_tag: BuildTag | None = None
- def get_formatted_file_tags(self) -> List[str]:
+ try:
+ wheel_info = parse_wheel_filename(filename)
+ self.name, _version, self._build_tag, self.file_tags = wheel_info
+ self.version = str(_version)
+ except _PackagingInvalidWheelFilename as e:
+ # Check if the wheel filename is in the legacy format
+ legacy_wheel_info = self.legacy_wheel_file_re.match(filename)
+ if not legacy_wheel_info:
+ raise InvalidWheelFilename(e.args[0]) from None
+
+ deprecated(
+ reason=(
+ f"Wheel filename {filename!r} is not correctly normalised. "
+ "Future versions of pip will raise the following error:\n"
+ f"{e.args[0]}\n\n"
+ ),
+ replacement=(
+ "to rename the wheel to use a correctly normalised "
+ "name (this may require updating the version in "
+ "the project metadata)"
+ ),
+ gone_in="25.3",
+ issue=12938,
+ )
+
+ self.name = legacy_wheel_info.group("name").replace("_", "-")
+ self.version = legacy_wheel_info.group("ver").replace("_", "-")
+
+ # Generate the file tags from the legacy wheel filename
+ pyversions = legacy_wheel_info.group("pyver").split(".")
+ abis = legacy_wheel_info.group("abi").split(".")
+ plats = legacy_wheel_info.group("plat").split(".")
+ self.file_tags = frozenset(
+ Tag(interpreter=py, abi=abi, platform=plat)
+ for py in pyversions
+ for abi in abis
+ for plat in plats
+ )
+
+ @property
+ def build_tag(self) -> BuildTag:
+ if self._build_tag is not None:
+ return self._build_tag
+
+ # Parse the build tag from the legacy wheel filename
+ legacy_wheel_info = self.legacy_wheel_file_re.match(self.filename)
+ assert legacy_wheel_info is not None, "guaranteed by filename validation"
+ build_tag = legacy_wheel_info.group("build")
+ match = re.match(r"^(\d+)(.*)$", build_tag)
+ assert match is not None, "guaranteed by filename validation"
+ build_tag_groups = match.groups()
+ self._build_tag = (int(build_tag_groups[0]), build_tag_groups[1])
+
+ return self._build_tag
+
+ def get_formatted_file_tags(self) -> list[str]:
"""Return the wheel's tags as a sorted list of strings."""
return sorted(str(tag) for tag in self.file_tags)
- def support_index_min(self, tags: List[Tag]) -> int:
+ def support_index_min(self, tags: list[Tag]) -> int:
"""Return the lowest index that one of the wheel's file_tag combinations
achieves in the given list of supported tags.
@@ -64,7 +113,7 @@ class Wheel:
raise ValueError()
def find_most_preferred_tag(
- self, tags: List[Tag], tag_to_priority: Dict[Tag, int]
+ self, tags: list[Tag], tag_to_priority: dict[Tag, int]
) -> int:
"""Return the priority of the most preferred tag that one of the wheel's file
tag combinations achieves in the given list of supported tags using the given
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py
index b51bde91..0ae1f562 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py
@@ -1,2 +1 @@
-"""Contains purely network-related utilities.
-"""
+"""Contains purely network-related utilities."""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc
index 37130511..ed091359 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc
index f601f2fb..c2420c09 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/auth.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc
index 4330e9bd..d960c527 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc
index ec504899..8710151f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/download.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc
index 8acc28f9..b8eea66b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc
index 310bc517..713dad5e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/session.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc
index a7a3594f..a202e5b1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc
index 0a76811f..390282c6 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
index 94a82fa6..a42f7024 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
@@ -3,6 +3,9 @@
Contains interface (MultiDomainBasicAuth) and associated glue code for
providing credentials in the context of network requests.
"""
+
+from __future__ import annotations
+
import logging
import os
import shutil
@@ -11,10 +14,10 @@ import sysconfig
import typing
import urllib.parse
from abc import ABC, abstractmethod
-from functools import lru_cache
+from functools import cache
from os.path import commonprefix
from pathlib import Path
-from typing import Any, Dict, List, NamedTuple, Optional, Tuple
+from typing import Any, NamedTuple
from pip._vendor.requests.auth import AuthBase, HTTPBasicAuth
from pip._vendor.requests.models import Request, Response
@@ -47,12 +50,10 @@ class KeyRingBaseProvider(ABC):
has_keyring: bool
@abstractmethod
- def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
- ...
+ def get_auth_info(self, url: str, username: str | None) -> AuthInfo | None: ...
@abstractmethod
- def save_auth_info(self, url: str, username: str, password: str) -> None:
- ...
+ def save_auth_info(self, url: str, username: str, password: str) -> None: ...
class KeyRingNullProvider(KeyRingBaseProvider):
@@ -60,7 +61,7 @@ class KeyRingNullProvider(KeyRingBaseProvider):
has_keyring = False
- def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
+ def get_auth_info(self, url: str, username: str | None) -> AuthInfo | None:
return None
def save_auth_info(self, url: str, username: str, password: str) -> None:
@@ -77,7 +78,7 @@ class KeyRingPythonProvider(KeyRingBaseProvider):
self.keyring = keyring
- def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
+ def get_auth_info(self, url: str, username: str | None) -> AuthInfo | None:
# Support keyring's get_credential interface which supports getting
# credentials without a username. This is only available for
# keyring>=15.2.0.
@@ -113,7 +114,7 @@ class KeyRingCliProvider(KeyRingBaseProvider):
def __init__(self, cmd: str) -> None:
self.keyring = cmd
- def get_auth_info(self, url: str, username: Optional[str]) -> Optional[AuthInfo]:
+ def get_auth_info(self, url: str, username: str | None) -> AuthInfo | None:
# This is the default implementation of keyring.get_credential
# https://github.com/jaraco/keyring/blob/97689324abcf01bd1793d49063e7ca01e03d7d07/keyring/backend.py#L134-L139
if username is not None:
@@ -125,7 +126,7 @@ class KeyRingCliProvider(KeyRingBaseProvider):
def save_auth_info(self, url: str, username: str, password: str) -> None:
return self._set_password(url, username, password)
- def _get_password(self, service_name: str, username: str) -> Optional[str]:
+ def _get_password(self, service_name: str, username: str) -> str | None:
"""Mirror the implementation of keyring.get_password using cli"""
if self.keyring is None:
return None
@@ -151,14 +152,14 @@ class KeyRingCliProvider(KeyRingBaseProvider):
env["PYTHONIOENCODING"] = "utf-8"
subprocess.run(
[self.keyring, "set", service_name, username],
- input=f"{password}{os.linesep}".encode("utf-8"),
+ input=f"{password}{os.linesep}".encode(),
env=env,
check=True,
)
return None
-@lru_cache(maxsize=None)
+@cache
def get_keyring_provider(provider: str) -> KeyRingBaseProvider:
logger.verbose("Keyring provider requested: %s", provider)
@@ -224,19 +225,19 @@ class MultiDomainBasicAuth(AuthBase):
def __init__(
self,
prompting: bool = True,
- index_urls: Optional[List[str]] = None,
+ index_urls: list[str] | None = None,
keyring_provider: str = "auto",
) -> None:
self.prompting = prompting
self.index_urls = index_urls
- self.keyring_provider = keyring_provider # type: ignore[assignment]
- self.passwords: Dict[str, AuthInfo] = {}
+ self.keyring_provider = keyring_provider
+ self.passwords: dict[str, AuthInfo] = {}
# When the user is prompted to enter credentials and keyring is
# available, we will offer to save them. If the user accepts,
# this value is set to the credentials they entered. After the
# request authenticates, the caller should call
# ``save_credentials`` to save these.
- self._credentials_to_save: Optional[Credentials] = None
+ self._credentials_to_save: Credentials | None = None
@property
def keyring_provider(self) -> KeyRingBaseProvider:
@@ -259,9 +260,9 @@ class MultiDomainBasicAuth(AuthBase):
def _get_keyring_auth(
self,
- url: Optional[str],
- username: Optional[str],
- ) -> Optional[AuthInfo]:
+ url: str | None,
+ username: str | None,
+ ) -> AuthInfo | None:
"""Return the tuple auth for a given url from keyring."""
# Do nothing if no url was provided
if not url:
@@ -270,6 +271,10 @@ class MultiDomainBasicAuth(AuthBase):
try:
return self.keyring_provider.get_auth_info(url, username)
except Exception as exc:
+ # Log the full exception (with stacktrace) at debug, so it'll only
+ # show up when running in verbose mode.
+ logger.debug("Keyring is skipped due to an exception", exc_info=True)
+ # Always log a shortened version of the exception.
logger.warning(
"Keyring is skipped due to an exception: %s",
str(exc),
@@ -279,7 +284,7 @@ class MultiDomainBasicAuth(AuthBase):
get_keyring_provider.cache_clear()
return None
- def _get_index_url(self, url: str) -> Optional[str]:
+ def _get_index_url(self, url: str) -> str | None:
"""Return the original index URL matching the requested URL.
Cached or dynamically generated credentials may work against
@@ -386,7 +391,7 @@ class MultiDomainBasicAuth(AuthBase):
def _get_url_and_credentials(
self, original_url: str
- ) -> Tuple[str, Optional[str], Optional[str]]:
+ ) -> tuple[str, str | None, str | None]:
"""Return the credentials to use for the provided URL.
If allowed, netrc and keyring may be used to obtain the
@@ -449,9 +454,7 @@ class MultiDomainBasicAuth(AuthBase):
return req
# Factored out to allow for easy patching in tests
- def _prompt_for_password(
- self, netloc: str
- ) -> Tuple[Optional[str], Optional[str], bool]:
+ def _prompt_for_password(self, netloc: str) -> tuple[str | None, str | None, bool]:
username = ask_input(f"User for {netloc}: ") if self.prompting else None
if not username:
return None, None, False
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py
index 4d0fb545..0c5961c4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py
@@ -1,10 +1,13 @@
-"""HTTP cache implementation.
-"""
+"""HTTP cache implementation."""
+
+from __future__ import annotations
import os
+import shutil
+from collections.abc import Generator
from contextlib import contextmanager
from datetime import datetime
-from typing import BinaryIO, Generator, Optional, Union
+from typing import Any, BinaryIO, Callable
from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache
from pip._vendor.cachecontrol.caches import SeparateBodyFileCache
@@ -60,7 +63,7 @@ class SafeFileCache(SeparateBodyBaseCache):
parts = list(hashed[:5]) + [hashed]
return os.path.join(self.directory, *parts)
- def get(self, key: str) -> Optional[bytes]:
+ def get(self, key: str) -> bytes | None:
# The cache entry is only valid if both metadata and body exist.
metadata_path = self._get_cache_path(key)
body_path = metadata_path + ".body"
@@ -70,17 +73,36 @@ class SafeFileCache(SeparateBodyBaseCache):
with open(metadata_path, "rb") as f:
return f.read()
- def _write(self, path: str, data: bytes) -> None:
+ def _write_to_file(self, path: str, writer_func: Callable[[BinaryIO], Any]) -> None:
+ """Common file writing logic with proper permissions and atomic replacement."""
with suppressed_cache_errors():
ensure_dir(os.path.dirname(path))
with adjacent_tmp_file(path) as f:
- f.write(data)
+ writer_func(f)
+ # Inherit the read/write permissions of the cache directory
+ # to enable multi-user cache use-cases.
+ mode = (
+ os.stat(self.directory).st_mode
+ & 0o666 # select read/write permissions of cache directory
+ | 0o600 # set owner read/write permissions
+ )
+ # Change permissions only if there is no risk of following a symlink.
+ if os.chmod in os.supports_fd:
+ os.chmod(f.fileno(), mode)
+ elif os.chmod in os.supports_follow_symlinks:
+ os.chmod(f.name, mode, follow_symlinks=False)
replace(f.name, path)
+ def _write(self, path: str, data: bytes) -> None:
+ self._write_to_file(path, lambda f: f.write(data))
+
+ def _write_from_io(self, path: str, source_file: BinaryIO) -> None:
+ self._write_to_file(path, lambda f: shutil.copyfileobj(source_file, f))
+
def set(
- self, key: str, value: bytes, expires: Union[int, datetime, None] = None
+ self, key: str, value: bytes, expires: int | datetime | None = None
) -> None:
path = self._get_cache_path(key)
self._write(path, value)
@@ -92,7 +114,7 @@ class SafeFileCache(SeparateBodyBaseCache):
with suppressed_cache_errors():
os.remove(path + ".body")
- def get_body(self, key: str) -> Optional[BinaryIO]:
+ def get_body(self, key: str) -> BinaryIO | None:
# The cache entry is only valid if both metadata and body exist.
metadata_path = self._get_cache_path(key)
body_path = metadata_path + ".body"
@@ -104,3 +126,8 @@ class SafeFileCache(SeparateBodyBaseCache):
def set_body(self, key: str, body: bytes) -> None:
path = self._get_cache_path(key) + ".body"
self._write(path, body)
+
+ def set_body_from_io(self, key: str, body_file: BinaryIO) -> None:
+ """Set the body of the cache entry from a file object."""
+ path = self._get_cache_path(key) + ".body"
+ self._write_from_io(path, body_file)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/download.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/download.py
index d1d43541..9881cc28 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/download.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/download.py
@@ -1,39 +1,56 @@
-"""Download files with progress indicators.
-"""
+"""Download files with progress indicators."""
+
+from __future__ import annotations
+
import email.message
import logging
import mimetypes
import os
-from typing import Iterable, Optional, Tuple
+from collections.abc import Iterable, Mapping
+from dataclasses import dataclass
+from http import HTTPStatus
+from typing import BinaryIO
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
+from pip._vendor.requests import PreparedRequest
+from pip._vendor.requests.models import Response
+from pip._vendor.urllib3 import HTTPResponse as URLlib3Response
+from pip._vendor.urllib3._collections import HTTPHeaderDict
+from pip._vendor.urllib3.exceptions import ReadTimeoutError
-from pip._internal.cli.progress_bars import get_download_progress_renderer
-from pip._internal.exceptions import NetworkConnectionError
+from pip._internal.cli.progress_bars import BarType, get_download_progress_renderer
+from pip._internal.exceptions import IncompleteDownloadError, NetworkConnectionError
from pip._internal.models.index import PyPI
from pip._internal.models.link import Link
-from pip._internal.network.cache import is_from_cache
-from pip._internal.network.session import PipSession
+from pip._internal.network.cache import SafeFileCache, is_from_cache
+from pip._internal.network.session import CacheControlAdapter, PipSession
from pip._internal.network.utils import HEADERS, raise_for_status, response_chunks
from pip._internal.utils.misc import format_size, redact_auth_from_url, splitext
logger = logging.getLogger(__name__)
-def _get_http_response_size(resp: Response) -> Optional[int]:
+def _get_http_response_size(resp: Response) -> int | None:
try:
return int(resp.headers["content-length"])
except (ValueError, KeyError, TypeError):
return None
-def _prepare_download(
+def _get_http_response_etag_or_last_modified(resp: Response) -> str | None:
+ """
+ Return either the ETag or Last-Modified header (or None if neither exists).
+ The return value can be used in an If-Range header.
+ """
+ return resp.headers.get("etag", resp.headers.get("last-modified"))
+
+
+def _log_download(
resp: Response,
link: Link,
- progress_bar: str,
+ progress_bar: BarType,
+ total_length: int | None,
+ range_start: int | None = 0,
) -> Iterable[bytes]:
- total_length = _get_http_response_size(resp)
-
if link.netloc == PyPI.file_storage_domain:
url = link.show_url
else:
@@ -42,10 +59,17 @@ def _prepare_download(
logged_url = redact_auth_from_url(url)
if total_length:
- logged_url = f"{logged_url} ({format_size(total_length)})"
+ if range_start:
+ logged_url = (
+ f"{logged_url} ({format_size(range_start)}/{format_size(total_length)})"
+ )
+ else:
+ logged_url = f"{logged_url} ({format_size(total_length)})"
if is_from_cache(resp):
logger.info("Using cached %s", logged_url)
+ elif range_start:
+ logger.info("Resuming download %s", logged_url)
else:
logger.info("Downloading %s", logged_url)
@@ -55,17 +79,19 @@ def _prepare_download(
show_progress = False
elif not total_length:
show_progress = True
- elif total_length > (40 * 1000):
+ elif total_length > (512 * 1024):
show_progress = True
else:
show_progress = False
- chunks = response_chunks(resp, CONTENT_CHUNK_SIZE)
+ chunks = response_chunks(resp)
if not show_progress:
return chunks
- renderer = get_download_progress_renderer(bar_type=progress_bar, size=total_length)
+ renderer = get_download_progress_renderer(
+ bar_type=progress_bar, size=total_length, initial_progress=range_start
+ )
return renderer(chunks)
@@ -100,7 +126,7 @@ def _get_http_response_filename(resp: Response, link: Link) -> str:
content_disposition = resp.headers.get("content-disposition")
if content_disposition:
filename = parse_content_disposition(content_disposition, filename)
- ext: Optional[str] = splitext(filename)[1]
+ ext: str | None = splitext(filename)[1]
if not ext:
ext = mimetypes.guess_extension(resp.headers.get("content-type", ""))
if ext:
@@ -112,75 +138,205 @@ def _get_http_response_filename(resp: Response, link: Link) -> str:
return filename
-def _http_get_download(session: PipSession, link: Link) -> Response:
- target_url = link.url.split("#", 1)[0]
- resp = session.get(target_url, headers=HEADERS, stream=True)
- raise_for_status(resp)
- return resp
+@dataclass
+class _FileDownload:
+ """Stores the state of a single link download."""
+
+ link: Link
+ output_file: BinaryIO
+ size: int | None
+ bytes_received: int = 0
+ reattempts: int = 0
+
+ def is_incomplete(self) -> bool:
+ return bool(self.size is not None and self.bytes_received < self.size)
+
+ def write_chunk(self, data: bytes) -> None:
+ self.bytes_received += len(data)
+ self.output_file.write(data)
+
+ def reset_file(self) -> None:
+ """Delete any saved data and reset progress to zero."""
+ self.output_file.seek(0)
+ self.output_file.truncate()
+ self.bytes_received = 0
class Downloader:
def __init__(
self,
session: PipSession,
- progress_bar: str,
+ progress_bar: BarType,
+ resume_retries: int,
) -> None:
+ assert (
+ resume_retries >= 0
+ ), "Number of max resume retries must be bigger or equal to zero"
self._session = session
self._progress_bar = progress_bar
+ self._resume_retries = resume_retries
- def __call__(self, link: Link, location: str) -> Tuple[str, str]:
- """Download the file given by link into location."""
+ def batch(
+ self, links: Iterable[Link], location: str
+ ) -> Iterable[tuple[Link, tuple[str, str]]]:
+ """Convenience method to download multiple links."""
+ for link in links:
+ filepath, content_type = self(link, location)
+ yield link, (filepath, content_type)
+
+ def __call__(self, link: Link, location: str) -> tuple[str, str]:
+ """Download a link and save it under location."""
+ resp = self._http_get(link)
+ download_size = _get_http_response_size(resp)
+
+ filepath = os.path.join(location, _get_http_response_filename(resp, link))
+ with open(filepath, "wb") as content_file:
+ download = _FileDownload(link, content_file, download_size)
+ self._process_response(download, resp)
+ if download.is_incomplete():
+ self._attempt_resumes_or_redownloads(download, resp)
+
+ content_type = resp.headers.get("Content-Type", "")
+ return filepath, content_type
+
+ def _process_response(self, download: _FileDownload, resp: Response) -> None:
+ """Download and save chunks from a response."""
+ chunks = _log_download(
+ resp,
+ download.link,
+ self._progress_bar,
+ download.size,
+ range_start=download.bytes_received,
+ )
try:
- resp = _http_get_download(self._session, link)
+ for chunk in chunks:
+ download.write_chunk(chunk)
+ except ReadTimeoutError as e:
+ # If the download size is not known, then give up downloading the file.
+ if download.size is None:
+ raise e
+
+ logger.warning("Connection timed out while downloading.")
+
+ def _attempt_resumes_or_redownloads(
+ self, download: _FileDownload, first_resp: Response
+ ) -> None:
+ """Attempt to resume/restart the download if connection was dropped."""
+
+ while download.reattempts < self._resume_retries and download.is_incomplete():
+ assert download.size is not None
+ download.reattempts += 1
+ logger.warning(
+ "Attempting to resume incomplete download (%s/%s, attempt %d)",
+ format_size(download.bytes_received),
+ format_size(download.size),
+ download.reattempts,
+ )
+
+ try:
+ resume_resp = self._http_get_resume(download, should_match=first_resp)
+ # Fallback: if the server responded with 200 (i.e., the file has
+ # since been modified or range requests are unsupported) or any
+ # other unexpected status, restart the download from the beginning.
+ must_restart = resume_resp.status_code != HTTPStatus.PARTIAL_CONTENT
+ if must_restart:
+ download.reset_file()
+ download.size = _get_http_response_size(resume_resp)
+ first_resp = resume_resp
+
+ self._process_response(download, resume_resp)
+ except (ConnectionError, ReadTimeoutError, OSError):
+ continue
+
+ # No more resume attempts. Raise an error if the download is still incomplete.
+ if download.is_incomplete():
+ os.remove(download.output_file.name)
+ raise IncompleteDownloadError(download)
+
+ # If we successfully completed the download via resume, manually cache it
+ # as a complete response to enable future caching
+ if download.reattempts > 0:
+ self._cache_resumed_download(download, first_resp)
+
+ def _cache_resumed_download(
+ self, download: _FileDownload, original_response: Response
+ ) -> None:
+ """
+ Manually cache a file that was successfully downloaded via resume retries.
+
+ cachecontrol doesn't cache 206 (Partial Content) responses, since they
+ are not complete files. This method manually adds the final file to the
+ cache as though it was downloaded in a single request, so that future
+ requests can use the cache.
+ """
+ url = download.link.url_without_fragment
+ adapter = self._session.get_adapter(url)
+
+ # Check if the adapter is the CacheControlAdapter (i.e. caching is enabled)
+ if not isinstance(adapter, CacheControlAdapter):
+ logger.debug(
+ "Skipping resume download caching: no cache controller for %s", url
+ )
+ return
+
+ # Check SafeFileCache is being used
+ assert isinstance(
+ adapter.cache, SafeFileCache
+ ), "separate body cache not in use!"
+
+ synthetic_request = PreparedRequest()
+ synthetic_request.prepare(method="GET", url=url, headers={})
+
+ synthetic_response_headers = HTTPHeaderDict()
+ for key, value in original_response.headers.items():
+ if key.lower() not in ["content-range", "content-length"]:
+ synthetic_response_headers[key] = value
+ synthetic_response_headers["content-length"] = str(download.size)
+
+ synthetic_response = URLlib3Response(
+ body="",
+ headers=synthetic_response_headers,
+ status=200,
+ preload_content=False,
+ )
+
+ # Save metadata and then stream the file contents to cache.
+ cache_url = adapter.controller.cache_url(url)
+ metadata_blob = adapter.controller.serializer.dumps(
+ synthetic_request, synthetic_response, b""
+ )
+ adapter.cache.set(cache_url, metadata_blob)
+ download.output_file.flush()
+ with open(download.output_file.name, "rb") as f:
+ adapter.cache.set_body_from_io(cache_url, f)
+
+ logger.debug(
+ "Cached resumed download as complete response for future use: %s", url
+ )
+
+ def _http_get_resume(
+ self, download: _FileDownload, should_match: Response
+ ) -> Response:
+ """Issue a HTTP range request to resume the download."""
+ # To better understand the download resumption logic, see the mdn web docs:
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/Range_requests
+ headers = HEADERS.copy()
+ headers["Range"] = f"bytes={download.bytes_received}-"
+ # If possible, use a conditional range request to avoid corrupted
+ # downloads caused by the remote file changing in-between.
+ if identifier := _get_http_response_etag_or_last_modified(should_match):
+ headers["If-Range"] = identifier
+ return self._http_get(download.link, headers)
+
+ def _http_get(self, link: Link, headers: Mapping[str, str] = HEADERS) -> Response:
+ target_url = link.url_without_fragment
+ try:
+ resp = self._session.get(target_url, headers=headers, stream=True)
+ raise_for_status(resp)
except NetworkConnectionError as e:
assert e.response is not None
logger.critical(
"HTTP error %s while getting %s", e.response.status_code, link
)
raise
-
- filename = _get_http_response_filename(resp, link)
- filepath = os.path.join(location, filename)
-
- chunks = _prepare_download(resp, link, self._progress_bar)
- with open(filepath, "wb") as content_file:
- for chunk in chunks:
- content_file.write(chunk)
- content_type = resp.headers.get("Content-Type", "")
- return filepath, content_type
-
-
-class BatchDownloader:
- def __init__(
- self,
- session: PipSession,
- progress_bar: str,
- ) -> None:
- self._session = session
- self._progress_bar = progress_bar
-
- def __call__(
- self, links: Iterable[Link], location: str
- ) -> Iterable[Tuple[Link, Tuple[str, str]]]:
- """Download the files given by links into location."""
- for link in links:
- try:
- resp = _http_get_download(self._session, link)
- except NetworkConnectionError as e:
- assert e.response is not None
- logger.critical(
- "HTTP error %s while getting %s",
- e.response.status_code,
- link,
- )
- raise
-
- filename = _get_http_response_filename(resp, link)
- filepath = os.path.join(location, filename)
-
- chunks = _prepare_download(resp, link, self._progress_bar)
- with open(filepath, "wb") as content_file:
- for chunk in chunks:
- content_file.write(chunk)
- content_type = resp.headers.get("Content-Type", "")
- yield link, (filepath, content_type)
+ return resp
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
index 82ec50d5..ac3ebe63 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
@@ -1,11 +1,14 @@
"""Lazy ZIP over HTTP"""
+from __future__ import annotations
+
__all__ = ["HTTPRangeRequestUnsupported", "dist_from_wheel_url"]
from bisect import bisect_left, bisect_right
+from collections.abc import Generator
from contextlib import contextmanager
from tempfile import NamedTemporaryFile
-from typing import Any, Dict, Generator, List, Optional, Tuple
+from typing import Any
from zipfile import BadZipFile, ZipFile
from pip._vendor.packaging.utils import canonicalize_name
@@ -56,8 +59,8 @@ class LazyZipOverHTTP:
self._length = int(head.headers["Content-Length"])
self._file = NamedTemporaryFile()
self.truncate(self._length)
- self._left: List[int] = []
- self._right: List[int] = []
+ self._left: list[int] = []
+ self._right: list[int] = []
if "bytes" not in head.headers.get("Accept-Ranges", "none"):
raise HTTPRangeRequestUnsupported("range request is not supported")
self._check_zip()
@@ -117,7 +120,7 @@ class LazyZipOverHTTP:
"""Return the current position."""
return self._file.tell()
- def truncate(self, size: Optional[int] = None) -> int:
+ def truncate(self, size: int | None = None) -> int:
"""Resize the stream to the given size in bytes.
If size is unspecified resize to the current position.
@@ -131,7 +134,7 @@ class LazyZipOverHTTP:
"""Return False."""
return False
- def __enter__(self) -> "LazyZipOverHTTP":
+ def __enter__(self) -> LazyZipOverHTTP:
self._file.__enter__()
return self
@@ -159,14 +162,14 @@ class LazyZipOverHTTP:
try:
# For read-only ZIP files, ZipFile only needs
# methods read, seek, seekable and tell.
- ZipFile(self) # type: ignore
+ ZipFile(self)
except BadZipFile:
pass
else:
break
def _stream_response(
- self, start: int, end: int, base_headers: Dict[str, str] = HEADERS
+ self, start: int, end: int, base_headers: dict[str, str] = HEADERS
) -> Response:
"""Return HTTP response to a range request from start to end."""
headers = base_headers.copy()
@@ -177,7 +180,7 @@ class LazyZipOverHTTP:
def _merge(
self, start: int, end: int, left: int, right: int
- ) -> Generator[Tuple[int, int], None, None]:
+ ) -> Generator[tuple[int, int], None, None]:
"""Return a generator of intervals to be fetched.
Args:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/session.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/session.py
index f17efc52..a1f9444e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/session.py
@@ -2,7 +2,10 @@
network request configuration and behavior.
"""
+from __future__ import annotations
+
import email.utils
+import functools
import io
import ipaddress
import json
@@ -15,16 +18,11 @@ import subprocess
import sys
import urllib.parse
import warnings
+from collections.abc import Generator, Mapping, Sequence
from typing import (
TYPE_CHECKING,
Any,
- Dict,
- Generator,
- List,
- Mapping,
Optional,
- Sequence,
- Tuple,
Union,
)
@@ -53,18 +51,19 @@ if TYPE_CHECKING:
from ssl import SSLContext
from pip._vendor.urllib3.poolmanager import PoolManager
+ from pip._vendor.urllib3.proxymanager import ProxyManager
logger = logging.getLogger(__name__)
-SecureOrigin = Tuple[str, str, Optional[Union[int, str]]]
+SecureOrigin = tuple[str, str, Optional[Union[int, str]]]
# Ignore warning raised when using --trusted-host.
warnings.filterwarnings("ignore", category=InsecureRequestWarning)
-SECURE_ORIGINS: List[SecureOrigin] = [
+SECURE_ORIGINS: list[SecureOrigin] = [
# protocol, hostname, port
# Taken from Chrome's list of secure origins (See: http://bit.ly/1qrySKC)
("https", "*", "*"),
@@ -106,11 +105,12 @@ def looks_like_ci() -> bool:
return any(name in os.environ for name in CI_ENVIRONMENT_VARIABLES)
+@functools.lru_cache(maxsize=1)
def user_agent() -> str:
"""
Return a string representing the user agent.
"""
- data: Dict[str, Any] = {
+ data: dict[str, Any] = {
"installer": {"name": "pip", "version": __version__},
"python": platform.python_version(),
"implementation": {
@@ -138,7 +138,7 @@ def user_agent() -> str:
from pip._vendor import distro
linux_distribution = distro.name(), distro.version(), distro.codename()
- distro_infos: Dict[str, Any] = dict(
+ distro_infos: dict[str, Any] = dict(
filter(
lambda x: x[1],
zip(["name", "version", "id"], linux_distribution),
@@ -212,10 +212,10 @@ class LocalFSAdapter(BaseAdapter):
self,
request: PreparedRequest,
stream: bool = False,
- timeout: Optional[Union[float, Tuple[float, float]]] = None,
- verify: Union[bool, str] = True,
- cert: Optional[Union[str, Tuple[str, str]]] = None,
- proxies: Optional[Mapping[str, str]] = None,
+ timeout: float | tuple[float, float] | None = None,
+ verify: bool | str = True,
+ cert: str | tuple[str, str] | None = None,
+ proxies: Mapping[str, str] | None = None,
) -> Response:
pathname = url_to_path(request.url)
@@ -230,7 +230,7 @@ class LocalFSAdapter(BaseAdapter):
# to return a better error message:
resp.status_code = 404
resp.reason = type(exc).__name__
- resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode("utf8"))
+ resp.raw = io.BytesIO(f"{resp.reason}: {exc}".encode())
else:
modified = email.utils.formatdate(stats.st_mtime, usegmt=True)
content_type = mimetypes.guess_type(pathname)[0] or "text/plain"
@@ -262,7 +262,7 @@ class _SSLContextAdapterMixin:
def __init__(
self,
*,
- ssl_context: Optional["SSLContext"] = None,
+ ssl_context: SSLContext | None = None,
**kwargs: Any,
) -> None:
self._ssl_context = ssl_context
@@ -274,7 +274,7 @@ class _SSLContextAdapterMixin:
maxsize: int,
block: bool = DEFAULT_POOLBLOCK,
**pool_kwargs: Any,
- ) -> "PoolManager":
+ ) -> PoolManager:
if self._ssl_context is not None:
pool_kwargs.setdefault("ssl_context", self._ssl_context)
return super().init_poolmanager( # type: ignore[misc]
@@ -284,6 +284,13 @@ class _SSLContextAdapterMixin:
**pool_kwargs,
)
+ def proxy_manager_for(self, proxy: str, **proxy_kwargs: Any) -> ProxyManager:
+ # Proxy manager replaces the pool manager, so inject our SSL
+ # context here too. https://github.com/pypa/pip/issues/13288
+ if self._ssl_context is not None:
+ proxy_kwargs.setdefault("ssl_context", self._ssl_context)
+ return super().proxy_manager_for(proxy, **proxy_kwargs) # type: ignore[misc]
+
class HTTPAdapter(_SSLContextAdapterMixin, _BaseHTTPAdapter):
pass
@@ -298,8 +305,8 @@ class InsecureHTTPAdapter(HTTPAdapter):
self,
conn: ConnectionPool,
url: str,
- verify: Union[bool, str],
- cert: Optional[Union[str, Tuple[str, str]]],
+ verify: bool | str,
+ cert: str | tuple[str, str] | None,
) -> None:
super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
@@ -309,23 +316,23 @@ class InsecureCacheControlAdapter(CacheControlAdapter):
self,
conn: ConnectionPool,
url: str,
- verify: Union[bool, str],
- cert: Optional[Union[str, Tuple[str, str]]],
+ verify: bool | str,
+ cert: str | tuple[str, str] | None,
) -> None:
super().cert_verify(conn=conn, url=url, verify=False, cert=cert)
class PipSession(requests.Session):
- timeout: Optional[int] = None
+ timeout: int | None = None
def __init__(
self,
*args: Any,
retries: int = 0,
- cache: Optional[str] = None,
+ cache: str | None = None,
trusted_hosts: Sequence[str] = (),
- index_urls: Optional[List[str]] = None,
- ssl_context: Optional["SSLContext"] = None,
+ index_urls: list[str] | None = None,
+ ssl_context: SSLContext | None = None,
**kwargs: Any,
) -> None:
"""
@@ -336,7 +343,8 @@ class PipSession(requests.Session):
# Namespace the attribute with "pip_" just in case to prevent
# possible conflicts with the base class.
- self.pip_trusted_origins: List[Tuple[str, Optional[int]]] = []
+ self.pip_trusted_origins: list[tuple[str, int | None]] = []
+ self.pip_proxy = None
# Attach our User Agent to the request
self.headers["User-Agent"] = user_agent()
@@ -398,7 +406,7 @@ class PipSession(requests.Session):
for host in trusted_hosts:
self.add_trusted_host(host, suppress_logging=True)
- def update_index_urls(self, new_index_urls: List[str]) -> None:
+ def update_index_urls(self, new_index_urls: list[str]) -> None:
"""
:param new_index_urls: New index urls to update the authentication
handler with.
@@ -406,7 +414,7 @@ class PipSession(requests.Session):
self.auth.index_urls = new_index_urls
def add_trusted_host(
- self, host: str, source: Optional[str] = None, suppress_logging: bool = False
+ self, host: str, source: str | None = None, suppress_logging: bool = False
) -> None:
"""
:param host: It is okay to provide a host that has previously been
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py
index 134848ae..74d3111c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py
@@ -1,6 +1,6 @@
-from typing import Dict, Generator
+from collections.abc import Generator
-from pip._vendor.requests.models import CONTENT_CHUNK_SIZE, Response
+from pip._vendor.requests.models import Response
from pip._internal.exceptions import NetworkConnectionError
@@ -23,7 +23,9 @@ from pip._internal.exceptions import NetworkConnectionError
# you're not asking for a compressed file and will then decompress it
# before sending because if that's the case I don't think it'll ever be
# possible to make this work.
-HEADERS: Dict[str, str] = {"Accept-Encoding": "identity"}
+HEADERS: dict[str, str] = {"Accept-Encoding": "identity"}
+
+DOWNLOAD_CHUNK_SIZE = 256 * 1024
def raise_for_status(resp: Response) -> None:
@@ -55,7 +57,7 @@ def raise_for_status(resp: Response) -> None:
def response_chunks(
- response: Response, chunk_size: int = CONTENT_CHUNK_SIZE
+ response: Response, chunk_size: int = DOWNLOAD_CHUNK_SIZE
) -> Generator[bytes, None, None]:
"""Given a requests Response, provide the data chunks."""
try:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
index 22ec8d2f..f4bddb48 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
@@ -1,10 +1,9 @@
-"""xmlrpclib.Transport implementation
-"""
+"""xmlrpclib.Transport implementation"""
import logging
import urllib.parse
import xmlrpc.client
-from typing import TYPE_CHECKING, Tuple
+from typing import TYPE_CHECKING
from pip._internal.exceptions import NetworkConnectionError
from pip._internal.network.session import PipSession
@@ -37,7 +36,7 @@ class PipXmlrpcTransport(xmlrpc.client.Transport):
handler: str,
request_body: "SizedBuffer",
verbose: bool = False,
- ) -> Tuple["_Marshallable", ...]:
+ ) -> tuple["_Marshallable", ...]:
assert isinstance(host, str)
parts = (self._scheme, host, handler, None, None, None)
url = urllib.parse.urlunparse(parts)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc
index 7a9e6c86..36cd6123 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc
index 47cf18c9..1fb87815 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/check.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc
index 91770360..7019ce8a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc
index 692dfb65..f5d3f883 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc
index d05bcf47..fc7feb97 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc
index e7e33675..6ff0f06b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc
index 7ac3f926..fd182f81 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc
index 308af67a..3f81fb2e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc
index 144a6fcf..a80721a3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc
index cb477abe..dde1a395 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc
index 787bb37a..e54e153a 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc
index e644b558..830951df 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
index 37919322..cbb4e4f0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
@@ -1,11 +1,12 @@
+from __future__ import annotations
+
import contextlib
import hashlib
import logging
import os
+from collections.abc import Generator
from types import TracebackType
-from typing import Dict, Generator, Optional, Set, Type, Union
-from pip._internal.models.link import Link
from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.temp_dir import TempDirectory
@@ -18,7 +19,7 @@ def update_env_context_manager(**changes: str) -> Generator[None, None, None]:
# Save values from the target and change them.
non_existent_marker = object()
- saved_values: Dict[str, Union[object, str]] = {}
+ saved_values: dict[str, object | str] = {}
for name, new_value in changes.items():
try:
saved_values[name] = target[name]
@@ -39,7 +40,7 @@ def update_env_context_manager(**changes: str) -> Generator[None, None, None]:
@contextlib.contextmanager
-def get_build_tracker() -> Generator["BuildTracker", None, None]:
+def get_build_tracker() -> Generator[BuildTracker, None, None]:
root = os.environ.get("PIP_BUILD_TRACKER")
with contextlib.ExitStack() as ctx:
if root is None:
@@ -66,18 +67,18 @@ class BuildTracker:
def __init__(self, root: str) -> None:
self._root = root
- self._entries: Dict[TrackerId, InstallRequirement] = {}
+ self._entries: dict[TrackerId, InstallRequirement] = {}
logger.debug("Created build tracker: %s", self._root)
- def __enter__(self) -> "BuildTracker":
+ def __enter__(self) -> BuildTracker:
logger.debug("Entered build tracker: %s", self._root)
return self
def __exit__(
self,
- exc_type: Optional[Type[BaseException]],
- exc_val: Optional[BaseException],
- exc_tb: Optional[TracebackType],
+ exc_type: type[BaseException] | None,
+ exc_val: BaseException | None,
+ exc_tb: TracebackType | None,
) -> None:
self.cleanup()
@@ -99,7 +100,7 @@ class BuildTracker:
except FileNotFoundError:
pass
else:
- message = "{} is already being built: {}".format(req.link, contents)
+ message = f"{req.link} is already being built: {contents}"
raise LookupError(message)
# If we're here, req should really not be building already.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py
index c66ac354..a546809e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py
@@ -1,5 +1,4 @@
-"""Metadata generation logic for source distributions.
-"""
+"""Metadata generation logic for source distributions."""
import os
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py
index 27c69f0d..27ecd7d3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py
@@ -1,5 +1,4 @@
-"""Metadata generation logic for source distributions.
-"""
+"""Metadata generation logic for source distributions."""
import os
@@ -38,4 +37,5 @@ def generate_editable_metadata(
except InstallationSubprocessError as error:
raise MetadataGenerationFailed(package_details=details) from error
+ assert distinfo_dir is not None
return os.path.join(metadata_dir, distinfo_dir)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py
index e60988d6..e385b5dd 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py
@@ -1,5 +1,4 @@
-"""Metadata generation logic for legacy source distributions.
-"""
+"""Metadata generation logic for legacy source distributions."""
import logging
import os
@@ -27,7 +26,7 @@ def _find_egg_info(directory: str) -> str:
if len(filenames) > 1:
raise InstallationError(
- "More than one .egg-info directory found in {}".format(directory)
+ f"More than one .egg-info directory found in {directory}"
)
return os.path.join(directory, filenames[0])
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
index 064811ad..5e404c61 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
@@ -1,6 +1,7 @@
+from __future__ import annotations
+
import logging
import os
-from typing import Optional
from pip._vendor.pyproject_hooks import BuildBackendHookCaller
@@ -14,7 +15,7 @@ def build_wheel_pep517(
backend: BuildBackendHookCaller,
metadata_directory: str,
tempd: str,
-) -> Optional[str]:
+) -> str | None:
"""Build one InstallRequirement using the PEP 517 build process.
Returns path to wheel if successfully built. Otherwise, returns None.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
index 719d69dd..521bd556 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
@@ -1,6 +1,7 @@
+from __future__ import annotations
+
import logging
import os
-from typing import Optional
from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing
@@ -14,7 +15,7 @@ def build_wheel_editable(
backend: BuildBackendHookCaller,
metadata_directory: str,
tempd: str,
-) -> Optional[str]:
+) -> str | None:
"""Build one InstallRequirement using the PEP 660 build process.
Returns path to wheel if successfully built. Otherwise, returns None.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py
index c5f0492c..02ef8e57 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py
@@ -1,8 +1,10 @@
+from __future__ import annotations
+
import logging
import os.path
-from typing import List, Optional
from pip._internal.cli.spinners import open_spinner
+from pip._internal.utils.deprecation import deprecated
from pip._internal.utils.setuptools_build import make_setuptools_bdist_wheel_args
from pip._internal.utils.subprocess import call_subprocess, format_command_args
@@ -10,7 +12,7 @@ logger = logging.getLogger(__name__)
def format_command_result(
- command_args: List[str],
+ command_args: list[str],
command_output: str,
) -> str:
"""Format command information for logging."""
@@ -30,26 +32,26 @@ def format_command_result(
def get_legacy_build_wheel_path(
- names: List[str],
+ names: list[str],
temp_dir: str,
name: str,
- command_args: List[str],
+ command_args: list[str],
command_output: str,
-) -> Optional[str]:
+) -> str | None:
"""Return the path to the wheel in the temporary build directory."""
# Sort for determinism.
names = sorted(names)
if not names:
- msg = ("Legacy build of wheel for {!r} created no files.\n").format(name)
+ msg = f"Legacy build of wheel for {name!r} created no files.\n"
msg += format_command_result(command_args, command_output)
logger.warning(msg)
return None
if len(names) > 1:
msg = (
- "Legacy build of wheel for {!r} created more than one file.\n"
- "Filenames (choosing first): {}\n"
- ).format(name, names)
+ f"Legacy build of wheel for {name!r} created more than one file.\n"
+ f"Filenames (choosing first): {names}\n"
+ )
msg += format_command_result(command_args, command_output)
logger.warning(msg)
@@ -60,14 +62,29 @@ def build_wheel_legacy(
name: str,
setup_py_path: str,
source_dir: str,
- global_options: List[str],
- build_options: List[str],
+ global_options: list[str],
+ build_options: list[str],
tempd: str,
-) -> Optional[str]:
+) -> str | None:
"""Build one unpacked package using the "legacy" build process.
Returns path to wheel if successfully built. Otherwise, returns None.
"""
+ deprecated(
+ reason=(
+ f"Building {name!r} using the legacy setup.py bdist_wheel mechanism, "
+ "which will be removed in a future version."
+ ),
+ replacement=(
+ "to use the standardized build interface by "
+ "setting the `--use-pep517` option, "
+ "(possibly combined with `--no-build-isolation`), "
+ f"or adding a `pyproject.toml` file to the source tree of {name!r}"
+ ),
+ gone_in="25.3",
+ issue=6334,
+ )
+
wheel_args = make_setuptools_bdist_wheel_args(
setup_py_path,
global_options=global_options,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py
index 90c6a58a..2d71fa5f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py
@@ -1,40 +1,47 @@
-"""Validation of dependencies of packages
-"""
+"""Validation of dependencies of packages"""
+
+from __future__ import annotations
import logging
-from typing import Callable, Dict, List, NamedTuple, Optional, Set, Tuple
+from collections.abc import Generator, Iterable
+from contextlib import suppress
+from email.parser import Parser
+from functools import reduce
+from typing import (
+ Callable,
+ NamedTuple,
+)
from pip._vendor.packaging.requirements import Requirement
-from pip._vendor.packaging.specifiers import LegacySpecifier
+from pip._vendor.packaging.tags import Tag, parse_tag
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion
+from pip._vendor.packaging.version import Version
from pip._internal.distributions import make_distribution_for_install_requirement
from pip._internal.metadata import get_default_environment
-from pip._internal.metadata.base import DistributionVersion
+from pip._internal.metadata.base import BaseDistribution
from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.deprecation import deprecated
logger = logging.getLogger(__name__)
class PackageDetails(NamedTuple):
- version: DistributionVersion
- dependencies: List[Requirement]
+ version: Version
+ dependencies: list[Requirement]
# Shorthands
-PackageSet = Dict[NormalizedName, PackageDetails]
-Missing = Tuple[NormalizedName, Requirement]
-Conflicting = Tuple[NormalizedName, DistributionVersion, Requirement]
+PackageSet = dict[NormalizedName, PackageDetails]
+Missing = tuple[NormalizedName, Requirement]
+Conflicting = tuple[NormalizedName, Version, Requirement]
-MissingDict = Dict[NormalizedName, List[Missing]]
-ConflictingDict = Dict[NormalizedName, List[Conflicting]]
-CheckResult = Tuple[MissingDict, ConflictingDict]
-ConflictDetails = Tuple[PackageSet, CheckResult]
+MissingDict = dict[NormalizedName, list[Missing]]
+ConflictingDict = dict[NormalizedName, list[Conflicting]]
+CheckResult = tuple[MissingDict, ConflictingDict]
+ConflictDetails = tuple[PackageSet, CheckResult]
-def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
+def create_package_set_from_installed() -> tuple[PackageSet, bool]:
"""Converts a list of distributions into a PackageSet."""
package_set = {}
problems = False
@@ -46,13 +53,13 @@ def create_package_set_from_installed() -> Tuple[PackageSet, bool]:
package_set[name] = PackageDetails(dist.version, dependencies)
except (OSError, ValueError) as e:
# Don't crash on unreadable or broken metadata.
- logger.warning("Error parsing requirements for %s: %s", name, e)
+ logger.warning("Error parsing dependencies of %s: %s", name, e)
problems = True
return package_set, problems
def check_package_set(
- package_set: PackageSet, should_ignore: Optional[Callable[[str], bool]] = None
+ package_set: PackageSet, should_ignore: Callable[[str], bool] | None = None
) -> CheckResult:
"""Check if a package set is consistent
@@ -60,15 +67,13 @@ def check_package_set(
package name and returns a boolean.
"""
- warn_legacy_versions_and_specifiers(package_set)
-
missing = {}
conflicting = {}
for package_name, package_detail in package_set.items():
# Info about dependencies of package_name
- missing_deps: Set[Missing] = set()
- conflicting_deps: Set[Conflicting] = set()
+ missing_deps: set[Missing] = set()
+ conflicting_deps: set[Conflicting] = set()
if should_ignore and should_ignore(package_name):
continue
@@ -98,7 +103,7 @@ def check_package_set(
return missing, conflicting
-def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDetails:
+def check_install_conflicts(to_install: list[InstallRequirement]) -> ConflictDetails:
"""For checking if the dependency graph would be consistent after \
installing given requirements
"""
@@ -118,9 +123,25 @@ def check_install_conflicts(to_install: List[InstallRequirement]) -> ConflictDet
)
+def check_unsupported(
+ packages: Iterable[BaseDistribution],
+ supported_tags: Iterable[Tag],
+) -> Generator[BaseDistribution, None, None]:
+ for p in packages:
+ with suppress(FileNotFoundError):
+ wheel_file = p.read_text("WHEEL")
+ wheel_tags: frozenset[Tag] = reduce(
+ frozenset.union,
+ map(parse_tag, Parser().parsestr(wheel_file).get_all("Tag", [])),
+ frozenset(),
+ )
+ if wheel_tags.isdisjoint(supported_tags):
+ yield p
+
+
def _simulate_installation_of(
- to_install: List[InstallRequirement], package_set: PackageSet
-) -> Set[NormalizedName]:
+ to_install: list[InstallRequirement], package_set: PackageSet
+) -> set[NormalizedName]:
"""Computes the version of packages after installing to_install."""
# Keep track of packages that were installed
installed = set()
@@ -138,8 +159,8 @@ def _simulate_installation_of(
def _create_whitelist(
- would_be_installed: Set[NormalizedName], package_set: PackageSet
-) -> Set[NormalizedName]:
+ would_be_installed: set[NormalizedName], package_set: PackageSet
+) -> set[NormalizedName]:
packages_affected = set(would_be_installed)
for package_name in package_set:
@@ -152,36 +173,3 @@ def _create_whitelist(
break
return packages_affected
-
-
-def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None:
- for project_name, package_details in package_set.items():
- if isinstance(package_details.version, LegacyVersion):
- deprecated(
- reason=(
- f"{project_name} {package_details.version} "
- f"has a non-standard version number."
- ),
- replacement=(
- f"to upgrade to a newer version of {project_name} "
- f"or contact the author to suggest that they "
- f"release a version with a conforming version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
- for dep in package_details.dependencies:
- if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier):
- deprecated(
- reason=(
- f"{project_name} {package_details.version} "
- f"has a non-standard dependency specifier {dep}."
- ),
- replacement=(
- f"to upgrade to a newer version of {project_name} "
- f"or contact the author to suggest that they "
- f"release a version with a conforming dependency specifiers"
- ),
- issue=12063,
- gone_in="24.1",
- )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
index 35445684..486a8332 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
@@ -1,10 +1,14 @@
+from __future__ import annotations
+
import collections
import logging
import os
-from typing import Container, Dict, Generator, Iterable, List, NamedTuple, Optional, Set
+from collections.abc import Container, Generator, Iterable
+from dataclasses import dataclass, field
+from typing import NamedTuple
-from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import Version
+from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import InvalidVersion
from pip._internal.exceptions import BadCommand, InstallationError
from pip._internal.metadata import BaseDistribution, get_environment
@@ -20,19 +24,19 @@ logger = logging.getLogger(__name__)
class _EditableInfo(NamedTuple):
requirement: str
- comments: List[str]
+ comments: list[str]
def freeze(
- requirement: Optional[List[str]] = None,
+ requirement: list[str] | None = None,
local_only: bool = False,
user_only: bool = False,
- paths: Optional[List[str]] = None,
+ paths: list[str] | None = None,
isolated: bool = False,
exclude_editable: bool = False,
skip: Container[str] = (),
) -> Generator[str, None, None]:
- installations: Dict[str, FrozenRequirement] = {}
+ installations: dict[str, FrozenRequirement] = {}
dists = get_environment(paths).iter_installed_distributions(
local_only=local_only,
@@ -50,10 +54,10 @@ def freeze(
# should only be emitted once, even if the same option is in multiple
# requirements files, so we need to keep track of what has been emitted
# so that we don't emit it again if it's seen again
- emitted_options: Set[str] = set()
+ emitted_options: set[str] = set()
# keep track of which files a requirement is in so that we can
# give an accurate warning if a requirement appears multiple times.
- req_files: Dict[str, List[str]] = collections.defaultdict(list)
+ req_files: dict[str, list[str]] = collections.defaultdict(list)
for req_file_path in requirement:
with open(req_file_path) as req_file:
for line in req_file:
@@ -82,7 +86,7 @@ def freeze(
yield line
continue
- if line.startswith("-e") or line.startswith("--editable"):
+ if line.startswith(("-e", "--editable")):
if line.startswith("-e"):
line = line[2:].strip()
else:
@@ -145,10 +149,13 @@ def freeze(
def _format_as_name_version(dist: BaseDistribution) -> str:
- dist_version = dist.version
- if isinstance(dist_version, Version):
+ try:
+ dist_version = dist.version
+ except InvalidVersion:
+ # legacy version
+ return f"{dist.raw_name}==={dist.raw_version}"
+ else:
return f"{dist.raw_name}=={dist_version}"
- return f"{dist.raw_name}==={dist_version}"
def _get_editable_info(dist: BaseDistribution) -> _EditableInfo:
@@ -217,22 +224,19 @@ def _get_editable_info(dist: BaseDistribution) -> _EditableInfo:
)
+@dataclass(frozen=True)
class FrozenRequirement:
- def __init__(
- self,
- name: str,
- req: str,
- editable: bool,
- comments: Iterable[str] = (),
- ) -> None:
- self.name = name
- self.canonical_name = canonicalize_name(name)
- self.req = req
- self.editable = editable
- self.comments = comments
+ name: str
+ req: str
+ editable: bool
+ comments: Iterable[str] = field(default_factory=tuple)
+
+ @property
+ def canonical_name(self) -> NormalizedName:
+ return canonicalize_name(self.name)
@classmethod
- def from_dist(cls, dist: BaseDistribution) -> "FrozenRequirement":
+ def from_dist(cls, dist: BaseDistribution) -> FrozenRequirement:
editable = dist.editable
if editable:
req, comments = _get_editable_info(dist)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py
index 24d6a5dd..2645a4ac 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py
@@ -1,2 +1 @@
-"""For modules related to installing packages.
-"""
+"""For modules related to installing packages."""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc
index 05fb4790..bdbf7287 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc
index 50a2103d..69366f73 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc
index 03a5fe94..3820efc7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py
index bebe24e6..0603d3d8 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py
@@ -1,7 +1,9 @@
-"""Legacy editable installation process, i.e. `setup.py develop`.
-"""
+"""Legacy editable installation process, i.e. `setup.py develop`."""
+
+from __future__ import annotations
+
import logging
-from typing import Optional, Sequence
+from collections.abc import Sequence
from pip._internal.build_env import BuildEnvironment
from pip._internal.utils.logging import indent_log
@@ -14,8 +16,8 @@ logger = logging.getLogger(__name__)
def install_editable(
*,
global_options: Sequence[str],
- prefix: Optional[str],
- home: Optional[str],
+ prefix: str | None,
+ home: str | None,
use_user_site: bool,
name: str,
setup_py_path: str,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
index f67180c9..2724f150 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
@@ -1,5 +1,6 @@
-"""Support for installing and building the "wheel" binary package format.
-"""
+"""Support for installing and building the "wheel" binary package format."""
+
+from __future__ import annotations
import collections
import compileall
@@ -11,26 +12,19 @@ import os.path
import re
import shutil
import sys
+import textwrap
import warnings
from base64 import urlsafe_b64encode
+from collections.abc import Generator, Iterable, Iterator, Sequence
from email.message import Message
from itertools import chain, filterfalse, starmap
from typing import (
IO,
- TYPE_CHECKING,
Any,
BinaryIO,
Callable,
- Dict,
- Generator,
- Iterable,
- Iterator,
- List,
NewType,
- Optional,
- Sequence,
- Set,
- Tuple,
+ Protocol,
Union,
cast,
)
@@ -50,7 +44,7 @@ from pip._internal.metadata import (
from pip._internal.models.direct_url import DIRECT_URL_METADATA_NAME, DirectUrl
from pip._internal.models.scheme import SCHEME_KEYS, Scheme
from pip._internal.utils.filesystem import adjacent_tmp_file, replace
-from pip._internal.utils.misc import captured_stdout, ensure_dir, hash_file, partition
+from pip._internal.utils.misc import StreamWrapper, ensure_dir, hash_file, partition
from pip._internal.utils.unpacking import (
current_umask,
is_within_directory,
@@ -59,32 +53,30 @@ from pip._internal.utils.unpacking import (
)
from pip._internal.utils.wheel import parse_wheel
-if TYPE_CHECKING:
- from typing import Protocol
- class File(Protocol):
- src_record_path: "RecordPath"
- dest_path: str
- changed: bool
+class File(Protocol):
+ src_record_path: RecordPath
+ dest_path: str
+ changed: bool
- def save(self) -> None:
- pass
+ def save(self) -> None:
+ pass
logger = logging.getLogger(__name__)
RecordPath = NewType("RecordPath", str)
-InstalledCSVRow = Tuple[RecordPath, str, Union[int, str]]
+InstalledCSVRow = tuple[RecordPath, str, Union[int, str]]
-def rehash(path: str, blocksize: int = 1 << 20) -> Tuple[str, str]:
+def rehash(path: str, blocksize: int = 1 << 20) -> tuple[str, str]:
"""Return (encoded_digest, length) for path using hashlib.sha256()"""
h, length = hash_file(path, blocksize)
digest = "sha256=" + urlsafe_b64encode(h.digest()).decode("latin1").rstrip("=")
return (digest, str(length))
-def csv_io_kwargs(mode: str) -> Dict[str, Any]:
+def csv_io_kwargs(mode: str) -> dict[str, Any]:
"""Return keyword arguments to properly open a CSV file
in the given mode.
"""
@@ -115,7 +107,7 @@ def wheel_root_is_purelib(metadata: Message) -> bool:
return metadata.get("Root-Is-Purelib", "").lower() == "true"
-def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, str]]:
+def get_entrypoints(dist: BaseDistribution) -> tuple[dict[str, str], dict[str, str]]:
console_scripts = {}
gui_scripts = {}
for entry_point in dist.iter_entry_points():
@@ -126,7 +118,7 @@ def get_entrypoints(dist: BaseDistribution) -> Tuple[Dict[str, str], Dict[str, s
return console_scripts, gui_scripts
-def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
+def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> str | None:
"""Determine if any scripts are not on PATH and format a warning.
Returns a warning message if one or more scripts are not on PATH,
otherwise None.
@@ -135,7 +127,7 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
return None
# Group scripts by the path they were installed in
- grouped_by_dir: Dict[str, Set[str]] = collections.defaultdict(set)
+ grouped_by_dir: dict[str, set[str]] = collections.defaultdict(set)
for destfile in scripts:
parent_dir = os.path.dirname(destfile)
script_name = os.path.basename(destfile)
@@ -151,7 +143,7 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
not_warn_dirs.append(
os.path.normcase(os.path.normpath(os.path.dirname(sys.executable)))
)
- warn_for: Dict[str, Set[str]] = {
+ warn_for: dict[str, set[str]] = {
parent_dir: scripts
for parent_dir, scripts in grouped_by_dir.items()
if os.path.normcase(os.path.normpath(parent_dir)) not in not_warn_dirs
@@ -162,7 +154,7 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
# Format a message
msg_lines = []
for parent_dir, dir_scripts in warn_for.items():
- sorted_scripts: List[str] = sorted(dir_scripts)
+ sorted_scripts: list[str] = sorted(dir_scripts)
if len(sorted_scripts) == 1:
start_text = f"script {sorted_scripts[0]} is"
else:
@@ -200,7 +192,7 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]:
def _normalized_outrows(
outrows: Iterable[InstalledCSVRow],
-) -> List[Tuple[str, str, str]]:
+) -> list[tuple[str, str, str]]:
"""Normalize the given rows of a RECORD file.
Items in each row are converted into str. Rows are then sorted to make
@@ -239,17 +231,17 @@ def _fs_to_record_path(path: str, lib_dir: str) -> RecordPath:
def get_csv_rows_for_installed(
- old_csv_rows: List[List[str]],
- installed: Dict[RecordPath, RecordPath],
- changed: Set[RecordPath],
- generated: List[str],
+ old_csv_rows: list[list[str]],
+ installed: dict[RecordPath, RecordPath],
+ changed: set[RecordPath],
+ generated: list[str],
lib_dir: str,
-) -> List[InstalledCSVRow]:
+) -> list[InstalledCSVRow]:
"""
:param installed: A map from archive RECORD path to installation RECORD
path.
"""
- installed_rows: List[InstalledCSVRow] = []
+ installed_rows: list[InstalledCSVRow] = []
for row in old_csv_rows:
if len(row) > 3:
logger.warning("RECORD line has more than three elements: %s", row)
@@ -270,7 +262,7 @@ def get_csv_rows_for_installed(
]
-def get_console_script_specs(console: Dict[str, str]) -> List[str]:
+def get_console_script_specs(console: dict[str, str]) -> list[str]:
"""
Given the mapping from entrypoint name to callable, return the relevant
console script specs.
@@ -288,17 +280,15 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]:
# the wheel metadata at build time, and so if the wheel is installed with
# a *different* version of Python the entry points will be wrong. The
# correct fix for this is to enhance the metadata to be able to describe
- # such versioned entry points, but that won't happen till Metadata 2.0 is
- # available.
- # In the meantime, projects using versioned entry points will either have
+ # such versioned entry points.
+ # Currently, projects using versioned entry points will either have
# incorrect versioned entry points, or they will not be able to distribute
# "universal" wheels (i.e., they will need a wheel per Python version).
#
# Because setuptools and pip are bundled with _ensurepip and virtualenv,
- # we need to use universal wheels. So, as a stopgap until Metadata 2.0, we
+ # we need to use universal wheels. As a workaround, we
# override the versioned entry points in the wheel and generate the
- # correct ones. This code is purely a short-term measure until Metadata 2.0
- # is available.
+ # correct ones.
#
# To add the level of hack in this section of code, in order to support
# ensurepip this code will look for an ``ENSUREPIP_OPTIONS`` environment
@@ -360,12 +350,6 @@ class ZipBackedFile:
return self._zip_file.getinfo(self.src_record_path)
def save(self) -> None:
- # directory creation is lazy and after file filtering
- # to ensure we don't install empty dirs; empty dirs can't be
- # uninstalled.
- parent_dir = os.path.dirname(self.dest_path)
- ensure_dir(parent_dir)
-
# When we open the output file below, any existing file is truncated
# before we start writing the new contents. This is fine in most
# cases, but can cause a segfault if pip has loaded a shared
@@ -379,16 +363,20 @@ class ZipBackedFile:
zipinfo = self._getinfo()
- with self._zip_file.open(zipinfo) as f:
- with open(self.dest_path, "wb") as dest:
- shutil.copyfileobj(f, dest)
+ # optimization: the file is created by open(),
+ # skip the decompression when there is 0 bytes to decompress.
+ with open(self.dest_path, "wb") as dest:
+ if zipinfo.file_size > 0:
+ with self._zip_file.open(zipinfo) as f:
+ blocksize = min(zipinfo.file_size, 1024 * 1024)
+ shutil.copyfileobj(f, dest, blocksize)
if zip_item_is_executable(zipinfo):
set_extracted_file_to_default_mode_plus_executable(self.dest_path)
class ScriptFile:
- def __init__(self, file: "File") -> None:
+ def __init__(self, file: File) -> None:
self._file = file
self.src_record_path = self._file.src_record_path
self.dest_path = self._file.dest_path
@@ -403,7 +391,7 @@ class MissingCallableSuffix(InstallationError):
def __init__(self, entry_point: str) -> None:
super().__init__(
f"Invalid script entry point: {entry_point} - A callable "
- "suffix is required. Cf https://packaging.python.org/"
+ "suffix is required. See https://packaging.python.org/"
"specifications/entry-points/#use-for-scripts for more "
"information."
)
@@ -416,21 +404,34 @@ def _raise_for_invalid_entrypoint(specification: str) -> None:
class PipScriptMaker(ScriptMaker):
+ # Override distlib's default script template with one that
+ # doesn't import `re` module, allowing scripts to load faster.
+ script_template = textwrap.dedent(
+ """\
+ import sys
+ from %(module)s import %(import_name)s
+ if __name__ == '__main__':
+ if sys.argv[0].endswith('.exe'):
+ sys.argv[0] = sys.argv[0][:-4]
+ sys.exit(%(func)s())
+"""
+ )
+
def make(
- self, specification: str, options: Optional[Dict[str, Any]] = None
- ) -> List[str]:
+ self, specification: str, options: dict[str, Any] | None = None
+ ) -> list[str]:
_raise_for_invalid_entrypoint(specification)
return super().make(specification, options)
-def _install_wheel(
+def _install_wheel( # noqa: C901, PLR0915 function is too long
name: str,
wheel_zip: ZipFile,
wheel_path: str,
scheme: Scheme,
pycompile: bool = True,
warn_script_location: bool = True,
- direct_url: Optional[DirectUrl] = None,
+ direct_url: DirectUrl | None = None,
requested: bool = False,
) -> None:
"""Install a wheel.
@@ -459,9 +460,9 @@ def _install_wheel(
# installed = files copied from the wheel to the destination
# changed = files changed while installing (scripts #! line typically)
# generated = files newly generated during the install (script wrappers)
- installed: Dict[RecordPath, RecordPath] = {}
- changed: Set[RecordPath] = set()
- generated: List[str] = []
+ installed: dict[RecordPath, RecordPath] = {}
+ changed: set[RecordPath] = set()
+ generated: list[str] = []
def record_installed(
srcfile: RecordPath, destfile: str, modified: bool = False
@@ -487,8 +488,8 @@ def _install_wheel(
def root_scheme_file_maker(
zip_file: ZipFile, dest: str
- ) -> Callable[[RecordPath], "File"]:
- def make_root_scheme_file(record_path: RecordPath) -> "File":
+ ) -> Callable[[RecordPath], File]:
+ def make_root_scheme_file(record_path: RecordPath) -> File:
normed_path = os.path.normpath(record_path)
dest_path = os.path.join(dest, normed_path)
assert_no_path_traversal(dest, dest_path)
@@ -498,18 +499,18 @@ def _install_wheel(
def data_scheme_file_maker(
zip_file: ZipFile, scheme: Scheme
- ) -> Callable[[RecordPath], "File"]:
+ ) -> Callable[[RecordPath], File]:
scheme_paths = {key: getattr(scheme, key) for key in SCHEME_KEYS}
- def make_data_scheme_file(record_path: RecordPath) -> "File":
+ def make_data_scheme_file(record_path: RecordPath) -> File:
normed_path = os.path.normpath(record_path)
try:
_, scheme_key, dest_subpath = normed_path.split(os.path.sep, 2)
except ValueError:
message = (
- "Unexpected file in {}: {!r}. .data directory contents"
- " should be named like: '/'."
- ).format(wheel_path, record_path)
+ f"Unexpected file in {wheel_path}: {record_path!r}. .data directory"
+ " contents should be named like: '/'."
+ )
raise InstallationError(message)
try:
@@ -517,10 +518,11 @@ def _install_wheel(
except KeyError:
valid_scheme_keys = ", ".join(sorted(scheme_paths))
message = (
- "Unknown scheme key used in {}: {} (for file {!r}). .data"
- " directory contents should be in subdirectories named"
- " with a valid scheme key ({})"
- ).format(wheel_path, scheme_key, record_path, valid_scheme_keys)
+ f"Unknown scheme key used in {wheel_path}: {scheme_key} "
+ f"(for file {record_path!r}). .data directory contents "
+ f"should be in subdirectories named with a valid scheme "
+ f"key ({valid_scheme_keys})"
+ )
raise InstallationError(message)
dest_path = os.path.join(scheme_path, dest_subpath)
@@ -532,7 +534,7 @@ def _install_wheel(
def is_data_scheme_path(path: RecordPath) -> bool:
return path.split("/", 1)[0].endswith(".data")
- paths = cast(List[RecordPath], wheel_zip.namelist())
+ paths = cast(list[RecordPath], wheel_zip.namelist())
file_paths = filterfalse(is_dir_path, paths)
root_scheme_paths, data_scheme_paths = partition(is_data_scheme_path, file_paths)
@@ -558,7 +560,7 @@ def _install_wheel(
)
console, gui = get_entrypoints(distribution)
- def is_entrypoint_wrapper(file: "File") -> bool:
+ def is_entrypoint_wrapper(file: File) -> bool:
# EP, EP.exe and EP-script.py are scripts generated for
# entry point EP by setuptools
path = file.dest_path
@@ -581,7 +583,15 @@ def _install_wheel(
script_scheme_files = map(ScriptFile, script_scheme_files)
files = chain(files, script_scheme_files)
+ existing_parents = set()
for file in files:
+ # directory creation is lazy and after file filtering
+ # to ensure we don't install empty dirs; empty dirs can't be
+ # uninstalled.
+ parent_dir = os.path.dirname(file.dest_path)
+ if parent_dir not in existing_parents:
+ ensure_dir(parent_dir)
+ existing_parents.add(parent_dir)
file.save()
record_installed(file.src_record_path, file.dest_path, file.changed)
@@ -604,7 +614,9 @@ def _install_wheel(
# Compile all of the pyc files for the installed files
if pycompile:
- with captured_stdout() as stdout:
+ with contextlib.redirect_stdout(
+ StreamWrapper.from_stream(sys.stdout)
+ ) as stdout:
with warnings.catch_warnings():
warnings.filterwarnings("ignore")
for path in pyc_source_file_paths():
@@ -717,7 +729,7 @@ def install_wheel(
req_description: str,
pycompile: bool = True,
warn_script_location: bool = True,
- direct_url: Optional[DirectUrl] = None,
+ direct_url: DirectUrl | None = None,
requested: bool = False,
) -> None:
with ZipFile(wheel_path, allowZip64=True) as z:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
index 956717d1..00b1a33a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
@@ -1,17 +1,20 @@
-"""Prepares a distribution for installation
-"""
+"""Prepares a distribution for installation"""
# The following comment should be removed at some point in the future.
# mypy: strict-optional=False
+from __future__ import annotations
import mimetypes
import os
import shutil
+from collections.abc import Iterable
+from dataclasses import dataclass
from pathlib import Path
-from typing import Dict, Iterable, List, Optional
+from typing import TYPE_CHECKING
from pip._vendor.packaging.utils import canonicalize_name
+from pip._internal.build_env import BuildEnvironmentInstaller
from pip._internal.distributions import make_distribution_for_install_requirement
from pip._internal.distributions.installed import InstalledDistribution
from pip._internal.exceptions import (
@@ -28,7 +31,7 @@ from pip._internal.metadata import BaseDistribution, get_metadata_distribution
from pip._internal.models.direct_url import ArchiveInfo
from pip._internal.models.link import Link
from pip._internal.models.wheel import Wheel
-from pip._internal.network.download import BatchDownloader, Downloader
+from pip._internal.network.download import Downloader
from pip._internal.network.lazy_wheel import (
HTTPRangeRequestUnsupported,
dist_from_wheel_url,
@@ -53,13 +56,16 @@ from pip._internal.utils.temp_dir import TempDirectory
from pip._internal.utils.unpacking import unpack_file
from pip._internal.vcs import vcs
+if TYPE_CHECKING:
+ from pip._internal.cli.progress_bars import BarType
+
logger = getLogger(__name__)
def _get_prepared_distribution(
req: InstallRequirement,
build_tracker: BuildTracker,
- finder: PackageFinder,
+ build_env_installer: BuildEnvironmentInstaller,
build_isolation: bool,
check_build_deps: bool,
) -> BaseDistribution:
@@ -69,7 +75,7 @@ def _get_prepared_distribution(
if tracker_id is not None:
with build_tracker.track(req, tracker_id):
abstract_dist.prepare_distribution_metadata(
- finder, build_isolation, check_build_deps
+ build_env_installer, build_isolation, check_build_deps
)
return abstract_dist.get_metadata_distribution()
@@ -80,20 +86,26 @@ def unpack_vcs_link(link: Link, location: str, verbosity: int) -> None:
vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity)
+@dataclass
class File:
- def __init__(self, path: str, content_type: Optional[str]) -> None:
- self.path = path
- if content_type is None:
- self.content_type = mimetypes.guess_type(path)[0]
- else:
- self.content_type = content_type
+ path: str
+ content_type: str | None = None
+
+ def __post_init__(self) -> None:
+ if self.content_type is None:
+ # Try to guess the file's MIME type. If the system MIME tables
+ # can't be loaded, give up.
+ try:
+ self.content_type = mimetypes.guess_type(self.path)[0]
+ except OSError:
+ pass
def get_http_url(
link: Link,
download: Downloader,
- download_dir: Optional[str] = None,
- hashes: Optional[Hashes] = None,
+ download_dir: str | None = None,
+ hashes: Hashes | None = None,
) -> File:
temp_dir = TempDirectory(kind="unpack", globally_managed=True)
# If a download dir is specified, is the file already downloaded there?
@@ -114,7 +126,7 @@ def get_http_url(
def get_file_url(
- link: Link, download_dir: Optional[str] = None, hashes: Optional[Hashes] = None
+ link: Link, download_dir: str | None = None, hashes: Hashes | None = None
) -> File:
"""Get file and optionally check its hash."""
# If a download dir is specified, is the file already there and valid?
@@ -142,9 +154,9 @@ def unpack_url(
location: str,
download: Downloader,
verbosity: int,
- download_dir: Optional[str] = None,
- hashes: Optional[Hashes] = None,
-) -> Optional[File]:
+ download_dir: str | None = None,
+ hashes: Hashes | None = None,
+) -> File | None:
"""Unpack link into location, downloading if required.
:param hashes: A Hashes object, one of whose embedded hashes must match,
@@ -183,9 +195,9 @@ def unpack_url(
def _check_download_dir(
link: Link,
download_dir: str,
- hashes: Optional[Hashes],
+ hashes: Hashes | None,
warn_on_hash_mismatch: bool = True,
-) -> Optional[str]:
+) -> str | None:
"""Check download_dir for previously downloaded file with correct hash
If a correct file is found return its path else None
"""
@@ -213,22 +225,25 @@ def _check_download_dir(
class RequirementPreparer:
"""Prepares a Requirement"""
- def __init__(
+ def __init__( # noqa: PLR0913 (too many parameters)
self,
+ *,
build_dir: str,
- download_dir: Optional[str],
+ download_dir: str | None,
src_dir: str,
build_isolation: bool,
+ build_isolation_installer: BuildEnvironmentInstaller,
check_build_deps: bool,
build_tracker: BuildTracker,
session: PipSession,
- progress_bar: str,
+ progress_bar: BarType,
finder: PackageFinder,
require_hashes: bool,
use_user_site: bool,
lazy_wheel: bool,
verbosity: int,
legacy_resolver: bool,
+ resume_retries: int,
) -> None:
super().__init__()
@@ -236,8 +251,7 @@ class RequirementPreparer:
self.build_dir = build_dir
self.build_tracker = build_tracker
self._session = session
- self._download = Downloader(session, progress_bar)
- self._batch_download = BatchDownloader(session, progress_bar)
+ self._download = Downloader(session, progress_bar, resume_retries)
self.finder = finder
# Where still-packed archives should be written to. If None, they are
@@ -246,6 +260,7 @@ class RequirementPreparer:
# Is build isolation allowed?
self.build_isolation = build_isolation
+ self.build_env_installer = build_isolation_installer
# Should check build dependencies?
self.check_build_deps = check_build_deps
@@ -266,7 +281,7 @@ class RequirementPreparer:
self.legacy_resolver = legacy_resolver
# Memoized downloaded files, as mapping of url: path.
- self._downloaded: Dict[str, str] = {}
+ self._downloaded: dict[str, str] = {}
# Previous "header" printed for a link-based InstallRequirement
self._previous_requirement_header = ("", "")
@@ -284,7 +299,7 @@ class RequirementPreparer:
# would already be included if we used req directly)
if req.req and req.comes_from:
if isinstance(req.comes_from, str):
- comes_from: Optional[str] = req.comes_from
+ comes_from: str | None = req.comes_from
else:
comes_from = req.comes_from.from_path()
if comes_from:
@@ -356,7 +371,7 @@ class RequirementPreparer:
def _fetch_metadata_only(
self,
req: InstallRequirement,
- ) -> Optional[BaseDistribution]:
+ ) -> BaseDistribution | None:
if self.legacy_resolver:
logger.debug(
"Metadata-only fetching is not used in the legacy resolver",
@@ -375,7 +390,7 @@ class RequirementPreparer:
def _fetch_metadata_using_link_data_attr(
self,
req: InstallRequirement,
- ) -> Optional[BaseDistribution]:
+ ) -> BaseDistribution | None:
"""Fetch metadata from the data-dist-info-metadata attribute, if possible."""
# (1) Get the link to the metadata file, if provided by the backend.
metadata_link = req.link.metadata_link()
@@ -416,7 +431,7 @@ class RequirementPreparer:
def _fetch_metadata_using_lazy_wheel(
self,
link: Link,
- ) -> Optional[BaseDistribution]:
+ ) -> BaseDistribution | None:
"""Fetch metadata using lazy wheel, if possible."""
# --use-feature=fast-deps must be provided.
if not self.use_lazy_wheel:
@@ -455,15 +470,12 @@ class RequirementPreparer:
# Map each link to the requirement that owns it. This allows us to set
# `req.local_file_path` on the appropriate requirement after passing
# all the links at once into BatchDownloader.
- links_to_fully_download: Dict[Link, InstallRequirement] = {}
+ links_to_fully_download: dict[Link, InstallRequirement] = {}
for req in partially_downloaded_reqs:
assert req.link
links_to_fully_download[req.link] = req
- batch_download = self._batch_download(
- links_to_fully_download.keys(),
- temp_dir,
- )
+ batch_download = self._download.batch(links_to_fully_download.keys(), temp_dir)
for link, (filepath, _) in batch_download:
logger.debug("Downloading link %s to %s", link, filepath)
req = links_to_fully_download[link]
@@ -540,7 +552,7 @@ class RequirementPreparer:
# Prepare requirements we found were already downloaded for some
# reason. The other downloads will be completed separately.
- partially_downloaded_reqs: List[InstallRequirement] = []
+ partially_downloaded_reqs: list[InstallRequirement] = []
for req in reqs:
if req.needs_more_preparation:
partially_downloaded_reqs.append(req)
@@ -640,7 +652,7 @@ class RequirementPreparer:
dist = _get_prepared_distribution(
req,
self.build_tracker,
- self.finder,
+ self.build_env_installer,
self.build_isolation,
self.check_build_deps,
)
@@ -696,7 +708,7 @@ class RequirementPreparer:
dist = _get_prepared_distribution(
req,
self.build_tracker,
- self.finder,
+ self.build_env_installer,
self.build_isolation,
self.check_build_deps,
)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
index 8de36b87..5c08b60e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
@@ -1,16 +1,19 @@
+from __future__ import annotations
+
import importlib.util
import os
from collections import namedtuple
-from typing import Any, List, Optional
+from typing import Any
-from pip._vendor import tomli
-from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
+from pip._vendor.packaging.requirements import InvalidRequirement
from pip._internal.exceptions import (
InstallationError,
InvalidPyProjectBuildRequires,
MissingPyProjectBuildRequires,
)
+from pip._internal.utils.compat import tomllib
+from pip._internal.utils.packaging import get_requirement
def _is_list_of_str(obj: Any) -> bool:
@@ -27,8 +30,8 @@ BuildSystemDetails = namedtuple(
def load_pyproject_toml(
- use_pep517: Optional[bool], pyproject_toml: str, setup_py: str, req_name: str
-) -> Optional[BuildSystemDetails]:
+ use_pep517: bool | None, pyproject_toml: str, setup_py: str, req_name: str
+) -> BuildSystemDetails | None:
"""Load the pyproject.toml file.
Parameters:
@@ -61,13 +64,13 @@ def load_pyproject_toml(
if has_pyproject:
with open(pyproject_toml, encoding="utf-8") as f:
- pp_toml = tomli.loads(f.read())
+ pp_toml = tomllib.loads(f.read())
build_system = pp_toml.get("build-system")
else:
build_system = None
# The following cases must use PEP 517
- # We check for use_pep517 being non-None and falsey because that means
+ # We check for use_pep517 being non-None and falsy because that means
# the user explicitly requested --no-use-pep517. The value 0 as
# opposed to False can occur when the value is provided via an
# environment variable or config file option (due to the quirk of
@@ -151,7 +154,7 @@ def load_pyproject_toml(
# Each requirement must be valid as per PEP 508
for requirement in requires:
try:
- Requirement(requirement)
+ get_requirement(requirement)
except InvalidRequirement as error:
raise InvalidPyProjectBuildRequires(
package=req_name,
@@ -160,7 +163,7 @@ def load_pyproject_toml(
backend = build_system.get("build-backend")
backend_path = build_system.get("backend-path", [])
- check: List[str] = []
+ check: list[str] = []
if backend is None:
# If the user didn't specify a backend, we assume they want to use
# the setuptools backend. But we can't be sure they have included
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py
index 16de903a..e5050ee5 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py
@@ -1,7 +1,11 @@
+from __future__ import annotations
+
import collections
import logging
-from typing import Generator, List, Optional, Sequence, Tuple
+from collections.abc import Generator, Sequence
+from dataclasses import dataclass
+from pip._internal.cli.progress_bars import BarType, get_install_progress_renderer
from pip._internal.utils.logging import indent_log
from .req_file import parse_requirements
@@ -18,32 +22,30 @@ __all__ = [
logger = logging.getLogger(__name__)
+@dataclass(frozen=True)
class InstallationResult:
- def __init__(self, name: str) -> None:
- self.name = name
-
- def __repr__(self) -> str:
- return f"InstallationResult(name={self.name!r})"
+ name: str
def _validate_requirements(
- requirements: List[InstallRequirement],
-) -> Generator[Tuple[str, InstallRequirement], None, None]:
+ requirements: list[InstallRequirement],
+) -> Generator[tuple[str, InstallRequirement], None, None]:
for req in requirements:
assert req.name, f"invalid to-be-installed requirement: {req}"
yield req.name, req
def install_given_reqs(
- requirements: List[InstallRequirement],
+ requirements: list[InstallRequirement],
global_options: Sequence[str],
- root: Optional[str],
- home: Optional[str],
- prefix: Optional[str],
+ root: str | None,
+ home: str | None,
+ prefix: str | None,
warn_script_location: bool,
use_user_site: bool,
pycompile: bool,
-) -> List[InstallationResult]:
+ progress_bar: BarType,
+) -> list[InstallationResult]:
"""
Install everything in the given list.
@@ -59,8 +61,19 @@ def install_given_reqs(
installed = []
+ show_progress = logger.isEnabledFor(logging.INFO) and len(to_install) > 1
+
+ items = iter(to_install.values())
+ if show_progress:
+ renderer = get_install_progress_renderer(
+ bar_type=progress_bar, total=len(to_install)
+ )
+ items = renderer(items)
+
with indent_log():
- for req_name, requirement in to_install.items():
+ for requirement in items:
+ req_name = requirement.name
+ assert req_name is not None
if requirement.should_reinstall:
logger.info("Attempting uninstall: %s", req_name)
with indent_log():
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc
index a766b919..9a1245e4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc
index 432c06ff..43e3dbbc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/constructors.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-312.pyc
new file mode 100644
index 00000000..dd3071cb
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_dependency_group.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc
index b54de857..05d1bef8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_file.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc
index 11d35fcc..e52eb1bb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_install.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc
index 6af2fb93..07c47383 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_set.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc
index 86a0f3c7..15d00506 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
index 7e2d0e5b..056e7e3a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
@@ -8,11 +8,14 @@ These are meant to be used elsewhere within pip to create instances of
InstallRequirement.
"""
+from __future__ import annotations
+
import copy
import logging
import os
import re
-from typing import Collection, Dict, List, Optional, Set, Tuple, Union
+from collections.abc import Collection
+from dataclasses import dataclass
from pip._vendor.packaging.markers import Marker
from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
@@ -40,7 +43,7 @@ logger = logging.getLogger(__name__)
operators = Specifier._operators.keys()
-def _strip_extras(path: str) -> Tuple[str, Optional[str]]:
+def _strip_extras(path: str) -> tuple[str, str | None]:
m = re.match(r"^(.+)(\[[^\]]+\])$", path)
extras = None
if m:
@@ -52,19 +55,19 @@ def _strip_extras(path: str) -> Tuple[str, Optional[str]]:
return path_no_extras, extras
-def convert_extras(extras: Optional[str]) -> Set[str]:
+def convert_extras(extras: str | None) -> set[str]:
if not extras:
return set()
return get_requirement("placeholder" + extras.lower()).extras
-def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement:
+def _set_requirement_extras(req: Requirement, new_extras: set[str]) -> Requirement:
"""
Returns a new requirement based on the given one, with the supplied extras. If the
given requirement already has extras those are replaced (or dropped if no new extras
are given).
"""
- match: Optional[re.Match[str]] = re.fullmatch(
+ match: re.Match[str] | None = re.fullmatch(
# see https://peps.python.org/pep-0508/#complete-grammar
r"([\w\t .-]+)(\[[^\]]*\])?(.*)",
str(req),
@@ -74,16 +77,16 @@ def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requireme
assert (
match is not None
), f"regex match on requirement {req} failed, this should never happen"
- pre: Optional[str] = match.group(1)
- post: Optional[str] = match.group(3)
+ pre: str | None = match.group(1)
+ post: str | None = match.group(3)
assert (
pre is not None and post is not None
), f"regex group selection for requirement {req} failed, this should never happen"
- extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else ""
- return Requirement(f"{pre}{extras}{post}")
+ extras: str = "[{}]".format(",".join(sorted(new_extras)) if new_extras else "")
+ return get_requirement(f"{pre}{extras}{post}")
-def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]:
+def parse_editable(editable_req: str) -> tuple[str | None, str, set[str]]:
"""Parses an editable requirement into:
- a requirement name
- an URL
@@ -132,8 +135,8 @@ def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]:
package_name = link.egg_fragment
if not package_name:
raise InstallationError(
- "Could not detect requirement name for '{}', please specify one "
- "with #egg=your_package_name".format(editable_req)
+ f"Could not detect requirement name for '{editable_req}', "
+ "please specify one with #egg=your_package_name"
)
return package_name, url, set()
@@ -162,7 +165,7 @@ def check_first_requirement_in_file(filename: str) -> None:
# If there is a line continuation, drop it, and append the next line.
if line.endswith("\\"):
line = line[:-2].strip() + next(lines, "")
- Requirement(line)
+ get_requirement(line)
return
@@ -191,18 +194,12 @@ def deduce_helpful_msg(req: str) -> str:
return msg
+@dataclass(frozen=True)
class RequirementParts:
- def __init__(
- self,
- requirement: Optional[Requirement],
- link: Optional[Link],
- markers: Optional[Marker],
- extras: Set[str],
- ):
- self.requirement = requirement
- self.link = link
- self.markers = markers
- self.extras = extras
+ requirement: Requirement | None
+ link: Link | None
+ markers: Marker | None
+ extras: set[str]
def parse_req_from_editable(editable_req: str) -> RequirementParts:
@@ -210,9 +207,9 @@ def parse_req_from_editable(editable_req: str) -> RequirementParts:
if name is not None:
try:
- req: Optional[Requirement] = Requirement(name)
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{name}'")
+ req: Requirement | None = get_requirement(name)
+ except InvalidRequirement as exc:
+ raise InstallationError(f"Invalid requirement: {name!r}: {exc}")
else:
req = None
@@ -226,16 +223,16 @@ def parse_req_from_editable(editable_req: str) -> RequirementParts:
def install_req_from_editable(
editable_req: str,
- comes_from: Optional[Union[InstallRequirement, str]] = None,
+ comes_from: InstallRequirement | str | None = None,
*,
- use_pep517: Optional[bool] = None,
+ use_pep517: bool | None = None,
isolated: bool = False,
- global_options: Optional[List[str]] = None,
- hash_options: Optional[Dict[str, List[str]]] = None,
+ global_options: list[str] | None = None,
+ hash_options: dict[str, list[str]] | None = None,
constraint: bool = False,
user_supplied: bool = False,
permit_editable_wheels: bool = False,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: dict[str, str | list[str]] | None = None,
) -> InstallRequirement:
parts = parse_req_from_editable(editable_req)
@@ -275,7 +272,7 @@ def _looks_like_path(name: str) -> bool:
return False
-def _get_url_from_path(path: str, name: str) -> Optional[str]:
+def _get_url_from_path(path: str, name: str) -> str | None:
"""
First, it checks whether a provided path is an installable directory. If it
is, returns the path.
@@ -309,7 +306,7 @@ def _get_url_from_path(path: str, name: str) -> Optional[str]:
return path_to_url(path)
-def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementParts:
+def parse_req_from_line(name: str, line_source: str | None) -> RequirementParts:
if is_url(name):
marker_sep = "; "
else:
@@ -364,8 +361,8 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar
def _parse_req_string(req_as_string: str) -> Requirement:
try:
- req = get_requirement(req_as_string)
- except InvalidRequirement:
+ return get_requirement(req_as_string)
+ except InvalidRequirement as exc:
if os.path.sep in req_as_string:
add_msg = "It looks like a path."
add_msg += deduce_helpful_msg(req_as_string)
@@ -375,24 +372,13 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar
add_msg = "= is not a valid operator. Did you mean == ?"
else:
add_msg = ""
- msg = with_source(f"Invalid requirement: {req_as_string!r}")
+ msg = with_source(f"Invalid requirement: {req_as_string!r}: {exc}")
if add_msg:
msg += f"\nHint: {add_msg}"
raise InstallationError(msg)
- else:
- # Deprecate extras after specifiers: "name>=1.0[extras]"
- # This currently works by accident because _strip_extras() parses
- # any extras in the end of the string and those are saved in
- # RequirementParts
- for spec in req.specifier:
- spec_str = str(spec)
- if spec_str.endswith("]"):
- msg = f"Extras after version '{spec_str}'."
- raise InstallationError(msg)
- return req
if req_as_string is not None:
- req: Optional[Requirement] = _parse_req_string(req_as_string)
+ req: Requirement | None = _parse_req_string(req_as_string)
else:
req = None
@@ -401,16 +387,16 @@ def parse_req_from_line(name: str, line_source: Optional[str]) -> RequirementPar
def install_req_from_line(
name: str,
- comes_from: Optional[Union[str, InstallRequirement]] = None,
+ comes_from: str | InstallRequirement | None = None,
*,
- use_pep517: Optional[bool] = None,
+ use_pep517: bool | None = None,
isolated: bool = False,
- global_options: Optional[List[str]] = None,
- hash_options: Optional[Dict[str, List[str]]] = None,
+ global_options: list[str] | None = None,
+ hash_options: dict[str, list[str]] | None = None,
constraint: bool = False,
- line_source: Optional[str] = None,
+ line_source: str | None = None,
user_supplied: bool = False,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: dict[str, str | list[str]] | None = None,
) -> InstallRequirement:
"""Creates an InstallRequirement from a name, which might be a
requirement, directory containing 'setup.py', filename, or URL.
@@ -438,15 +424,15 @@ def install_req_from_line(
def install_req_from_req_string(
req_string: str,
- comes_from: Optional[InstallRequirement] = None,
+ comes_from: InstallRequirement | None = None,
isolated: bool = False,
- use_pep517: Optional[bool] = None,
+ use_pep517: bool | None = None,
user_supplied: bool = False,
) -> InstallRequirement:
try:
req = get_requirement(req_string)
- except InvalidRequirement:
- raise InstallationError(f"Invalid requirement: '{req_string}'")
+ except InvalidRequirement as exc:
+ raise InstallationError(f"Invalid requirement: {req_string!r}: {exc}")
domains_not_allowed = [
PyPI.file_storage_domain,
@@ -477,9 +463,9 @@ def install_req_from_req_string(
def install_req_from_parsed_requirement(
parsed_req: ParsedRequirement,
isolated: bool = False,
- use_pep517: Optional[bool] = None,
+ use_pep517: bool | None = None,
user_supplied: bool = False,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: dict[str, str | list[str]] | None = None,
) -> InstallRequirement:
if parsed_req.is_editable:
req = install_req_from_editable(
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_dependency_group.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_dependency_group.py
new file mode 100644
index 00000000..396ac1bb
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_dependency_group.py
@@ -0,0 +1,75 @@
+from collections.abc import Iterable, Iterator
+from typing import Any
+
+from pip._vendor.dependency_groups import DependencyGroupResolver
+
+from pip._internal.exceptions import InstallationError
+from pip._internal.utils.compat import tomllib
+
+
+def parse_dependency_groups(groups: list[tuple[str, str]]) -> list[str]:
+ """
+ Parse dependency groups data as provided via the CLI, in a `[path:]group` syntax.
+
+ Raises InstallationErrors if anything goes wrong.
+ """
+ resolvers = _build_resolvers(path for (path, _) in groups)
+ return list(_resolve_all_groups(resolvers, groups))
+
+
+def _resolve_all_groups(
+ resolvers: dict[str, DependencyGroupResolver], groups: list[tuple[str, str]]
+) -> Iterator[str]:
+ """
+ Run all resolution, converting any error from `DependencyGroupResolver` into
+ an InstallationError.
+ """
+ for path, groupname in groups:
+ resolver = resolvers[path]
+ try:
+ yield from (str(req) for req in resolver.resolve(groupname))
+ except (ValueError, TypeError, LookupError) as e:
+ raise InstallationError(
+ f"[dependency-groups] resolution failed for '{groupname}' "
+ f"from '{path}': {e}"
+ ) from e
+
+
+def _build_resolvers(paths: Iterable[str]) -> dict[str, Any]:
+ resolvers = {}
+ for path in paths:
+ if path in resolvers:
+ continue
+
+ pyproject = _load_pyproject(path)
+ if "dependency-groups" not in pyproject:
+ raise InstallationError(
+ f"[dependency-groups] table was missing from '{path}'. "
+ "Cannot resolve '--group' option."
+ )
+ raw_dependency_groups = pyproject["dependency-groups"]
+ if not isinstance(raw_dependency_groups, dict):
+ raise InstallationError(
+ f"[dependency-groups] table was malformed in {path}. "
+ "Cannot resolve '--group' option."
+ )
+
+ resolvers[path] = DependencyGroupResolver(raw_dependency_groups)
+ return resolvers
+
+
+def _load_pyproject(path: str) -> dict[str, Any]:
+ """
+ This helper loads a pyproject.toml as TOML.
+
+ It raises an InstallationError if the operation fails.
+ """
+ try:
+ with open(path, "rb") as fp:
+ return tomllib.load(fp)
+ except FileNotFoundError:
+ raise InstallationError(f"{path} not found. Cannot resolve '--group' option.")
+ except tomllib.TOMLDecodeError as e:
+ raise InstallationError(f"Error parsing {path}: {e}") from e
+ except OSError as e:
+ raise InstallationError(f"Error reading {path}: {e}") from e
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
index 1ef3d5ef..0aad0a36 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
@@ -2,45 +2,40 @@
Requirements file parsing
"""
+from __future__ import annotations
+
+import codecs
+import locale
import logging
import optparse
import os
import re
import shlex
+import sys
import urllib.parse
+from collections.abc import Generator, Iterable
+from dataclasses import dataclass
from optparse import Values
from typing import (
TYPE_CHECKING,
Any,
Callable,
- Dict,
- Generator,
- Iterable,
- List,
- Optional,
- Tuple,
+ NoReturn,
)
from pip._internal.cli import cmdoptions
from pip._internal.exceptions import InstallationError, RequirementsFileParseError
from pip._internal.models.search_scope import SearchScope
-from pip._internal.network.session import PipSession
-from pip._internal.network.utils import raise_for_status
-from pip._internal.utils.encoding import auto_decode
-from pip._internal.utils.urls import get_url_scheme
if TYPE_CHECKING:
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
from pip._internal.index.package_finder import PackageFinder
+ from pip._internal.network.session import PipSession
__all__ = ["parse_requirements"]
-ReqFileLines = Iterable[Tuple[int, str]]
+ReqFileLines = Iterable[tuple[int, str]]
-LineParser = Callable[[str], Tuple[str, Values]]
+LineParser = Callable[[str], tuple[str, Values]]
SCHEME_RE = re.compile(r"^(http|https|file):", re.I)
COMMENT_RE = re.compile(r"(^|\s+)#.*$")
@@ -51,7 +46,7 @@ COMMENT_RE = re.compile(r"(^|\s+)#.*$")
# 2013 Edition.
ENV_VAR_RE = re.compile(r"(?P\$\{(?P[A-Z0-9_]+)\})")
-SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [
+SUPPORTED_OPTIONS: list[Callable[..., optparse.Option]] = [
cmdoptions.index_url,
cmdoptions.extra_index_url,
cmdoptions.no_index,
@@ -69,13 +64,13 @@ SUPPORTED_OPTIONS: List[Callable[..., optparse.Option]] = [
]
# options to be passed to requirements
-SUPPORTED_OPTIONS_REQ: List[Callable[..., optparse.Option]] = [
+SUPPORTED_OPTIONS_REQ: list[Callable[..., optparse.Option]] = [
cmdoptions.global_options,
cmdoptions.hash,
cmdoptions.config_settings,
]
-SUPPORTED_OPTIONS_EDITABLE_REQ: List[Callable[..., optparse.Option]] = [
+SUPPORTED_OPTIONS_EDITABLE_REQ: list[Callable[..., optparse.Option]] = [
cmdoptions.config_settings,
]
@@ -86,59 +81,73 @@ SUPPORTED_OPTIONS_EDITABLE_REQ_DEST = [
str(o().dest) for o in SUPPORTED_OPTIONS_EDITABLE_REQ
]
+# order of BOMS is important: codecs.BOM_UTF16_LE is a prefix of codecs.BOM_UTF32_LE
+# so data.startswith(BOM_UTF16_LE) would be true for UTF32_LE data
+BOMS: list[tuple[bytes, str]] = [
+ (codecs.BOM_UTF8, "utf-8"),
+ (codecs.BOM_UTF32, "utf-32"),
+ (codecs.BOM_UTF32_BE, "utf-32-be"),
+ (codecs.BOM_UTF32_LE, "utf-32-le"),
+ (codecs.BOM_UTF16, "utf-16"),
+ (codecs.BOM_UTF16_BE, "utf-16-be"),
+ (codecs.BOM_UTF16_LE, "utf-16-le"),
+]
+
+PEP263_ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)")
+DEFAULT_ENCODING = "utf-8"
+
logger = logging.getLogger(__name__)
+@dataclass(frozen=True)
class ParsedRequirement:
- def __init__(
- self,
- requirement: str,
- is_editable: bool,
- comes_from: str,
- constraint: bool,
- options: Optional[Dict[str, Any]] = None,
- line_source: Optional[str] = None,
- ) -> None:
- self.requirement = requirement
- self.is_editable = is_editable
- self.comes_from = comes_from
- self.options = options
- self.constraint = constraint
- self.line_source = line_source
+ # TODO: replace this with slots=True when dropping Python 3.9 support.
+ __slots__ = (
+ "requirement",
+ "is_editable",
+ "comes_from",
+ "constraint",
+ "options",
+ "line_source",
+ )
+
+ requirement: str
+ is_editable: bool
+ comes_from: str
+ constraint: bool
+ options: dict[str, Any] | None
+ line_source: str | None
+@dataclass(frozen=True)
class ParsedLine:
- def __init__(
- self,
- filename: str,
- lineno: int,
- args: str,
- opts: Values,
- constraint: bool,
- ) -> None:
- self.filename = filename
- self.lineno = lineno
- self.opts = opts
- self.constraint = constraint
+ __slots__ = ("filename", "lineno", "args", "opts", "constraint")
- if args:
- self.is_requirement = True
- self.is_editable = False
- self.requirement = args
- elif opts.editables:
- self.is_requirement = True
- self.is_editable = True
+ filename: str
+ lineno: int
+ args: str
+ opts: Values
+ constraint: bool
+
+ @property
+ def is_editable(self) -> bool:
+ return bool(self.opts.editables)
+
+ @property
+ def requirement(self) -> str | None:
+ if self.args:
+ return self.args
+ elif self.is_editable:
# We don't support multiple -e on one line
- self.requirement = opts.editables[0]
- else:
- self.is_requirement = False
+ return self.opts.editables[0]
+ return None
def parse_requirements(
filename: str,
session: PipSession,
- finder: Optional["PackageFinder"] = None,
- options: Optional[optparse.Values] = None,
+ finder: PackageFinder | None = None,
+ options: optparse.Values | None = None,
constraint: bool = False,
) -> Generator[ParsedRequirement, None, None]:
"""Parse a requirements file and yield ParsedRequirement instances.
@@ -175,7 +184,7 @@ def preprocess(content: str) -> ReqFileLines:
def handle_requirement_line(
line: ParsedLine,
- options: Optional[optparse.Values] = None,
+ options: optparse.Values | None = None,
) -> ParsedRequirement:
# preserve for the nested code path
line_comes_from = "{} {} (line {})".format(
@@ -184,7 +193,7 @@ def handle_requirement_line(
line.lineno,
)
- assert line.is_requirement
+ assert line.requirement is not None
# get the options that apply to requirements
if line.is_editable:
@@ -211,9 +220,9 @@ def handle_option_line(
opts: Values,
filename: str,
lineno: int,
- finder: Optional["PackageFinder"] = None,
- options: Optional[optparse.Values] = None,
- session: Optional[PipSession] = None,
+ finder: PackageFinder | None = None,
+ options: optparse.Values | None = None,
+ session: PipSession | None = None,
) -> None:
if opts.hashes:
logger.warning(
@@ -279,10 +288,10 @@ def handle_option_line(
def handle_line(
line: ParsedLine,
- options: Optional[optparse.Values] = None,
- finder: Optional["PackageFinder"] = None,
- session: Optional[PipSession] = None,
-) -> Optional[ParsedRequirement]:
+ options: optparse.Values | None = None,
+ finder: PackageFinder | None = None,
+ session: PipSession | None = None,
+) -> ParsedRequirement | None:
"""Handle a single parsed requirements line; This can result in
creating/yielding requirements, or updating the finder.
@@ -306,7 +315,7 @@ def handle_line(
affect the finder.
"""
- if line.is_requirement:
+ if line.requirement is not None:
parsed_req = handle_requirement_line(line, options)
return parsed_req
else:
@@ -334,13 +343,18 @@ class RequirementsFileParser:
self, filename: str, constraint: bool
) -> Generator[ParsedLine, None, None]:
"""Parse a given file, yielding parsed lines."""
- yield from self._parse_and_recurse(filename, constraint)
+ yield from self._parse_and_recurse(
+ filename, constraint, [{os.path.abspath(filename): None}]
+ )
def _parse_and_recurse(
- self, filename: str, constraint: bool
+ self,
+ filename: str,
+ constraint: bool,
+ parsed_files_stack: list[dict[str, str | None]],
) -> Generator[ParsedLine, None, None]:
for line in self._parse_file(filename, constraint):
- if not line.is_requirement and (
+ if line.requirement is None and (
line.opts.requirements or line.opts.constraints
):
# parse a nested requirements file
@@ -358,12 +372,30 @@ class RequirementsFileParser:
# original file and nested file are paths
elif not SCHEME_RE.search(req_path):
# do a join so relative paths work
- req_path = os.path.join(
- os.path.dirname(filename),
- req_path,
+ # and then abspath so that we can identify recursive references
+ req_path = os.path.abspath(
+ os.path.join(
+ os.path.dirname(filename),
+ req_path,
+ )
)
-
- yield from self._parse_and_recurse(req_path, nested_constraint)
+ parsed_files = parsed_files_stack[0]
+ if req_path in parsed_files:
+ initial_file = parsed_files[req_path]
+ tail = (
+ f" and again in {initial_file}"
+ if initial_file is not None
+ else ""
+ )
+ raise RequirementsFileParseError(
+ f"{req_path} recursively references itself in {filename}{tail}"
+ )
+ # Keeping a track where was each file first included in
+ new_parsed_files = parsed_files.copy()
+ new_parsed_files[req_path] = filename
+ yield from self._parse_and_recurse(
+ req_path, nested_constraint, [new_parsed_files, *parsed_files_stack]
+ )
else:
yield line
@@ -391,8 +423,8 @@ class RequirementsFileParser:
)
-def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser:
- def parse_line(line: str) -> Tuple[str, Values]:
+def get_line_parser(finder: PackageFinder | None) -> LineParser:
+ def parse_line(line: str) -> tuple[str, Values]:
# Build new parser for each line since it accumulates appendable
# options.
parser = build_parser()
@@ -415,7 +447,7 @@ def get_line_parser(finder: Optional["PackageFinder"]) -> LineParser:
return parse_line
-def break_args_options(line: str) -> Tuple[str, str]:
+def break_args_options(line: str) -> tuple[str, str]:
"""Break up the line into an args and options string. We only want to shlex
(and then optparse) the options, not the args. args can contain markers
which are corrupted by shlex.
@@ -424,7 +456,7 @@ def break_args_options(line: str) -> Tuple[str, str]:
args = []
options = tokens[:]
for token in tokens:
- if token.startswith("-") or token.startswith("--"):
+ if token.startswith(("-", "--")):
break
else:
args.append(token)
@@ -450,7 +482,7 @@ def build_parser() -> optparse.OptionParser:
# By default optparse sys.exits on parsing errors. We want to wrap
# that in our own exception.
- def parser_exit(self: Any, msg: str) -> "NoReturn":
+ def parser_exit(self: Any, msg: str) -> NoReturn:
raise OptionParsingError(msg)
# NOTE: mypy disallows assigning to a method
@@ -465,7 +497,7 @@ def join_lines(lines_enum: ReqFileLines) -> ReqFileLines:
comments). The joined line takes on the index of the first line.
"""
primary_line_number = None
- new_line: List[str] = []
+ new_line: list[str] = []
for line_number, line in lines_enum:
if not line.endswith("\\") or COMMENT_RE.match(line):
if COMMENT_RE.match(line):
@@ -529,7 +561,7 @@ def expand_env_variables(lines_enum: ReqFileLines) -> ReqFileLines:
yield line_number, line
-def get_file_content(url: str, session: PipSession) -> Tuple[str, str]:
+def get_file_content(url: str, session: PipSession) -> tuple[str, str]:
"""Gets the content of a file; it may be a filename, file: URL, or
http: URL. Returns (location, content). Content is unicode.
Respects # -*- coding: declarations on the retrieved files.
@@ -537,10 +569,12 @@ def get_file_content(url: str, session: PipSession) -> Tuple[str, str]:
:param url: File path or url.
:param session: PipSession instance.
"""
- scheme = get_url_scheme(url)
-
+ scheme = urllib.parse.urlsplit(url).scheme
# Pip has special support for file:// URLs (LocalFSAdapter).
if scheme in ["http", "https", "file"]:
+ # Delay importing heavy network modules until absolutely necessary.
+ from pip._internal.network.utils import raise_for_status
+
resp = session.get(url)
raise_for_status(resp)
return resp.url, resp.text
@@ -548,7 +582,39 @@ def get_file_content(url: str, session: PipSession) -> Tuple[str, str]:
# Assume this is a bare path.
try:
with open(url, "rb") as f:
- content = auto_decode(f.read())
+ raw_content = f.read()
except OSError as exc:
raise InstallationError(f"Could not open requirements file: {exc}")
+
+ content = _decode_req_file(raw_content, url)
+
return url, content
+
+
+def _decode_req_file(data: bytes, url: str) -> str:
+ for bom, encoding in BOMS:
+ if data.startswith(bom):
+ return data[len(bom) :].decode(encoding)
+
+ for line in data.split(b"\n")[:2]:
+ if line[0:1] == b"#":
+ result = PEP263_ENCODING_RE.search(line)
+ if result is not None:
+ encoding = result.groups()[0].decode("ascii")
+ return data.decode(encoding)
+
+ try:
+ return data.decode(DEFAULT_ENCODING)
+ except UnicodeDecodeError:
+ locale_encoding = locale.getpreferredencoding(False) or sys.getdefaultencoding()
+ logging.warning(
+ "unable to decode data from %s with default encoding %s, "
+ "falling back to encoding from locale: %s. "
+ "If this is intentional you should specify the encoding with a "
+ "PEP-263 style comment, e.g. '# -*- coding: %s -*-'",
+ url,
+ DEFAULT_ENCODING,
+ locale_encoding,
+ locale_encoding,
+ )
+ return data.decode(locale_encoding)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
index a65611c3..c9f6bff1 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import functools
import logging
import os
@@ -5,9 +7,10 @@ import shutil
import sys
import uuid
import zipfile
+from collections.abc import Collection, Iterable, Sequence
from optparse import Values
from pathlib import Path
-from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union
+from typing import Any
from pip._vendor.packaging.markers import Marker
from pip._vendor.packaging.requirements import Requirement
@@ -52,7 +55,7 @@ from pip._internal.utils.misc import (
redact_auth_from_requirement,
redact_auth_from_url,
)
-from pip._internal.utils.packaging import safe_extra
+from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.subprocess import runner_with_spinner_message
from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds
from pip._internal.utils.unpacking import unpack_file
@@ -71,17 +74,17 @@ class InstallRequirement:
def __init__(
self,
- req: Optional[Requirement],
- comes_from: Optional[Union[str, "InstallRequirement"]],
+ req: Requirement | None,
+ comes_from: str | InstallRequirement | None,
editable: bool = False,
- link: Optional[Link] = None,
- markers: Optional[Marker] = None,
- use_pep517: Optional[bool] = None,
+ link: Link | None = None,
+ markers: Marker | None = None,
+ use_pep517: bool | None = None,
isolated: bool = False,
*,
- global_options: Optional[List[str]] = None,
- hash_options: Optional[Dict[str, List[str]]] = None,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ global_options: list[str] | None = None,
+ hash_options: dict[str, list[str]] | None = None,
+ config_settings: dict[str, str | list[str]] | None = None,
constraint: bool = False,
extras: Collection[str] = (),
user_supplied: bool = False,
@@ -99,7 +102,7 @@ class InstallRequirement:
# populating source_dir is done by the RequirementPreparer. Note this
# is not necessarily the directory where pyproject.toml or setup.py is
# located - that one is obtained via unpacked_source_directory.
- self.source_dir: Optional[str] = None
+ self.source_dir: str | None = None
if self.editable:
assert link
if link.is_file:
@@ -115,14 +118,14 @@ class InstallRequirement:
# When this InstallRequirement is a wheel obtained from the cache of locally
# built wheels, this is the source link corresponding to the cache entry, which
# was used to download and build the cached wheel.
- self.cached_wheel_source_link: Optional[Link] = None
+ self.cached_wheel_source_link: Link | None = None
# Information about the location of the artifact that was downloaded . This
# property is guaranteed to be set in resolver results.
- self.download_info: Optional[DirectUrl] = None
+ self.download_info: DirectUrl | None = None
# Path to any downloaded or already-existing package.
- self.local_file_path: Optional[str] = None
+ self.local_file_path: str | None = None
if self.link and self.link.is_file:
self.local_file_path = self.link.file_path
@@ -137,14 +140,14 @@ class InstallRequirement:
self.markers = markers
# This holds the Distribution object if this requirement is already installed.
- self.satisfied_by: Optional[BaseDistribution] = None
+ self.satisfied_by: BaseDistribution | None = None
# Whether the installation process should try to uninstall an existing
# distribution before installing this requirement.
self.should_reinstall = False
# Temporary build location
- self._temp_build_dir: Optional[TempDirectory] = None
+ self._temp_build_dir: TempDirectory | None = None
# Set to True after successful installation
- self.install_succeeded: Optional[bool] = None
+ self.install_succeeded: bool | None = None
# Supplied options
self.global_options = global_options if global_options else []
self.hash_options = hash_options if hash_options else {}
@@ -163,16 +166,16 @@ class InstallRequirement:
# gets stored. We need this to pass to build_wheel, so the backend
# can ensure that the wheel matches the metadata (see the PEP for
# details).
- self.metadata_directory: Optional[str] = None
+ self.metadata_directory: str | None = None
# The static build requirements (from pyproject.toml)
- self.pyproject_requires: Optional[List[str]] = None
+ self.pyproject_requires: list[str] | None = None
# Build requirements that we will check are available
- self.requirements_to_check: List[str] = []
+ self.requirements_to_check: list[str] = []
# The PEP 517 backend we should use to build the project
- self.pep517_backend: Optional[BuildBackendHookCaller] = None
+ self.pep517_backend: BuildBackendHookCaller | None = None
# Are we using PEP 517 for this requirement?
# After pyproject.toml has been loaded, the only valid values are True
@@ -195,7 +198,7 @@ class InstallRequirement:
self.needs_more_preparation = False
# This requirement needs to be unpacked before it can be installed.
- self._archive_source: Optional[Path] = None
+ self._archive_source: Path | None = None
def __str__(self) -> str:
if self.req:
@@ -214,7 +217,7 @@ class InstallRequirement:
s += f" in {location}"
if self.comes_from:
if isinstance(self.comes_from, str):
- comes_from: Optional[str] = self.comes_from
+ comes_from: str | None = self.comes_from
else:
comes_from = self.comes_from.from_path()
if comes_from:
@@ -222,8 +225,9 @@ class InstallRequirement:
return s
def __repr__(self) -> str:
- return "<{} object: {} editable={!r}>".format(
- self.__class__.__name__, str(self), self.editable
+ return (
+ f"<{self.__class__.__name__} object: "
+ f"{str(self)} editable={self.editable!r}>"
)
def format_debug(self) -> str:
@@ -239,12 +243,12 @@ class InstallRequirement:
# Things that are valid for all kinds of requirements?
@property
- def name(self) -> Optional[str]:
+ def name(self) -> str | None:
if self.req is None:
return None
return self.req.name
- @functools.lru_cache() # use cached_property in python 3.8+
+ @functools.cached_property
def supports_pyproject_editable(self) -> bool:
if not self.use_pep517:
return False
@@ -276,19 +280,14 @@ class InstallRequirement:
specifiers = self.req.specifier
return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="}
- def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool:
+ def match_markers(self, extras_requested: Iterable[str] | None = None) -> bool:
if not extras_requested:
# Provide an extra to safely evaluate the markers
# without matching any extra
extras_requested = ("",)
if self.markers is not None:
return any(
- self.markers.evaluate({"extra": extra})
- # TODO: Remove these two variants when packaging is upgraded to
- # support the marker comparison logic specified in PEP 685.
- or self.markers.evaluate({"extra": safe_extra(extra)})
- or self.markers.evaluate({"extra": canonicalize_name(extra)})
- for extra in extras_requested
+ self.markers.evaluate({"extra": extra}) for extra in extras_requested
)
else:
return True
@@ -330,13 +329,13 @@ class InstallRequirement:
good_hashes.setdefault(link.hash_name, []).append(link.hash)
return Hashes(good_hashes)
- def from_path(self) -> Optional[str]:
+ def from_path(self) -> str | None:
"""Format a nice indicator to show where this "comes from" """
if self.req is None:
return None
s = str(self.req)
if self.comes_from:
- comes_from: Optional[str]
+ comes_from: str | None
if isinstance(self.comes_from, str):
comes_from = self.comes_from
else:
@@ -400,7 +399,7 @@ class InstallRequirement:
else:
op = "==="
- self.req = Requirement(
+ self.req = get_requirement(
"".join(
[
self.metadata["Name"],
@@ -426,7 +425,7 @@ class InstallRequirement:
metadata_name,
self.name,
)
- self.req = Requirement(metadata_name)
+ self.req = get_requirement(metadata_name)
def check_if_exists(self, use_user_site: bool) -> None:
"""Find an installed distribution that satisfies or conflicts
@@ -542,7 +541,7 @@ class InstallRequirement:
if (
self.editable
and self.use_pep517
- and not self.supports_pyproject_editable()
+ and not self.supports_pyproject_editable
and not os.path.isfile(self.setup_py_path)
and not os.path.isfile(self.setup_cfg_path)
):
@@ -568,7 +567,7 @@ class InstallRequirement:
if (
self.editable
and self.permit_editable_wheels
- and self.supports_pyproject_editable()
+ and self.supports_pyproject_editable
):
self.metadata_directory = generate_editable_metadata(
build_env=self.build_env,
@@ -703,7 +702,7 @@ class InstallRequirement:
# Top-level Actions
def uninstall(
self, auto_confirm: bool = False, verbose: bool = False
- ) -> Optional[UninstallPathSet]:
+ ) -> UninstallPathSet | None:
"""
Uninstall the distribution currently satisfying this requirement.
@@ -741,7 +740,7 @@ class InstallRequirement:
name = _clean_zip_name(path, rootdir)
return self.req.name + "/" + name
- def archive(self, build_dir: Optional[str]) -> None:
+ def archive(self, build_dir: str | None) -> None:
"""Saves archive to provided build_dir.
Used for saving downloaded VCS requirements as part of `pip download`.
@@ -810,10 +809,10 @@ class InstallRequirement:
def install(
self,
- global_options: Optional[Sequence[str]] = None,
- root: Optional[str] = None,
- home: Optional[str] = None,
- prefix: Optional[str] = None,
+ global_options: Sequence[str] | None = None,
+ root: str | None = None,
+ home: str | None = None,
+ prefix: str | None = None,
warn_script_location: bool = True,
use_user_site: bool = False,
pycompile: bool = True,
@@ -829,6 +828,21 @@ class InstallRequirement:
)
if self.editable and not self.is_wheel:
+ deprecated(
+ reason=(
+ f"Legacy editable install of {self} (setup.py develop) "
+ "is deprecated."
+ ),
+ replacement=(
+ "to add a pyproject.toml or enable --use-pep517, "
+ "and use setuptools >= 64. "
+ "If the resulting installation is not behaving as expected, "
+ "try using --config-settings editable_mode=compat. "
+ "Please consult the setuptools documentation for more information"
+ ),
+ gone_in="25.3",
+ issue=11457,
+ )
if self.config_settings:
logger.warning(
"--config-settings ignored for legacy editable install of %s. "
@@ -894,7 +908,7 @@ def check_invalid_constraint_type(req: InstallRequirement) -> str:
return problem
-def _has_option(options: Values, reqs: List[InstallRequirement], option: str) -> bool:
+def _has_option(options: Values, reqs: list[InstallRequirement], option: str) -> bool:
if getattr(options, option, None):
return True
for req in reqs:
@@ -905,7 +919,7 @@ def _has_option(options: Values, reqs: List[InstallRequirement], option: str) ->
def check_legacy_setup_py_options(
options: Values,
- reqs: List[InstallRequirement],
+ reqs: list[InstallRequirement],
) -> None:
has_build_options = _has_option(options, reqs, "build_options")
has_global_options = _has_option(options, reqs, "global_options")
@@ -914,7 +928,7 @@ def check_legacy_setup_py_options(
reason="--build-option and --global-option are deprecated.",
issue=11859,
replacement="to use --config-settings",
- gone_in="24.2",
+ gone_in="25.3",
)
logger.warning(
"Implying --no-binary=:all: due to the presence of "
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
index bf36114e..3451b24f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
@@ -1,13 +1,9 @@
import logging
from collections import OrderedDict
-from typing import Dict, List
-from pip._vendor.packaging.specifiers import LegacySpecifier
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.packaging.version import LegacyVersion
from pip._internal.req.req_install import InstallRequirement
-from pip._internal.utils.deprecation import deprecated
logger = logging.getLogger(__name__)
@@ -16,10 +12,10 @@ class RequirementSet:
def __init__(self, check_supported_wheels: bool = True) -> None:
"""Create a RequirementSet."""
- self.requirements: Dict[str, InstallRequirement] = OrderedDict()
+ self.requirements: dict[str, InstallRequirement] = OrderedDict()
self.check_supported_wheels = check_supported_wheels
- self.unnamed_requirements: List[InstallRequirement] = []
+ self.unnamed_requirements: list[InstallRequirement] = []
def __str__(self) -> str:
requirements = sorted(
@@ -68,11 +64,11 @@ class RequirementSet:
raise KeyError(f"No project with the name {name!r}")
@property
- def all_requirements(self) -> List[InstallRequirement]:
+ def all_requirements(self) -> list[InstallRequirement]:
return self.unnamed_requirements + list(self.requirements.values())
@property
- def requirements_to_install(self) -> List[InstallRequirement]:
+ def requirements_to_install(self) -> list[InstallRequirement]:
"""Return the list of requirements that need to be installed.
TODO remove this property together with the legacy resolver, since the new
@@ -83,37 +79,3 @@ class RequirementSet:
for install_req in self.all_requirements
if not install_req.constraint and not install_req.satisfied_by
]
-
- def warn_legacy_versions_and_specifiers(self) -> None:
- for req in self.requirements_to_install:
- version = req.get_dist().version
- if isinstance(version, LegacyVersion):
- deprecated(
- reason=(
- f"pip has selected the non standard version {version} "
- f"of {req}. In the future this version will be "
- f"ignored as it isn't standard compliant."
- ),
- replacement=(
- "set or update constraints to select another version "
- "or contact the package author to fix the version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
- for dep in req.get_dist().iter_dependencies():
- if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier):
- deprecated(
- reason=(
- f"pip has selected {req} {version} which has non "
- f"standard dependency specifier {dep}. "
- f"In the future this version of {req} will be "
- f"ignored as it isn't standard compliant."
- ),
- replacement=(
- "set or update constraints to select another version "
- "or contact the package author to fix the version number"
- ),
- issue=12063,
- gone_in="24.1",
- )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
index 707fde1b..3f3dde2f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
@@ -1,11 +1,14 @@
+from __future__ import annotations
+
import functools
import os
import sys
import sysconfig
+from collections.abc import Generator, Iterable
from importlib.util import cache_from_source
-from typing import Any, Callable, Dict, Generator, Iterable, List, Optional, Set, Tuple
+from typing import Any, Callable
-from pip._internal.exceptions import UninstallationError
+from pip._internal.exceptions import LegacyDistutilsInstall, UninstallMissingRecord
from pip._internal.locations import get_bin_prefix, get_bin_user
from pip._internal.metadata import BaseDistribution
from pip._internal.utils.compat import WINDOWS
@@ -38,11 +41,11 @@ def _script_names(
def _unique(
- fn: Callable[..., Generator[Any, None, None]]
+ fn: Callable[..., Generator[Any, None, None]],
) -> Callable[..., Generator[Any, None, None]]:
@functools.wraps(fn)
def unique(*args: Any, **kw: Any) -> Generator[Any, None, None]:
- seen: Set[Any] = set()
+ seen: set[Any] = set()
for item in fn(*args, **kw):
if item not in seen:
seen.add(item)
@@ -61,7 +64,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
UninstallPathSet.add() takes care of the __pycache__ .py[co].
- If RECORD is not found, raises UninstallationError,
+ If RECORD is not found, raises an error,
with possible information from the INSTALLER file.
https://packaging.python.org/specifications/recording-installed-packages/
@@ -71,17 +74,7 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
entries = dist.iter_declared_entries()
if entries is None:
- msg = f"Cannot uninstall {dist}, RECORD file not found."
- installer = dist.installer
- if not installer or installer == "pip":
- dep = f"{dist.raw_name}=={dist.version}"
- msg += (
- " You might be able to recover from this via: "
- f"'pip install --force-reinstall --no-deps {dep}'."
- )
- else:
- msg += f" Hint: The package was installed by {installer}."
- raise UninstallationError(msg)
+ raise UninstallMissingRecord(distribution=dist)
for entry in entries:
path = os.path.join(location, entry)
@@ -95,14 +88,14 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]:
yield path
-def compact(paths: Iterable[str]) -> Set[str]:
+def compact(paths: Iterable[str]) -> set[str]:
"""Compact a path set to contain the minimal number of paths
necessary to contain all paths in the set. If /a/path/ and
/a/path/to/a/file.txt are both in the set, leave only the
shorter path."""
sep = os.path.sep
- short_paths: Set[str] = set()
+ short_paths: set[str] = set()
for path in sorted(paths, key=len):
should_skip = any(
path.startswith(shortpath.rstrip("*"))
@@ -114,7 +107,7 @@ def compact(paths: Iterable[str]) -> Set[str]:
return short_paths
-def compress_for_rename(paths: Iterable[str]) -> Set[str]:
+def compress_for_rename(paths: Iterable[str]) -> set[str]:
"""Returns a set containing the paths that need to be renamed.
This set may include directories when the original sequence of paths
@@ -123,7 +116,7 @@ def compress_for_rename(paths: Iterable[str]) -> Set[str]:
case_map = {os.path.normcase(p): p for p in paths}
remaining = set(case_map)
unchecked = sorted({os.path.split(p)[0] for p in case_map.values()}, key=len)
- wildcards: Set[str] = set()
+ wildcards: set[str] = set()
def norm_join(*a: str) -> str:
return os.path.normcase(os.path.join(*a))
@@ -133,8 +126,8 @@ def compress_for_rename(paths: Iterable[str]) -> Set[str]:
# This directory has already been handled.
continue
- all_files: Set[str] = set()
- all_subdirs: Set[str] = set()
+ all_files: set[str] = set()
+ all_subdirs: set[str] = set()
for dirname, subdirs, files in os.walk(root):
all_subdirs.update(norm_join(root, dirname, d) for d in subdirs)
all_files.update(norm_join(root, dirname, f) for f in files)
@@ -148,7 +141,7 @@ def compress_for_rename(paths: Iterable[str]) -> Set[str]:
return set(map(case_map.__getitem__, remaining)) | wildcards
-def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str]]:
+def compress_for_output_listing(paths: Iterable[str]) -> tuple[set[str], set[str]]:
"""Returns a tuple of 2 sets of which paths to display to user
The first set contains paths that would be deleted. Files of a package
@@ -204,10 +197,10 @@ class StashedUninstallPathSet:
def __init__(self) -> None:
# Mapping from source file root to [Adjacent]TempDirectory
# for files under that directory.
- self._save_dirs: Dict[str, TempDirectory] = {}
+ self._save_dirs: dict[str, TempDirectory] = {}
# (old path, new path) tuples for each move that may need
# to be undone.
- self._moves: List[Tuple[str, str]] = []
+ self._moves: list[tuple[str, str]] = []
def _get_directory_stash(self, path: str) -> str:
"""Stashes a directory.
@@ -307,15 +300,15 @@ class UninstallPathSet:
requirement."""
def __init__(self, dist: BaseDistribution) -> None:
- self._paths: Set[str] = set()
- self._refuse: Set[str] = set()
- self._pth: Dict[str, UninstallPthEntries] = {}
+ self._paths: set[str] = set()
+ self._refuse: set[str] = set()
+ self._pth: dict[str, UninstallPthEntries] = {}
self._dist = dist
self._moved_paths = StashedUninstallPathSet()
# Create local cache of normalize_path results. Creating an UninstallPathSet
# can result in hundreds/thousands of redundant calls to normalize_path with
# the same args, which hurts performance.
- self._normalize_path_cached = functools.lru_cache()(normalize_path)
+ self._normalize_path_cached = functools.lru_cache(normalize_path)
def _permitted(self, path: str) -> bool:
"""
@@ -367,7 +360,7 @@ class UninstallPathSet:
)
return
- dist_name_version = f"{self._dist.raw_name}-{self._dist.version}"
+ dist_name_version = f"{self._dist.raw_name}-{self._dist.raw_version}"
logger.info("Uninstalling %s:", dist_name_version)
with indent_log():
@@ -431,7 +424,7 @@ class UninstallPathSet:
self._moved_paths.commit()
@classmethod
- def from_dist(cls, dist: BaseDistribution) -> "UninstallPathSet":
+ def from_dist(cls, dist: BaseDistribution) -> UninstallPathSet:
dist_location = dist.location
info_location = dist.info_location
if dist_location is None:
@@ -509,22 +502,19 @@ class UninstallPathSet:
paths_to_remove.add(f"{path}.pyo")
elif dist.installed_by_distutils:
- raise UninstallationError(
- "Cannot uninstall {!r}. It is a distutils installed project "
- "and thus we cannot accurately determine which files belong "
- "to it which would lead to only a partial uninstall.".format(
- dist.raw_name,
- )
- )
+ raise LegacyDistutilsInstall(distribution=dist)
elif dist.installed_as_egg:
# package installed by easy_install
# We cannot match on dist.egg_name because it can slightly vary
# i.e. setuptools-0.6c11-py2.6.egg vs setuptools-0.6rc11-py2.6.egg
- paths_to_remove.add(dist_location)
- easy_install_egg = os.path.split(dist_location)[1]
+ # XXX We use normalized_dist_location because dist_location my contain
+ # a trailing / if the distribution is a zipped egg
+ # (which is not a directory).
+ paths_to_remove.add(normalized_dist_location)
+ easy_install_egg = os.path.split(normalized_dist_location)[1]
easy_install_pth = os.path.join(
- os.path.dirname(dist_location),
+ os.path.dirname(normalized_dist_location),
"easy-install.pth",
)
paths_to_remove.add_pth(easy_install_pth, "./" + easy_install_egg)
@@ -594,8 +584,8 @@ class UninstallPathSet:
class UninstallPthEntries:
def __init__(self, pth_file: str) -> None:
self.file = pth_file
- self.entries: Set[str] = set()
- self._saved_lines: Optional[List[bytes]] = None
+ self.entries: set[str] = set()
+ self._saved_lines: list[bytes] | None = None
def add(self, entry: str) -> None:
entry = os.path.normcase(entry)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc
index ea8c693f..9466932c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc
index a051de8c..e29d1d0f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py
index 42dade18..5ec4d96a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py
@@ -1,4 +1,4 @@
-from typing import Callable, List, Optional
+from typing import Callable, Optional
from pip._internal.req.req_install import InstallRequirement
from pip._internal.req.req_set import RequirementSet
@@ -10,11 +10,11 @@ InstallRequirementProvider = Callable[
class BaseResolver:
def resolve(
- self, root_reqs: List[InstallRequirement], check_supported_wheels: bool
+ self, root_reqs: list[InstallRequirement], check_supported_wheels: bool
) -> RequirementSet:
raise NotImplementedError()
def get_installation_order(
self, req_set: RequirementSet
- ) -> List[InstallRequirement]:
+ ) -> list[InstallRequirement]:
raise NotImplementedError()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc
index ea513703..23ba7fab 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc
index 34691320..1a2bdae9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
index 5ddb848a..33a4fdc3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
@@ -10,14 +10,14 @@ for sub-dependencies
a. "first found, wins" (where the order is breadth first)
"""
-# The following comment should be removed at some point in the future.
-# mypy: strict-optional=False
+from __future__ import annotations
import logging
import sys
from collections import defaultdict
+from collections.abc import Iterable
from itertools import chain
-from typing import DefaultDict, Iterable, List, Optional, Set, Tuple
+from typing import Optional
from pip._vendor.packaging import specifiers
from pip._vendor.packaging.requirements import Requirement
@@ -52,12 +52,12 @@ from pip._internal.utils.packaging import check_requires_python
logger = logging.getLogger(__name__)
-DiscoveredDependencies = DefaultDict[str, List[InstallRequirement]]
+DiscoveredDependencies = defaultdict[Optional[str], list[InstallRequirement]]
def _check_dist_requires_python(
dist: BaseDistribution,
- version_info: Tuple[int, int, int],
+ version_info: tuple[int, int, int],
ignore_requires_python: bool = False,
) -> None:
"""
@@ -104,9 +104,8 @@ def _check_dist_requires_python(
return
raise UnsupportedPythonVersion(
- "Package {!r} requires a different Python: {} not in {!r}".format(
- dist.raw_name, version, requires_python
- )
+ f"Package {dist.raw_name!r} requires a different Python: "
+ f"{version} not in {requires_python!r}"
)
@@ -121,7 +120,7 @@ class Resolver(BaseResolver):
self,
preparer: RequirementPreparer,
finder: PackageFinder,
- wheel_cache: Optional[WheelCache],
+ wheel_cache: WheelCache | None,
make_install_req: InstallRequirementProvider,
use_user_site: bool,
ignore_dependencies: bool,
@@ -129,7 +128,7 @@ class Resolver(BaseResolver):
ignore_requires_python: bool,
force_reinstall: bool,
upgrade_strategy: str,
- py_version_info: Optional[Tuple[int, ...]] = None,
+ py_version_info: tuple[int, ...] | None = None,
) -> None:
super().__init__()
assert upgrade_strategy in self._allowed_strategies
@@ -156,7 +155,7 @@ class Resolver(BaseResolver):
self._discovered_dependencies: DiscoveredDependencies = defaultdict(list)
def resolve(
- self, root_reqs: List[InstallRequirement], check_supported_wheels: bool
+ self, root_reqs: list[InstallRequirement], check_supported_wheels: bool
) -> RequirementSet:
"""Resolve what operations need to be done
@@ -178,7 +177,7 @@ class Resolver(BaseResolver):
# exceptions cannot be checked ahead of time, because
# _populate_link() needs to be called before we can make decisions
# based on link type.
- discovered_reqs: List[InstallRequirement] = []
+ discovered_reqs: list[InstallRequirement] = []
hash_errors = HashErrors()
for req in chain(requirement_set.all_requirements, discovered_reqs):
try:
@@ -196,9 +195,9 @@ class Resolver(BaseResolver):
self,
requirement_set: RequirementSet,
install_req: InstallRequirement,
- parent_req_name: Optional[str] = None,
- extras_requested: Optional[Iterable[str]] = None,
- ) -> Tuple[List[InstallRequirement], Optional[InstallRequirement]]:
+ parent_req_name: str | None = None,
+ extras_requested: Iterable[str] | None = None,
+ ) -> tuple[list[InstallRequirement], InstallRequirement | None]:
"""Add install_req as a requirement to install.
:param parent_req_name: The name of the requirement that needed this
@@ -246,9 +245,9 @@ class Resolver(BaseResolver):
return [install_req], None
try:
- existing_req: Optional[
- InstallRequirement
- ] = requirement_set.get_requirement(install_req.name)
+ existing_req: InstallRequirement | None = requirement_set.get_requirement(
+ install_req.name
+ )
except KeyError:
existing_req = None
@@ -263,9 +262,8 @@ class Resolver(BaseResolver):
)
if has_conflicting_requirement:
raise InstallationError(
- "Double requirement given: {} (already in {}, name={!r})".format(
- install_req, existing_req, install_req.name
- )
+ f"Double requirement given: {install_req} "
+ f"(already in {existing_req}, name={install_req.name!r})"
)
# When no existing requirement exists, add the requirement as a
@@ -323,13 +321,12 @@ class Resolver(BaseResolver):
"""
# Don't uninstall the conflict if doing a user install and the
# conflict is not a user install.
+ assert req.satisfied_by is not None
if not self.use_user_site or req.satisfied_by.in_usersite:
req.should_reinstall = True
req.satisfied_by = None
- def _check_skip_installed(
- self, req_to_install: InstallRequirement
- ) -> Optional[str]:
+ def _check_skip_installed(self, req_to_install: InstallRequirement) -> str | None:
"""Check if req_to_install should be skipped.
This will check if the req is installed, and whether we should upgrade
@@ -381,7 +378,7 @@ class Resolver(BaseResolver):
self._set_req_to_reinstall(req_to_install)
return None
- def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]:
+ def _find_requirement_link(self, req: InstallRequirement) -> Link | None:
upgrade = self._is_upgrade_allowed(req)
best_candidate = self.finder.find_requirement(req, upgrade)
if not best_candidate:
@@ -421,6 +418,8 @@ class Resolver(BaseResolver):
if self.wheel_cache is None or self.preparer.require_hashes:
return
+
+ assert req.link is not None, "_find_requirement_link unexpectedly returned None"
cache_entry = self.wheel_cache.get_cache_entry(
link=req.link,
package_name=req.name,
@@ -490,7 +489,7 @@ class Resolver(BaseResolver):
self,
requirement_set: RequirementSet,
req_to_install: InstallRequirement,
- ) -> List[InstallRequirement]:
+ ) -> list[InstallRequirement]:
"""Prepare a single requirements file.
:return: A list of additional InstallRequirements to also install.
@@ -513,7 +512,7 @@ class Resolver(BaseResolver):
ignore_requires_python=self.ignore_requires_python,
)
- more_reqs: List[InstallRequirement] = []
+ more_reqs: list[InstallRequirement] = []
def add_req(subreq: Requirement, extras_requested: Iterable[str]) -> None:
# This idiosyncratically converts the Requirement to str and let
@@ -534,6 +533,7 @@ class Resolver(BaseResolver):
with indent_log():
# We add req_to_install before its dependencies, so that we
# can refer to it when adding dependencies.
+ assert req_to_install.name is not None
if not requirement_set.has_requirement(req_to_install.name):
# 'unnamed' requirements will get added here
# 'unnamed' requirements can only come from being directly
@@ -570,7 +570,7 @@ class Resolver(BaseResolver):
def get_installation_order(
self, req_set: RequirementSet
- ) -> List[InstallRequirement]:
+ ) -> list[InstallRequirement]:
"""Create the installation order.
The installation order is topological - requirements are installed
@@ -581,7 +581,7 @@ class Resolver(BaseResolver):
# installs the user specified things in the order given, except when
# dependencies must come earlier to achieve topological order.
order = []
- ordered_reqs: Set[InstallRequirement] = set()
+ ordered_reqs: set[InstallRequirement] = set()
def schedule(req: InstallRequirement) -> None:
if req.satisfied_by or req in ordered_reqs:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc
index 941b4821..4b03d370 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc
index f1add5d3..eb2491f3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc
index 9809a83e..7eb9ec6d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc
index 42db77a4..1f650f35 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc
index 1be04830..344fad41 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc
index 22da3f65..dd455bf1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc
index 3c88fedf..681ee007 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc
index 2cfc65ce..6d3040ca 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc
index 8b56d8c4..2579881f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py
index 9c0ef5ca..03877b6c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py
@@ -1,45 +1,46 @@
-from typing import FrozenSet, Iterable, Optional, Tuple, Union
+from __future__ import annotations
+
+from collections.abc import Iterable
+from dataclasses import dataclass
+from typing import Optional
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName
-from pip._vendor.packaging.version import LegacyVersion, Version
+from pip._vendor.packaging.version import Version
from pip._internal.models.link import Link, links_equivalent
from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.hashes import Hashes
-CandidateLookup = Tuple[Optional["Candidate"], Optional[InstallRequirement]]
-CandidateVersion = Union[LegacyVersion, Version]
+CandidateLookup = tuple[Optional["Candidate"], Optional[InstallRequirement]]
-def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> str:
+def format_name(project: NormalizedName, extras: frozenset[NormalizedName]) -> str:
if not extras:
return project
extras_expr = ",".join(sorted(extras))
return f"{project}[{extras_expr}]"
+@dataclass(frozen=True)
class Constraint:
- def __init__(
- self, specifier: SpecifierSet, hashes: Hashes, links: FrozenSet[Link]
- ) -> None:
- self.specifier = specifier
- self.hashes = hashes
- self.links = links
+ specifier: SpecifierSet
+ hashes: Hashes
+ links: frozenset[Link]
@classmethod
- def empty(cls) -> "Constraint":
+ def empty(cls) -> Constraint:
return Constraint(SpecifierSet(), Hashes(), frozenset())
@classmethod
- def from_ireq(cls, ireq: InstallRequirement) -> "Constraint":
+ def from_ireq(cls, ireq: InstallRequirement) -> Constraint:
links = frozenset([ireq.link]) if ireq.link else frozenset()
return Constraint(ireq.specifier, ireq.hashes(trust_internet=False), links)
def __bool__(self) -> bool:
return bool(self.specifier) or bool(self.hashes) or bool(self.links)
- def __and__(self, other: InstallRequirement) -> "Constraint":
+ def __and__(self, other: InstallRequirement) -> Constraint:
if not isinstance(other, InstallRequirement):
return NotImplemented
specifier = self.specifier & other.specifier
@@ -49,7 +50,7 @@ class Constraint:
links = links.union([other.link])
return Constraint(specifier, hashes, links)
- def is_satisfied_by(self, candidate: "Candidate") -> bool:
+ def is_satisfied_by(self, candidate: Candidate) -> bool:
# Reject if there are any mismatched URL constraints on this package.
if self.links and not all(_match_link(link, candidate) for link in self.links):
return False
@@ -79,7 +80,7 @@ class Requirement:
"""
raise NotImplementedError("Subclass should override")
- def is_satisfied_by(self, candidate: "Candidate") -> bool:
+ def is_satisfied_by(self, candidate: Candidate) -> bool:
return False
def get_candidate_lookup(self) -> CandidateLookup:
@@ -89,7 +90,7 @@ class Requirement:
raise NotImplementedError("Subclass should override")
-def _match_link(link: Link, candidate: "Candidate") -> bool:
+def _match_link(link: Link, candidate: Candidate) -> bool:
if candidate.source_link:
return links_equivalent(link, candidate.source_link)
return False
@@ -116,7 +117,7 @@ class Candidate:
raise NotImplementedError("Override in subclass")
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
raise NotImplementedError("Override in subclass")
@property
@@ -128,13 +129,13 @@ class Candidate:
raise NotImplementedError("Override in subclass")
@property
- def source_link(self) -> Optional[Link]:
+ def source_link(self) -> Link | None:
raise NotImplementedError("Override in subclass")
- def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
+ def iter_dependencies(self, with_requires: bool) -> Iterable[Requirement | None]:
raise NotImplementedError("Override in subclass")
- def get_install_requirement(self) -> Optional[InstallRequirement]:
+ def get_install_requirement(self) -> InstallRequirement | None:
raise NotImplementedError("Override in subclass")
def format_for_error(self) -> str:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
index 4125cda2..a8315349 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
@@ -1,14 +1,20 @@
+from __future__ import annotations
+
import logging
import sys
-from typing import TYPE_CHECKING, Any, FrozenSet, Iterable, Optional, Tuple, Union, cast
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, Any, Union, cast
+from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
from pip._vendor.packaging.version import Version
from pip._internal.exceptions import (
HashError,
InstallationSubprocessError,
+ InvalidInstalledPackage,
MetadataInconsistent,
+ MetadataInvalid,
)
from pip._internal.metadata import BaseDistribution
from pip._internal.models.link import Link, links_equivalent
@@ -21,7 +27,7 @@ from pip._internal.req.req_install import InstallRequirement
from pip._internal.utils.direct_url_helpers import direct_url_from_link
from pip._internal.utils.misc import normalize_version_info
-from .base import Candidate, CandidateVersion, Requirement, format_name
+from .base import Candidate, Requirement, format_name
if TYPE_CHECKING:
from .factory import Factory
@@ -38,7 +44,7 @@ BaseCandidate = Union[
REQUIRES_PYTHON_IDENTIFIER = cast(NormalizedName, "")
-def as_base_candidate(candidate: Candidate) -> Optional[BaseCandidate]:
+def as_base_candidate(candidate: Candidate) -> BaseCandidate | None:
"""The runtime version of BaseCandidate."""
base_candidate_classes = (
AlreadyInstalledCandidate,
@@ -143,9 +149,9 @@ class _InstallRequirementBackedCandidate(Candidate):
link: Link,
source_link: Link,
ireq: InstallRequirement,
- factory: "Factory",
- name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ factory: Factory,
+ name: NormalizedName | None = None,
+ version: Version | None = None,
) -> None:
self._link = link
self._source_link = source_link
@@ -154,6 +160,7 @@ class _InstallRequirementBackedCandidate(Candidate):
self._name = name
self._version = version
self.dist = self._prepare()
+ self._hash: int | None = None
def __str__(self) -> str:
return f"{self.name} {self.version}"
@@ -162,7 +169,11 @@ class _InstallRequirementBackedCandidate(Candidate):
return f"{self.__class__.__name__}({str(self._link)!r})"
def __hash__(self) -> int:
- return hash((self.__class__, self._link))
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash((self.__class__, self._link))
+ return self._hash
def __eq__(self, other: Any) -> bool:
if isinstance(other, self.__class__):
@@ -170,7 +181,7 @@ class _InstallRequirementBackedCandidate(Candidate):
return False
@property
- def source_link(self) -> Optional[Link]:
+ def source_link(self) -> Link | None:
return self._source_link
@property
@@ -185,16 +196,15 @@ class _InstallRequirementBackedCandidate(Candidate):
return self.project_name
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
if self._version is None:
self._version = self.dist.version
return self._version
def format_for_error(self) -> str:
- return "{} {} (from {})".format(
- self.name,
- self.version,
- self._link.file_path if self._link.is_file else self._link,
+ return (
+ f"{self.name} {self.version} "
+ f"(from {self._link.file_path if self._link.is_file else self._link})"
)
def _prepare_distribution(self) -> BaseDistribution:
@@ -216,6 +226,13 @@ class _InstallRequirementBackedCandidate(Candidate):
str(self._version),
str(dist.version),
)
+ # check dependencies are valid
+ # TODO performance: this means we iterate the dependencies at least twice,
+ # we may want to cache parsed Requires-Dist
+ try:
+ list(dist.iter_dependencies(list(dist.iter_provided_extras())))
+ except InvalidRequirement as e:
+ raise MetadataInvalid(self._ireq, str(e))
def _prepare(self) -> BaseDistribution:
try:
@@ -234,13 +251,15 @@ class _InstallRequirementBackedCandidate(Candidate):
self._check_metadata_consistency(dist)
return dist
- def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
+ def iter_dependencies(self, with_requires: bool) -> Iterable[Requirement | None]:
+ # Emit the Requires-Python requirement first to fail fast on
+ # unsupported candidates and avoid pointless downloads/preparation.
+ yield self._factory.make_requires_python_requirement(self.dist.requires_python)
requires = self.dist.iter_dependencies() if with_requires else ()
for r in requires:
yield from self._factory.make_requirements_from_spec(str(r), self._ireq)
- yield self._factory.make_requires_python_requirement(self.dist.requires_python)
- def get_install_requirement(self) -> Optional[InstallRequirement]:
+ def get_install_requirement(self) -> InstallRequirement | None:
return self._ireq
@@ -251,9 +270,9 @@ class LinkCandidate(_InstallRequirementBackedCandidate):
self,
link: Link,
template: InstallRequirement,
- factory: "Factory",
- name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ factory: Factory,
+ name: NormalizedName | None = None,
+ version: Version | None = None,
) -> None:
source_link = link
cache_entry = factory.get_wheel_cache_entry(source_link, name)
@@ -269,9 +288,9 @@ class LinkCandidate(_InstallRequirementBackedCandidate):
# Version may not be present for PEP 508 direct URLs
if version is not None:
wheel_version = Version(wheel.version)
- assert version == wheel_version, "{!r} != {!r} for wheel {}".format(
- version, wheel_version, name
- )
+ assert (
+ version == wheel_version
+ ), f"{version!r} != {wheel_version!r} for wheel {name}"
if cache_entry is not None:
assert ireq.link.is_wheel
@@ -308,9 +327,9 @@ class EditableCandidate(_InstallRequirementBackedCandidate):
self,
link: Link,
template: InstallRequirement,
- factory: "Factory",
- name: Optional[NormalizedName] = None,
- version: Optional[CandidateVersion] = None,
+ factory: Factory,
+ name: NormalizedName | None = None,
+ version: Version | None = None,
) -> None:
super().__init__(
link=link,
@@ -333,7 +352,7 @@ class AlreadyInstalledCandidate(Candidate):
self,
dist: BaseDistribution,
template: InstallRequirement,
- factory: "Factory",
+ factory: Factory,
) -> None:
self.dist = dist
self._ireq = _make_install_req_from_dist(dist, template)
@@ -353,13 +372,13 @@ class AlreadyInstalledCandidate(Candidate):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.dist!r})"
- def __hash__(self) -> int:
- return hash((self.__class__, self.name, self.version))
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, AlreadyInstalledCandidate):
+ return NotImplemented
+ return self.name == other.name and self.version == other.version
- def __eq__(self, other: Any) -> bool:
- if isinstance(other, self.__class__):
- return self.name == other.name and self.version == other.version
- return False
+ def __hash__(self) -> int:
+ return hash((self.name, self.version))
@property
def project_name(self) -> NormalizedName:
@@ -370,7 +389,7 @@ class AlreadyInstalledCandidate(Candidate):
return self.project_name
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
if self._version is None:
self._version = self.dist.version
return self._version
@@ -382,13 +401,17 @@ class AlreadyInstalledCandidate(Candidate):
def format_for_error(self) -> str:
return f"{self.name} {self.version} (Installed)"
- def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
+ def iter_dependencies(self, with_requires: bool) -> Iterable[Requirement | None]:
if not with_requires:
return
- for r in self.dist.iter_dependencies():
- yield from self._factory.make_requirements_from_spec(str(r), self._ireq)
- def get_install_requirement(self) -> Optional[InstallRequirement]:
+ try:
+ for r in self.dist.iter_dependencies():
+ yield from self._factory.make_requirements_from_spec(str(r), self._ireq)
+ except InvalidRequirement as exc:
+ raise InvalidInstalledPackage(dist=self.dist, invalid_exc=exc) from None
+
+ def get_install_requirement(self) -> InstallRequirement | None:
return None
@@ -420,9 +443,9 @@ class ExtrasCandidate(Candidate):
def __init__(
self,
base: BaseCandidate,
- extras: FrozenSet[str],
+ extras: frozenset[str],
*,
- comes_from: Optional[InstallRequirement] = None,
+ comes_from: InstallRequirement | None = None,
) -> None:
"""
:param comes_from: the InstallRequirement that led to this candidate if it
@@ -434,14 +457,6 @@ class ExtrasCandidate(Candidate):
"""
self.base = base
self.extras = frozenset(canonicalize_name(e) for e in extras)
- # If any extras are requested in their non-normalized forms, keep track
- # of their raw values. This is needed when we look up dependencies
- # since PEP 685 has not been implemented for marker-matching, and using
- # the non-normalized extra for lookup ensures the user can select a
- # non-normalized extra in a package with its non-normalized form.
- # TODO: Remove this attribute when packaging is upgraded to support the
- # marker comparison logic specified in PEP 685.
- self._unnormalized_extras = extras.difference(self.extras)
self._comes_from = comes_from if comes_from is not None else self.base._ireq
def __str__(self) -> str:
@@ -469,7 +484,7 @@ class ExtrasCandidate(Candidate):
return format_name(self.base.project_name, self.extras)
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
return self.base.version
def format_for_error(self) -> str:
@@ -486,54 +501,10 @@ class ExtrasCandidate(Candidate):
return self.base.is_editable
@property
- def source_link(self) -> Optional[Link]:
+ def source_link(self) -> Link | None:
return self.base.source_link
- def _warn_invalid_extras(
- self,
- requested: FrozenSet[str],
- valid: FrozenSet[str],
- ) -> None:
- """Emit warnings for invalid extras being requested.
-
- This emits a warning for each requested extra that is not in the
- candidate's ``Provides-Extra`` list.
- """
- invalid_extras_to_warn = frozenset(
- extra
- for extra in requested
- if extra not in valid
- # If an extra is requested in an unnormalized form, skip warning
- # about the normalized form being missing.
- and extra in self.extras
- )
- if not invalid_extras_to_warn:
- return
- for extra in sorted(invalid_extras_to_warn):
- logger.warning(
- "%s %s does not provide the extra '%s'",
- self.base.name,
- self.version,
- extra,
- )
-
- def _calculate_valid_requested_extras(self) -> FrozenSet[str]:
- """Get a list of valid extras requested by this candidate.
-
- The user (or upstream dependant) may have specified extras that the
- candidate doesn't support. Any unsupported extras are dropped, and each
- cause a warning to be logged here.
- """
- requested_extras = self.extras.union(self._unnormalized_extras)
- valid_extras = frozenset(
- extra
- for extra in requested_extras
- if self.base.dist.is_extra_provided(extra)
- )
- self._warn_invalid_extras(requested_extras, valid_extras)
- return valid_extras
-
- def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
+ def iter_dependencies(self, with_requires: bool) -> Iterable[Requirement | None]:
factory = self.base._factory
# Add a dependency on the exact base
@@ -542,7 +513,18 @@ class ExtrasCandidate(Candidate):
if not with_requires:
return
- valid_extras = self._calculate_valid_requested_extras()
+ # The user may have specified extras that the candidate doesn't
+ # support. We ignore any unsupported extras here.
+ valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras())
+ invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras())
+ for extra in sorted(invalid_extras):
+ logger.warning(
+ "%s %s does not provide the extra '%s'",
+ self.base.name,
+ self.version,
+ extra,
+ )
+
for r in self.base.dist.iter_dependencies(valid_extras):
yield from factory.make_requirements_from_spec(
str(r),
@@ -550,7 +532,7 @@ class ExtrasCandidate(Candidate):
valid_extras,
)
- def get_install_requirement(self) -> Optional[InstallRequirement]:
+ def get_install_requirement(self) -> InstallRequirement | None:
# We don't return anything here, because we always
# depend on the base candidate, and we'll get the
# install requirement from that.
@@ -561,7 +543,7 @@ class RequiresPythonCandidate(Candidate):
is_installed = False
source_link = None
- def __init__(self, py_version_info: Optional[Tuple[int, ...]]) -> None:
+ def __init__(self, py_version_info: tuple[int, ...] | None) -> None:
if py_version_info is not None:
version_info = normalize_version_info(py_version_info)
else:
@@ -575,6 +557,9 @@ class RequiresPythonCandidate(Candidate):
def __str__(self) -> str:
return f"Python {self._version}"
+ def __repr__(self) -> str:
+ return f"{self.__class__.__name__}({self._version!r})"
+
@property
def project_name(self) -> NormalizedName:
return REQUIRES_PYTHON_IDENTIFIER
@@ -584,14 +569,14 @@ class RequiresPythonCandidate(Candidate):
return REQUIRES_PYTHON_IDENTIFIER
@property
- def version(self) -> CandidateVersion:
+ def version(self) -> Version:
return self._version
def format_for_error(self) -> str:
return f"Python {self.version}"
- def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]:
+ def iter_dependencies(self, with_requires: bool) -> Iterable[Requirement | None]:
return ()
- def get_install_requirement(self) -> Optional[InstallRequirement]:
+ def get_install_requirement(self) -> InstallRequirement | None:
return None
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
index 4adeb430..f23e4cd6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
@@ -1,19 +1,14 @@
+from __future__ import annotations
+
import contextlib
import functools
import logging
+from collections.abc import Iterable, Iterator, Mapping, Sequence
from typing import (
TYPE_CHECKING,
- Dict,
- FrozenSet,
- Iterable,
- Iterator,
- List,
- Mapping,
+ Callable,
NamedTuple,
- Optional,
- Sequence,
- Set,
- Tuple,
+ Protocol,
TypeVar,
cast,
)
@@ -21,13 +16,16 @@ from typing import (
from pip._vendor.packaging.requirements import InvalidRequirement
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
+from pip._vendor.packaging.version import InvalidVersion, Version
from pip._vendor.resolvelib import ResolutionImpossible
from pip._internal.cache import CacheEntry, WheelCache
from pip._internal.exceptions import (
DistributionNotFound,
InstallationError,
+ InvalidInstalledPackage,
MetadataInconsistent,
+ MetadataInvalid,
UnsupportedPythonVersion,
UnsupportedWheel,
)
@@ -50,7 +48,7 @@ from pip._internal.utils.hashes import Hashes
from pip._internal.utils.packaging import get_requirement
from pip._internal.utils.virtualenv import running_under_virtualenv
-from .base import Candidate, CandidateVersion, Constraint, Requirement
+from .base import Candidate, Constraint, Requirement
from .candidates import (
AlreadyInstalledCandidate,
BaseCandidate,
@@ -70,7 +68,6 @@ from .requirements import (
)
if TYPE_CHECKING:
- from typing import Protocol
class ConflictCause(Protocol):
requirement: RequiresPythonRequirement
@@ -80,13 +77,13 @@ if TYPE_CHECKING:
logger = logging.getLogger(__name__)
C = TypeVar("C")
-Cache = Dict[Link, C]
+Cache = dict[Link, C]
class CollectedRootRequirements(NamedTuple):
- requirements: List[Requirement]
- constraints: Dict[str, Constraint]
- user_requested: Dict[str, int]
+ requirements: list[Requirement]
+ constraints: dict[str, Constraint]
+ user_requested: dict[str, int]
class Factory:
@@ -95,12 +92,12 @@ class Factory:
finder: PackageFinder,
preparer: RequirementPreparer,
make_install_req: InstallRequirementProvider,
- wheel_cache: Optional[WheelCache],
+ wheel_cache: WheelCache | None,
use_user_site: bool,
force_reinstall: bool,
ignore_installed: bool,
ignore_requires_python: bool,
- py_version_info: Optional[Tuple[int, ...]] = None,
+ py_version_info: tuple[int, ...] | None = None,
) -> None:
self._finder = finder
self.preparer = preparer
@@ -114,10 +111,11 @@ class Factory:
self._build_failures: Cache[InstallationError] = {}
self._link_candidate_cache: Cache[LinkCandidate] = {}
self._editable_candidate_cache: Cache[EditableCandidate] = {}
- self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {}
- self._extras_candidate_cache: Dict[
- Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate
+ self._installed_candidate_cache: dict[str, AlreadyInstalledCandidate] = {}
+ self._extras_candidate_cache: dict[
+ tuple[int, frozenset[NormalizedName]], ExtrasCandidate
] = {}
+ self._supported_tags_cache = get_supported()
if not ignore_installed:
env = get_default_environment()
@@ -144,9 +142,9 @@ class Factory:
def _make_extras_candidate(
self,
base: BaseCandidate,
- extras: FrozenSet[str],
+ extras: frozenset[str],
*,
- comes_from: Optional[InstallRequirement] = None,
+ comes_from: InstallRequirement | None = None,
) -> ExtrasCandidate:
cache_key = (id(base), frozenset(canonicalize_name(e) for e in extras))
try:
@@ -159,7 +157,7 @@ class Factory:
def _make_candidate_from_dist(
self,
dist: BaseDistribution,
- extras: FrozenSet[str],
+ extras: frozenset[str],
template: InstallRequirement,
) -> Candidate:
try:
@@ -174,12 +172,12 @@ class Factory:
def _make_candidate_from_link(
self,
link: Link,
- extras: FrozenSet[str],
+ extras: frozenset[str],
template: InstallRequirement,
- name: Optional[NormalizedName],
- version: Optional[CandidateVersion],
- ) -> Optional[Candidate]:
- base: Optional[BaseCandidate] = self._make_base_candidate_from_link(
+ name: NormalizedName | None,
+ version: Version | None,
+ ) -> Candidate | None:
+ base: BaseCandidate | None = self._make_base_candidate_from_link(
link, template, name, version
)
if not extras or base is None:
@@ -190,9 +188,9 @@ class Factory:
self,
link: Link,
template: InstallRequirement,
- name: Optional[NormalizedName],
- version: Optional[CandidateVersion],
- ) -> Optional[BaseCandidate]:
+ name: NormalizedName | None,
+ version: Version | None,
+ ) -> BaseCandidate | None:
# TODO: Check already installed candidate, and use it if the link and
# editable flag match.
@@ -211,7 +209,7 @@ class Factory:
name=name,
version=version,
)
- except MetadataInconsistent as e:
+ except (MetadataInconsistent, MetadataInvalid) as e:
logger.info(
"Discarding [blue underline]%s[/]: [yellow]%s[reset]",
link,
@@ -249,7 +247,7 @@ class Factory:
specifier: SpecifierSet,
hashes: Hashes,
prefers_installed: bool,
- incompatible_ids: Set[int],
+ incompatible_ids: set[int],
) -> Iterable[Candidate]:
if not ireqs:
return ()
@@ -262,14 +260,14 @@ class Factory:
assert template.req, "Candidates found on index must be PEP 508"
name = canonicalize_name(template.req.name)
- extras: FrozenSet[str] = frozenset()
+ extras: frozenset[str] = frozenset()
for ireq in ireqs:
assert ireq.req, "Candidates found on index must be PEP 508"
specifier &= ireq.req.specifier
hashes &= ireq.hashes(trust_internet=False)
extras |= frozenset(ireq.extras)
- def _get_installed_candidate() -> Optional[Candidate]:
+ def _get_installed_candidate() -> Candidate | None:
"""Get the candidate for the currently-installed version."""
# If --force-reinstall is set, we want the version from the index
# instead, so we "pretend" there is nothing installed.
@@ -279,10 +277,15 @@ class Factory:
installed_dist = self._installed_dists[name]
except KeyError:
return None
- # Don't use the installed distribution if its version does not fit
- # the current dependency graph.
- if not specifier.contains(installed_dist.version, prereleases=True):
- return None
+
+ try:
+ # Don't use the installed distribution if its version
+ # does not fit the current dependency graph.
+ if not specifier.contains(installed_dist.version, prereleases=True):
+ return None
+ except InvalidVersion as e:
+ raise InvalidInstalledPackage(dist=installed_dist, invalid_exc=e)
+
candidate = self._make_candidate_from_dist(
dist=installed_dist,
extras=extras,
@@ -299,7 +302,7 @@ class Factory:
specifier=specifier,
hashes=hashes,
)
- icans = list(result.iter_applicable())
+ icans = result.applicable_candidates
# PEP 592: Yanked releases are ignored unless the specifier
# explicitly pins a version (via '==' or '===') that can be
@@ -343,7 +346,7 @@ class Factory:
def _iter_explicit_candidates_from_base(
self,
base_requirements: Iterable[Requirement],
- extras: FrozenSet[str],
+ extras: frozenset[str],
) -> Iterator[Candidate]:
"""Produce explicit candidates from the base given an extra-ed package.
@@ -391,10 +394,11 @@ class Factory:
incompatibilities: Mapping[str, Iterator[Candidate]],
constraint: Constraint,
prefers_installed: bool,
+ is_satisfied_by: Callable[[Requirement, Candidate], bool],
) -> Iterable[Candidate]:
# Collect basic lookup information from the requirements.
- explicit_candidates: Set[Candidate] = set()
- ireqs: List[InstallRequirement] = []
+ explicit_candidates: set[Candidate] = set()
+ ireqs: list[InstallRequirement] = []
for req in requirements[identifier]:
cand, ireq = req.get_candidate_lookup()
if cand is not None:
@@ -456,7 +460,7 @@ class Factory:
for c in explicit_candidates
if id(c) not in incompat_ids
and constraint.is_satisfied_by(c)
- and all(req.is_satisfied_by(c) for req in requirements[identifier])
+ and all(is_satisfied_by(req, c) for req in requirements[identifier])
)
def _make_requirements_from_install_req(
@@ -513,7 +517,7 @@ class Factory:
)
def collect_root_requirements(
- self, root_ireqs: List[InstallRequirement]
+ self, root_ireqs: list[InstallRequirement]
) -> CollectedRootRequirements:
collected = CollectedRootRequirements([], {}, {})
for i, ireq in enumerate(root_ireqs):
@@ -562,7 +566,7 @@ class Factory:
def make_requirements_from_spec(
self,
specifier: str,
- comes_from: Optional[InstallRequirement],
+ comes_from: InstallRequirement | None,
requested_extras: Iterable[str] = (),
) -> Iterator[Requirement]:
"""
@@ -580,7 +584,7 @@ class Factory:
def make_requires_python_requirement(
self,
specifier: SpecifierSet,
- ) -> Optional[Requirement]:
+ ) -> Requirement | None:
if self._ignore_requires_python:
return None
# Don't bother creating a dependency for an empty Requires-Python.
@@ -588,9 +592,7 @@ class Factory:
return None
return RequiresPythonRequirement(specifier, self._python_candidate)
- def get_wheel_cache_entry(
- self, link: Link, name: Optional[str]
- ) -> Optional[CacheEntry]:
+ def get_wheel_cache_entry(self, link: Link, name: str | None) -> CacheEntry | None:
"""Look up the link in the wheel cache.
If ``preparer.require_hashes`` is True, don't use the wheel cache,
@@ -604,10 +606,10 @@ class Factory:
return self._wheel_cache.get_cache_entry(
link=link,
package_name=name,
- supported_tags=get_supported(),
+ supported_tags=self._supported_tags_cache,
)
- def get_dist_to_uninstall(self, candidate: Candidate) -> Optional[BaseDistribution]:
+ def get_dist_to_uninstall(self, candidate: Candidate) -> BaseDistribution | None:
# TODO: Are there more cases this needs to return True? Editable?
dist = self._installed_dists.get(candidate.project_name)
if dist is None: # Not installed, no uninstallation required.
@@ -636,7 +638,7 @@ class Factory:
return None
def _report_requires_python_error(
- self, causes: Sequence["ConflictCause"]
+ self, causes: Sequence[ConflictCause]
) -> UnsupportedPythonVersion:
assert causes, "Requires-Python error reported with no cause"
@@ -658,7 +660,7 @@ class Factory:
return UnsupportedPythonVersion(message)
def _report_single_requirement_conflict(
- self, req: Requirement, parent: Optional[Candidate]
+ self, req: Requirement, parent: Candidate | None
) -> DistributionNotFound:
if parent is None:
req_disp = str(req)
@@ -668,8 +670,8 @@ class Factory:
cands = self._finder.find_all_candidates(req.project_name)
skipped_by_requires_python = self._finder.requires_python_skipped_reasons()
- versions_set: Set[CandidateVersion] = set()
- yanked_versions_set: Set[CandidateVersion] = set()
+ versions_set: set[Version] = set()
+ yanked_versions_set: set[Version] = set()
for c in cands:
is_yanked = c.link.is_yanked if c.link else False
if is_yanked:
@@ -711,8 +713,8 @@ class Factory:
def get_installation_error(
self,
- e: "ResolutionImpossible[Requirement, Candidate]",
- constraints: Dict[str, Constraint],
+ e: ResolutionImpossible[Requirement, Candidate],
+ constraints: dict[str, Constraint],
) -> InstallationError:
assert e.causes, "Installation error reported with no cause"
@@ -737,7 +739,7 @@ class Factory:
# The simplest case is when we have *one* cause that can't be
# satisfied. We just report that case.
if len(e.causes) == 1:
- req, parent = e.causes[0]
+ req, parent = next(iter(e.causes))
if req.name not in constraints:
return self._report_single_requirement_conflict(req, parent)
@@ -745,7 +747,7 @@ class Factory:
# satisfied at once.
# A couple of formatting helpers
- def text_join(parts: List[str]) -> str:
+ def text_join(parts: list[str]) -> str:
if len(parts) == 1:
return parts[0]
@@ -799,7 +801,7 @@ class Factory:
+ "\n\n"
+ "To fix this you could try to:\n"
+ "1. loosen the range of package versions you've specified\n"
- + "2. remove package versions to allow pip attempt to solve "
+ + "2. remove package versions to allow pip to attempt to solve "
+ "the dependency conflict\n"
)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py
index 8663097b..f60653d2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py
@@ -8,30 +8,21 @@ absolutely need, and not "download the world" when we only need one version of
something.
"""
-import functools
-from collections.abc import Sequence
-from typing import TYPE_CHECKING, Any, Callable, Iterator, Optional, Set, Tuple
+from __future__ import annotations
+
+import logging
+from collections.abc import Iterator, Sequence
+from typing import Any, Callable, Optional
from pip._vendor.packaging.version import _BaseVersion
+from pip._internal.exceptions import MetadataInvalid
+
from .base import Candidate
-IndexCandidateInfo = Tuple[_BaseVersion, Callable[[], Optional[Candidate]]]
+logger = logging.getLogger(__name__)
-if TYPE_CHECKING:
- SequenceCandidate = Sequence[Candidate]
-else:
- # For compatibility: Python before 3.9 does not support using [] on the
- # Sequence class.
- #
- # >>> from collections.abc import Sequence
- # >>> Sequence[str]
- # Traceback (most recent call last):
- # File "", line 1, in
- # TypeError: 'ABCMeta' object is not subscriptable
- #
- # TODO: Remove this block after dropping Python 3.8 support.
- SequenceCandidate = Sequence
+IndexCandidateInfo = tuple[_BaseVersion, Callable[[], Optional[Candidate]]]
def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]:
@@ -40,15 +31,29 @@ def _iter_built(infos: Iterator[IndexCandidateInfo]) -> Iterator[Candidate]:
This iterator is used when the package is not already installed. Candidates
from index come later in their normal ordering.
"""
- versions_found: Set[_BaseVersion] = set()
+ versions_found: set[_BaseVersion] = set()
for version, func in infos:
if version in versions_found:
continue
- candidate = func()
- if candidate is None:
- continue
- yield candidate
- versions_found.add(version)
+ try:
+ candidate = func()
+ except MetadataInvalid as e:
+ logger.warning(
+ "Ignoring version %s of %s since it has invalid metadata:\n"
+ "%s\n"
+ "Please use pip<24.1 if you need to use this version.",
+ version,
+ e.ireq.name,
+ e,
+ )
+ # Mark version as found to avoid trying other candidates with the same
+ # version, since they most likely have invalid metadata as well.
+ versions_found.add(version)
+ else:
+ if candidate is None:
+ continue
+ yield candidate
+ versions_found.add(version)
def _iter_built_with_prepended(
@@ -62,7 +67,7 @@ def _iter_built_with_prepended(
normal ordering, except skipped when the version is already installed.
"""
yield installed
- versions_found: Set[_BaseVersion] = {installed.version}
+ versions_found: set[_BaseVersion] = {installed.version}
for version, func in infos:
if version in versions_found:
continue
@@ -86,7 +91,7 @@ def _iter_built_with_inserted(
the installed candidate exactly once before we start yielding older or
equivalent candidates, or after all other candidates if they are all newer.
"""
- versions_found: Set[_BaseVersion] = set()
+ versions_found: set[_BaseVersion] = set()
for version, func in infos:
if version in versions_found:
continue
@@ -105,7 +110,7 @@ def _iter_built_with_inserted(
yield installed
-class FoundCandidates(SequenceCandidate):
+class FoundCandidates(Sequence[Candidate]):
"""A lazy sequence to provide candidates to the resolver.
The intended usage is to return this from `find_matches()` so the resolver
@@ -117,14 +122,15 @@ class FoundCandidates(SequenceCandidate):
def __init__(
self,
get_infos: Callable[[], Iterator[IndexCandidateInfo]],
- installed: Optional[Candidate],
+ installed: Candidate | None,
prefers_installed: bool,
- incompatible_ids: Set[int],
+ incompatible_ids: set[int],
):
self._get_infos = get_infos
self._installed = installed
self._prefers_installed = prefers_installed
self._incompatible_ids = incompatible_ids
+ self._bool: bool | None = None
def __getitem__(self, index: Any) -> Any:
# Implemented to satisfy the ABC check. This is not needed by the
@@ -148,8 +154,13 @@ class FoundCandidates(SequenceCandidate):
# performance reasons).
raise NotImplementedError("don't do this")
- @functools.lru_cache(maxsize=1)
def __bool__(self) -> bool:
+ if self._bool is not None:
+ return self._bool
+
if self._prefers_installed and self._installed:
+ self._bool = True
return True
- return any(self)
+
+ self._bool = any(self)
+ return self._bool
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py
index 315fb9c8..40d61154 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py
@@ -1,21 +1,21 @@
-import collections
+from __future__ import annotations
+
import math
+from collections.abc import Iterable, Iterator, Mapping, Sequence
+from functools import cache
from typing import (
TYPE_CHECKING,
- Dict,
- Iterable,
- Iterator,
- Mapping,
- Sequence,
TypeVar,
- Union,
)
from pip._vendor.resolvelib.providers import AbstractProvider
+from pip._internal.req.req_install import InstallRequirement
+
from .base import Candidate, Constraint, Requirement
from .candidates import REQUIRES_PYTHON_IDENTIFIER
from .factory import Factory
+from .requirements import ExplicitRequirement
if TYPE_CHECKING:
from pip._vendor.resolvelib.providers import Preference
@@ -54,7 +54,7 @@ def _get_with_identifier(
mapping: Mapping[str, V],
identifier: str,
default: D,
-) -> Union[D, V]:
+) -> D | V:
"""Get item from a package name lookup mapping with a resolver identifier.
This extra logic is needed when the target mapping is keyed by package
@@ -89,29 +89,71 @@ class PipProvider(_ProviderBase):
def __init__(
self,
factory: Factory,
- constraints: Dict[str, Constraint],
+ constraints: dict[str, Constraint],
ignore_dependencies: bool,
upgrade_strategy: str,
- user_requested: Dict[str, int],
+ user_requested: dict[str, int],
) -> None:
self._factory = factory
self._constraints = constraints
self._ignore_dependencies = ignore_dependencies
self._upgrade_strategy = upgrade_strategy
self._user_requested = user_requested
- self._known_depths: Dict[str, float] = collections.defaultdict(lambda: math.inf)
- def identify(self, requirement_or_candidate: Union[Requirement, Candidate]) -> str:
+ def identify(self, requirement_or_candidate: Requirement | Candidate) -> str:
return requirement_or_candidate.name
+ def narrow_requirement_selection(
+ self,
+ identifiers: Iterable[str],
+ resolutions: Mapping[str, Candidate],
+ candidates: Mapping[str, Iterator[Candidate]],
+ information: Mapping[str, Iterator[PreferenceInformation]],
+ backtrack_causes: Sequence[PreferenceInformation],
+ ) -> Iterable[str]:
+ """Produce a subset of identifiers that should be considered before others.
+
+ Currently pip narrows the following selection:
+ * Requires-Python, if present is always returned by itself
+ * Backtrack causes are considered next because they can be identified
+ in linear time here, whereas because get_preference() is called
+ for each identifier, it would be quadratic to check for them there.
+ Further, the current backtrack causes likely need to be resolved
+ before other requirements as a resolution can't be found while
+ there is a conflict.
+ """
+ backtrack_identifiers = set()
+ for info in backtrack_causes:
+ backtrack_identifiers.add(info.requirement.name)
+ if info.parent is not None:
+ backtrack_identifiers.add(info.parent.name)
+
+ current_backtrack_causes = []
+ for identifier in identifiers:
+ # Requires-Python has only one candidate and the check is basically
+ # free, so we always do it first to avoid needless work if it fails.
+ # This skips calling get_preference() for all other identifiers.
+ if identifier == REQUIRES_PYTHON_IDENTIFIER:
+ return [identifier]
+
+ # Check if this identifier is a backtrack cause
+ if identifier in backtrack_identifiers:
+ current_backtrack_causes.append(identifier)
+ continue
+
+ if current_backtrack_causes:
+ return current_backtrack_causes
+
+ return identifiers
+
def get_preference(
self,
identifier: str,
resolutions: Mapping[str, Candidate],
candidates: Mapping[str, Iterator[Candidate]],
- information: Mapping[str, Iterable["PreferenceInformation"]],
- backtrack_causes: Sequence["PreferenceInformation"],
- ) -> "Preference":
+ information: Mapping[str, Iterable[PreferenceInformation]],
+ backtrack_causes: Sequence[PreferenceInformation],
+ ) -> Preference:
"""Produce a sort key for given requirement based on preference.
The lower the return value is, the more preferred this group of
@@ -119,18 +161,20 @@ class PipProvider(_ProviderBase):
Currently pip considers the following in order:
- * Prefer if any of the known requirements is "direct", e.g. points to an
- explicit URL.
- * If equal, prefer if any requirement is "pinned", i.e. contains
- operator ``===`` or ``==``.
- * If equal, calculate an approximate "depth" and resolve requirements
- closer to the user-specified requirements first. If the depth cannot
- by determined (eg: due to no matching parents), it is considered
- infinite.
- * Order user-specified requirements by the order they are specified.
- * If equal, prefers "non-free" requirements, i.e. contains at least one
- operator, such as ``>=`` or ``<``.
- * If equal, order alphabetically for consistency (helps debuggability).
+ * Any requirement that is "direct", e.g., points to an explicit URL.
+ * Any requirement that is "pinned", i.e., contains the operator ``===``
+ or ``==`` without a wildcard.
+ * Any requirement that imposes an upper version limit, i.e., contains the
+ operator ``<``, ``<=``, ``~=``, or ``==`` with a wildcard. Because
+ pip prioritizes the latest version, preferring explicit upper bounds
+ can rule out infeasible candidates sooner. This does not imply that
+ upper bounds are good practice; they can make dependency management
+ and resolution harder.
+ * Order user-specified requirements as they are specified, placing
+ other requirements afterward.
+ * Any "non-free" requirement, i.e., one that contains at least one
+ operator, such as ``>=`` or ``!=``.
+ * Alphabetical order for consistency (aids debuggability).
"""
try:
next(iter(information[identifier]))
@@ -141,55 +185,39 @@ class PipProvider(_ProviderBase):
else:
has_information = True
- if has_information:
- lookups = (r.get_candidate_lookup() for r, _ in information[identifier])
- candidate, ireqs = zip(*lookups)
+ if not has_information:
+ direct = False
+ ireqs: tuple[InstallRequirement | None, ...] = ()
else:
- candidate, ireqs = None, ()
+ # Go through the information and for each requirement,
+ # check if it's explicit (e.g., a direct link) and get the
+ # InstallRequirement (the second element) from get_candidate_lookup()
+ directs, ireqs = zip(
+ *(
+ (isinstance(r, ExplicitRequirement), r.get_candidate_lookup()[1])
+ for r, _ in information[identifier]
+ )
+ )
+ direct = any(directs)
- operators = [
- specifier.operator
+ operators: list[tuple[str, str]] = [
+ (specifier.operator, specifier.version)
for specifier_set in (ireq.specifier for ireq in ireqs if ireq)
for specifier in specifier_set
]
- direct = candidate is not None
- pinned = any(op[:2] == "==" for op in operators)
+ pinned = any(((op[:2] == "==") and ("*" not in ver)) for op, ver in operators)
+ upper_bounded = any(
+ ((op in ("<", "<=", "~=")) or (op == "==" and "*" in ver))
+ for op, ver in operators
+ )
unfree = bool(operators)
-
- try:
- requested_order: Union[int, float] = self._user_requested[identifier]
- except KeyError:
- requested_order = math.inf
- if has_information:
- parent_depths = (
- self._known_depths[parent.name] if parent is not None else 0.0
- for _, parent in information[identifier]
- )
- inferred_depth = min(d for d in parent_depths) + 1.0
- else:
- inferred_depth = math.inf
- else:
- inferred_depth = 1.0
- self._known_depths[identifier] = inferred_depth
-
requested_order = self._user_requested.get(identifier, math.inf)
- # Requires-Python has only one candidate and the check is basically
- # free, so we always do it first to avoid needless work if it fails.
- requires_python = identifier == REQUIRES_PYTHON_IDENTIFIER
-
- # Prefer the causes of backtracking on the assumption that the problem
- # resolving the dependency tree is related to the failures that caused
- # the backtracking
- backtrack_cause = self.is_backtrack_cause(identifier, backtrack_causes)
-
return (
- not requires_python,
not direct,
not pinned,
- not backtrack_cause,
- inferred_depth,
+ not upper_bounded,
requested_order,
not unfree,
identifier,
@@ -234,22 +262,15 @@ class PipProvider(_ProviderBase):
constraint=constraint,
prefers_installed=(not _eligible_for_upgrade(identifier)),
incompatibilities=incompatibilities,
+ is_satisfied_by=self.is_satisfied_by,
)
- def is_satisfied_by(self, requirement: Requirement, candidate: Candidate) -> bool:
+ @staticmethod
+ @cache
+ def is_satisfied_by(requirement: Requirement, candidate: Candidate) -> bool:
return requirement.is_satisfied_by(candidate)
- def get_dependencies(self, candidate: Candidate) -> Sequence[Requirement]:
+ def get_dependencies(self, candidate: Candidate) -> Iterable[Requirement]:
with_requires = not self._ignore_dependencies
- return [r for r in candidate.iter_dependencies(with_requires) if r is not None]
-
- @staticmethod
- def is_backtrack_cause(
- identifier: str, backtrack_causes: Sequence["PreferenceInformation"]
- ) -> bool:
- for backtrack_cause in backtrack_causes:
- if identifier == backtrack_cause.requirement.name:
- return True
- if backtrack_cause.parent and identifier == backtrack_cause.parent.name:
- return True
- return False
+ # iter_dependencies() can perform nontrivial work so delay until needed.
+ return (r for r in candidate.iter_dependencies(with_requires) if r is not None)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py
index 12adeff7..e694132b 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py
@@ -1,6 +1,8 @@
+from __future__ import annotations
+
from collections import defaultdict
from logging import getLogger
-from typing import Any, DefaultDict
+from typing import Any
from pip._vendor.resolvelib.reporters import BaseReporter
@@ -9,9 +11,9 @@ from .base import Candidate, Requirement
logger = getLogger(__name__)
-class PipReporter(BaseReporter):
+class PipReporter(BaseReporter[Requirement, Candidate, str]):
def __init__(self) -> None:
- self.reject_count_by_package: DefaultDict[str, int] = defaultdict(int)
+ self.reject_count_by_package: defaultdict[str, int] = defaultdict(int)
self._messages_at_reject_count = {
1: (
@@ -55,7 +57,7 @@ class PipReporter(BaseReporter):
logger.debug(msg)
-class PipDebuggingReporter(BaseReporter):
+class PipDebuggingReporter(BaseReporter[Requirement, Candidate, str]):
"""A reporter that does an info log for every event it sees."""
def starting(self) -> None:
@@ -66,11 +68,14 @@ class PipDebuggingReporter(BaseReporter):
def ending_round(self, index: int, state: Any) -> None:
logger.info("Reporter.ending_round(%r, state)", index)
+ logger.debug("Reporter.ending_round(%r, %r)", index, state)
def ending(self, state: Any) -> None:
logger.info("Reporter.ending(%r)", state)
- def adding_requirement(self, requirement: Requirement, parent: Candidate) -> None:
+ def adding_requirement(
+ self, requirement: Requirement, parent: Candidate | None
+ ) -> None:
logger.info("Reporter.adding_requirement(%r, %r)", requirement, parent)
def rejecting_candidate(self, criterion: Any, candidate: Candidate) -> None:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
index 4af4a9f2..447e36b5 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
@@ -1,3 +1,7 @@
+from __future__ import annotations
+
+from typing import Any
+
from pip._vendor.packaging.specifiers import SpecifierSet
from pip._vendor.packaging.utils import NormalizedName, canonicalize_name
@@ -17,6 +21,14 @@ class ExplicitRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({self.candidate!r})"
+ def __hash__(self) -> int:
+ return hash(self.candidate)
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, ExplicitRequirement):
+ return False
+ return self.candidate == other.candidate
+
@property
def project_name(self) -> NormalizedName:
# No need to canonicalize - the candidate did this
@@ -41,14 +53,36 @@ class SpecifierRequirement(Requirement):
def __init__(self, ireq: InstallRequirement) -> None:
assert ireq.link is None, "This is a link, not a specifier"
self._ireq = ireq
+ self._equal_cache: str | None = None
+ self._hash: int | None = None
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
+ @property
+ def _equal(self) -> str:
+ if self._equal_cache is not None:
+ return self._equal_cache
+
+ self._equal_cache = str(self._ireq)
+ return self._equal_cache
+
def __str__(self) -> str:
return str(self._ireq.req)
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self._ireq.req)!r})"
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, SpecifierRequirement):
+ return NotImplemented
+ return self._equal == other._equal
+
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash(self._equal)
+ return self._hash
+
@property
def project_name(self) -> NormalizedName:
assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
@@ -96,14 +130,38 @@ class SpecifierWithoutExtrasRequirement(SpecifierRequirement):
def __init__(self, ireq: InstallRequirement) -> None:
assert ireq.link is None, "This is a link, not a specifier"
self._ireq = install_req_drop_extras(ireq)
+ self._equal_cache: str | None = None
+ self._hash: int | None = None
self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras)
+ @property
+ def _equal(self) -> str:
+ if self._equal_cache is not None:
+ return self._equal_cache
+
+ self._equal_cache = str(self._ireq)
+ return self._equal_cache
+
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, SpecifierWithoutExtrasRequirement):
+ return NotImplemented
+ return self._equal == other._equal
+
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash(self._equal)
+ return self._hash
+
class RequiresPythonRequirement(Requirement):
"""A requirement representing Requires-Python metadata."""
def __init__(self, specifier: SpecifierSet, match: Candidate) -> None:
self.specifier = specifier
+ self._specifier_string = str(specifier) # for faster __eq__
+ self._hash: int | None = None
self._candidate = match
def __str__(self) -> str:
@@ -112,6 +170,21 @@ class RequiresPythonRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self.specifier)!r})"
+ def __hash__(self) -> int:
+ if self._hash is not None:
+ return self._hash
+
+ self._hash = hash((self._specifier_string, self._candidate))
+ return self._hash
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, RequiresPythonRequirement):
+ return False
+ return (
+ self._specifier_string == other._specifier_string
+ and self._candidate == other._candidate
+ )
+
@property
def project_name(self) -> NormalizedName:
return self._candidate.project_name
@@ -148,6 +221,14 @@ class UnsatisfiableRequirement(Requirement):
def __repr__(self) -> str:
return f"{self.__class__.__name__}({str(self._name)!r})"
+ def __eq__(self, other: object) -> bool:
+ if not isinstance(other, UnsatisfiableRequirement):
+ return NotImplemented
+ return self._name == other._name
+
+ def __hash__(self) -> int:
+ return hash(self._name)
+
@property
def project_name(self) -> NormalizedName:
return self._name
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
index c12beef0..1ba70c2b 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
@@ -1,15 +1,18 @@
+from __future__ import annotations
+
import contextlib
import functools
import logging
import os
-from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, cast
+from typing import TYPE_CHECKING, cast
from pip._vendor.packaging.utils import canonicalize_name
-from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible
+from pip._vendor.resolvelib import BaseReporter, ResolutionImpossible, ResolutionTooDeep
from pip._vendor.resolvelib import Resolver as RLResolver
from pip._vendor.resolvelib.structs import DirectedGraph
from pip._internal.cache import WheelCache
+from pip._internal.exceptions import ResolutionTooDeepError
from pip._internal.index.package_finder import PackageFinder
from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req.constructors import install_req_extend_extras
@@ -42,7 +45,7 @@ class Resolver(BaseResolver):
self,
preparer: RequirementPreparer,
finder: PackageFinder,
- wheel_cache: Optional[WheelCache],
+ wheel_cache: WheelCache | None,
make_install_req: InstallRequirementProvider,
use_user_site: bool,
ignore_dependencies: bool,
@@ -50,7 +53,7 @@ class Resolver(BaseResolver):
ignore_requires_python: bool,
force_reinstall: bool,
upgrade_strategy: str,
- py_version_info: Optional[Tuple[int, ...]] = None,
+ py_version_info: tuple[int, ...] | None = None,
):
super().__init__()
assert upgrade_strategy in self._allowed_strategies
@@ -68,10 +71,10 @@ class Resolver(BaseResolver):
)
self.ignore_dependencies = ignore_dependencies
self.upgrade_strategy = upgrade_strategy
- self._result: Optional[Result] = None
+ self._result: Result | None = None
def resolve(
- self, root_reqs: List[InstallRequirement], check_supported_wheels: bool
+ self, root_reqs: list[InstallRequirement], check_supported_wheels: bool
) -> RequirementSet:
collected = self.factory.collect_root_requirements(root_reqs)
provider = PipProvider(
@@ -82,7 +85,7 @@ class Resolver(BaseResolver):
user_requested=collected.user_requested,
)
if "PIP_RESOLVER_DEBUG" in os.environ:
- reporter: BaseReporter = PipDebuggingReporter()
+ reporter: BaseReporter[Requirement, Candidate, str] = PipDebuggingReporter()
else:
reporter = PipReporter()
resolver: RLResolver[Requirement, Candidate, str] = RLResolver(
@@ -102,6 +105,8 @@ class Resolver(BaseResolver):
collected.constraints,
)
raise error from e
+ except ResolutionTooDeep:
+ raise ResolutionTooDeepError from None
req_set = RequirementSet(check_supported_wheels=check_supported_wheels)
# process candidates with extras last to ensure their base equivalent is
@@ -184,7 +189,7 @@ class Resolver(BaseResolver):
def get_installation_order(
self, req_set: RequirementSet
- ) -> List[InstallRequirement]:
+ ) -> list[InstallRequirement]:
"""Get order for installation of requirements in RequirementSet.
The returned list contains a requirement before another that depends on
@@ -215,8 +220,8 @@ class Resolver(BaseResolver):
def get_topological_weights(
- graph: "DirectedGraph[Optional[str]]", requirement_keys: Set[str]
-) -> Dict[Optional[str], int]:
+ graph: DirectedGraph[str | None], requirement_keys: set[str]
+) -> dict[str | None, int]:
"""Assign weights to each node based on how "deep" they are.
This implementation may change at any point in the future without prior
@@ -242,14 +247,25 @@ def get_topological_weights(
We are only interested in the weights of packages that are in the
requirement_keys.
"""
- path: Set[Optional[str]] = set()
- weights: Dict[Optional[str], int] = {}
+ path: set[str | None] = set()
+ weights: dict[str | None, list[int]] = {}
- def visit(node: Optional[str]) -> None:
+ def visit(node: str | None) -> None:
if node in path:
# We hit a cycle, so we'll break it here.
return
+ # The walk is exponential and for pathologically connected graphs (which
+ # are the ones most likely to contain cycles in the first place) it can
+ # take until the heat-death of the universe. To counter this we limit
+ # the number of attempts to visit (i.e. traverse through) any given
+ # node. We choose a value here which gives decent enough coverage for
+ # fairly well behaved graphs, and still limits the walk complexity to be
+ # linear in nature.
+ cur_weights = weights.get(node, [])
+ if len(cur_weights) >= 5:
+ return
+
# Time to visit the children!
path.add(node)
for child in graph.iter_children(node):
@@ -259,14 +275,14 @@ def get_topological_weights(
if node not in requirement_keys:
return
- last_known_parent_count = weights.get(node, 0)
- weights[node] = max(last_known_parent_count, len(path))
+ cur_weights.append(len(path))
+ weights[node] = cur_weights
- # Simplify the graph, pruning leaves that have no dependencies.
- # This is needed for large graphs (say over 200 packages) because the
- # `visit` function is exponentially slower then, taking minutes.
+ # Simplify the graph, pruning leaves that have no dependencies. This is
+ # needed for large graphs (say over 200 packages) because the `visit`
+ # function is slower for large/densely connected graphs, taking minutes.
# See https://github.com/pypa/pip/issues/10557
- # We will loop until we explicitly break the loop.
+ # We repeat the pruning step until we have no more leaves to remove.
while True:
leaves = set()
for key in graph:
@@ -286,12 +302,13 @@ def get_topological_weights(
for leaf in leaves:
if leaf not in requirement_keys:
continue
- weights[leaf] = weight
+ weights[leaf] = [weight]
# Remove the leaves from the graph, making it simpler.
for leaf in leaves:
graph.remove(leaf)
- # Visit the remaining graph.
+ # Visit the remaining graph, this will only have nodes to handle if the
+ # graph had a cycle in it, which the pruning step above could not handle.
# `None` is guaranteed to be the root node by resolvelib.
visit(None)
@@ -300,13 +317,15 @@ def get_topological_weights(
difference = set(weights.keys()).difference(requirement_keys)
assert not difference, difference
- return weights
+ # Now give back all the weights, choosing the largest ones from what we
+ # accumulated.
+ return {node: max(wgts) for (node, wgts) in weights.items()}
def _req_set_item_sorter(
- item: Tuple[str, InstallRequirement],
- weights: Dict[Optional[str], int],
-) -> Tuple[int, str]:
+ item: tuple[str, InstallRequirement],
+ weights: dict[str | None, int],
+) -> tuple[int, str]:
"""Key function used to sort install requirements for installation.
Based on the "weight" mapping calculated in ``get_installation_order()``.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py
index 0f64ae0e..ca507f11 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import datetime
import functools
import hashlib
@@ -7,8 +9,9 @@ import optparse
import os.path
import sys
from dataclasses import dataclass
-from typing import Any, Callable, Dict, Optional
+from typing import Any, Callable
+from pip._vendor.packaging.version import Version
from pip._vendor.packaging.version import parse as parse_version
from pip._vendor.rich.console import Group
from pip._vendor.rich.markup import escape
@@ -17,7 +20,6 @@ from pip._vendor.rich.text import Text
from pip._internal.index.collector import LinkCollector
from pip._internal.index.package_finder import PackageFinder
from pip._internal.metadata import get_default_environment
-from pip._internal.metadata.base import DistributionVersion
from pip._internal.models.selection_prefs import SelectionPreferences
from pip._internal.network.session import PipSession
from pip._internal.utils.compat import WINDOWS
@@ -26,7 +28,11 @@ from pip._internal.utils.entrypoints import (
get_best_invocation_for_this_python,
)
from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace
-from pip._internal.utils.misc import ensure_dir
+from pip._internal.utils.misc import (
+ ExternallyManagedEnvironment,
+ check_externally_managed,
+ ensure_dir,
+)
_WEEK = datetime.timedelta(days=7)
@@ -50,7 +56,7 @@ def _convert_date(isodate: str) -> datetime.datetime:
class SelfCheckState:
def __init__(self, cache_dir: str) -> None:
- self._state: Dict[str, Any] = {}
+ self._state: dict[str, Any] = {}
self._statefile_path = None
# Try to load the existing state
@@ -70,7 +76,7 @@ class SelfCheckState:
def key(self) -> str:
return sys.prefix
- def get(self, current_time: datetime.datetime) -> Optional[str]:
+ def get(self, current_time: datetime.datetime) -> str | None:
"""Check if we have a not-outdated version loaded already."""
if not self._state:
return None
@@ -161,7 +167,7 @@ def was_installed_by_pip(pkg: str) -> bool:
def _get_current_remote_pip_version(
session: PipSession, options: optparse.Values
-) -> Optional[str]:
+) -> str | None:
# Lets use PackageFinder to see what the latest pip version is
link_collector = LinkCollector.create(
session,
@@ -191,9 +197,9 @@ def _self_version_check_logic(
*,
state: SelfCheckState,
current_time: datetime.datetime,
- local_version: DistributionVersion,
- get_remote_version: Callable[[], Optional[str]],
-) -> Optional[UpgradePrompt]:
+ local_version: Version,
+ get_remote_version: Callable[[], str | None],
+) -> UpgradePrompt | None:
remote_version_str = state.get(current_time)
if remote_version_str is None:
remote_version_str = get_remote_version()
@@ -231,18 +237,18 @@ def pip_self_version_check(session: PipSession, options: optparse.Values) -> Non
installed_dist = get_default_environment().get_distribution("pip")
if not installed_dist:
return
-
try:
- upgrade_prompt = _self_version_check_logic(
- state=SelfCheckState(cache_dir=options.cache_dir),
- current_time=datetime.datetime.now(datetime.timezone.utc),
- local_version=installed_dist.version,
- get_remote_version=functools.partial(
- _get_current_remote_pip_version, session, options
- ),
- )
- if upgrade_prompt is not None:
- logger.warning("%s", upgrade_prompt, extra={"rich": True})
- except Exception:
- logger.warning("There was an error checking the latest version of pip.")
- logger.debug("See below for error", exc_info=True)
+ check_externally_managed()
+ except ExternallyManagedEnvironment:
+ return
+
+ upgrade_prompt = _self_version_check_logic(
+ state=SelfCheckState(cache_dir=options.cache_dir),
+ current_time=datetime.datetime.now(datetime.timezone.utc),
+ local_version=installed_dist.version,
+ get_remote_version=functools.partial(
+ _get_current_remote_pip_version, session, options
+ ),
+ )
+ if upgrade_prompt is not None:
+ logger.warning("%s", upgrade_prompt, extra={"rich": True})
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc
index ddc32f4d..f47d15be 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc
index 541df52e..a90d8ffb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc
index 668fdeb6..a9f5e508 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/_log.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc
index 3f211940..8a6de05d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc
index 4dc78fef..e7ed17fe 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc
index cb133fa4..a89e36d9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc
index a6617db1..c78455fb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc
index 9f9114e6..ce896f78 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc
index a134592a..94774037 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc
index 468c9de2..a616169e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc
deleted file mode 100644
index 577115d1..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc
index fae9b3d0..1553bc36 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc
index f134eb61..d41ba579 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc
index 36a02a74..883d6722 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc
index ca666ed6..56092147 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc
index 66643c8d..f33b6384 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc
index cb8704e2..b9841cc3 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/logging.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc
index 6ab215b8..bbd59938 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/misc.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc
deleted file mode 100644
index 337c8c26..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/models.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc
index 6fa2f7ff..1abcf124 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc
new file mode 100644
index 00000000..f6a00986
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/retry.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc
index 34098ffb..4de0621e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc
index 24fd45fd..d47f7113 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc
index 7c224e27..f18827c0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc
index 3acfec42..64bf0f92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc
index 9ae6121f..42f349b7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/urls.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc
index 2cc64908..330c34ee 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc
index 0e0966c5..8120557b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py
index e06947c0..6ccf53b7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py
@@ -88,7 +88,7 @@ def join_continuation(lines):
['foobarbaz']
Not sure why, but...
- The character preceeding the backslash is also elided.
+ The character preceding the backslash is also elided.
>>> list(join_continuation(['goo\\', 'dly']))
['godly']
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py
index 16933bf8..4152528f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py
@@ -8,7 +8,6 @@ and eventually drop this after all usages are changed.
import os
import sys
-from typing import List
from pip._vendor import platformdirs as _appdirs
@@ -40,9 +39,10 @@ def user_config_dir(appname: str, roaming: bool = True) -> str:
# for the discussion regarding site_config_dir locations
# see
-def site_config_dirs(appname: str) -> List[str]:
+def site_config_dirs(appname: str) -> list[str]:
if sys.platform == "darwin":
- return [_appdirs.site_data_dir(appname, appauthor=False, multipath=True)]
+ dirval = _appdirs.site_data_dir(appname, appauthor=False, multipath=True)
+ return dirval.split(os.pathsep)
dirval = _appdirs.site_config_dir(appname, appauthor=False, multipath=True)
if sys.platform == "win32":
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py
index 3f4d300c..324789f1 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py
@@ -1,11 +1,13 @@
"""Stuff that differs in different Python versions and platform
distributions."""
+import importlib.resources
import logging
import os
import sys
+from typing import IO
-__all__ = ["get_path_uid", "stdlib_pkgs", "WINDOWS"]
+__all__ = ["get_path_uid", "stdlib_pkgs", "tomllib", "WINDOWS"]
logger = logging.getLogger(__name__)
@@ -51,6 +53,26 @@ def get_path_uid(path: str) -> int:
return file_uid
+# The importlib.resources.open_text function was deprecated in 3.11 with suggested
+# replacement we use below.
+if sys.version_info < (3, 11):
+ open_text_resource = importlib.resources.open_text
+else:
+
+ def open_text_resource(
+ package: str, resource: str, encoding: str = "utf-8", errors: str = "strict"
+ ) -> IO[str]:
+ return (importlib.resources.files(package) / resource).open(
+ "r", encoding=encoding, errors=errors
+ )
+
+
+if sys.version_info >= (3, 11):
+ import tomllib
+else:
+ from pip._vendor import tomli as tomllib
+
+
# packages in the stdlib that may have installation metadata, but should not be
# considered 'installed'. this theoretically could be determined based on
# dist.location (py27:`sysconfig.get_paths()['stdlib']`,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py
index b6ed9a78..6d98171d 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py
@@ -1,30 +1,32 @@
-"""Generate and work with PEP 425 Compatibility Tags.
-"""
+"""Generate and work with PEP 425 Compatibility Tags."""
+
+from __future__ import annotations
import re
-from typing import List, Optional, Tuple
from pip._vendor.packaging.tags import (
PythonVersion,
Tag,
+ android_platforms,
compatible_tags,
cpython_tags,
generic_tags,
interpreter_name,
interpreter_version,
+ ios_platforms,
mac_platforms,
)
-_osx_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)")
+_apple_arch_pat = re.compile(r"(.+)_(\d+)_(\d+)_(.+)")
-def version_info_to_nodot(version_info: Tuple[int, ...]) -> str:
+def version_info_to_nodot(version_info: tuple[int, ...]) -> str:
# Only use up to the first two numbers.
return "".join(map(str, version_info[:2]))
-def _mac_platforms(arch: str) -> List[str]:
- match = _osx_arch_pat.match(arch)
+def _mac_platforms(arch: str) -> list[str]:
+ match = _apple_arch_pat.match(arch)
if match:
name, major, minor, actual_arch = match.groups()
mac_version = (int(major), int(minor))
@@ -43,7 +45,37 @@ def _mac_platforms(arch: str) -> List[str]:
return arches
-def _custom_manylinux_platforms(arch: str) -> List[str]:
+def _ios_platforms(arch: str) -> list[str]:
+ match = _apple_arch_pat.match(arch)
+ if match:
+ name, major, minor, actual_multiarch = match.groups()
+ ios_version = (int(major), int(minor))
+ arches = [
+ # Since we have always only checked that the platform starts
+ # with "ios", for backwards-compatibility we extract the
+ # actual prefix provided by the user in case they provided
+ # something like "ioscustom_". It may be good to remove
+ # this as undocumented or deprecate it in the future.
+ "{}_{}".format(name, arch[len("ios_") :])
+ for arch in ios_platforms(ios_version, actual_multiarch)
+ ]
+ else:
+ # arch pattern didn't match (?!)
+ arches = [arch]
+ return arches
+
+
+def _android_platforms(arch: str) -> list[str]:
+ match = re.fullmatch(r"android_(\d+)_(.+)", arch)
+ if match:
+ api_level, abi = match.groups()
+ return list(android_platforms(int(api_level), abi))
+ else:
+ # arch pattern didn't match (?!)
+ return [arch]
+
+
+def _custom_manylinux_platforms(arch: str) -> list[str]:
arches = [arch]
arch_prefix, arch_sep, arch_suffix = arch.partition("_")
if arch_prefix == "manylinux2014":
@@ -64,10 +96,14 @@ def _custom_manylinux_platforms(arch: str) -> List[str]:
return arches
-def _get_custom_platforms(arch: str) -> List[str]:
+def _get_custom_platforms(arch: str) -> list[str]:
arch_prefix, arch_sep, arch_suffix = arch.partition("_")
if arch.startswith("macosx"):
arches = _mac_platforms(arch)
+ elif arch.startswith("ios"):
+ arches = _ios_platforms(arch)
+ elif arch_prefix == "android":
+ arches = _android_platforms(arch)
elif arch_prefix in ["manylinux2014", "manylinux2010"]:
arches = _custom_manylinux_platforms(arch)
else:
@@ -75,7 +111,7 @@ def _get_custom_platforms(arch: str) -> List[str]:
return arches
-def _expand_allowed_platforms(platforms: Optional[List[str]]) -> Optional[List[str]]:
+def _expand_allowed_platforms(platforms: list[str] | None) -> list[str] | None:
if not platforms:
return None
@@ -100,7 +136,7 @@ def _get_python_version(version: str) -> PythonVersion:
def _get_custom_interpreter(
- implementation: Optional[str] = None, version: Optional[str] = None
+ implementation: str | None = None, version: str | None = None
) -> str:
if implementation is None:
implementation = interpreter_name()
@@ -110,11 +146,11 @@ def _get_custom_interpreter(
def get_supported(
- version: Optional[str] = None,
- platforms: Optional[List[str]] = None,
- impl: Optional[str] = None,
- abis: Optional[List[str]] = None,
-) -> List[Tag]:
+ version: str | None = None,
+ platforms: list[str] | None = None,
+ impl: str | None = None,
+ abis: list[str] | None = None,
+) -> list[Tag]:
"""Return a list of supported tags for each version specified in
`versions`.
@@ -127,9 +163,9 @@ def get_supported(
:param abis: specify a list of abis you want valid
tags for, or None. If None, use the local interpreter abi.
"""
- supported: List[Tag] = []
+ supported: list[Tag] = []
- python_version: Optional[PythonVersion] = None
+ python_version: PythonVersion | None = None
if version is not None:
python_version = _get_python_version(version)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py
index 8668b3b0..776e4989 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py
@@ -1,5 +1,4 @@
-"""For when pip wants to check the date or time.
-"""
+"""For when pip wants to check the date or time."""
import datetime
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py
index 72bd6f25..96e7783f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py
@@ -2,9 +2,11 @@
A module that implements tooling to enable easy warnings about deprecations.
"""
+from __future__ import annotations
+
import logging
import warnings
-from typing import Any, Optional, TextIO, Type, Union
+from typing import Any, TextIO
from pip._vendor.packaging.version import parse
@@ -22,12 +24,12 @@ _original_showwarning: Any = None
# Warnings <-> Logging Integration
def _showwarning(
- message: Union[Warning, str],
- category: Type[Warning],
+ message: Warning | str,
+ category: type[Warning],
filename: str,
lineno: int,
- file: Optional[TextIO] = None,
- line: Optional[str] = None,
+ file: TextIO | None = None,
+ line: str | None = None,
) -> None:
if file is not None:
if _original_showwarning is not None:
@@ -55,10 +57,10 @@ def install_warning_logger() -> None:
def deprecated(
*,
reason: str,
- replacement: Optional[str],
- gone_in: Optional[str],
- feature_flag: Optional[str] = None,
- issue: Optional[int] = None,
+ replacement: str | None,
+ gone_in: str | None,
+ feature_flag: str | None = None,
+ issue: int | None = None,
) -> None:
"""Helper to deprecate existing functionality.
@@ -87,9 +89,11 @@ def deprecated(
(reason, f"{DEPRECATION_MSG_PREFIX}{{}}"),
(
gone_in,
- "pip {} will enforce this behaviour change."
- if not is_gone
- else "Since pip {}, this is no longer supported.",
+ (
+ "pip {} will enforce this behaviour change."
+ if not is_gone
+ else "Since pip {}, this is no longer supported."
+ ),
),
(
replacement,
@@ -97,9 +101,11 @@ def deprecated(
),
(
feature_flag,
- "You can use the flag --use-feature={} to test the upcoming behaviour."
- if not is_gone
- else None,
+ (
+ "You can use the flag --use-feature={} to test the upcoming behaviour."
+ if not is_gone
+ else None
+ ),
),
(
issue,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
index 0e8e5e16..3cbc1e76 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
@@ -1,4 +1,4 @@
-from typing import Optional
+from __future__ import annotations
from pip._internal.models.direct_url import ArchiveInfo, DirectUrl, DirInfo, VcsInfo
from pip._internal.models.link import Link
@@ -12,8 +12,8 @@ def direct_url_as_pep440_direct_reference(direct_url: DirectUrl, name: str) -> s
requirement = name + " @ "
fragments = []
if isinstance(direct_url.info, VcsInfo):
- requirement += "{}+{}@{}".format(
- direct_url.info.vcs, direct_url.url, direct_url.info.commit_id
+ requirement += (
+ f"{direct_url.info.vcs}+{direct_url.url}@{direct_url.info.commit_id}"
)
elif isinstance(direct_url.info, ArchiveInfo):
requirement += direct_url.url
@@ -37,7 +37,7 @@ def direct_url_for_editable(source_dir: str) -> DirectUrl:
def direct_url_from_link(
- link: Link, source_dir: Optional[str] = None, link_is_in_wheel_cache: bool = False
+ link: Link, source_dir: str | None = None, link_is_in_wheel_cache: bool = False
) -> DirectUrl:
if link.is_vcs:
vcs_backend = vcs.get_backend_for_scheme(link.scheme)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py
index 4a384a63..dc85a58b 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py
@@ -1,7 +1,8 @@
+from __future__ import annotations
+
import os
import re
import sys
-from typing import List, Optional
from pip._internal.locations import site_packages, user_site
from pip._internal.utils.virtualenv import (
@@ -15,7 +16,7 @@ __all__ = [
]
-def _egg_link_names(raw_name: str) -> List[str]:
+def _egg_link_names(raw_name: str) -> list[str]:
"""
Convert a Name metadata value to a .egg-link name, by applying
the same substitution as pkg_resources's safe_name function.
@@ -30,7 +31,7 @@ def _egg_link_names(raw_name: str) -> List[str]:
]
-def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]:
+def egg_link_path_from_sys_path(raw_name: str) -> str | None:
"""
Look for a .egg-link file for project name, by walking sys.path.
"""
@@ -43,7 +44,7 @@ def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]:
return None
-def egg_link_path_from_location(raw_name: str) -> Optional[str]:
+def egg_link_path_from_location(raw_name: str) -> str | None:
"""
Return the path for the .egg-link file if it exists, otherwise, None.
@@ -61,7 +62,7 @@ def egg_link_path_from_location(raw_name: str) -> Optional[str]:
This method will just return the first one found.
"""
- sites: List[str] = []
+ sites: list[str] = []
if running_under_virtualenv():
sites.append(site_packages)
if not virtualenv_no_global() and user_site:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py
deleted file mode 100644
index 008f06a7..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py
+++ /dev/null
@@ -1,36 +0,0 @@
-import codecs
-import locale
-import re
-import sys
-from typing import List, Tuple
-
-BOMS: List[Tuple[bytes, str]] = [
- (codecs.BOM_UTF8, "utf-8"),
- (codecs.BOM_UTF16, "utf-16"),
- (codecs.BOM_UTF16_BE, "utf-16-be"),
- (codecs.BOM_UTF16_LE, "utf-16-le"),
- (codecs.BOM_UTF32, "utf-32"),
- (codecs.BOM_UTF32_BE, "utf-32-be"),
- (codecs.BOM_UTF32_LE, "utf-32-le"),
-]
-
-ENCODING_RE = re.compile(rb"coding[:=]\s*([-\w.]+)")
-
-
-def auto_decode(data: bytes) -> str:
- """Check a bytes string for a BOM to correctly detect the encoding
-
- Fallback to locale.getpreferredencoding(False) like open() on Python3"""
- for bom, encoding in BOMS:
- if data.startswith(bom):
- return data[len(bom) :].decode(encoding)
- # Lets check the first two lines as in PEP263
- for line in data.split(b"\n")[:2]:
- if line[0:1] == b"#" and ENCODING_RE.search(line):
- result = ENCODING_RE.search(line)
- assert result is not None
- encoding = result.groups()[0].decode("ascii")
- return data.decode(encoding)
- return data.decode(
- locale.getpreferredencoding(False) or sys.getdefaultencoding(),
- )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py
index 15013693..e3a150ee 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py
@@ -1,8 +1,9 @@
+from __future__ import annotations
+
import itertools
import os
import shutil
import sys
-from typing import List, Optional
from pip._internal.cli.main import main
from pip._internal.utils.compat import WINDOWS
@@ -20,7 +21,7 @@ if WINDOWS:
]
-def _wrapper(args: Optional[List[str]] = None) -> int:
+def _wrapper(args: list[str] | None = None) -> int:
"""Central wrapper for all old entrypoints.
Historically pip has had several entrypoints defined. Because of issues
@@ -77,7 +78,10 @@ def get_best_invocation_for_this_python() -> str:
# Try to use the basename, if it's the first executable.
found_executable = shutil.which(exe_name)
- if found_executable and os.path.samefile(found_executable, exe):
+ # Virtual environments often symlink to their parent Python binaries, but we don't
+ # want to treat the Python binaries as equivalent when the environment's Python is
+ # not on PATH (not activated). Thus, we don't follow symlinks.
+ if found_executable and os.path.samestat(os.lstat(found_executable), os.lstat(exe)):
return exe_name
# Use the full executable name, because we couldn't find something simpler.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
index 83c2df75..d7c05243 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
@@ -1,16 +1,18 @@
+from __future__ import annotations
+
import fnmatch
import os
import os.path
import random
import sys
+from collections.abc import Generator
from contextlib import contextmanager
from tempfile import NamedTemporaryFile
-from typing import Any, BinaryIO, Generator, List, Union, cast
-
-from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed
+from typing import Any, BinaryIO, cast
from pip._internal.utils.compat import get_path_uid
from pip._internal.utils.misc import format_size
+from pip._internal.utils.retry import retry
def check_path_owner(path: str) -> bool:
@@ -65,10 +67,7 @@ def adjacent_tmp_file(path: str, **kwargs: Any) -> Generator[BinaryIO, None, Non
os.fsync(result.fileno())
-# Tenacity raises RetryError by default, explicitly raise the original exception
-_replace_retry = retry(reraise=True, stop=stop_after_delay(1), wait=wait_fixed(0.25))
-
-replace = _replace_retry(os.replace)
+replace = retry(stop_after_delay=1, wait=0.25)(os.replace)
# test_writable_dir and _test_writable_dir_win are copied from Flit,
@@ -119,17 +118,17 @@ def _test_writable_dir_win(path: str) -> bool:
raise OSError("Unexpected condition testing for writable directory")
-def find_files(path: str, pattern: str) -> List[str]:
+def find_files(path: str, pattern: str) -> list[str]:
"""Returns a list of absolute paths of files beneath path, recursively,
with filenames which match the UNIX-style shell glob pattern."""
- result: List[str] = []
+ result: list[str] = []
for root, _, files in os.walk(path):
matches = fnmatch.filter(files, pattern)
result.extend(os.path.join(root, f) for f in matches)
return result
-def file_size(path: str) -> Union[int, float]:
+def file_size(path: str) -> int | float:
# If it's a symlink, return 0.
if os.path.islink(path):
return 0
@@ -140,7 +139,7 @@ def format_file_size(path: str) -> str:
return format_size(file_size(path))
-def directory_size(path: str) -> Union[int, float]:
+def directory_size(path: str) -> int | float:
size = 0.0
for root, _dirs, files in os.walk(path):
for filename in files:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py
index 59485701..2b8baad7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py
@@ -1,21 +1,18 @@
-"""Filetype information.
-"""
-
-from typing import Tuple
+"""Filetype information."""
from pip._internal.utils.misc import splitext
WHEEL_EXTENSION = ".whl"
-BZ2_EXTENSIONS: Tuple[str, ...] = (".tar.bz2", ".tbz")
-XZ_EXTENSIONS: Tuple[str, ...] = (
+BZ2_EXTENSIONS: tuple[str, ...] = (".tar.bz2", ".tbz")
+XZ_EXTENSIONS: tuple[str, ...] = (
".tar.xz",
".txz",
".tlz",
".tar.lz",
".tar.lzma",
)
-ZIP_EXTENSIONS: Tuple[str, ...] = (".zip", WHEEL_EXTENSION)
-TAR_EXTENSIONS: Tuple[str, ...] = (".tar.gz", ".tgz", ".tar")
+ZIP_EXTENSIONS: tuple[str, ...] = (".zip", WHEEL_EXTENSION)
+TAR_EXTENSIONS: tuple[str, ...] = (".tar.gz", ".tgz", ".tar")
ARCHIVE_EXTENSIONS = ZIP_EXTENSIONS + BZ2_EXTENSIONS + TAR_EXTENSIONS + XZ_EXTENSIONS
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py
index 81342afa..2cb3013c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py
@@ -1,14 +1,15 @@
+from __future__ import annotations
+
import os
import sys
-from typing import Optional, Tuple
-def glibc_version_string() -> Optional[str]:
+def glibc_version_string() -> str | None:
"Returns glibc version string, or None if not using glibc."
return glibc_version_string_confstr() or glibc_version_string_ctypes()
-def glibc_version_string_confstr() -> Optional[str]:
+def glibc_version_string_confstr() -> str | None:
"Primary implementation of glibc_version_string using os.confstr."
# os.confstr is quite a bit faster than ctypes.DLL. It's also less likely
# to be broken or missing. This strategy is used in the standard library
@@ -28,7 +29,7 @@ def glibc_version_string_confstr() -> Optional[str]:
return version
-def glibc_version_string_ctypes() -> Optional[str]:
+def glibc_version_string_ctypes() -> str | None:
"Fallback implementation of glibc_version_string using ctypes."
try:
@@ -40,7 +41,20 @@ def glibc_version_string_ctypes() -> Optional[str]:
# manpage says, "If filename is NULL, then the returned handle is for the
# main program". This way we can let the linker do the work to figure out
# which libc our process is actually using.
- process_namespace = ctypes.CDLL(None)
+ #
+ # We must also handle the special case where the executable is not a
+ # dynamically linked executable. This can occur when using musl libc,
+ # for example. In this situation, dlopen() will error, leading to an
+ # OSError. Interestingly, at least in the case of musl, there is no
+ # errno set on the OSError. The single string argument used to construct
+ # OSError comes from libc itself and is therefore not portable to
+ # hard code here. In any case, failure to call dlopen() means we
+ # can't proceed, so we bail on our attempt.
+ try:
+ process_namespace = ctypes.CDLL(None)
+ except OSError:
+ return None
+
try:
gnu_get_libc_version = process_namespace.gnu_get_libc_version
except AttributeError:
@@ -50,7 +64,7 @@ def glibc_version_string_ctypes() -> Optional[str]:
# Call gnu_get_libc_version, which returns a string like "2.5"
gnu_get_libc_version.restype = ctypes.c_char_p
- version_str = gnu_get_libc_version()
+ version_str: str = gnu_get_libc_version()
# py2 / py3 compatibility:
if not isinstance(version_str, str):
version_str = version_str.decode("ascii")
@@ -75,7 +89,7 @@ def glibc_version_string_ctypes() -> Optional[str]:
# versions that was generated by pip 8.1.2 and earlier is useless and
# misleading. Solution: instead of using platform, use our code that actually
# works.
-def libc_ver() -> Tuple[str, str]:
+def libc_ver() -> tuple[str, str]:
"""Try to determine the glibc version
Returns a tuple of strings (lib, version) which default to empty strings
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py
index 843cffc6..3d8c125a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py
@@ -1,5 +1,8 @@
+from __future__ import annotations
+
import hashlib
-from typing import TYPE_CHECKING, BinaryIO, Dict, Iterable, List, Optional
+from collections.abc import Iterable
+from typing import TYPE_CHECKING, BinaryIO, NoReturn
from pip._internal.exceptions import HashMismatch, HashMissing, InstallationError
from pip._internal.utils.misc import read_chunks
@@ -7,10 +10,6 @@ from pip._internal.utils.misc import read_chunks
if TYPE_CHECKING:
from hashlib import _Hash
- # NoReturn introduced in 3.6.2; imported only for type checking to maintain
- # pip compatibility with older patch versions of Python 3.6
- from typing import NoReturn
-
# The recommended hash algo of the moment. Change this whenever the state of
# the art changes; it won't hurt backward compatibility.
@@ -28,7 +27,7 @@ class Hashes:
"""
- def __init__(self, hashes: Optional[Dict[str, List[str]]] = None) -> None:
+ def __init__(self, hashes: dict[str, list[str]] | None = None) -> None:
"""
:param hashes: A dict of algorithm names pointing to lists of allowed
hex digests
@@ -37,10 +36,10 @@ class Hashes:
if hashes is not None:
for alg, keys in hashes.items():
# Make sure values are always sorted (to ease equality checks)
- allowed[alg] = sorted(keys)
+ allowed[alg] = [k.lower() for k in sorted(keys)]
self._allowed = allowed
- def __and__(self, other: "Hashes") -> "Hashes":
+ def __and__(self, other: Hashes) -> Hashes:
if not isinstance(other, Hashes):
return NotImplemented
@@ -90,7 +89,7 @@ class Hashes:
return
self._raise(gots)
- def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn":
+ def _raise(self, gots: dict[str, _Hash]) -> NoReturn:
raise HashMismatch(self._allowed, gots)
def check_against_file(self, file: BinaryIO) -> None:
@@ -105,7 +104,7 @@ class Hashes:
with open(path, "rb") as file:
return self.check_against_file(file)
- def has_one_of(self, hashes: Dict[str, str]) -> bool:
+ def has_one_of(self, hashes: dict[str, str]) -> bool:
"""Return whether any of the given hashes are allowed."""
for hash_name, hex_digest in hashes.items():
if self.is_hash_allowed(hash_name, hex_digest):
@@ -147,5 +146,5 @@ class MissingHashes(Hashes):
# empty list, it will never match, so an error will always raise.
super().__init__(hashes={FAVORITE_HASH: []})
- def _raise(self, gots: Dict[str, "_Hash"]) -> "NoReturn":
+ def _raise(self, gots: dict[str, _Hash]) -> NoReturn:
raise HashMissing(gots[FAVORITE_HASH].hexdigest())
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
index 95982dfb..5cdbeb7f 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
@@ -1,3 +1,5 @@
+from __future__ import annotations
+
import contextlib
import errno
import logging
@@ -5,10 +7,11 @@ import logging.handlers
import os
import sys
import threading
+from collections.abc import Generator
from dataclasses import dataclass
from io import TextIOWrapper
from logging import Filter
-from typing import Any, ClassVar, Generator, List, Optional, TextIO, Type
+from typing import Any, ClassVar
from pip._vendor.rich.console import (
Console,
@@ -29,6 +32,8 @@ from pip._internal.utils.deprecation import DEPRECATION_MSG_PREFIX
from pip._internal.utils.misc import ensure_dir
_log_state = threading.local()
+_stdout_console = None
+_stderr_console = None
subprocess_logger = getLogger("pip.subprocessor")
@@ -38,7 +43,7 @@ class BrokenStdoutLoggingError(Exception):
"""
-def _is_broken_pipe_error(exc_class: Type[BaseException], exc: BaseException) -> bool:
+def _is_broken_pipe_error(exc_class: type[BaseException], exc: BaseException) -> bool:
if exc_class is BrokenPipeError:
return True
@@ -137,12 +142,28 @@ class IndentedRenderable:
yield Segment("\n")
-class RichPipStreamHandler(RichHandler):
- KEYWORDS: ClassVar[Optional[List[str]]] = []
+class PipConsole(Console):
+ def on_broken_pipe(self) -> None:
+ # Reraise the original exception, rich 13.8.0+ exits by default
+ # instead, preventing our handler from firing.
+ raise BrokenPipeError() from None
- def __init__(self, stream: Optional[TextIO], no_color: bool) -> None:
+
+def get_console(*, stderr: bool = False) -> Console:
+ if stderr:
+ assert _stderr_console is not None, "stderr rich console is missing!"
+ return _stderr_console
+ else:
+ assert _stdout_console is not None, "stdout rich console is missing!"
+ return _stdout_console
+
+
+class RichPipStreamHandler(RichHandler):
+ KEYWORDS: ClassVar[list[str] | None] = []
+
+ def __init__(self, console: Console) -> None:
super().__init__(
- console=Console(file=stream, no_color=no_color, soft_wrap=True),
+ console=console,
show_time=False,
show_level=False,
show_path=False,
@@ -151,11 +172,11 @@ class RichPipStreamHandler(RichHandler):
# Our custom override on Rich's logger, to make things work as we need them to.
def emit(self, record: logging.LogRecord) -> None:
- style: Optional[Style] = None
+ style: Style | None = None
# If we are given a diagnostic error to present, present it with indentation.
- assert isinstance(record.args, tuple)
if getattr(record, "rich", False):
+ assert isinstance(record.args, tuple)
(rich_renderable,) = record.args
assert isinstance(
rich_renderable, (ConsoleRenderable, RichCast, str)
@@ -212,7 +233,6 @@ class MaxLevelFilter(Filter):
class ExcludeLoggerFilter(Filter):
-
"""
A logging Filter that excludes records from a logger (or its children).
"""
@@ -223,7 +243,7 @@ class ExcludeLoggerFilter(Filter):
return not super().filter(record)
-def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str]) -> int:
+def setup_logging(verbosity: int, no_color: bool, user_log_file: str | None) -> int:
"""Configures and sets up all of the logging
Returns the requested logging level, as its integer value.
@@ -260,10 +280,6 @@ def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str])
vendored_log_level = "WARNING" if level in ["INFO", "ERROR"] else "DEBUG"
# Shorthands for clarity
- log_streams = {
- "stdout": "ext://sys.stdout",
- "stderr": "ext://sys.stderr",
- }
handler_classes = {
"stream": "pip._internal.utils.logging.RichPipStreamHandler",
"file": "pip._internal.utils.logging.BetterRotatingFileHandler",
@@ -271,6 +287,9 @@ def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str])
handlers = ["console", "console_errors", "console_subprocess"] + (
["user_log"] if include_user_log else []
)
+ global _stdout_console, stderr_console
+ _stdout_console = PipConsole(file=sys.stdout, no_color=no_color, soft_wrap=True)
+ _stderr_console = PipConsole(file=sys.stderr, no_color=no_color, soft_wrap=True)
logging.config.dictConfig(
{
@@ -305,16 +324,14 @@ def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str])
"console": {
"level": level,
"class": handler_classes["stream"],
- "no_color": no_color,
- "stream": log_streams["stdout"],
+ "console": _stdout_console,
"filters": ["exclude_subprocess", "exclude_warnings"],
"formatter": "indent",
},
"console_errors": {
"level": "WARNING",
"class": handler_classes["stream"],
- "no_color": no_color,
- "stream": log_streams["stderr"],
+ "console": _stderr_console,
"filters": ["exclude_subprocess"],
"formatter": "indent",
},
@@ -323,8 +340,7 @@ def setup_logging(verbosity: int, no_color: bool, user_log_file: Optional[str])
"console_subprocess": {
"level": level,
"class": handler_classes["stream"],
- "stream": log_streams["stderr"],
- "no_color": no_color,
+ "console": _stderr_console,
"filters": ["restrict_to_subprocess"],
"formatter": "indent",
},
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
index 1ad3f616..3a28e844 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
@@ -1,8 +1,8 @@
-import contextlib
+from __future__ import annotations
+
import errno
import getpass
import hashlib
-import io
import logging
import os
import posixpath
@@ -11,6 +11,8 @@ import stat
import sys
import sysconfig
import urllib.parse
+from collections.abc import Generator, Iterable, Iterator, Mapping, Sequence
+from dataclasses import dataclass
from functools import partial
from io import StringIO
from itertools import filterfalse, tee, zip_longest
@@ -20,29 +22,20 @@ from typing import (
Any,
BinaryIO,
Callable,
- ContextManager,
- Dict,
- Generator,
- Iterable,
- Iterator,
- List,
Optional,
TextIO,
- Tuple,
- Type,
TypeVar,
- Union,
cast,
)
from pip._vendor.packaging.requirements import Requirement
from pip._vendor.pyproject_hooks import BuildBackendHookCaller
-from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed
from pip import __version__
from pip._internal.exceptions import CommandError, ExternallyManagedEnvironment
from pip._internal.locations import get_major_minor_version
from pip._internal.utils.compat import WINDOWS
+from pip._internal.utils.retry import retry
from pip._internal.utils.virtualenv import running_under_virtualenv
__all__ = [
@@ -56,7 +49,6 @@ __all__ = [
"normalize_path",
"renames",
"get_prog",
- "captured_stdout",
"ensure_dir",
"remove_auth_from_url",
"check_externally_managed",
@@ -66,12 +58,14 @@ __all__ = [
logger = logging.getLogger(__name__)
T = TypeVar("T")
-ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType]
-VersionInfo = Tuple[int, int, int]
-NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]]
+ExcInfo = tuple[type[BaseException], BaseException, TracebackType]
+VersionInfo = tuple[int, int, int]
+NetlocTuple = tuple[str, tuple[Optional[str], Optional[str]]]
OnExc = Callable[[FunctionType, Path, BaseException], Any]
OnErr = Callable[[FunctionType, Path, ExcInfo], Any]
+FILE_CHUNK_SIZE = 1024 * 1024
+
def get_pip_version() -> str:
pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..")
@@ -80,7 +74,7 @@ def get_pip_version() -> str:
return f"pip {__version__} from {pip_pkg_dir} (python {get_major_minor_version()})"
-def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]:
+def normalize_version_info(py_version_info: tuple[int, ...]) -> tuple[int, int, int]:
"""
Convert a tuple of ints representing a Python version to one of length
three.
@@ -122,23 +116,13 @@ def get_prog() -> str:
# Retry every half second for up to 3 seconds
-# Tenacity raises RetryError by default, explicitly raise the original exception
-@retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5))
-def rmtree(
- dir: str,
- ignore_errors: bool = False,
- onexc: Optional[OnExc] = None,
-) -> None:
+@retry(stop_after_delay=3, wait=0.5)
+def rmtree(dir: str, ignore_errors: bool = False, onexc: OnExc | None = None) -> None:
if ignore_errors:
onexc = _onerror_ignore
if onexc is None:
onexc = _onerror_reraise
- handler: OnErr = partial(
- # `[func, path, Union[ExcInfo, BaseException]] -> Any` is equivalent to
- # `Union[([func, path, ExcInfo] -> Any), ([func, path, BaseException] -> Any)]`.
- cast(Union[OnExc, OnErr], rmtree_errorhandler),
- onexc=onexc,
- )
+ handler: OnErr = partial(rmtree_errorhandler, onexc=onexc)
if sys.version_info >= (3, 12):
# See https://docs.python.org/3.12/whatsnew/3.12.html#shutil.
shutil.rmtree(dir, onexc=handler) # type: ignore
@@ -151,13 +135,13 @@ def _onerror_ignore(*_args: Any) -> None:
def _onerror_reraise(*_args: Any) -> None:
- raise
+ raise # noqa: PLE0704 - Bare exception used to reraise existing exception
def rmtree_errorhandler(
func: FunctionType,
path: Path,
- exc_info: Union[ExcInfo, BaseException],
+ exc_info: ExcInfo | BaseException,
*,
onexc: OnExc = _onerror_reraise,
) -> None:
@@ -284,7 +268,7 @@ def format_size(bytes: float) -> str:
return f"{int(bytes)} bytes"
-def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]:
+def tabulate(rows: Iterable[Iterable[Any]]) -> tuple[list[str], list[int]]:
"""Return a list of formatted rows and a list of column sizes.
For example::
@@ -316,7 +300,7 @@ def is_installable_dir(path: str) -> bool:
def read_chunks(
- file: BinaryIO, size: int = io.DEFAULT_BUFFER_SIZE
+ file: BinaryIO, size: int = FILE_CHUNK_SIZE
) -> Generator[bytes, None, None]:
"""Yield pieces of data from a file-like object until EOF."""
while True:
@@ -339,7 +323,7 @@ def normalize_path(path: str, resolve_symlinks: bool = True) -> str:
return os.path.normcase(path)
-def splitext(path: str) -> Tuple[str, str]:
+def splitext(path: str) -> tuple[str, str]:
"""Like os.path.splitext, but take off .tar too"""
base, ext = posixpath.splitext(path)
if base.lower().endswith(".tar"):
@@ -387,7 +371,7 @@ class StreamWrapper(StringIO):
orig_stream: TextIO
@classmethod
- def from_stream(cls, orig_stream: TextIO) -> "StreamWrapper":
+ def from_stream(cls, orig_stream: TextIO) -> StreamWrapper:
ret = cls()
ret.orig_stream = orig_stream
return ret
@@ -399,49 +383,15 @@ class StreamWrapper(StringIO):
return self.orig_stream.encoding
-@contextlib.contextmanager
-def captured_output(stream_name: str) -> Generator[StreamWrapper, None, None]:
- """Return a context manager used by captured_stdout/stdin/stderr
- that temporarily replaces the sys stream *stream_name* with a StringIO.
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- orig_stdout = getattr(sys, stream_name)
- setattr(sys, stream_name, StreamWrapper.from_stream(orig_stdout))
- try:
- yield getattr(sys, stream_name)
- finally:
- setattr(sys, stream_name, orig_stdout)
-
-
-def captured_stdout() -> ContextManager[StreamWrapper]:
- """Capture the output of sys.stdout:
-
- with captured_stdout() as stdout:
- print('hello')
- self.assertEqual(stdout.getvalue(), 'hello\n')
-
- Taken from Lib/support/__init__.py in the CPython repo.
- """
- return captured_output("stdout")
-
-
-def captured_stderr() -> ContextManager[StreamWrapper]:
- """
- See captured_stdout().
- """
- return captured_output("stderr")
-
-
# Simulates an enum
-def enum(*sequential: Any, **named: Any) -> Type[Any]:
+def enum(*sequential: Any, **named: Any) -> type[Any]:
enums = dict(zip(sequential, range(len(sequential))), **named)
reverse = {value: key for key, value in enums.items()}
enums["reverse_mapping"] = reverse
return type("Enum", (), enums)
-def build_netloc(host: str, port: Optional[int]) -> str:
+def build_netloc(host: str, port: int | None) -> str:
"""
Build a netloc from a host-port pair
"""
@@ -463,7 +413,7 @@ def build_url_from_netloc(netloc: str, scheme: str = "https") -> str:
return f"{scheme}://{netloc}"
-def parse_netloc(netloc: str) -> Tuple[Optional[str], Optional[int]]:
+def parse_netloc(netloc: str) -> tuple[str | None, int | None]:
"""
Return the host-port pair from a netloc.
"""
@@ -485,7 +435,7 @@ def split_auth_from_netloc(netloc: str) -> NetlocTuple:
# behaves if more than one @ is present (which can be checked using
# the password attribute of urlsplit()'s return value).
auth, netloc = netloc.rsplit("@", 1)
- pw: Optional[str] = None
+ pw: str | None = None
if ":" in auth:
# Split from the left because that's how urllib.parse.urlsplit()
# behaves if more than one : is present (which again can be checked
@@ -522,8 +472,8 @@ def redact_netloc(netloc: str) -> str:
def _transform_url(
- url: str, transform_netloc: Callable[[str], Tuple[Any, ...]]
-) -> Tuple[str, NetlocTuple]:
+ url: str, transform_netloc: Callable[[str], tuple[Any, ...]]
+) -> tuple[str, NetlocTuple]:
"""Transform and replace netloc in a url.
transform_netloc is a function taking the netloc and returning a
@@ -545,13 +495,13 @@ def _get_netloc(netloc: str) -> NetlocTuple:
return split_auth_from_netloc(netloc)
-def _redact_netloc(netloc: str) -> Tuple[str]:
+def _redact_netloc(netloc: str) -> tuple[str]:
return (redact_netloc(netloc),)
def split_auth_netloc_from_url(
url: str,
-) -> Tuple[str, str, Tuple[Optional[str], Optional[str]]]:
+) -> tuple[str, str, tuple[str | None, str | None]]:
"""
Parse a url into separate netloc, auth, and url with no auth.
@@ -580,10 +530,10 @@ def redact_auth_from_requirement(req: Requirement) -> str:
return str(req).replace(req.url, redact_auth_from_url(req.url))
+@dataclass(frozen=True)
class HiddenText:
- def __init__(self, secret: str, redacted: str) -> None:
- self.secret = secret
- self.redacted = redacted
+ secret: str
+ redacted: str
def __repr__(self) -> str:
return f""
@@ -593,7 +543,7 @@ class HiddenText:
# This is useful for testing.
def __eq__(self, other: Any) -> bool:
- if type(self) != type(other):
+ if type(self) is not type(other):
return False
# The string being used for redaction doesn't also have to match,
@@ -656,7 +606,7 @@ def is_console_interactive() -> bool:
return sys.stdin is not None and sys.stdin.isatty()
-def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]:
+def hash_file(path: str, blocksize: int = 1 << 20) -> tuple[Any, int]:
"""Return (hash, length) for path using hashlib.sha256()"""
h = hashlib.sha256()
@@ -668,7 +618,7 @@ def hash_file(path: str, blocksize: int = 1 << 20) -> Tuple[Any, int]:
return h, length
-def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]:
+def pairwise(iterable: Iterable[Any]) -> Iterator[tuple[Any, Any]]:
"""
Return paired elements.
@@ -680,9 +630,8 @@ def pairwise(iterable: Iterable[Any]) -> Iterator[Tuple[Any, Any]]:
def partition(
- pred: Callable[[T], bool],
- iterable: Iterable[T],
-) -> Tuple[Iterable[T], Iterable[T]]:
+ pred: Callable[[T], bool], iterable: Iterable[T]
+) -> tuple[Iterable[T], Iterable[T]]:
"""
Use a predicate to partition entries into false entries and true entries,
like
@@ -699,9 +648,9 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
config_holder: Any,
source_dir: str,
build_backend: str,
- backend_path: Optional[str] = None,
- runner: Optional[Callable[..., None]] = None,
- python_executable: Optional[str] = None,
+ backend_path: str | None = None,
+ runner: Callable[..., None] | None = None,
+ python_executable: str | None = None,
):
super().__init__(
source_dir, build_backend, backend_path, runner, python_executable
@@ -711,8 +660,8 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
def build_wheel(
self,
wheel_directory: str,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
- metadata_directory: Optional[str] = None,
+ config_settings: Mapping[str, Any] | None = None,
+ metadata_directory: str | None = None,
) -> str:
cs = self.config_holder.config_settings
return super().build_wheel(
@@ -722,7 +671,7 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
def build_sdist(
self,
sdist_directory: str,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: Mapping[str, Any] | None = None,
) -> str:
cs = self.config_holder.config_settings
return super().build_sdist(sdist_directory, config_settings=cs)
@@ -730,8 +679,8 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
def build_editable(
self,
wheel_directory: str,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
- metadata_directory: Optional[str] = None,
+ config_settings: Mapping[str, Any] | None = None,
+ metadata_directory: str | None = None,
) -> str:
cs = self.config_holder.config_settings
return super().build_editable(
@@ -739,27 +688,27 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
)
def get_requires_for_build_wheel(
- self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None
- ) -> List[str]:
+ self, config_settings: Mapping[str, Any] | None = None
+ ) -> Sequence[str]:
cs = self.config_holder.config_settings
return super().get_requires_for_build_wheel(config_settings=cs)
def get_requires_for_build_sdist(
- self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None
- ) -> List[str]:
+ self, config_settings: Mapping[str, Any] | None = None
+ ) -> Sequence[str]:
cs = self.config_holder.config_settings
return super().get_requires_for_build_sdist(config_settings=cs)
def get_requires_for_build_editable(
- self, config_settings: Optional[Dict[str, Union[str, List[str]]]] = None
- ) -> List[str]:
+ self, config_settings: Mapping[str, Any] | None = None
+ ) -> Sequence[str]:
cs = self.config_holder.config_settings
return super().get_requires_for_build_editable(config_settings=cs)
def prepare_metadata_for_build_wheel(
self,
metadata_directory: str,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: Mapping[str, Any] | None = None,
_allow_fallback: bool = True,
) -> str:
cs = self.config_holder.config_settings
@@ -772,12 +721,45 @@ class ConfiguredBuildBackendHookCaller(BuildBackendHookCaller):
def prepare_metadata_for_build_editable(
self,
metadata_directory: str,
- config_settings: Optional[Dict[str, Union[str, List[str]]]] = None,
+ config_settings: Mapping[str, Any] | None = None,
_allow_fallback: bool = True,
- ) -> str:
+ ) -> str | None:
cs = self.config_holder.config_settings
return super().prepare_metadata_for_build_editable(
metadata_directory=metadata_directory,
config_settings=cs,
_allow_fallback=_allow_fallback,
)
+
+
+def warn_if_run_as_root() -> None:
+ """Output a warning for sudo users on Unix.
+
+ In a virtual environment, sudo pip still writes to virtualenv.
+ On Windows, users may run pip as Administrator without issues.
+ This warning only applies to Unix root users outside of virtualenv.
+ """
+ if running_under_virtualenv():
+ return
+ if not hasattr(os, "getuid"):
+ return
+ # On Windows, there are no "system managed" Python packages. Installing as
+ # Administrator via pip is the correct way of updating system environments.
+ #
+ # We choose sys.platform over utils.compat.WINDOWS here to enable Mypy platform
+ # checks: https://mypy.readthedocs.io/en/stable/common_issues.html
+ if sys.platform == "win32" or sys.platform == "cygwin":
+ return
+
+ if os.getuid() != 0:
+ return
+
+ logger.warning(
+ "Running pip as the 'root' user can result in broken permissions and "
+ "conflicting behaviour with the system package manager, possibly "
+ "rendering your system unusable. "
+ "It is recommended to use a virtual environment instead: "
+ "https://pip.pypa.io/warnings/venv. "
+ "Use the --root-user-action option if you know what you are doing and "
+ "want to suppress this warning."
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py
deleted file mode 100644
index b6bb21a8..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""Utilities for defining models
-"""
-
-import operator
-from typing import Any, Callable, Type
-
-
-class KeyBasedCompareMixin:
- """Provides comparison capabilities that is based on a key"""
-
- __slots__ = ["_compare_key", "_defining_class"]
-
- def __init__(self, key: Any, defining_class: Type["KeyBasedCompareMixin"]) -> None:
- self._compare_key = key
- self._defining_class = defining_class
-
- def __hash__(self) -> int:
- return hash(self._compare_key)
-
- def __lt__(self, other: Any) -> bool:
- return self._compare(other, operator.__lt__)
-
- def __le__(self, other: Any) -> bool:
- return self._compare(other, operator.__le__)
-
- def __gt__(self, other: Any) -> bool:
- return self._compare(other, operator.__gt__)
-
- def __ge__(self, other: Any) -> bool:
- return self._compare(other, operator.__ge__)
-
- def __eq__(self, other: Any) -> bool:
- return self._compare(other, operator.__eq__)
-
- def _compare(self, other: Any, method: Callable[[Any, Any], bool]) -> bool:
- if not isinstance(other, self._defining_class):
- return NotImplemented
-
- return method(self._compare_key, other._compare_key)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py
index b9f6af4d..3cbc0490 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py
@@ -1,18 +1,17 @@
+from __future__ import annotations
+
import functools
import logging
-import re
-from typing import NewType, Optional, Tuple, cast
from pip._vendor.packaging import specifiers, version
from pip._vendor.packaging.requirements import Requirement
-NormalizedExtra = NewType("NormalizedExtra", str)
-
logger = logging.getLogger(__name__)
+@functools.lru_cache(maxsize=32)
def check_requires_python(
- requires_python: Optional[str], version_info: Tuple[int, ...]
+ requires_python: str | None, version_info: tuple[int, ...]
) -> bool:
"""
Check if the given Python version matches a "Requires-Python" specifier.
@@ -34,7 +33,7 @@ def check_requires_python(
return python_version in requires_python_specifier
-@functools.lru_cache(maxsize=512)
+@functools.lru_cache(maxsize=10000)
def get_requirement(req_string: str) -> Requirement:
"""Construct a packaging.Requirement object with caching"""
# Parsing requirement strings is expensive, and is also expected to happen
@@ -43,15 +42,3 @@ def get_requirement(req_string: str) -> Requirement:
# minimize repeated parsing of the same string to construct equivalent
# Requirement objects.
return Requirement(req_string)
-
-
-def safe_extra(extra: str) -> NormalizedExtra:
- """Convert an arbitrary string to a standard 'extra' name
-
- Any runs of non-alphanumeric characters are replaced with a single '_',
- and the result is always lowercased.
-
- This function is duplicated from ``pkg_resources``. Note that this is not
- the same to either ``canonicalize_name`` or ``_egg_link_name``.
- """
- return cast(NormalizedExtra, re.sub("[^A-Za-z0-9.-]+", "_", extra).lower())
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/retry.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/retry.py
new file mode 100644
index 00000000..27d3b6e7
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/retry.py
@@ -0,0 +1,45 @@
+from __future__ import annotations
+
+import functools
+from time import perf_counter, sleep
+from typing import TYPE_CHECKING, Callable, TypeVar
+
+if TYPE_CHECKING:
+ from typing_extensions import ParamSpec
+
+ T = TypeVar("T")
+ P = ParamSpec("P")
+
+
+def retry(
+ wait: float, stop_after_delay: float
+) -> Callable[[Callable[P, T]], Callable[P, T]]:
+ """Decorator to automatically retry a function on error.
+
+ If the function raises, the function is recalled with the same arguments
+ until it returns or the time limit is reached. When the time limit is
+ surpassed, the last exception raised is reraised.
+
+ :param wait: The time to wait after an error before retrying, in seconds.
+ :param stop_after_delay: The time limit after which retries will cease,
+ in seconds.
+ """
+
+ def wrapper(func: Callable[P, T]) -> Callable[P, T]:
+
+ @functools.wraps(func)
+ def retry_wrapped(*args: P.args, **kwargs: P.kwargs) -> T:
+ # The performance counter is monotonic on all platforms we care
+ # about and has much better resolution than time.monotonic().
+ start_time = perf_counter()
+ while True:
+ try:
+ return func(*args, **kwargs)
+ except Exception:
+ if perf_counter() - start_time > stop_after_delay:
+ raise
+ sleep(wait)
+
+ return retry_wrapped
+
+ return wrapper
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py
index 96d1b246..1b8c7a1c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py
@@ -1,6 +1,8 @@
+from __future__ import annotations
+
import sys
import textwrap
-from typing import List, Optional, Sequence
+from collections.abc import Sequence
# Shim to wrap setup.py invocation with setuptools
# Note that __file__ is handled via two {!r} *and* %r, to ensure that paths on
@@ -17,16 +19,17 @@ _SETUPTOOLS_SHIM = textwrap.dedent(
# setuptools doesn't think the script is `-c`. This avoids the following warning:
# manifest_maker: standard file '-c' not found".
# - It generates a shim setup.py, for handling setup.cfg-only projects.
- import os, sys, tokenize
+ import os, sys, tokenize, traceback
try:
import setuptools
- except ImportError as error:
+ except ImportError:
print(
- "ERROR: Can not execute `setup.py` since setuptools is not available in "
- "the build environment.",
+ "ERROR: Can not execute `setup.py` since setuptools failed to import in "
+ "the build environment with exception:",
file=sys.stderr,
)
+ traceback.print_exc()
sys.exit(1)
__file__ = %r
@@ -48,10 +51,10 @@ _SETUPTOOLS_SHIM = textwrap.dedent(
def make_setuptools_shim_args(
setup_py_path: str,
- global_options: Optional[Sequence[str]] = None,
+ global_options: Sequence[str] | None = None,
no_user_config: bool = False,
unbuffered_output: bool = False,
-) -> List[str]:
+) -> list[str]:
"""
Get setuptools command arguments with shim wrapped setup file invocation.
@@ -77,7 +80,7 @@ def make_setuptools_bdist_wheel_args(
global_options: Sequence[str],
build_options: Sequence[str],
destination_dir: str,
-) -> List[str]:
+) -> list[str]:
# NOTE: Eventually, we'd want to also -S to the flags here, when we're
# isolating. Currently, it breaks Python in virtualenvs, because it
# relies on site.py to find parts of the standard library outside the
@@ -93,7 +96,7 @@ def make_setuptools_bdist_wheel_args(
def make_setuptools_clean_args(
setup_py_path: str,
global_options: Sequence[str],
-) -> List[str]:
+) -> list[str]:
args = make_setuptools_shim_args(
setup_py_path, global_options=global_options, unbuffered_output=True
)
@@ -106,10 +109,10 @@ def make_setuptools_develop_args(
*,
global_options: Sequence[str],
no_user_config: bool,
- prefix: Optional[str],
- home: Optional[str],
+ prefix: str | None,
+ home: str | None,
use_user_site: bool,
-) -> List[str]:
+) -> list[str]:
assert not (use_user_site and prefix)
args = make_setuptools_shim_args(
@@ -133,9 +136,9 @@ def make_setuptools_develop_args(
def make_setuptools_egg_info_args(
setup_py_path: str,
- egg_info_dir: Optional[str],
+ egg_info_dir: str | None,
no_user_config: bool,
-) -> List[str]:
+) -> list[str]:
args = make_setuptools_shim_args(setup_py_path, no_user_config=no_user_config)
args += ["egg_info"]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
index 79580b05..3e7b83f3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
@@ -1,17 +1,11 @@
+from __future__ import annotations
+
import logging
import os
import shlex
import subprocess
-from typing import (
- TYPE_CHECKING,
- Any,
- Callable,
- Iterable,
- List,
- Mapping,
- Optional,
- Union,
-)
+from collections.abc import Iterable, Mapping
+from typing import Any, Callable, Literal, Union
from pip._vendor.rich.markup import escape
@@ -20,16 +14,10 @@ from pip._internal.exceptions import InstallationSubprocessError
from pip._internal.utils.logging import VERBOSE, subprocess_logger
from pip._internal.utils.misc import HiddenText
-if TYPE_CHECKING:
- # Literal was introduced in Python 3.8.
- #
- # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7.
- from typing import Literal
-
-CommandArgs = List[Union[str, HiddenText]]
+CommandArgs = list[Union[str, HiddenText]]
-def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs:
+def make_command(*args: str | HiddenText | CommandArgs) -> CommandArgs:
"""
Create a CommandArgs object.
"""
@@ -46,7 +34,7 @@ def make_command(*args: Union[str, HiddenText, CommandArgs]) -> CommandArgs:
return command_args
-def format_command_args(args: Union[List[str], CommandArgs]) -> str:
+def format_command_args(args: list[str] | CommandArgs) -> str:
"""
Format command arguments for display.
"""
@@ -61,7 +49,7 @@ def format_command_args(args: Union[List[str], CommandArgs]) -> str:
)
-def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]:
+def reveal_command_args(args: list[str] | CommandArgs) -> list[str]:
"""
Return the arguments in their raw, unredacted form.
"""
@@ -69,16 +57,16 @@ def reveal_command_args(args: Union[List[str], CommandArgs]) -> List[str]:
def call_subprocess(
- cmd: Union[List[str], CommandArgs],
+ cmd: list[str] | CommandArgs,
show_stdout: bool = False,
- cwd: Optional[str] = None,
- on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise",
- extra_ok_returncodes: Optional[Iterable[int]] = None,
- extra_environ: Optional[Mapping[str, Any]] = None,
- unset_environ: Optional[Iterable[str]] = None,
- spinner: Optional[SpinnerInterface] = None,
- log_failed_cmd: Optional[bool] = True,
- stdout_only: Optional[bool] = False,
+ cwd: str | None = None,
+ on_returncode: Literal["raise", "warn", "ignore"] = "raise",
+ extra_ok_returncodes: Iterable[int] | None = None,
+ extra_environ: Mapping[str, Any] | None = None,
+ unset_environ: Iterable[str] | None = None,
+ spinner: SpinnerInterface | None = None,
+ log_failed_cmd: bool | None = True,
+ stdout_only: bool | None = False,
*,
command_desc: str,
) -> str:
@@ -244,9 +232,9 @@ def runner_with_spinner_message(message: str) -> Callable[..., None]:
"""
def runner(
- cmd: List[str],
- cwd: Optional[str] = None,
- extra_environ: Optional[Mapping[str, Any]] = None,
+ cmd: list[str],
+ cwd: str | None = None,
+ extra_environ: Mapping[str, Any] | None = None,
) -> None:
with open_spinner(message) as spinner:
call_subprocess(
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
index 4eec5f37..a9afa76c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
@@ -1,20 +1,18 @@
+from __future__ import annotations
+
import errno
import itertools
import logging
import os.path
import tempfile
import traceback
+from collections.abc import Generator
from contextlib import ExitStack, contextmanager
from pathlib import Path
from typing import (
Any,
Callable,
- Dict,
- Generator,
- List,
- Optional,
TypeVar,
- Union,
)
from pip._internal.utils.misc import enum, rmtree
@@ -33,7 +31,7 @@ tempdir_kinds = enum(
)
-_tempdir_manager: Optional[ExitStack] = None
+_tempdir_manager: ExitStack | None = None
@contextmanager
@@ -51,7 +49,7 @@ class TempDirectoryTypeRegistry:
"""Manages temp directory behavior"""
def __init__(self) -> None:
- self._should_delete: Dict[str, bool] = {}
+ self._should_delete: dict[str, bool] = {}
def set_delete(self, kind: str, value: bool) -> None:
"""Indicate whether a TempDirectory of the given kind should be
@@ -66,7 +64,7 @@ class TempDirectoryTypeRegistry:
return self._should_delete.get(kind, True)
-_tempdir_registry: Optional[TempDirectoryTypeRegistry] = None
+_tempdir_registry: TempDirectoryTypeRegistry | None = None
@contextmanager
@@ -113,8 +111,8 @@ class TempDirectory:
def __init__(
self,
- path: Optional[str] = None,
- delete: Union[bool, None, _Default] = _default,
+ path: str | None = None,
+ delete: bool | None | _Default = _default,
kind: str = "temp",
globally_managed: bool = False,
ignore_cleanup_errors: bool = True,
@@ -184,7 +182,7 @@ class TempDirectory:
if not os.path.exists(self._path):
return
- errors: List[BaseException] = []
+ errors: list[BaseException] = []
def onerror(
func: Callable[..., Any],
@@ -208,7 +206,7 @@ class TempDirectory:
if self.ignore_cleanup_errors:
try:
- # first try with tenacity; retrying to handle ephemeral errors
+ # first try with @retry; retrying to handle ephemeral errors
rmtree(self._path, ignore_errors=False)
except OSError:
# last pass ignore/log all errors
@@ -245,7 +243,7 @@ class AdjacentTempDirectory(TempDirectory):
# with leading '-' and invalid metadata
LEADING_CHARS = "-~.=%0123456789"
- def __init__(self, original: str, delete: Optional[bool] = None) -> None:
+ def __init__(self, original: str, delete: bool | None = None) -> None:
self.original = original.rstrip("/\\")
super().__init__(delete=delete)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py
index 78b5c13c..0ad3129a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py
@@ -1,13 +1,15 @@
-"""Utilities related archives.
-"""
+"""Utilities related archives."""
+
+from __future__ import annotations
import logging
import os
import shutil
import stat
+import sys
import tarfile
import zipfile
-from typing import Iterable, List, Optional
+from collections.abc import Iterable
from zipfile import ZipInfo
from pip._internal.exceptions import InstallationError
@@ -47,7 +49,7 @@ def current_umask() -> int:
return mask
-def split_leading_dir(path: str) -> List[str]:
+def split_leading_dir(path: str) -> list[str]:
path = path.lstrip("/").lstrip("\\")
if "/" in path and (
("\\" in path and path.find("/") < path.find("\\")) or "\\" not in path
@@ -85,12 +87,16 @@ def is_within_directory(directory: str, target: str) -> bool:
return prefix == abs_directory
+def _get_default_mode_plus_executable() -> int:
+ return 0o777 & ~current_umask() | 0o111
+
+
def set_extracted_file_to_default_mode_plus_executable(path: str) -> None:
"""
Make file present at path have execute for user/group/world
(chmod +x) is no-op on windows per python docs
"""
- os.chmod(path, (0o777 & ~current_umask() | 0o111))
+ os.chmod(path, _get_default_mode_plus_executable())
def zip_item_is_executable(info: ZipInfo) -> bool:
@@ -127,7 +133,7 @@ def unzip_file(filename: str, location: str, flatten: bool = True) -> None:
"outside target directory ({})"
)
raise InstallationError(message.format(filename, fn, location))
- if fn.endswith("/") or fn.endswith("\\"):
+ if fn.endswith(("/", "\\")):
# A directory
ensure_dir(fn)
else:
@@ -151,8 +157,8 @@ def untar_file(filename: str, location: str) -> None:
Untar the file (with path `filename`) to the destination `location`.
All files are written based on system defaults and umask (i.e. permissions
are not preserved), except that regular file members with any execute
- permissions (user, group, or world) have "chmod +x" applied after being
- written. Note that for windows, any execute changes using os.chmod are
+ permissions (user, group, or world) have "chmod +x" applied on top of the
+ default. Note that for windows, any execute changes using os.chmod are
no-ops per the python docs.
"""
ensure_dir(location)
@@ -170,66 +176,140 @@ def untar_file(filename: str, location: str) -> None:
filename,
)
mode = "r:*"
- tar = tarfile.open(filename, mode, encoding="utf-8")
+
+ tar = tarfile.open(filename, mode, encoding="utf-8") # type: ignore
try:
leading = has_leading_dir([member.name for member in tar.getmembers()])
- for member in tar.getmembers():
- fn = member.name
+
+ # PEP 706 added `tarfile.data_filter`, and made some other changes to
+ # Python's tarfile module (see below). The features were backported to
+ # security releases.
+ try:
+ data_filter = tarfile.data_filter
+ except AttributeError:
+ _untar_without_filter(filename, location, tar, leading)
+ else:
+ default_mode_plus_executable = _get_default_mode_plus_executable()
+
if leading:
- fn = split_leading_dir(fn)[1]
- path = os.path.join(location, fn)
- if not is_within_directory(location, path):
- message = (
- "The tar file ({}) has a file ({}) trying to install "
- "outside target directory ({})"
- )
- raise InstallationError(message.format(filename, path, location))
- if member.isdir():
- ensure_dir(path)
- elif member.issym():
+ # Strip the leading directory from all files in the archive,
+ # including hardlink targets (which are relative to the
+ # unpack location).
+ for member in tar.getmembers():
+ name_lead, name_rest = split_leading_dir(member.name)
+ member.name = name_rest
+ if member.islnk():
+ lnk_lead, lnk_rest = split_leading_dir(member.linkname)
+ if lnk_lead == name_lead:
+ member.linkname = lnk_rest
+
+ def pip_filter(member: tarfile.TarInfo, path: str) -> tarfile.TarInfo:
+ orig_mode = member.mode
try:
- tar._extract_member(member, path)
- except Exception as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
+ try:
+ member = data_filter(member, location)
+ except tarfile.LinkOutsideDestinationError:
+ if sys.version_info[:3] in {
+ (3, 9, 17),
+ (3, 10, 12),
+ (3, 11, 4),
+ }:
+ # The tarfile filter in specific Python versions
+ # raises LinkOutsideDestinationError on valid input
+ # (https://github.com/python/cpython/issues/107845)
+ # Ignore the error there, but do use the
+ # more lax `tar_filter`
+ member = tarfile.tar_filter(member, location)
+ else:
+ raise
+ except tarfile.TarError as exc:
+ message = "Invalid member in the tar file {}: {}"
+ # Filter error messages mention the member name.
+ # No need to add it here.
+ raise InstallationError(
+ message.format(
+ filename,
+ exc,
+ )
)
- continue
- else:
- try:
- fp = tar.extractfile(member)
- except (KeyError, AttributeError) as exc:
- # Some corrupt tar files seem to produce this
- # (specifically bad symlinks)
- logger.warning(
- "In the tar file %s the member %s is invalid: %s",
- filename,
- member.name,
- exc,
- )
- continue
- ensure_dir(os.path.dirname(path))
- assert fp is not None
- with open(path, "wb") as destfp:
- shutil.copyfileobj(fp, destfp)
- fp.close()
- # Update the timestamp (useful for cython compiled files)
- tar.utime(member, path)
- # member have any execute permissions for user/group/world?
- if member.mode & 0o111:
- set_extracted_file_to_default_mode_plus_executable(path)
+ if member.isfile() and orig_mode & 0o111:
+ member.mode = default_mode_plus_executable
+ else:
+ # See PEP 706 note above.
+ # The PEP changed this from `int` to `Optional[int]`,
+ # where None means "use the default". Mypy doesn't
+ # know this yet.
+ member.mode = None # type: ignore [assignment]
+ return member
+
+ tar.extractall(location, filter=pip_filter)
+
finally:
tar.close()
+def _untar_without_filter(
+ filename: str,
+ location: str,
+ tar: tarfile.TarFile,
+ leading: bool,
+) -> None:
+ """Fallback for Python without tarfile.data_filter"""
+ for member in tar.getmembers():
+ fn = member.name
+ if leading:
+ fn = split_leading_dir(fn)[1]
+ path = os.path.join(location, fn)
+ if not is_within_directory(location, path):
+ message = (
+ "The tar file ({}) has a file ({}) trying to install "
+ "outside target directory ({})"
+ )
+ raise InstallationError(message.format(filename, path, location))
+ if member.isdir():
+ ensure_dir(path)
+ elif member.issym():
+ try:
+ tar._extract_member(member, path)
+ except Exception as exc:
+ # Some corrupt tar files seem to produce this
+ # (specifically bad symlinks)
+ logger.warning(
+ "In the tar file %s the member %s is invalid: %s",
+ filename,
+ member.name,
+ exc,
+ )
+ continue
+ else:
+ try:
+ fp = tar.extractfile(member)
+ except (KeyError, AttributeError) as exc:
+ # Some corrupt tar files seem to produce this
+ # (specifically bad symlinks)
+ logger.warning(
+ "In the tar file %s the member %s is invalid: %s",
+ filename,
+ member.name,
+ exc,
+ )
+ continue
+ ensure_dir(os.path.dirname(path))
+ assert fp is not None
+ with open(path, "wb") as destfp:
+ shutil.copyfileobj(fp, destfp)
+ fp.close()
+ # Update the timestamp (useful for cython compiled files)
+ tar.utime(member, path)
+ # member have any execute permissions for user/group/world?
+ if member.mode & 0o111:
+ set_extracted_file_to_default_mode_plus_executable(path)
+
+
def unpack_file(
filename: str,
location: str,
- content_type: Optional[str] = None,
+ content_type: str | None = None,
) -> None:
filename = os.path.realpath(filename)
if (
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py
index 6ba2e04f..e951a5e4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py
@@ -2,24 +2,17 @@ import os
import string
import urllib.parse
import urllib.request
-from typing import Optional
from .compat import WINDOWS
-def get_url_scheme(url: str) -> Optional[str]:
- if ":" not in url:
- return None
- return url.split(":", 1)[0].lower()
-
-
def path_to_url(path: str) -> str:
"""
Convert a path to a file: URL. The path will be made absolute and have
quoted path parts.
"""
path = os.path.normpath(os.path.abspath(path))
- url = urllib.parse.urljoin("file:", urllib.request.pathname2url(path))
+ url = urllib.parse.urljoin("file://", urllib.request.pathname2url(path))
return url
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py
index 882e36f5..b1742a3e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py
@@ -1,9 +1,10 @@
+from __future__ import annotations
+
import logging
import os
import re
import site
import sys
-from typing import List, Optional
logger = logging.getLogger(__name__)
_INCLUDE_SYSTEM_SITE_PACKAGES_REGEX = re.compile(
@@ -33,7 +34,7 @@ def running_under_virtualenv() -> bool:
return _running_under_venv() or _running_under_legacy_virtualenv()
-def _get_pyvenv_cfg_lines() -> Optional[List[str]]:
+def _get_pyvenv_cfg_lines() -> list[str] | None:
"""Reads {sys.prefix}/pyvenv.cfg and returns its contents as list of lines
Returns None, if it could not read/access the file.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py
index 3551f8f1..789e7362 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py
@@ -1,10 +1,8 @@
-"""Support functions for working with wheel files.
-"""
+"""Support functions for working with wheel files."""
import logging
from email.message import Message
from email.parser import Parser
-from typing import Tuple
from zipfile import BadZipFile, ZipFile
from pip._vendor.packaging.utils import canonicalize_name
@@ -17,7 +15,7 @@ VERSION_COMPATIBLE = (1, 0)
logger = logging.getLogger(__name__)
-def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]:
+def parse_wheel(wheel_zip: ZipFile, name: str) -> tuple[str, Message]:
"""Extract information from the provided wheel, ensuring it meets basic
standards.
@@ -28,7 +26,7 @@ def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]:
metadata = wheel_metadata(wheel_zip, info_dir)
version = wheel_version(metadata)
except UnsupportedWheel as e:
- raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}")
+ raise UnsupportedWheel(f"{name} has an invalid wheel, {e}")
check_compatibility(version, name)
@@ -94,7 +92,7 @@ def wheel_metadata(source: ZipFile, dist_info_dir: str) -> Message:
return Parser().parsestr(wheel_text)
-def wheel_version(wheel_data: Message) -> Tuple[int, ...]:
+def wheel_version(wheel_data: Message) -> tuple[int, ...]:
"""Given WHEEL metadata, return the parsed Wheel-Version.
Otherwise, raise UnsupportedWheel.
"""
@@ -110,7 +108,7 @@ def wheel_version(wheel_data: Message) -> Tuple[int, ...]:
raise UnsupportedWheel(f"invalid Wheel-Version: {version!r}")
-def check_compatibility(version: Tuple[int, ...], name: str) -> None:
+def check_compatibility(version: tuple[int, ...], name: str) -> None:
"""Raises errors or warns if called with an incompatible Wheel-Version.
pip should refuse to install a Wheel-Version that's a major series
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc
index 25649b8d..8dd2f313 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc
index 34f7b930..b3aa1169 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc
index ae210c77..a9da6d92 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/git.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc
index 1e6f34c3..cc5add2e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc
index cbc534a8..9b2ec14f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc
index b968699c..26bf4c0d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py
index 20a17ed0..3a8a21e6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py
@@ -1,5 +1,6 @@
+from __future__ import annotations
+
import logging
-from typing import List, Optional, Tuple
from pip._internal.utils.misc import HiddenText, display_path
from pip._internal.utils.subprocess import make_command
@@ -30,7 +31,7 @@ class Bazaar(VersionControl):
)
@staticmethod
- def get_base_rev_args(rev: str) -> List[str]:
+ def get_base_rev_args(rev: str) -> list[str]:
return ["-r", rev]
def fetch_new(
@@ -44,34 +45,51 @@ class Bazaar(VersionControl):
display_path(dest),
)
if verbosity <= 0:
- flag = "--quiet"
+ flags = ["--quiet"]
elif verbosity == 1:
- flag = ""
+ flags = []
else:
- flag = f"-{'v'*verbosity}"
+ flags = [f"-{'v'*verbosity}"]
cmd_args = make_command(
- "checkout", "--lightweight", flag, rev_options.to_args(), url, dest
+ "checkout", "--lightweight", *flags, rev_options.to_args(), url, dest
)
self.run_command(cmd_args)
- def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def switch(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
self.run_command(make_command("switch", url), cwd=dest)
- def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def update(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
+ flags = []
+
+ if verbosity <= 0:
+ flags.append("-q")
+
output = self.run_command(
make_command("info"), show_stdout=False, stdout_only=True, cwd=dest
)
if output.startswith("Standalone "):
# Older versions of pip used to create standalone branches.
# Convert the standalone branch to a checkout by calling "bzr bind".
- cmd_args = make_command("bind", "-q", url)
+ cmd_args = make_command("bind", *flags, url)
self.run_command(cmd_args, cwd=dest)
- cmd_args = make_command("update", "-q", rev_options.to_args())
+ cmd_args = make_command("update", *flags, rev_options.to_args())
self.run_command(cmd_args, cwd=dest)
@classmethod
- def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
+ def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, AuthInfo]:
# hotfix the URL scheme after removing bzr+ from bzr+ssh:// re-add it
url, rev, user_pass = super().get_url_rev_and_auth(url)
if url.startswith("ssh://"):
@@ -104,7 +122,7 @@ class Bazaar(VersionControl):
return revision.splitlines()[-1]
@classmethod
- def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
+ def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
"""Always assume the versions don't match"""
return False
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
index 8c242cf8..1769da79 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
@@ -1,10 +1,13 @@
+from __future__ import annotations
+
import logging
import os.path
import pathlib
import re
import urllib.parse
import urllib.request
-from typing import List, Optional, Tuple
+from dataclasses import replace
+from typing import Any
from pip._internal.exceptions import BadCommand, InstallationError
from pip._internal.utils.misc import HiddenText, display_path, hide_url
@@ -73,9 +76,18 @@ class Git(VersionControl):
default_arg_rev = "HEAD"
@staticmethod
- def get_base_rev_args(rev: str) -> List[str]:
+ def get_base_rev_args(rev: str) -> list[str]:
return [rev]
+ @classmethod
+ def run_command(cls, *args: Any, **kwargs: Any) -> str:
+ if os.environ.get("PIP_NO_INPUT"):
+ extra_environ = kwargs.get("extra_environ", {})
+ extra_environ["GIT_TERMINAL_PROMPT"] = "0"
+ extra_environ["GIT_SSH_COMMAND"] = "ssh -oBatchMode=yes"
+ kwargs["extra_environ"] = extra_environ
+ return super().run_command(*args, **kwargs)
+
def is_immutable_rev_checkout(self, url: str, dest: str) -> bool:
_, rev_options = self.get_url_rev_options(hide_url(url))
if not rev_options.rev:
@@ -90,7 +102,7 @@ class Git(VersionControl):
is_tag_or_branch = bool(self.get_revision_sha(dest, rev_options.rev)[0])
return not is_tag_or_branch
- def get_git_version(self) -> Tuple[int, ...]:
+ def get_git_version(self) -> tuple[int, ...]:
version = self.run_command(
["version"],
command_desc="git version",
@@ -104,7 +116,7 @@ class Git(VersionControl):
return (int(match.group(1)), int(match.group(2)))
@classmethod
- def get_current_branch(cls, location: str) -> Optional[str]:
+ def get_current_branch(cls, location: str) -> str | None:
"""
Return the current branch, or None if HEAD isn't at a branch
(e.g. detached HEAD).
@@ -129,7 +141,7 @@ class Git(VersionControl):
return None
@classmethod
- def get_revision_sha(cls, dest: str, rev: str) -> Tuple[Optional[str], bool]:
+ def get_revision_sha(cls, dest: str, rev: str) -> tuple[str | None, bool]:
"""
Return (sha_or_none, is_branch), where sha_or_none is a commit hash
if the revision names a remote branch or tag, otherwise None.
@@ -217,14 +229,14 @@ class Git(VersionControl):
if sha is not None:
rev_options = rev_options.make_new(sha)
- rev_options.branch_name = rev if is_branch else None
+ rev_options = replace(rev_options, branch_name=(rev if is_branch else None))
return rev_options
# Do not show a warning for the common case of something that has
# the form of a Git commit hash.
if not looks_like_hash(rev):
- logger.warning(
+ logger.info(
"Did not find branch or tag '%s', assuming revision or ref.",
rev,
)
@@ -244,7 +256,7 @@ class Git(VersionControl):
return rev_options
@classmethod
- def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
+ def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
"""
Return whether the current commit hash equals the given name.
@@ -264,7 +276,7 @@ class Git(VersionControl):
rev_display = rev_options.to_display()
logger.info("Cloning %s%s to %s", url, rev_display, display_path(dest))
if verbosity <= 0:
- flags: Tuple[str, ...] = ("--quiet",)
+ flags: tuple[str, ...] = ("--quiet",)
elif verbosity == 1:
flags = ()
else:
@@ -319,31 +331,59 @@ class Git(VersionControl):
logger.info("Resolved %s to commit %s", url, rev_options.rev)
#: repo may contain submodules
- self.update_submodules(dest)
+ self.update_submodules(dest, verbosity=verbosity)
- def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def switch(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
self.run_command(
make_command("config", "remote.origin.url", url),
cwd=dest,
)
- cmd_args = make_command("checkout", "-q", rev_options.to_args())
+
+ extra_flags = []
+
+ if verbosity <= 0:
+ extra_flags.append("-q")
+
+ cmd_args = make_command("checkout", *extra_flags, rev_options.to_args())
self.run_command(cmd_args, cwd=dest)
- self.update_submodules(dest)
+ self.update_submodules(dest, verbosity=verbosity)
+
+ def update(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
+ extra_flags = []
+
+ if verbosity <= 0:
+ extra_flags.append("-q")
- def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
# First fetch changes from the default remote
if self.get_git_version() >= (1, 9):
# fetch tags in addition to everything else
- self.run_command(["fetch", "-q", "--tags"], cwd=dest)
+ self.run_command(["fetch", "--tags", *extra_flags], cwd=dest)
else:
- self.run_command(["fetch", "-q"], cwd=dest)
+ self.run_command(["fetch", *extra_flags], cwd=dest)
# Then reset to wanted revision (maybe even origin/master)
rev_options = self.resolve_revision(dest, url, rev_options)
- cmd_args = make_command("reset", "--hard", "-q", rev_options.to_args())
+ cmd_args = make_command(
+ "reset",
+ "--hard",
+ *extra_flags,
+ rev_options.to_args(),
+ )
self.run_command(cmd_args, cwd=dest)
#: update submodules
- self.update_submodules(dest)
+ self.update_submodules(dest, verbosity=verbosity)
@classmethod
def get_remote_url(cls, location: str) -> str:
@@ -423,7 +463,7 @@ class Git(VersionControl):
return True
@classmethod
- def get_revision(cls, location: str, rev: Optional[str] = None) -> str:
+ def get_revision(cls, location: str, rev: str | None = None) -> str:
if rev is None:
rev = "HEAD"
current_rev = cls.run_command(
@@ -435,7 +475,7 @@ class Git(VersionControl):
return current_rev.strip()
@classmethod
- def get_subdirectory(cls, location: str) -> Optional[str]:
+ def get_subdirectory(cls, location: str) -> str | None:
"""
Return the path to Python project root, relative to the repo root.
Return None if the project root is in the repo root.
@@ -453,7 +493,7 @@ class Git(VersionControl):
return find_path_to_project_root_from_repo_root(location, repo_root)
@classmethod
- def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
+ def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, AuthInfo]:
"""
Prefixes stub URLs like 'user@hostname:user/repo.git' with 'ssh://'.
That's required because although they use SSH they sometimes don't
@@ -484,16 +524,21 @@ class Git(VersionControl):
return url, rev, user_pass
@classmethod
- def update_submodules(cls, location: str) -> None:
+ def update_submodules(cls, location: str, verbosity: int = 0) -> None:
+ argv = ["submodule", "update", "--init", "--recursive"]
+
+ if verbosity <= 0:
+ argv.append("-q")
+
if not os.path.exists(os.path.join(location, ".gitmodules")):
return
cls.run_command(
- ["submodule", "update", "--init", "--recursive", "-q"],
+ argv,
cwd=location,
)
@classmethod
- def get_repository_root(cls, location: str) -> Optional[str]:
+ def get_repository_root(cls, location: str) -> str | None:
loc = super().get_repository_root(location)
if loc:
return loc
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py
index c183d41d..c8758031 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py
@@ -1,7 +1,8 @@
+from __future__ import annotations
+
import configparser
import logging
import os
-from typing import List, Optional, Tuple
from pip._internal.exceptions import BadCommand, InstallationError
from pip._internal.utils.misc import HiddenText, display_path
@@ -30,7 +31,7 @@ class Mercurial(VersionControl):
)
@staticmethod
- def get_base_rev_args(rev: str) -> List[str]:
+ def get_base_rev_args(rev: str) -> list[str]:
return [f"--rev={rev}"]
def fetch_new(
@@ -44,7 +45,7 @@ class Mercurial(VersionControl):
display_path(dest),
)
if verbosity <= 0:
- flags: Tuple[str, ...] = ("--quiet",)
+ flags: tuple[str, ...] = ("--quiet",)
elif verbosity == 1:
flags = ()
elif verbosity == 2:
@@ -57,9 +58,20 @@ class Mercurial(VersionControl):
cwd=dest,
)
- def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def switch(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
+ extra_flags = []
repo_config = os.path.join(dest, self.dirname, "hgrc")
config = configparser.RawConfigParser()
+
+ if verbosity <= 0:
+ extra_flags.append("-q")
+
try:
config.read(repo_config)
config.set("paths", "default", url.secret)
@@ -68,12 +80,23 @@ class Mercurial(VersionControl):
except (OSError, configparser.NoSectionError) as exc:
logger.warning("Could not switch Mercurial repository to %s: %s", url, exc)
else:
- cmd_args = make_command("update", "-q", rev_options.to_args())
+ cmd_args = make_command("update", *extra_flags, rev_options.to_args())
self.run_command(cmd_args, cwd=dest)
- def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
- self.run_command(["pull", "-q"], cwd=dest)
- cmd_args = make_command("update", "-q", rev_options.to_args())
+ def update(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
+ extra_flags = []
+
+ if verbosity <= 0:
+ extra_flags.append("-q")
+
+ self.run_command(["pull", *extra_flags], cwd=dest)
+ cmd_args = make_command("update", *extra_flags, rev_options.to_args())
self.run_command(cmd_args, cwd=dest)
@classmethod
@@ -116,12 +139,12 @@ class Mercurial(VersionControl):
return current_rev_hash
@classmethod
- def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
+ def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
"""Always assume the versions don't match"""
return False
@classmethod
- def get_subdirectory(cls, location: str) -> Optional[str]:
+ def get_subdirectory(cls, location: str) -> str | None:
"""
Return the path to Python project root, relative to the repo root.
Return None if the project root is in the repo root.
@@ -135,7 +158,7 @@ class Mercurial(VersionControl):
return find_path_to_project_root_from_repo_root(location, repo_root)
@classmethod
- def get_repository_root(cls, location: str) -> Optional[str]:
+ def get_repository_root(cls, location: str) -> str | None:
loc = super().get_repository_root(location)
if loc:
return loc
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
index 16d93a67..579f428c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
@@ -1,7 +1,8 @@
+from __future__ import annotations
+
import logging
import os
import re
-from typing import List, Optional, Tuple
from pip._internal.utils.misc import (
HiddenText,
@@ -38,7 +39,7 @@ class Subversion(VersionControl):
return True
@staticmethod
- def get_base_rev_args(rev: str) -> List[str]:
+ def get_base_rev_args(rev: str) -> list[str]:
return ["-r", rev]
@classmethod
@@ -73,7 +74,7 @@ class Subversion(VersionControl):
@classmethod
def get_netloc_and_auth(
cls, netloc: str, scheme: str
- ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]:
+ ) -> tuple[str, tuple[str | None, str | None]]:
"""
This override allows the auth information to be passed to svn via the
--username and --password options instead of via the URL.
@@ -86,7 +87,7 @@ class Subversion(VersionControl):
return split_auth_from_netloc(netloc)
@classmethod
- def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
+ def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, AuthInfo]:
# hotfix the URL scheme after removing svn+ from svn+ssh:// re-add it
url, rev, user_pass = super().get_url_rev_and_auth(url)
if url.startswith("ssh://"):
@@ -94,9 +95,7 @@ class Subversion(VersionControl):
return url, rev, user_pass
@staticmethod
- def make_rev_args(
- username: Optional[str], password: Optional[HiddenText]
- ) -> CommandArgs:
+ def make_rev_args(username: str | None, password: HiddenText | None) -> CommandArgs:
extra_args: CommandArgs = []
if username:
extra_args += ["--username", username]
@@ -130,7 +129,7 @@ class Subversion(VersionControl):
return url
@classmethod
- def _get_svn_url_rev(cls, location: str) -> Tuple[Optional[str], int]:
+ def _get_svn_url_rev(cls, location: str) -> tuple[str | None, int]:
from pip._internal.exceptions import InstallationError
entries_path = os.path.join(location, cls.dirname, "entries")
@@ -141,7 +140,7 @@ class Subversion(VersionControl):
data = ""
url = None
- if data.startswith("8") or data.startswith("9") or data.startswith("10"):
+ if data.startswith(("8", "9", "10")):
entries = list(map(str.splitlines, data.split("\n\x0c\n")))
del entries[0][0] # get rid of the '8'
url = entries[0][3]
@@ -180,11 +179,11 @@ class Subversion(VersionControl):
return url, rev
@classmethod
- def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
+ def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
"""Always assume the versions don't match"""
return False
- def __init__(self, use_interactive: Optional[bool] = None) -> None:
+ def __init__(self, use_interactive: bool | None = None) -> None:
if use_interactive is None:
use_interactive = is_console_interactive()
self.use_interactive = use_interactive
@@ -194,11 +193,11 @@ class Subversion(VersionControl):
# Special value definitions:
# None: Not evaluated yet.
# Empty tuple: Could not parse version.
- self._vcs_version: Optional[Tuple[int, ...]] = None
+ self._vcs_version: tuple[int, ...] | None = None
super().__init__()
- def call_vcs_version(self) -> Tuple[int, ...]:
+ def call_vcs_version(self) -> tuple[int, ...]:
"""Query the version of the currently installed Subversion client.
:return: A tuple containing the parts of the version information or
@@ -226,7 +225,7 @@ class Subversion(VersionControl):
return parsed_version
- def get_vcs_version(self) -> Tuple[int, ...]:
+ def get_vcs_version(self) -> tuple[int, ...]:
"""Return the version of the currently installed Subversion client.
If the version of the Subversion client has already been queried,
@@ -288,12 +287,12 @@ class Subversion(VersionControl):
display_path(dest),
)
if verbosity <= 0:
- flag = "--quiet"
+ flags = ["--quiet"]
else:
- flag = ""
+ flags = []
cmd_args = make_command(
"checkout",
- flag,
+ *flags,
self.get_remote_call_options(),
rev_options.to_args(),
url,
@@ -301,7 +300,13 @@ class Subversion(VersionControl):
)
self.run_command(cmd_args)
- def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def switch(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
cmd_args = make_command(
"switch",
self.get_remote_call_options(),
@@ -311,7 +316,13 @@ class Subversion(VersionControl):
)
self.run_command(cmd_args)
- def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def update(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
cmd_args = make_command(
"update",
self.get_remote_call_options(),
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py
index 46ca2799..4e91ccd4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py
@@ -1,22 +1,18 @@
"""Handles all VCS (version control) support"""
+from __future__ import annotations
+
import logging
import os
import shutil
import sys
import urllib.parse
+from collections.abc import Iterable, Iterator, Mapping
+from dataclasses import dataclass, field
from typing import (
- TYPE_CHECKING,
Any,
- Dict,
- Iterable,
- Iterator,
- List,
- Mapping,
+ Literal,
Optional,
- Tuple,
- Type,
- Union,
)
from pip._internal.cli.spinners import SpinnerInterface
@@ -37,35 +33,27 @@ from pip._internal.utils.subprocess import (
format_command_args,
make_command,
)
-from pip._internal.utils.urls import get_url_scheme
-
-if TYPE_CHECKING:
- # Literal was introduced in Python 3.8.
- #
- # TODO: Remove `if TYPE_CHECKING` when dropping support for Python 3.7.
- from typing import Literal
-
__all__ = ["vcs"]
logger = logging.getLogger(__name__)
-AuthInfo = Tuple[Optional[str], Optional[str]]
+AuthInfo = tuple[Optional[str], Optional[str]]
def is_url(name: str) -> bool:
"""
Return true if the name looks like a URL.
"""
- scheme = get_url_scheme(name)
- if scheme is None:
+ scheme = urllib.parse.urlsplit(name).scheme
+ if not scheme:
return False
return scheme in ["http", "https", "file", "ftp"] + vcs.all_schemes
def make_vcs_requirement_url(
- repo_url: str, rev: str, project_name: str, subdir: Optional[str] = None
+ repo_url: str, rev: str, project_name: str, subdir: str | None = None
) -> str:
"""
Return the URL for a VCS requirement.
@@ -84,7 +72,7 @@ def make_vcs_requirement_url(
def find_path_to_project_root_from_repo_root(
location: str, repo_root: str
-) -> Optional[str]:
+) -> str | None:
"""
Find the the Python project's root by searching up the filesystem from
`location`. Return the path to project root relative to `repo_root`.
@@ -121,40 +109,28 @@ class RemoteNotValidError(Exception):
self.url = url
+@dataclass(frozen=True)
class RevOptions:
-
"""
Encapsulates a VCS-specific revision to install, along with any VCS
install options.
- Instances of this class should be treated as if immutable.
+ Args:
+ vc_class: a VersionControl subclass.
+ rev: the name of the revision to install.
+ extra_args: a list of extra options.
"""
- def __init__(
- self,
- vc_class: Type["VersionControl"],
- rev: Optional[str] = None,
- extra_args: Optional[CommandArgs] = None,
- ) -> None:
- """
- Args:
- vc_class: a VersionControl subclass.
- rev: the name of the revision to install.
- extra_args: a list of extra options.
- """
- if extra_args is None:
- extra_args = []
-
- self.extra_args = extra_args
- self.rev = rev
- self.vc_class = vc_class
- self.branch_name: Optional[str] = None
+ vc_class: type[VersionControl]
+ rev: str | None = None
+ extra_args: CommandArgs = field(default_factory=list)
+ branch_name: str | None = None
def __repr__(self) -> str:
return f""
@property
- def arg_rev(self) -> Optional[str]:
+ def arg_rev(self) -> str | None:
if self.rev is None:
return self.vc_class.default_arg_rev
@@ -178,7 +154,7 @@ class RevOptions:
return f" (to revision {self.rev})"
- def make_new(self, rev: str) -> "RevOptions":
+ def make_new(self, rev: str) -> RevOptions:
"""
Make a copy of the current instance, but with a new rev.
@@ -189,7 +165,7 @@ class RevOptions:
class VcsSupport:
- _registry: Dict[str, "VersionControl"] = {}
+ _registry: dict[str, VersionControl] = {}
schemes = ["ssh", "git", "hg", "bzr", "sftp", "svn"]
def __init__(self) -> None:
@@ -202,21 +178,21 @@ class VcsSupport:
return self._registry.__iter__()
@property
- def backends(self) -> List["VersionControl"]:
+ def backends(self) -> list[VersionControl]:
return list(self._registry.values())
@property
- def dirnames(self) -> List[str]:
+ def dirnames(self) -> list[str]:
return [backend.dirname for backend in self.backends]
@property
- def all_schemes(self) -> List[str]:
- schemes: List[str] = []
+ def all_schemes(self) -> list[str]:
+ schemes: list[str] = []
for backend in self.backends:
schemes.extend(backend.schemes)
return schemes
- def register(self, cls: Type["VersionControl"]) -> None:
+ def register(self, cls: type[VersionControl]) -> None:
if not hasattr(cls, "name"):
logger.warning("Cannot register VCS %s", cls.__name__)
return
@@ -228,7 +204,7 @@ class VcsSupport:
if name in self._registry:
del self._registry[name]
- def get_backend_for_dir(self, location: str) -> Optional["VersionControl"]:
+ def get_backend_for_dir(self, location: str) -> VersionControl | None:
"""
Return a VersionControl object if a repository of that type is found
at the given directory.
@@ -251,7 +227,7 @@ class VcsSupport:
inner_most_repo_path = max(vcs_backends, key=len)
return vcs_backends[inner_most_repo_path]
- def get_backend_for_scheme(self, scheme: str) -> Optional["VersionControl"]:
+ def get_backend_for_scheme(self, scheme: str) -> VersionControl | None:
"""
Return a VersionControl object or None.
"""
@@ -260,7 +236,7 @@ class VcsSupport:
return vcs_backend
return None
- def get_backend(self, name: str) -> Optional["VersionControl"]:
+ def get_backend(self, name: str) -> VersionControl | None:
"""
Return a VersionControl object or None.
"""
@@ -276,10 +252,10 @@ class VersionControl:
dirname = ""
repo_name = ""
# List of supported schemes for this Version Control
- schemes: Tuple[str, ...] = ()
+ schemes: tuple[str, ...] = ()
# Iterable of environment variable names to pass to call_subprocess().
- unset_environ: Tuple[str, ...] = ()
- default_arg_rev: Optional[str] = None
+ unset_environ: tuple[str, ...] = ()
+ default_arg_rev: str | None = None
@classmethod
def should_add_vcs_url_prefix(cls, remote_url: str) -> bool:
@@ -290,7 +266,7 @@ class VersionControl:
return not remote_url.lower().startswith(f"{cls.name}:")
@classmethod
- def get_subdirectory(cls, location: str) -> Optional[str]:
+ def get_subdirectory(cls, location: str) -> str | None:
"""
Return the path to Python project root, relative to the repo root.
Return None if the project root is in the repo root.
@@ -329,7 +305,7 @@ class VersionControl:
return req
@staticmethod
- def get_base_rev_args(rev: str) -> List[str]:
+ def get_base_rev_args(rev: str) -> list[str]:
"""
Return the base revision arguments for a vcs command.
@@ -353,7 +329,7 @@ class VersionControl:
@classmethod
def make_rev_options(
- cls, rev: Optional[str] = None, extra_args: Optional[CommandArgs] = None
+ cls, rev: str | None = None, extra_args: CommandArgs | None = None
) -> RevOptions:
"""
Return a RevOptions object.
@@ -362,7 +338,7 @@ class VersionControl:
rev: the name of a revision to install.
extra_args: a list of extra options.
"""
- return RevOptions(cls, rev, extra_args=extra_args)
+ return RevOptions(cls, rev, extra_args=extra_args or [])
@classmethod
def _is_local_repository(cls, repo: str) -> bool:
@@ -376,7 +352,7 @@ class VersionControl:
@classmethod
def get_netloc_and_auth(
cls, netloc: str, scheme: str
- ) -> Tuple[str, Tuple[Optional[str], Optional[str]]]:
+ ) -> tuple[str, tuple[str | None, str | None]]:
"""
Parse the repository URL's netloc, and return the new netloc to use
along with auth information.
@@ -395,7 +371,7 @@ class VersionControl:
return netloc, (None, None)
@classmethod
- def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]:
+ def get_url_rev_and_auth(cls, url: str) -> tuple[str, str | None, AuthInfo]:
"""
Parse the repository URL to use, and return the URL, revision,
and auth info to use.
@@ -425,22 +401,20 @@ class VersionControl:
return url, rev, user_pass
@staticmethod
- def make_rev_args(
- username: Optional[str], password: Optional[HiddenText]
- ) -> CommandArgs:
+ def make_rev_args(username: str | None, password: HiddenText | None) -> CommandArgs:
"""
Return the RevOptions "extra arguments" to use in obtain().
"""
return []
- def get_url_rev_options(self, url: HiddenText) -> Tuple[HiddenText, RevOptions]:
+ def get_url_rev_options(self, url: HiddenText) -> tuple[HiddenText, RevOptions]:
"""
Return the URL and RevOptions object to use in obtain(),
as a tuple (url, rev_options).
"""
secret_url, rev, user_pass = self.get_url_rev_and_auth(url.secret)
username, secret_password = user_pass
- password: Optional[HiddenText] = None
+ password: HiddenText | None = None
if secret_password is not None:
password = hide_value(secret_password)
extra_args = self.make_rev_args(username, password)
@@ -477,7 +451,13 @@ class VersionControl:
"""
raise NotImplementedError
- def switch(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def switch(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
"""
Switch the repo at ``dest`` to point to ``URL``.
@@ -486,7 +466,13 @@ class VersionControl:
"""
raise NotImplementedError
- def update(self, dest: str, url: HiddenText, rev_options: RevOptions) -> None:
+ def update(
+ self,
+ dest: str,
+ url: HiddenText,
+ rev_options: RevOptions,
+ verbosity: int = 0,
+ ) -> None:
"""
Update an already-existing repo to the given ``rev_options``.
@@ -496,7 +482,7 @@ class VersionControl:
raise NotImplementedError
@classmethod
- def is_commit_id_equal(cls, dest: str, name: Optional[str]) -> bool:
+ def is_commit_id_equal(cls, dest: str, name: str | None) -> bool:
"""
Return whether the id of the current commit equals the given name.
@@ -538,7 +524,7 @@ class VersionControl:
self.repo_name,
rev_display,
)
- self.update(dest, url, rev_options)
+ self.update(dest, url, rev_options, verbosity=verbosity)
else:
logger.info("Skipping because already up-to-date.")
return
@@ -593,7 +579,7 @@ class VersionControl:
url,
rev_display,
)
- self.switch(dest, url, rev_options)
+ self.switch(dest, url, rev_options, verbosity=verbosity)
def unpack(self, location: str, url: HiddenText, verbosity: int) -> None:
"""
@@ -627,14 +613,14 @@ class VersionControl:
@classmethod
def run_command(
cls,
- cmd: Union[List[str], CommandArgs],
+ cmd: list[str] | CommandArgs,
show_stdout: bool = True,
- cwd: Optional[str] = None,
- on_returncode: 'Literal["raise", "warn", "ignore"]' = "raise",
- extra_ok_returncodes: Optional[Iterable[int]] = None,
- command_desc: Optional[str] = None,
- extra_environ: Optional[Mapping[str, Any]] = None,
- spinner: Optional[SpinnerInterface] = None,
+ cwd: str | None = None,
+ on_returncode: Literal["raise", "warn", "ignore"] = "raise",
+ extra_ok_returncodes: Iterable[int] | None = None,
+ command_desc: str | None = None,
+ extra_environ: Mapping[str, Any] | None = None,
+ spinner: SpinnerInterface | None = None,
log_failed_cmd: bool = True,
stdout_only: bool = False,
) -> str:
@@ -660,6 +646,8 @@ class VersionControl:
log_failed_cmd=log_failed_cmd,
stdout_only=stdout_only,
)
+ except NotADirectoryError:
+ raise BadCommand(f"Cannot find command {cls.name!r} - invalid PATH")
except FileNotFoundError:
# errno.ENOENT = no such file or directory
# In other words, the VCS executable isn't available
@@ -689,7 +677,7 @@ class VersionControl:
return os.path.exists(os.path.join(path, cls.dirname))
@classmethod
- def get_repository_root(cls, location: str) -> Optional[str]:
+ def get_repository_root(cls, location: str) -> str | None:
"""
Return the "root" (top-level) directory controlled by the vcs,
or `None` if the directory is not in any.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
index b1debe34..beed02f0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
@@ -1,11 +1,12 @@
-"""Orchestrator for building wheels from InstallRequirements.
-"""
+"""Orchestrator for building wheels from InstallRequirements."""
+
+from __future__ import annotations
import logging
import os.path
import re
import shutil
-from typing import Iterable, List, Optional, Tuple
+from collections.abc import Iterable
from pip._vendor.packaging.utils import canonicalize_name, canonicalize_version
from pip._vendor.packaging.version import InvalidVersion, Version
@@ -31,7 +32,7 @@ logger = logging.getLogger(__name__)
_egg_info_re = re.compile(r"([a-z0-9_.]+)-([a-z0-9_.!+-]+)", re.IGNORECASE)
-BuildResult = Tuple[List[InstallRequirement], List[InstallRequirement]]
+BuildResult = tuple[list[InstallRequirement], list[InstallRequirement]]
def _contains_egg_info(s: str) -> bool:
@@ -44,52 +45,31 @@ def _contains_egg_info(s: str) -> bool:
def _should_build(
req: InstallRequirement,
- need_wheel: bool,
) -> bool:
"""Return whether an InstallRequirement should be built into a wheel."""
- if req.constraint:
- # never build requirements that are merely constraints
- return False
+ assert not req.constraint
+
if req.is_wheel:
- if need_wheel:
- logger.info(
- "Skipping %s, due to already being wheel.",
- req.name,
- )
return False
- if need_wheel:
- # i.e. pip wheel, not pip install
- return True
-
- # From this point, this concerns the pip install command only
- # (need_wheel=False).
-
- if not req.source_dir:
- return False
+ assert req.source_dir
if req.editable:
# we only build PEP 660 editable requirements
- return req.supports_pyproject_editable()
+ return req.supports_pyproject_editable
return True
-def should_build_for_wheel_command(
- req: InstallRequirement,
-) -> bool:
- return _should_build(req, need_wheel=True)
-
-
def should_build_for_install_command(
req: InstallRequirement,
) -> bool:
- return _should_build(req, need_wheel=False)
+ return _should_build(req)
def _should_cache(
req: InstallRequirement,
-) -> Optional[bool]:
+) -> bool | None:
"""
Return whether a built InstallRequirement can be stored in the persistent
wheel cache, assuming the wheel cache is available, and _should_build()
@@ -168,10 +148,10 @@ def _build_one(
req: InstallRequirement,
output_dir: str,
verify: bool,
- build_options: List[str],
- global_options: List[str],
+ build_options: list[str],
+ global_options: list[str],
editable: bool,
-) -> Optional[str]:
+) -> str | None:
"""Build one wheel.
:return: The filename of the built wheel, or None if the build failed.
@@ -205,10 +185,10 @@ def _build_one(
def _build_one_inside_env(
req: InstallRequirement,
output_dir: str,
- build_options: List[str],
- global_options: List[str],
+ build_options: list[str],
+ global_options: list[str],
editable: bool,
-) -> Optional[str]:
+) -> str | None:
with TempDirectory(kind="wheel") as temp_dir:
assert req.name
if req.use_pep517:
@@ -273,7 +253,7 @@ def _build_one_inside_env(
return None
-def _clean_one_legacy(req: InstallRequirement, global_options: List[str]) -> bool:
+def _clean_one_legacy(req: InstallRequirement, global_options: list[str]) -> bool:
clean_args = make_setuptools_clean_args(
req.setup_py_path,
global_options=global_options,
@@ -294,8 +274,8 @@ def build(
requirements: Iterable[InstallRequirement],
wheel_cache: WheelCache,
verify: bool,
- build_options: List[str],
- global_options: List[str],
+ build_options: list[str],
+ global_options: list[str],
) -> BuildResult:
"""Build wheels.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py
index c1884baf..34ccb990 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py
@@ -60,20 +60,16 @@ if DEBUNDLED:
# Actually alias all of our vendored dependencies.
vendored("cachecontrol")
vendored("certifi")
- vendored("colorama")
+ vendored("dependency-groups")
vendored("distlib")
vendored("distro")
- vendored("six")
- vendored("six.moves")
- vendored("six.moves.urllib")
- vendored("six.moves.urllib.parse")
vendored("packaging")
vendored("packaging.version")
vendored("packaging.specifiers")
- vendored("pep517")
vendored("pkg_resources")
vendored("platformdirs")
vendored("progress")
+ vendored("pyproject_hooks")
vendored("requests")
vendored("requests.exceptions")
vendored("requests.packages")
@@ -115,7 +111,7 @@ if DEBUNDLED:
vendored("rich.style")
vendored("rich.text")
vendored("rich.traceback")
- vendored("tenacity")
- vendored("tomli")
+ if sys.version_info < (3, 11):
+ vendored("tomli")
vendored("truststore")
vendored("urllib3")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc
index bea7abcb..f4b7732c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc
deleted file mode 100644
index a90fb4c1..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/six.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc
deleted file mode 100644
index 63fe9ca4..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py
index 4d20bc9b..67888db0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py
@@ -6,9 +6,10 @@
Make it easy to import from cachecontrol without long namespaces.
"""
+
__author__ = "Eric Larson"
__email__ = "eric@ionrock.org"
-__version__ = "0.13.1"
+__version__ = "0.14.3"
from pip._vendor.cachecontrol.adapter import CacheControlAdapter
from pip._vendor.cachecontrol.controller import CacheController
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc
index 9bd24ec6..0a1b033e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc
index 6546b68c..d9a286c2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc
index a4dd14a0..f63855ef 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc
index 4a03b3ce..38276558 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc
index 75fe7bd3..24ab9737 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc
index b1286722..b6480700 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc
index 9d2f2d66..4d8b5858 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc
index 3adc2ad3..ac9224fd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc
index fe94b582..3720a816 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py
index 3e83e308..18084d12 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py
@@ -5,6 +5,7 @@ from __future__ import annotations
import functools
import types
+import weakref
import zlib
from typing import TYPE_CHECKING, Any, Collection, Mapping
@@ -77,7 +78,7 @@ class CacheControlAdapter(HTTPAdapter):
return resp
- def build_response(
+ def build_response( # type: ignore[override]
self,
request: PreparedRequest,
response: HTTPResponse,
@@ -125,25 +126,31 @@ class CacheControlAdapter(HTTPAdapter):
else:
# Wrap the response file with a wrapper that will cache the
# response when the stream has been consumed.
- response._fp = CallbackFileWrapper( # type: ignore[attr-defined]
- response._fp, # type: ignore[attr-defined]
+ response._fp = CallbackFileWrapper( # type: ignore[assignment]
+ response._fp, # type: ignore[arg-type]
functools.partial(
- self.controller.cache_response, request, response
+ self.controller.cache_response, request, weakref.ref(response)
),
)
if response.chunked:
- super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined]
+ super_update_chunk_length = response.__class__._update_chunk_length
- def _update_chunk_length(self: HTTPResponse) -> None:
- super_update_chunk_length()
+ def _update_chunk_length(
+ weak_self: weakref.ReferenceType[HTTPResponse],
+ ) -> None:
+ self = weak_self()
+ if self is None:
+ return
+
+ super_update_chunk_length(self)
if self.chunk_left == 0:
- self._fp._close() # type: ignore[attr-defined]
+ self._fp._close() # type: ignore[union-attr]
- response._update_chunk_length = types.MethodType( # type: ignore[attr-defined]
- _update_chunk_length, response
+ response._update_chunk_length = functools.partial( # type: ignore[method-assign]
+ _update_chunk_length, weakref.ref(response)
)
- resp: Response = super().build_response(request, response) # type: ignore[no-untyped-call]
+ resp: Response = super().build_response(request, response)
# See if we should invalidate the cache.
if request.method in self.invalidating_methods and resp.ok:
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py
index 3293b005..91598e92 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py
@@ -6,6 +6,7 @@
The cache object API for implementing caches. The default is a thread
safe in-memory dictionary.
"""
+
from __future__ import annotations
from threading import Lock
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc
index fa658a89..8ca0cb85 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc
index e5daaa4c..23a933be 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc
index 2a2d098f..601d4745 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
index 1fd28013..45c632c7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py
@@ -5,8 +5,10 @@ from __future__ import annotations
import hashlib
import os
+import tempfile
from textwrap import dedent
from typing import IO, TYPE_CHECKING
+from pathlib import Path
from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache
from pip._vendor.cachecontrol.controller import CacheController
@@ -17,53 +19,12 @@ if TYPE_CHECKING:
from filelock import BaseFileLock
-def _secure_open_write(filename: str, fmode: int) -> IO[bytes]:
- # We only want to write to this file, so open it in write only mode
- flags = os.O_WRONLY
-
- # os.O_CREAT | os.O_EXCL will fail if the file already exists, so we only
- # will open *new* files.
- # We specify this because we want to ensure that the mode we pass is the
- # mode of the file.
- flags |= os.O_CREAT | os.O_EXCL
-
- # Do not follow symlinks to prevent someone from making a symlink that
- # we follow and insecurely open a cache file.
- if hasattr(os, "O_NOFOLLOW"):
- flags |= os.O_NOFOLLOW
-
- # On Windows we'll mark this file as binary
- if hasattr(os, "O_BINARY"):
- flags |= os.O_BINARY
-
- # Before we open our file, we want to delete any existing file that is
- # there
- try:
- os.remove(filename)
- except OSError:
- # The file must not exist already, so we can just skip ahead to opening
- pass
-
- # Open our file, the use of os.O_CREAT | os.O_EXCL will ensure that if a
- # race condition happens between the os.remove and this line, that an
- # error will be raised. Because we utilize a lockfile this should only
- # happen if someone is attempting to attack us.
- fd = os.open(filename, flags, fmode)
- try:
- return os.fdopen(fd, "wb")
-
- except:
- # An error occurred wrapping our FD in a file object
- os.close(fd)
- raise
-
-
class _FileCacheMixin:
"""Shared implementation for both FileCache variants."""
def __init__(
self,
- directory: str,
+ directory: str | Path,
forever: bool = False,
filemode: int = 0o0600,
dirmode: int = 0o0700,
@@ -79,7 +40,7 @@ class _FileCacheMixin:
"""
NOTE: In order to use the FileCache you must have
filelock installed. You can install it via pip:
- pip install filelock
+ pip install cachecontrol[filecache]
"""
)
raise ImportError(notice)
@@ -121,15 +82,18 @@ class _FileCacheMixin:
Safely write the data to the given path.
"""
# Make sure the directory exists
- try:
- os.makedirs(os.path.dirname(path), self.dirmode)
- except OSError:
- pass
+ dirname = os.path.dirname(path)
+ os.makedirs(dirname, self.dirmode, exist_ok=True)
with self.lock_class(path + ".lock"):
# Write our actual file
- with _secure_open_write(path, self.filemode) as fh:
- fh.write(data)
+ (fd, name) = tempfile.mkstemp(dir=dirname)
+ try:
+ os.write(fd, data)
+ finally:
+ os.close(fd)
+ os.chmod(name, self.filemode)
+ os.replace(name, path)
def _delete(self, key: str, suffix: str) -> None:
name = self._fn(key) + suffix
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
index 586b9f97..d92d991c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
@@ -5,12 +5,14 @@
"""
The httplib2 algorithms ported for use with requests.
"""
+
from __future__ import annotations
import calendar
import logging
import re
import time
+import weakref
from email.utils import parsedate_tz
from typing import TYPE_CHECKING, Collection, Mapping
@@ -142,6 +144,11 @@ class CacheController:
"""
Load a cached response, or return None if it's not available.
"""
+ # We do not support caching of partial content: so if the request contains a
+ # Range header then we don't want to load anything from the cache.
+ if "Range" in request.headers:
+ return None
+
cache_url = request.url
assert cache_url is not None
cache_data = self.cache.get(cache_url)
@@ -317,7 +324,7 @@ class CacheController:
def cache_response(
self,
request: PreparedRequest,
- response: HTTPResponse,
+ response_or_ref: HTTPResponse | weakref.ReferenceType[HTTPResponse],
body: bytes | None = None,
status_codes: Collection[int] | None = None,
) -> None:
@@ -326,6 +333,16 @@ class CacheController:
This assumes a requests Response object.
"""
+ if isinstance(response_or_ref, weakref.ReferenceType):
+ response = response_or_ref()
+ if response is None:
+ # The weakref can be None only in case the user used streamed request
+ # and did not consume or close it, and holds no reference to requests.Response.
+ # In such case, we don't want to cache the response.
+ return
+ else:
+ response = response_or_ref
+
# From httplib2: Don't cache 206's since we aren't going to
# handle byte range requests
cacheable_status_codes = status_codes or self.cacheable_status_codes
@@ -480,7 +497,7 @@ class CacheController:
cached_response.headers.update(
{
k: v
- for k, v in response.headers.items() # type: ignore[no-untyped-call]
+ for k, v in response.headers.items()
if k.lower() not in excluded_headers
}
)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py
index 25143902..37d2fa59 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py
@@ -38,10 +38,10 @@ class CallbackFileWrapper:
self.__callback = callback
def __getattr__(self, name: str) -> Any:
- # The vaguaries of garbage collection means that self.__fp is
+ # The vagaries of garbage collection means that self.__fp is
# not always set. By using __getattribute__ and the private
# name[0] allows looking up the attribute value and raising an
- # AttributeError when it doesn't exist. This stop thigns from
+ # AttributeError when it doesn't exist. This stop things from
# infinitely recursing calls to getattr in the case where
# self.__fp hasn't been set.
#
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py
index b9d72ca4..b778c4f3 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py
@@ -68,7 +68,10 @@ class OneDayCache(BaseHeuristic):
if "expires" not in response.headers:
date = parsedate(response.headers["date"])
- expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc]
+ expires = expire_after(
+ timedelta(days=1),
+ date=datetime(*date[:6], tzinfo=timezone.utc), # type: ignore[index,misc]
+ )
headers["expires"] = datetime_to_header(expires)
headers["cache-control"] = "public"
return headers
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py
index f9e967c3..a49487a1 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py
@@ -32,13 +32,13 @@ class Serializer:
# also update the response with a new file handler to be
# sure it acts as though it was never read.
body = response.read(decode_content=False)
- response._fp = io.BytesIO(body) # type: ignore[attr-defined]
+ response._fp = io.BytesIO(body) # type: ignore[assignment]
response.length_remaining = len(body)
data = {
"response": {
"body": body, # Empty bytestring if body is stored separately
- "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call]
+ "headers": {str(k): str(v) for k, v in response.headers.items()},
"status": response.status,
"version": response.version,
"reason": str(response.reason),
@@ -72,31 +72,14 @@ class Serializer:
if not data:
return None
- # Determine what version of the serializer the data was serialized
- # with
- try:
- ver, data = data.split(b",", 1)
- except ValueError:
- ver = b"cc=0"
-
- # Make sure that our "ver" is actually a version and isn't a false
- # positive from a , being in the data stream.
- if ver[:3] != b"cc=":
- data = ver + data
- ver = b"cc=0"
-
- # Get the version number out of the cc=N
- verstr = ver.split(b"=", 1)[-1].decode("ascii")
-
- # Dispatch to the actual load method for the given version
- try:
- return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return]
-
- except AttributeError:
- # This is a version we don't have a loads function for, so we'll
- # just treat it as a miss and return None
+ # Previous versions of this library supported other serialization
+ # formats, but these have all been removed.
+ if not data.startswith(f"cc={self.serde_version},".encode()):
return None
+ data = data[5:]
+ return self._loads_v4(request, data, body_file)
+
def prepare_response(
self,
request: PreparedRequest,
@@ -149,49 +132,6 @@ class Serializer:
return HTTPResponse(body=body, preload_content=False, **cached["response"])
- def _loads_v0(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> None:
- # The original legacy cache data. This doesn't contain enough
- # information to construct everything we need, so we'll treat this as
- # a miss.
- return None
-
- def _loads_v1(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> HTTPResponse | None:
- # The "v1" pickled cache format. This is no longer supported
- # for security reasons, so we treat it as a miss.
- return None
-
- def _loads_v2(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> HTTPResponse | None:
- # The "v2" compressed base64 cache format.
- # This has been removed due to age and poor size/performance
- # characteristics, so we treat it as a miss.
- return None
-
- def _loads_v3(
- self,
- request: PreparedRequest,
- data: bytes,
- body_file: IO[bytes] | None = None,
- ) -> None:
- # Due to Python 2 encoding issues, it's impossible to know for sure
- # exactly how to load v3 entries, thus we'll treat these as a miss so
- # that they get rewritten out as v4 entries.
- return None
-
def _loads_v4(
self,
request: PreparedRequest,
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py
index 8ce89cef..e8370493 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py
@@ -1,4 +1,4 @@
from .core import contents, where
__all__ = ["contents", "where"]
-__version__ = "2023.07.22"
+__version__ = "2025.07.14"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc
index 0c51dd59..07a463ec 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc
index 37071a79..7cd85163 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc
index 4a9d99d8..38e60fe4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py
index 5c67600b..2f2f7e08 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py
@@ -5,8 +5,11 @@ certifi.py
This module returns the installation location of cacert.pem or its contents.
"""
import sys
+import atexit
+
+def exit_cacert_ctx() -> None:
+ _CACERT_CTX.__exit__(None, None, None) # type: ignore[union-attr]
-DEBIAN_CA_CERTS_PATH = '/etc/ssl/certs/ca-certificates.crt'
if sys.version_info >= (3, 11):
@@ -36,13 +39,14 @@ if sys.version_info >= (3, 11):
# we will also store that at the global level as well.
_CACERT_CTX = as_file(files("pip._vendor.certifi").joinpath("cacert.pem"))
_CACERT_PATH = str(_CACERT_CTX.__enter__())
+ atexit.register(exit_cacert_ctx)
return _CACERT_PATH
def contents() -> str:
return files("pip._vendor.certifi").joinpath("cacert.pem").read_text(encoding="ascii")
-elif sys.version_info >= (3, 7):
+else:
from importlib.resources import path as get_path, read_text
@@ -71,49 +75,9 @@ elif sys.version_info >= (3, 7):
# we will also store that at the global level as well.
_CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
_CACERT_PATH = str(_CACERT_CTX.__enter__())
+ atexit.register(exit_cacert_ctx)
return _CACERT_PATH
def contents() -> str:
return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
-
-else:
- import os
- import types
- from typing import Union
-
- Package = Union[types.ModuleType, str]
- Resource = Union[str, "os.PathLike"]
-
- # This fallback will work for Python versions prior to 3.7 that lack the
- # importlib.resources module but relies on the existing `where` function
- # so won't address issues with environments like PyOxidizer that don't set
- # __file__ on modules.
- def read_text(
- package: Package,
- resource: Resource,
- encoding: str = 'utf-8',
- errors: str = 'strict'
- ) -> str:
- with open(where(), encoding=encoding) as data:
- return data.read()
-
- # If we don't have importlib.resources, then we will just do the old logic
- # of assuming we're on the filesystem and munge the path directly.
- def where() -> str:
- f = os.path.dirname(__file__)
-
- return os.path.join(f, "cacert.pem")
-
- def contents() -> str:
- return read_text("pip._vendor.certifi", "cacert.pem", encoding="ascii")
-
-
-# Debian: Use system CA certs:
-def where() -> str:
- return DEBIAN_CA_CERTS_PATH
-
-
-def contents() -> str:
- with open(where(), "r", encoding="ascii") as data:
- return data.read()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/certifi/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py
deleted file mode 100644
index fe581623..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py
+++ /dev/null
@@ -1,115 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetgroupprober import CharSetGroupProber
-from .charsetprober import CharSetProber
-from .enums import InputState
-from .resultdict import ResultDict
-from .universaldetector import UniversalDetector
-from .version import VERSION, __version__
-
-__all__ = ["UniversalDetector", "detect", "detect_all", "__version__", "VERSION"]
-
-
-def detect(
- byte_str: Union[bytes, bytearray], should_rename_legacy: bool = False
-) -> ResultDict:
- """
- Detect the encoding of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- :param should_rename_legacy: Should we rename legacy encodings
- to their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError(
- f"Expected object of type bytes or bytearray, got: {type(byte_str)}"
- )
- byte_str = bytearray(byte_str)
- detector = UniversalDetector(should_rename_legacy=should_rename_legacy)
- detector.feed(byte_str)
- return detector.close()
-
-
-def detect_all(
- byte_str: Union[bytes, bytearray],
- ignore_threshold: bool = False,
- should_rename_legacy: bool = False,
-) -> List[ResultDict]:
- """
- Detect all the possible encodings of the given byte string.
-
- :param byte_str: The byte sequence to examine.
- :type byte_str: ``bytes`` or ``bytearray``
- :param ignore_threshold: Include encodings that are below
- ``UniversalDetector.MINIMUM_THRESHOLD``
- in results.
- :type ignore_threshold: ``bool``
- :param should_rename_legacy: Should we rename legacy encodings
- to their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- if not isinstance(byte_str, bytearray):
- if not isinstance(byte_str, bytes):
- raise TypeError(
- f"Expected object of type bytes or bytearray, got: {type(byte_str)}"
- )
- byte_str = bytearray(byte_str)
-
- detector = UniversalDetector(should_rename_legacy=should_rename_legacy)
- detector.feed(byte_str)
- detector.close()
-
- if detector.input_state == InputState.HIGH_BYTE:
- results: List[ResultDict] = []
- probers: List[CharSetProber] = []
- for prober in detector.charset_probers:
- if isinstance(prober, CharSetGroupProber):
- probers.extend(p for p in prober.probers)
- else:
- probers.append(prober)
- for prober in probers:
- if ignore_threshold or prober.get_confidence() > detector.MINIMUM_THRESHOLD:
- charset_name = prober.charset_name or ""
- lower_charset_name = charset_name.lower()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith("iso-8859") and detector.has_win_bytes:
- charset_name = detector.ISO_WIN_MAP.get(
- lower_charset_name, charset_name
- )
- # Rename legacy encodings with superset encodings if asked
- if should_rename_legacy:
- charset_name = detector.LEGACY_MAP.get(
- charset_name.lower(), charset_name
- )
- results.append(
- {
- "encoding": charset_name,
- "confidence": prober.get_confidence(),
- "language": prober.language,
- }
- )
- if len(results) > 0:
- return sorted(results, key=lambda result: -result["confidence"])
-
- return [detector.result]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index d06b2875..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc
deleted file mode 100644
index 2faa355e..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc
deleted file mode 100644
index efb51a8a..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc
deleted file mode 100644
index 0ce6d4ef..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc
deleted file mode 100644
index 26f0985a..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc
deleted file mode 100644
index bdb8cf80..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc
deleted file mode 100644
index 7c665aba..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc
deleted file mode 100644
index 50c758cd..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc
deleted file mode 100644
index 00342497..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc
deleted file mode 100644
index 6c3fa980..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc
deleted file mode 100644
index d35d1840..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc
deleted file mode 100644
index db9737e7..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc
deleted file mode 100644
index d4c6eaf2..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc
deleted file mode 100644
index 7306149d..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc
deleted file mode 100644
index 90a91136..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc
deleted file mode 100644
index c85c4f6e..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc
deleted file mode 100644
index df26795d..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc
deleted file mode 100644
index 96313bad..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc
deleted file mode 100644
index 4d822431..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc
deleted file mode 100644
index fba602dd..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc
deleted file mode 100644
index 27aa5a0d..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc
deleted file mode 100644
index 51a70db9..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc
deleted file mode 100644
index dd6e3d5b..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc
deleted file mode 100644
index 0f36746f..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc
deleted file mode 100644
index 53eba38f..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc
deleted file mode 100644
index 9b707f03..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc
deleted file mode 100644
index 1b05822a..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc
deleted file mode 100644
index 334ace1e..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc
deleted file mode 100644
index 98a9954e..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc
deleted file mode 100644
index 369ff961..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc
deleted file mode 100644
index f191e2b3..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc
deleted file mode 100644
index 8cd2b698..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc
deleted file mode 100644
index f7634ba0..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc
deleted file mode 100644
index acee9533..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc
deleted file mode 100644
index 19125cb6..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc
deleted file mode 100644
index 9a49cda9..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc
deleted file mode 100644
index ed5e809b..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc
deleted file mode 100644
index 62e98c73..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc
deleted file mode 100644
index 9886ef58..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc
deleted file mode 100644
index d8e77dfb..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc
deleted file mode 100644
index 6aa7bbdc..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc
deleted file mode 100644
index 4ab2e467..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc
deleted file mode 100644
index 7fc1228c..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc
deleted file mode 100644
index e27ff572..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py
deleted file mode 100644
index 87d9f972..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py
+++ /dev/null
@@ -1,386 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Big5 frequency table
-# by Taiwan's Mandarin Promotion Council
-#
-#
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table
-BIG5_TABLE_SIZE = 5376
-# fmt: off
-BIG5_CHAR_TO_FREQ_ORDER = (
- 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16
-3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32
-1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48
- 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64
-3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80
-4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96
-5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112
- 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128
- 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144
- 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160
-2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176
-1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192
-3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208
- 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224
-1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240
-3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256
-2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272
- 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288
-3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304
-1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320
-5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336
- 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352
-5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368
-1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384
- 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400
- 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416
-3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432
-3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448
- 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464
-2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480
-2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496
- 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512
- 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528
-3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544
-1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560
-1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576
-1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592
-2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608
- 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624
-4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640
-1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656
-5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672
-2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688
- 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704
- 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720
- 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736
- 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752
-5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768
- 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784
-1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800
- 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816
- 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832
-5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848
-1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864
- 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880
-3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896
-4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912
-3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928
- 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944
- 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960
-1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976
-4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992
-3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008
-3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024
-2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040
-5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056
-3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072
-5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088
-1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104
-2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120
-1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136
- 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152
-1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168
-4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184
-3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200
- 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216
- 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232
- 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248
-2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264
-5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280
-1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296
-2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312
-1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328
-1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344
-5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360
-5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376
-5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392
-3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408
-4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424
-4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440
-2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456
-5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472
-3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488
- 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504
-5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520
-5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536
-1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552
-2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568
-3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584
-4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600
-5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616
-3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632
-4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648
-1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664
-1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680
-4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696
-1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712
- 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728
-1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744
-1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760
-3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776
- 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792
-5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808
-2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824
-1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840
-1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856
-5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872
- 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888
-4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904
- 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920
-2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936
- 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952
-1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968
-1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984
- 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000
-4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016
-4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032
-1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048
-3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064
-5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080
-5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096
-1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112
-2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128
-1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144
-3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160
-2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176
-3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192
-2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208
-4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224
-4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240
-3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256
- 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272
-3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288
- 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304
-3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320
-4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336
-3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352
-1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368
-5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384
- 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400
-5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416
-1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432
- 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448
-4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464
-4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480
- 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496
-2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512
-2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528
-3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544
-1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560
-4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576
-2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592
-1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608
-1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624
-2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640
-3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656
-1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672
-5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688
-1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704
-4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720
-1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736
- 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752
-1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768
-4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784
-4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800
-2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816
-1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832
-4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848
- 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864
-5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880
-2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896
-3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912
-4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928
- 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944
-5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960
-5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976
-1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992
-4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008
-4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024
-2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040
-3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056
-3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072
-2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088
-1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104
-4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120
-3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136
-3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152
-2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168
-4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184
-5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200
-3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216
-2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232
-3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248
-1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264
-2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280
-3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296
-4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312
-2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328
-2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344
-5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360
-1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376
-2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392
-1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408
-3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424
-4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440
-2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456
-3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472
-3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488
-2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504
-4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520
-2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536
-3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552
-4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568
-5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584
-3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600
- 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616
-1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632
-4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648
-1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664
-4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680
-5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696
- 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712
-5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728
-5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744
-2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760
-3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776
-2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792
-2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808
- 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824
-1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840
-4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856
-3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872
-3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888
- 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904
-2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920
- 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936
-2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952
-4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968
-1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984
-4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000
-1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016
-3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032
- 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048
-3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064
-5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080
-5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096
-3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112
-3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128
-1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144
-2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160
-5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176
-1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192
-1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208
-3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224
- 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240
-1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256
-4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272
-5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288
-2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304
-3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320
- 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336
-1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352
-2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368
-2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384
-5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400
-5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416
-5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432
-2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448
-2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464
-1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480
-4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496
-3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512
-3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528
-4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544
-4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560
-2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576
-2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592
-5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608
-4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624
-5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640
-4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656
- 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672
- 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688
-1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704
-3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720
-4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736
-1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752
-5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768
-2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784
-2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800
-3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816
-5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832
-1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848
-3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864
-5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880
-1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896
-5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912
-2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928
-3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944
-2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960
-3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976
-3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992
-3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008
-4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024
- 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040
-2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056
-4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072
-3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088
-5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104
-1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120
-5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136
- 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152
-1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168
- 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184
-4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200
-1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216
-4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232
-1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248
- 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264
-3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280
-4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296
-5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312
- 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328
-3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344
- 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360
-2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376
-)
-# fmt: on
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py
deleted file mode 100644
index ef09c60e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import Big5DistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import BIG5_SM_MODEL
-
-
-class Big5Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(BIG5_SM_MODEL)
- self.distribution_analyzer = Big5DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "Big5"
-
- @property
- def language(self) -> str:
- return "Chinese"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py
deleted file mode 100644
index 176cb996..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py
+++ /dev/null
@@ -1,261 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Tuple, Union
-
-from .big5freq import (
- BIG5_CHAR_TO_FREQ_ORDER,
- BIG5_TABLE_SIZE,
- BIG5_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .euckrfreq import (
- EUCKR_CHAR_TO_FREQ_ORDER,
- EUCKR_TABLE_SIZE,
- EUCKR_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .euctwfreq import (
- EUCTW_CHAR_TO_FREQ_ORDER,
- EUCTW_TABLE_SIZE,
- EUCTW_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .gb2312freq import (
- GB2312_CHAR_TO_FREQ_ORDER,
- GB2312_TABLE_SIZE,
- GB2312_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .jisfreq import (
- JIS_CHAR_TO_FREQ_ORDER,
- JIS_TABLE_SIZE,
- JIS_TYPICAL_DISTRIBUTION_RATIO,
-)
-from .johabfreq import JOHAB_TO_EUCKR_ORDER_TABLE
-
-
-class CharDistributionAnalysis:
- ENOUGH_DATA_THRESHOLD = 1024
- SURE_YES = 0.99
- SURE_NO = 0.01
- MINIMUM_DATA_THRESHOLD = 3
-
- def __init__(self) -> None:
- # Mapping table to get frequency order from char order (get from
- # GetOrder())
- self._char_to_freq_order: Tuple[int, ...] = tuple()
- self._table_size = 0 # Size of above table
- # This is a constant value which varies from language to language,
- # used in calculating confidence. See
- # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
- # for further detail.
- self.typical_distribution_ratio = 0.0
- self._done = False
- self._total_chars = 0
- self._freq_chars = 0
- self.reset()
-
- def reset(self) -> None:
- """reset analyser, clear any state"""
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
- self._total_chars = 0 # Total characters encountered
- # The number of characters whose frequency order is less than 512
- self._freq_chars = 0
-
- def feed(self, char: Union[bytes, bytearray], char_len: int) -> None:
- """feed a character with known length"""
- if char_len == 2:
- # we only care about 2-bytes character in our distribution analysis
- order = self.get_order(char)
- else:
- order = -1
- if order >= 0:
- self._total_chars += 1
- # order is valid
- if order < self._table_size:
- if 512 > self._char_to_freq_order[order]:
- self._freq_chars += 1
-
- def get_confidence(self) -> float:
- """return confidence based on existing data"""
- # if we didn't receive any character in our consideration range,
- # return negative answer
- if self._total_chars <= 0 or self._freq_chars <= self.MINIMUM_DATA_THRESHOLD:
- return self.SURE_NO
-
- if self._total_chars != self._freq_chars:
- r = self._freq_chars / (
- (self._total_chars - self._freq_chars) * self.typical_distribution_ratio
- )
- if r < self.SURE_YES:
- return r
-
- # normalize confidence (we don't want to be 100% sure)
- return self.SURE_YES
-
- def got_enough_data(self) -> bool:
- # It is not necessary to receive all data to draw conclusion.
- # For charset detection, certain amount of data is enough
- return self._total_chars > self.ENOUGH_DATA_THRESHOLD
-
- def get_order(self, _: Union[bytes, bytearray]) -> int:
- # We do not handle characters based on the original encoding string,
- # but convert this encoding string to a number, here called order.
- # This allows multiple encodings of a language to share one frequency
- # table.
- return -1
-
-
-class EUCTWDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCTW_CHAR_TO_FREQ_ORDER
- self._table_size = EUCTW_TABLE_SIZE
- self.typical_distribution_ratio = EUCTW_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-TW encoding, we are interested
- # first byte range: 0xc4 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xC4:
- return 94 * (first_char - 0xC4) + byte_str[1] - 0xA1
- return -1
-
-
-class EUCKRDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
- self._table_size = EUCKR_TABLE_SIZE
- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-KR encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char = byte_str[0]
- if first_char >= 0xB0:
- return 94 * (first_char - 0xB0) + byte_str[1] - 0xA1
- return -1
-
-
-class JOHABDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = EUCKR_CHAR_TO_FREQ_ORDER
- self._table_size = EUCKR_TABLE_SIZE
- self.typical_distribution_ratio = EUCKR_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- first_char = byte_str[0]
- if 0x88 <= first_char < 0xD4:
- code = first_char * 256 + byte_str[1]
- return JOHAB_TO_EUCKR_ORDER_TABLE.get(code, -1)
- return -1
-
-
-class GB2312DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = GB2312_CHAR_TO_FREQ_ORDER
- self._table_size = GB2312_TABLE_SIZE
- self.typical_distribution_ratio = GB2312_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for GB2312 encoding, we are interested
- # first byte range: 0xb0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if (first_char >= 0xB0) and (second_char >= 0xA1):
- return 94 * (first_char - 0xB0) + second_char - 0xA1
- return -1
-
-
-class Big5DistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = BIG5_CHAR_TO_FREQ_ORDER
- self._table_size = BIG5_TABLE_SIZE
- self.typical_distribution_ratio = BIG5_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for big5 encoding, we are interested
- # first byte range: 0xa4 -- 0xfe
- # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if first_char >= 0xA4:
- if second_char >= 0xA1:
- return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63
- return 157 * (first_char - 0xA4) + second_char - 0x40
- return -1
-
-
-class SJISDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for sjis encoding, we are interested
- # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe
- # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe
- # no validation needed here. State machine has done that
- first_char, second_char = byte_str[0], byte_str[1]
- if 0x81 <= first_char <= 0x9F:
- order = 188 * (first_char - 0x81)
- elif 0xE0 <= first_char <= 0xEF:
- order = 188 * (first_char - 0xE0 + 31)
- else:
- return -1
- order = order + second_char - 0x40
- if second_char > 0x7F:
- order = -1
- return order
-
-
-class EUCJPDistributionAnalysis(CharDistributionAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._char_to_freq_order = JIS_CHAR_TO_FREQ_ORDER
- self._table_size = JIS_TABLE_SIZE
- self.typical_distribution_ratio = JIS_TYPICAL_DISTRIBUTION_RATIO
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> int:
- # for euc-JP encoding, we are interested
- # first byte range: 0xa0 -- 0xfe
- # second byte range: 0xa1 -- 0xfe
- # no validation needed here. State machine has done that
- char = byte_str[0]
- if char >= 0xA0:
- return 94 * (char - 0xA1) + byte_str[1] - 0xA1
- return -1
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py
deleted file mode 100644
index 6def56b4..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py
+++ /dev/null
@@ -1,106 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import LanguageFilter, ProbingState
-
-
-class CharSetGroupProber(CharSetProber):
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self._active_num = 0
- self.probers: List[CharSetProber] = []
- self._best_guess_prober: Optional[CharSetProber] = None
-
- def reset(self) -> None:
- super().reset()
- self._active_num = 0
- for prober in self.probers:
- prober.reset()
- prober.active = True
- self._active_num += 1
- self._best_guess_prober = None
-
- @property
- def charset_name(self) -> Optional[str]:
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.charset_name
-
- @property
- def language(self) -> Optional[str]:
- if not self._best_guess_prober:
- self.get_confidence()
- if not self._best_guess_prober:
- return None
- return self._best_guess_prober.language
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for prober in self.probers:
- if not prober.active:
- continue
- state = prober.feed(byte_str)
- if not state:
- continue
- if state == ProbingState.FOUND_IT:
- self._best_guess_prober = prober
- self._state = ProbingState.FOUND_IT
- return self.state
- if state == ProbingState.NOT_ME:
- prober.active = False
- self._active_num -= 1
- if self._active_num <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- return self.state
-
- def get_confidence(self) -> float:
- state = self.state
- if state == ProbingState.FOUND_IT:
- return 0.99
- if state == ProbingState.NOT_ME:
- return 0.01
- best_conf = 0.0
- self._best_guess_prober = None
- for prober in self.probers:
- if not prober.active:
- self.logger.debug("%s not active", prober.charset_name)
- continue
- conf = prober.get_confidence()
- self.logger.debug(
- "%s %s confidence = %s", prober.charset_name, prober.language, conf
- )
- if best_conf < conf:
- best_conf = conf
- self._best_guess_prober = prober
- if not self._best_guess_prober:
- return 0.0
- return best_conf
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py
deleted file mode 100644
index a103ca11..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py
+++ /dev/null
@@ -1,147 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-import re
-from typing import Optional, Union
-
-from .enums import LanguageFilter, ProbingState
-
-INTERNATIONAL_WORDS_PATTERN = re.compile(
- b"[a-zA-Z]*[\x80-\xFF]+[a-zA-Z]*[^a-zA-Z\x80-\xFF]?"
-)
-
-
-class CharSetProber:
-
- SHORTCUT_THRESHOLD = 0.95
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- self._state = ProbingState.DETECTING
- self.active = True
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
-
- def reset(self) -> None:
- self._state = ProbingState.DETECTING
-
- @property
- def charset_name(self) -> Optional[str]:
- return None
-
- @property
- def language(self) -> Optional[str]:
- raise NotImplementedError
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- raise NotImplementedError
-
- @property
- def state(self) -> ProbingState:
- return self._state
-
- def get_confidence(self) -> float:
- return 0.0
-
- @staticmethod
- def filter_high_byte_only(buf: Union[bytes, bytearray]) -> bytes:
- buf = re.sub(b"([\x00-\x7F])+", b" ", buf)
- return buf
-
- @staticmethod
- def filter_international_words(buf: Union[bytes, bytearray]) -> bytearray:
- """
- We define three types of bytes:
- alphabet: english alphabets [a-zA-Z]
- international: international characters [\x80-\xFF]
- marker: everything else [^a-zA-Z\x80-\xFF]
- The input buffer can be thought to contain a series of words delimited
- by markers. This function works to filter all words that contain at
- least one international character. All contiguous sequences of markers
- are replaced by a single space ascii character.
- This filter applies to all scripts which do not use English characters.
- """
- filtered = bytearray()
-
- # This regex expression filters out only words that have at-least one
- # international character. The word may include one marker character at
- # the end.
- words = INTERNATIONAL_WORDS_PATTERN.findall(buf)
-
- for word in words:
- filtered.extend(word[:-1])
-
- # If the last character in the word is a marker, replace it with a
- # space as markers shouldn't affect our analysis (they are used
- # similarly across all languages and may thus have similar
- # frequencies).
- last_char = word[-1:]
- if not last_char.isalpha() and last_char < b"\x80":
- last_char = b" "
- filtered.extend(last_char)
-
- return filtered
-
- @staticmethod
- def remove_xml_tags(buf: Union[bytes, bytearray]) -> bytes:
- """
- Returns a copy of ``buf`` that retains only the sequences of English
- alphabet and high byte characters that are not between <> characters.
- This filter can be applied to all scripts which contain both English
- characters and extended ASCII characters, but is currently only used by
- ``Latin1Prober``.
- """
- filtered = bytearray()
- in_tag = False
- prev = 0
- buf = memoryview(buf).cast("c")
-
- for curr, buf_char in enumerate(buf):
- # Check if we're coming out of or entering an XML tag
-
- # https://github.com/python/typeshed/issues/8182
- if buf_char == b">": # type: ignore[comparison-overlap]
- prev = curr + 1
- in_tag = False
- # https://github.com/python/typeshed/issues/8182
- elif buf_char == b"<": # type: ignore[comparison-overlap]
- if curr > prev and not in_tag:
- # Keep everything after last non-extended-ASCII,
- # non-alphabetic character
- filtered.extend(buf[prev:curr])
- # Output a space to delimit stretch we kept
- filtered.extend(b" ")
- in_tag = True
-
- # If we're not in a tag...
- if not in_tag:
- # Keep everything after last non-extended-ASCII, non-alphabetic
- # character
- filtered.extend(buf[prev:])
-
- return filtered
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index 83552096..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc
deleted file mode 100644
index a7bee62c..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py
deleted file mode 100644
index 43f6e144..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py
+++ /dev/null
@@ -1,112 +0,0 @@
-"""
-Script which takes one or more file paths and reports on their detected
-encodings
-
-Example::
-
- % chardetect somefile someotherfile
- somefile: windows-1252 with confidence 0.5
- someotherfile: ascii with confidence 1.0
-
-If no paths are provided, it takes its input from stdin.
-
-"""
-
-
-import argparse
-import sys
-from typing import Iterable, List, Optional
-
-from .. import __version__
-from ..universaldetector import UniversalDetector
-
-
-def description_of(
- lines: Iterable[bytes],
- name: str = "stdin",
- minimal: bool = False,
- should_rename_legacy: bool = False,
-) -> Optional[str]:
- """
- Return a string describing the probable encoding of a file or
- list of strings.
-
- :param lines: The lines to get the encoding of.
- :type lines: Iterable of bytes
- :param name: Name of file or collection of lines
- :type name: str
- :param should_rename_legacy: Should we rename legacy encodings to
- their more modern equivalents?
- :type should_rename_legacy: ``bool``
- """
- u = UniversalDetector(should_rename_legacy=should_rename_legacy)
- for line in lines:
- line = bytearray(line)
- u.feed(line)
- # shortcut out of the loop to save reading further - particularly useful if we read a BOM.
- if u.done:
- break
- u.close()
- result = u.result
- if minimal:
- return result["encoding"]
- if result["encoding"]:
- return f'{name}: {result["encoding"]} with confidence {result["confidence"]}'
- return f"{name}: no result"
-
-
-def main(argv: Optional[List[str]] = None) -> None:
- """
- Handles command line arguments and gets things started.
-
- :param argv: List of arguments, as if specified on the command-line.
- If None, ``sys.argv[1:]`` is used instead.
- :type argv: list of str
- """
- # Get command line arguments
- parser = argparse.ArgumentParser(
- description=(
- "Takes one or more file paths and reports their detected encodings"
- )
- )
- parser.add_argument(
- "input",
- help="File whose encoding we would like to determine. (default: stdin)",
- type=argparse.FileType("rb"),
- nargs="*",
- default=[sys.stdin.buffer],
- )
- parser.add_argument(
- "--minimal",
- help="Print only the encoding to standard output",
- action="store_true",
- )
- parser.add_argument(
- "-l",
- "--legacy",
- help="Rename legacy encodings to more modern ones.",
- action="store_true",
- )
- parser.add_argument(
- "--version", action="version", version=f"%(prog)s {__version__}"
- )
- args = parser.parse_args(argv)
-
- for f in args.input:
- if f.isatty():
- print(
- "You are running chardetect interactively. Press "
- "CTRL-D twice at the start of a blank line to signal the "
- "end of your input. If you want help, run chardetect "
- "--help\n",
- file=sys.stderr,
- )
- print(
- description_of(
- f, f.name, minimal=args.minimal, should_rename_legacy=args.legacy
- )
- )
-
-
-if __name__ == "__main__":
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py
deleted file mode 100644
index 8ed4a877..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py
+++ /dev/null
@@ -1,90 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-import logging
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-
-class CodingStateMachine:
- """
- A state machine to verify a byte sequence for a particular encoding. For
- each byte the detector receives, it will feed that byte to every active
- state machine available, one byte at a time. The state machine changes its
- state based on its previous state and the byte it receives. There are 3
- states in a state machine that are of interest to an auto-detector:
-
- START state: This is the state to start with, or a legal byte sequence
- (i.e. a valid code point) for character has been identified.
-
- ME state: This indicates that the state machine identified a byte sequence
- that is specific to the charset it is designed for and that
- there is no other possible encoding which can contain this byte
- sequence. This will to lead to an immediate positive answer for
- the detector.
-
- ERROR state: This indicates the state machine identified an illegal byte
- sequence for that encoding. This will lead to an immediate
- negative answer for this encoding. Detector will exclude this
- encoding from consideration from here on.
- """
-
- def __init__(self, sm: CodingStateMachineDict) -> None:
- self._model = sm
- self._curr_byte_pos = 0
- self._curr_char_len = 0
- self._curr_state = MachineState.START
- self.active = True
- self.logger = logging.getLogger(__name__)
- self.reset()
-
- def reset(self) -> None:
- self._curr_state = MachineState.START
-
- def next_state(self, c: int) -> int:
- # for each byte we get its class
- # if it is first byte, we also get byte length
- byte_class = self._model["class_table"][c]
- if self._curr_state == MachineState.START:
- self._curr_byte_pos = 0
- self._curr_char_len = self._model["char_len_table"][byte_class]
- # from byte's class and state_table, we get its next state
- curr_state = self._curr_state * self._model["class_factor"] + byte_class
- self._curr_state = self._model["state_table"][curr_state]
- self._curr_byte_pos += 1
- return self._curr_state
-
- def get_current_charlen(self) -> int:
- return self._curr_char_len
-
- def get_coding_state_machine(self) -> str:
- return self._model["name"]
-
- @property
- def language(self) -> str:
- return self._model["language"]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py
deleted file mode 100644
index 7a3c4c7e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py
+++ /dev/null
@@ -1,19 +0,0 @@
-from typing import TYPE_CHECKING, Tuple
-
-if TYPE_CHECKING:
- # TypedDict was introduced in Python 3.8.
- #
- # TODO: Remove the else block and TYPE_CHECKING check when dropping support
- # for Python 3.7.
- from typing import TypedDict
-
- class CodingStateMachineDict(TypedDict, total=False):
- class_table: Tuple[int, ...]
- class_factor: int
- state_table: Tuple[int, ...]
- char_len_table: Tuple[int, ...]
- name: str
- language: str # Optional key
-
-else:
- CodingStateMachineDict = dict
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py
deleted file mode 100644
index fa7307ed..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py
+++ /dev/null
@@ -1,49 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import CP949_SM_MODEL
-
-
-class CP949Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(CP949_SM_MODEL)
- # NOTE: CP949 is a superset of EUC-KR, so the distribution should be
- # not different.
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "CP949"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py
deleted file mode 100644
index 5e3e1982..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py
+++ /dev/null
@@ -1,85 +0,0 @@
-"""
-All of the Enums that are used throughout the chardet package.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-from enum import Enum, Flag
-
-
-class InputState:
- """
- This enum represents the different states a universal detector can be in.
- """
-
- PURE_ASCII = 0
- ESC_ASCII = 1
- HIGH_BYTE = 2
-
-
-class LanguageFilter(Flag):
- """
- This enum represents the different language filters we can apply to a
- ``UniversalDetector``.
- """
-
- NONE = 0x00
- CHINESE_SIMPLIFIED = 0x01
- CHINESE_TRADITIONAL = 0x02
- JAPANESE = 0x04
- KOREAN = 0x08
- NON_CJK = 0x10
- ALL = 0x1F
- CHINESE = CHINESE_SIMPLIFIED | CHINESE_TRADITIONAL
- CJK = CHINESE | JAPANESE | KOREAN
-
-
-class ProbingState(Enum):
- """
- This enum represents the different states a prober can be in.
- """
-
- DETECTING = 0
- FOUND_IT = 1
- NOT_ME = 2
-
-
-class MachineState:
- """
- This enum represents the different states a state machine can be in.
- """
-
- START = 0
- ERROR = 1
- ITS_ME = 2
-
-
-class SequenceLikelihood:
- """
- This enum represents the likelihood of a character following the previous one.
- """
-
- NEGATIVE = 0
- UNLIKELY = 1
- LIKELY = 2
- POSITIVE = 3
-
- @classmethod
- def get_num_categories(cls) -> int:
- """:returns: The number of likelihood categories in the enum."""
- return 4
-
-
-class CharacterCategory:
- """
- This enum represents the different categories language models for
- ``SingleByteCharsetProber`` put characters into.
-
- Anything less than CONTROL is considered a letter.
- """
-
- UNDEFINED = 255
- LINE_BREAK = 254
- SYMBOL = 253
- DIGIT = 252
- CONTROL = 251
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py
deleted file mode 100644
index fd713830..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py
+++ /dev/null
@@ -1,102 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, MachineState, ProbingState
-from .escsm import (
- HZ_SM_MODEL,
- ISO2022CN_SM_MODEL,
- ISO2022JP_SM_MODEL,
- ISO2022KR_SM_MODEL,
-)
-
-
-class EscCharSetProber(CharSetProber):
- """
- This CharSetProber uses a "code scheme" approach for detecting encodings,
- whereby easily recognizable escape or shift sequences are relied on to
- identify these encodings.
- """
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.coding_sm = []
- if self.lang_filter & LanguageFilter.CHINESE_SIMPLIFIED:
- self.coding_sm.append(CodingStateMachine(HZ_SM_MODEL))
- self.coding_sm.append(CodingStateMachine(ISO2022CN_SM_MODEL))
- if self.lang_filter & LanguageFilter.JAPANESE:
- self.coding_sm.append(CodingStateMachine(ISO2022JP_SM_MODEL))
- if self.lang_filter & LanguageFilter.KOREAN:
- self.coding_sm.append(CodingStateMachine(ISO2022KR_SM_MODEL))
- self.active_sm_count = 0
- self._detected_charset: Optional[str] = None
- self._detected_language: Optional[str] = None
- self._state = ProbingState.DETECTING
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- for coding_sm in self.coding_sm:
- coding_sm.active = True
- coding_sm.reset()
- self.active_sm_count = len(self.coding_sm)
- self._detected_charset = None
- self._detected_language = None
-
- @property
- def charset_name(self) -> Optional[str]:
- return self._detected_charset
-
- @property
- def language(self) -> Optional[str]:
- return self._detected_language
-
- def get_confidence(self) -> float:
- return 0.99 if self._detected_charset else 0.00
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- for coding_sm in self.coding_sm:
- if not coding_sm.active:
- continue
- coding_state = coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- coding_sm.active = False
- self.active_sm_count -= 1
- if self.active_sm_count <= 0:
- self._state = ProbingState.NOT_ME
- return self.state
- elif coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- self._detected_charset = coding_sm.get_coding_state_machine()
- self._detected_language = coding_sm.language
- return self.state
-
- return self.state
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py
deleted file mode 100644
index 11d4adf7..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py
+++ /dev/null
@@ -1,261 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-# fmt: off
-HZ_CLS = (
- 1, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 4, 0, 5, 2, 0, # 78 - 7f
- 1, 1, 1, 1, 1, 1, 1, 1, # 80 - 87
- 1, 1, 1, 1, 1, 1, 1, 1, # 88 - 8f
- 1, 1, 1, 1, 1, 1, 1, 1, # 90 - 97
- 1, 1, 1, 1, 1, 1, 1, 1, # 98 - 9f
- 1, 1, 1, 1, 1, 1, 1, 1, # a0 - a7
- 1, 1, 1, 1, 1, 1, 1, 1, # a8 - af
- 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7
- 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf
- 1, 1, 1, 1, 1, 1, 1, 1, # c0 - c7
- 1, 1, 1, 1, 1, 1, 1, 1, # c8 - cf
- 1, 1, 1, 1, 1, 1, 1, 1, # d0 - d7
- 1, 1, 1, 1, 1, 1, 1, 1, # d8 - df
- 1, 1, 1, 1, 1, 1, 1, 1, # e0 - e7
- 1, 1, 1, 1, 1, 1, 1, 1, # e8 - ef
- 1, 1, 1, 1, 1, 1, 1, 1, # f0 - f7
- 1, 1, 1, 1, 1, 1, 1, 1, # f8 - ff
-)
-
-HZ_ST = (
-MachineState.START, MachineState.ERROR, 3, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07
-MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f
-MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.START, MachineState.START, 4, MachineState.ERROR, # 10-17
- 5, MachineState.ERROR, 6, MachineState.ERROR, 5, 5, 4, MachineState.ERROR, # 18-1f
- 4, MachineState.ERROR, 4, 4, 4, MachineState.ERROR, 4, MachineState.ERROR, # 20-27
- 4, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 28-2f
-)
-# fmt: on
-
-HZ_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-HZ_SM_MODEL: CodingStateMachineDict = {
- "class_table": HZ_CLS,
- "class_factor": 6,
- "state_table": HZ_ST,
- "char_len_table": HZ_CHAR_LEN_TABLE,
- "name": "HZ-GB-2312",
- "language": "Chinese",
-}
-
-# fmt: off
-ISO2022CN_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 4, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022CN_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07
- MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f
- MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, # 18-1f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 20-27
- 5, 6, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 28-2f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 30-37
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, # 38-3f
-)
-# fmt: on
-
-ISO2022CN_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022CN_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022CN_CLS,
- "class_factor": 9,
- "state_table": ISO2022CN_ST,
- "char_len_table": ISO2022CN_CHAR_LEN_TABLE,
- "name": "ISO-2022-CN",
- "language": "Chinese",
-}
-
-# fmt: off
-ISO2022JP_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 2, 2, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 7, 0, 0, 0, # 20 - 27
- 3, 0, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 6, 0, 4, 0, 8, 0, 0, 0, # 40 - 47
- 0, 9, 5, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022JP_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 00-07
- MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 08-0f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 10-17
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, # 18-1f
- MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 20-27
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 6, MachineState.ITS_ME, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, # 28-2f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, # 30-37
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 38-3f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ERROR, MachineState.START, MachineState.START, # 40-47
-)
-# fmt: on
-
-ISO2022JP_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
-
-ISO2022JP_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022JP_CLS,
- "class_factor": 10,
- "state_table": ISO2022JP_ST,
- "char_len_table": ISO2022JP_CHAR_LEN_TABLE,
- "name": "ISO-2022-JP",
- "language": "Japanese",
-}
-
-# fmt: off
-ISO2022KR_CLS = (
- 2, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 0, 0, 0, 0, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 1, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 3, 0, 0, 0, # 20 - 27
- 0, 4, 0, 0, 0, 0, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 5, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 2, 2, 2, 2, 2, 2, 2, 2, # 80 - 87
- 2, 2, 2, 2, 2, 2, 2, 2, # 88 - 8f
- 2, 2, 2, 2, 2, 2, 2, 2, # 90 - 97
- 2, 2, 2, 2, 2, 2, 2, 2, # 98 - 9f
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 2, # f8 - ff
-)
-
-ISO2022KR_ST = (
- MachineState.START, 3, MachineState.ERROR, MachineState.START, MachineState.START, MachineState.START, MachineState.ERROR, MachineState.ERROR, # 00-07
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ITS_ME, # 08-0f
- MachineState.ITS_ME, MachineState.ITS_ME, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 4, MachineState.ERROR, MachineState.ERROR, # 10-17
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, 5, MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, # 18-1f
- MachineState.ERROR, MachineState.ERROR, MachineState.ERROR, MachineState.ITS_ME, MachineState.START, MachineState.START, MachineState.START, MachineState.START, # 20-27
-)
-# fmt: on
-
-ISO2022KR_CHAR_LEN_TABLE = (0, 0, 0, 0, 0, 0)
-
-ISO2022KR_SM_MODEL: CodingStateMachineDict = {
- "class_table": ISO2022KR_CLS,
- "class_factor": 6,
- "state_table": ISO2022KR_ST,
- "char_len_table": ISO2022KR_CHAR_LEN_TABLE,
- "name": "ISO-2022-KR",
- "language": "Korean",
-}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
deleted file mode 100644
index 39487f40..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+++ /dev/null
@@ -1,102 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .chardistribution import EUCJPDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .jpcntx import EUCJPContextAnalysis
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCJP_SM_MODEL
-
-
-class EUCJPProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCJP_SM_MODEL)
- self.distribution_analyzer = EUCJPDistributionAnalysis()
- self.context_analyzer = EUCJPContextAnalysis()
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-JP"
-
- @property
- def language(self) -> str:
- return "Japanese"
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- # PY3K: byte_str is a byte array, so byte is an int, not a byte
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.context_analyzer.feed(self._last_char, char_len)
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.context_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
-
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py
deleted file mode 100644
index 7dc3b103..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py
+++ /dev/null
@@ -1,196 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-
-# 128 --> 0.79
-# 256 --> 0.92
-# 512 --> 0.986
-# 1024 --> 0.99944
-# 2048 --> 0.99999
-#
-# Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24
-# Random Distribution Ration = 512 / (2350-512) = 0.279.
-#
-# Typical Distribution Ratio
-
-EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0
-
-EUCKR_TABLE_SIZE = 2352
-
-# Char to FreqOrder table ,
-# fmt: off
-EUCKR_CHAR_TO_FREQ_ORDER = (
- 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87,
-1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398,
-1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734,
- 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739,
- 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622,
- 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750,
-1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856,
- 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205,
- 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779,
-1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19,
-1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567,
-1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797,
-1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802,
-1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899,
- 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818,
-1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409,
-1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697,
-1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770,
-1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723,
- 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416,
-1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300,
- 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083,
- 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857,
-1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871,
- 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420,
-1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885,
- 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889,
- 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893,
-1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317,
-1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841,
-1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910,
-1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610,
- 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375,
-1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939,
- 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870,
- 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934,
-1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888,
-1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950,
-1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065,
-1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002,
-1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965,
-1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467,
- 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285,
- 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7,
- 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979,
-1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985,
- 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994,
-1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250,
- 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824,
- 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003,
-2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745,
- 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61,
- 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023,
-2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032,
-2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912,
-2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224,
- 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012,
- 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050,
-2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681,
- 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414,
-1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068,
-2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075,
-1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850,
-2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606,
-2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449,
-1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452,
- 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112,
-2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121,
-2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130,
- 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274,
- 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139,
-2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721,
-1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298,
-2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463,
-2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747,
-2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285,
-2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187,
-2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10,
-2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350,
-1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201,
-2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972,
-2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219,
-2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233,
-2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242,
-2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247,
-1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178,
-1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255,
-2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259,
-1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262,
-2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702,
-1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273,
- 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541,
-2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117,
- 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187,
-2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800,
- 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312,
-2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229,
-2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315,
- 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484,
-2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170,
-1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335,
- 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601,
-1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395,
-2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354,
-1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476,
-2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035,
- 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498,
-2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310,
-1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389,
-2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504,
-1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505,
-2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145,
-1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624,
- 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700,
-2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221,
-2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377,
- 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448,
- 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485,
-1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705,
-1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465,
- 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471,
-2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997,
-2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486,
- 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494,
- 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771,
- 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323,
-2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491,
- 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510,
- 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519,
-2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532,
-2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199,
- 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544,
-2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247,
-1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441,
- 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562,
-2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362,
-2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583,
-2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465,
- 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431,
- 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151,
- 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596,
-2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406,
-2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611,
-2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619,
-1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628,
-2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042,
- 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256
-)
-# fmt: on
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py
deleted file mode 100644
index 1fc5de04..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCKRDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCKR_SM_MODEL
-
-
-class EUCKRProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCKR_SM_MODEL)
- self.distribution_analyzer = EUCKRDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-KR"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py
deleted file mode 100644
index 4900ccc1..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py
+++ /dev/null
@@ -1,388 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# EUCTW frequency table
-# Converted from big5 work
-# by Taiwan's Mandarin Promotion Council
-#
-
-# 128 --> 0.42261
-# 256 --> 0.57851
-# 512 --> 0.74851
-# 1024 --> 0.89384
-# 2048 --> 0.97583
-#
-# Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98
-# Random Distribution Ration = 512/(5401-512)=0.105
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR
-
-EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75
-
-# Char to FreqOrder table
-EUCTW_TABLE_SIZE = 5376
-
-# fmt: off
-EUCTW_CHAR_TO_FREQ_ORDER = (
- 1, 1800, 1506, 255, 1431, 198, 9, 82, 6, 7310, 177, 202, 3615, 1256, 2808, 110, # 2742
- 3735, 33, 3241, 261, 76, 44, 2113, 16, 2931, 2184, 1176, 659, 3868, 26, 3404, 2643, # 2758
- 1198, 3869, 3313, 4060, 410, 2211, 302, 590, 361, 1963, 8, 204, 58, 4296, 7311, 1931, # 2774
- 63, 7312, 7313, 317, 1614, 75, 222, 159, 4061, 2412, 1480, 7314, 3500, 3068, 224, 2809, # 2790
- 3616, 3, 10, 3870, 1471, 29, 2774, 1135, 2852, 1939, 873, 130, 3242, 1123, 312, 7315, # 2806
- 4297, 2051, 507, 252, 682, 7316, 142, 1914, 124, 206, 2932, 34, 3501, 3173, 64, 604, # 2822
- 7317, 2494, 1976, 1977, 155, 1990, 645, 641, 1606, 7318, 3405, 337, 72, 406, 7319, 80, # 2838
- 630, 238, 3174, 1509, 263, 939, 1092, 2644, 756, 1440, 1094, 3406, 449, 69, 2969, 591, # 2854
- 179, 2095, 471, 115, 2034, 1843, 60, 50, 2970, 134, 806, 1868, 734, 2035, 3407, 180, # 2870
- 995, 1607, 156, 537, 2893, 688, 7320, 319, 1305, 779, 2144, 514, 2374, 298, 4298, 359, # 2886
- 2495, 90, 2707, 1338, 663, 11, 906, 1099, 2545, 20, 2436, 182, 532, 1716, 7321, 732, # 2902
- 1376, 4062, 1311, 1420, 3175, 25, 2312, 1056, 113, 399, 382, 1949, 242, 3408, 2467, 529, # 2918
- 3243, 475, 1447, 3617, 7322, 117, 21, 656, 810, 1297, 2295, 2329, 3502, 7323, 126, 4063, # 2934
- 706, 456, 150, 613, 4299, 71, 1118, 2036, 4064, 145, 3069, 85, 835, 486, 2114, 1246, # 2950
- 1426, 428, 727, 1285, 1015, 800, 106, 623, 303, 1281, 7324, 2127, 2354, 347, 3736, 221, # 2966
- 3503, 3110, 7325, 1955, 1153, 4065, 83, 296, 1199, 3070, 192, 624, 93, 7326, 822, 1897, # 2982
- 2810, 3111, 795, 2064, 991, 1554, 1542, 1592, 27, 43, 2853, 859, 139, 1456, 860, 4300, # 2998
- 437, 712, 3871, 164, 2392, 3112, 695, 211, 3017, 2096, 195, 3872, 1608, 3504, 3505, 3618, # 3014
- 3873, 234, 811, 2971, 2097, 3874, 2229, 1441, 3506, 1615, 2375, 668, 2076, 1638, 305, 228, # 3030
- 1664, 4301, 467, 415, 7327, 262, 2098, 1593, 239, 108, 300, 200, 1033, 512, 1247, 2077, # 3046
- 7328, 7329, 2173, 3176, 3619, 2673, 593, 845, 1062, 3244, 88, 1723, 2037, 3875, 1950, 212, # 3062
- 266, 152, 149, 468, 1898, 4066, 4302, 77, 187, 7330, 3018, 37, 5, 2972, 7331, 3876, # 3078
- 7332, 7333, 39, 2517, 4303, 2894, 3177, 2078, 55, 148, 74, 4304, 545, 483, 1474, 1029, # 3094
- 1665, 217, 1869, 1531, 3113, 1104, 2645, 4067, 24, 172, 3507, 900, 3877, 3508, 3509, 4305, # 3110
- 32, 1408, 2811, 1312, 329, 487, 2355, 2247, 2708, 784, 2674, 4, 3019, 3314, 1427, 1788, # 3126
- 188, 109, 499, 7334, 3620, 1717, 1789, 888, 1217, 3020, 4306, 7335, 3510, 7336, 3315, 1520, # 3142
- 3621, 3878, 196, 1034, 775, 7337, 7338, 929, 1815, 249, 439, 38, 7339, 1063, 7340, 794, # 3158
- 3879, 1435, 2296, 46, 178, 3245, 2065, 7341, 2376, 7342, 214, 1709, 4307, 804, 35, 707, # 3174
- 324, 3622, 1601, 2546, 140, 459, 4068, 7343, 7344, 1365, 839, 272, 978, 2257, 2572, 3409, # 3190
- 2128, 1363, 3623, 1423, 697, 100, 3071, 48, 70, 1231, 495, 3114, 2193, 7345, 1294, 7346, # 3206
- 2079, 462, 586, 1042, 3246, 853, 256, 988, 185, 2377, 3410, 1698, 434, 1084, 7347, 3411, # 3222
- 314, 2615, 2775, 4308, 2330, 2331, 569, 2280, 637, 1816, 2518, 757, 1162, 1878, 1616, 3412, # 3238
- 287, 1577, 2115, 768, 4309, 1671, 2854, 3511, 2519, 1321, 3737, 909, 2413, 7348, 4069, 933, # 3254
- 3738, 7349, 2052, 2356, 1222, 4310, 765, 2414, 1322, 786, 4311, 7350, 1919, 1462, 1677, 2895, # 3270
- 1699, 7351, 4312, 1424, 2437, 3115, 3624, 2590, 3316, 1774, 1940, 3413, 3880, 4070, 309, 1369, # 3286
- 1130, 2812, 364, 2230, 1653, 1299, 3881, 3512, 3882, 3883, 2646, 525, 1085, 3021, 902, 2000, # 3302
- 1475, 964, 4313, 421, 1844, 1415, 1057, 2281, 940, 1364, 3116, 376, 4314, 4315, 1381, 7, # 3318
- 2520, 983, 2378, 336, 1710, 2675, 1845, 321, 3414, 559, 1131, 3022, 2742, 1808, 1132, 1313, # 3334
- 265, 1481, 1857, 7352, 352, 1203, 2813, 3247, 167, 1089, 420, 2814, 776, 792, 1724, 3513, # 3350
- 4071, 2438, 3248, 7353, 4072, 7354, 446, 229, 333, 2743, 901, 3739, 1200, 1557, 4316, 2647, # 3366
- 1920, 395, 2744, 2676, 3740, 4073, 1835, 125, 916, 3178, 2616, 4317, 7355, 7356, 3741, 7357, # 3382
- 7358, 7359, 4318, 3117, 3625, 1133, 2547, 1757, 3415, 1510, 2313, 1409, 3514, 7360, 2145, 438, # 3398
- 2591, 2896, 2379, 3317, 1068, 958, 3023, 461, 311, 2855, 2677, 4074, 1915, 3179, 4075, 1978, # 3414
- 383, 750, 2745, 2617, 4076, 274, 539, 385, 1278, 1442, 7361, 1154, 1964, 384, 561, 210, # 3430
- 98, 1295, 2548, 3515, 7362, 1711, 2415, 1482, 3416, 3884, 2897, 1257, 129, 7363, 3742, 642, # 3446
- 523, 2776, 2777, 2648, 7364, 141, 2231, 1333, 68, 176, 441, 876, 907, 4077, 603, 2592, # 3462
- 710, 171, 3417, 404, 549, 18, 3118, 2393, 1410, 3626, 1666, 7365, 3516, 4319, 2898, 4320, # 3478
- 7366, 2973, 368, 7367, 146, 366, 99, 871, 3627, 1543, 748, 807, 1586, 1185, 22, 2258, # 3494
- 379, 3743, 3180, 7368, 3181, 505, 1941, 2618, 1991, 1382, 2314, 7369, 380, 2357, 218, 702, # 3510
- 1817, 1248, 3418, 3024, 3517, 3318, 3249, 7370, 2974, 3628, 930, 3250, 3744, 7371, 59, 7372, # 3526
- 585, 601, 4078, 497, 3419, 1112, 1314, 4321, 1801, 7373, 1223, 1472, 2174, 7374, 749, 1836, # 3542
- 690, 1899, 3745, 1772, 3885, 1476, 429, 1043, 1790, 2232, 2116, 917, 4079, 447, 1086, 1629, # 3558
- 7375, 556, 7376, 7377, 2020, 1654, 844, 1090, 105, 550, 966, 1758, 2815, 1008, 1782, 686, # 3574
- 1095, 7378, 2282, 793, 1602, 7379, 3518, 2593, 4322, 4080, 2933, 2297, 4323, 3746, 980, 2496, # 3590
- 544, 353, 527, 4324, 908, 2678, 2899, 7380, 381, 2619, 1942, 1348, 7381, 1341, 1252, 560, # 3606
- 3072, 7382, 3420, 2856, 7383, 2053, 973, 886, 2080, 143, 4325, 7384, 7385, 157, 3886, 496, # 3622
- 4081, 57, 840, 540, 2038, 4326, 4327, 3421, 2117, 1445, 970, 2259, 1748, 1965, 2081, 4082, # 3638
- 3119, 1234, 1775, 3251, 2816, 3629, 773, 1206, 2129, 1066, 2039, 1326, 3887, 1738, 1725, 4083, # 3654
- 279, 3120, 51, 1544, 2594, 423, 1578, 2130, 2066, 173, 4328, 1879, 7386, 7387, 1583, 264, # 3670
- 610, 3630, 4329, 2439, 280, 154, 7388, 7389, 7390, 1739, 338, 1282, 3073, 693, 2857, 1411, # 3686
- 1074, 3747, 2440, 7391, 4330, 7392, 7393, 1240, 952, 2394, 7394, 2900, 1538, 2679, 685, 1483, # 3702
- 4084, 2468, 1436, 953, 4085, 2054, 4331, 671, 2395, 79, 4086, 2441, 3252, 608, 567, 2680, # 3718
- 3422, 4087, 4088, 1691, 393, 1261, 1791, 2396, 7395, 4332, 7396, 7397, 7398, 7399, 1383, 1672, # 3734
- 3748, 3182, 1464, 522, 1119, 661, 1150, 216, 675, 4333, 3888, 1432, 3519, 609, 4334, 2681, # 3750
- 2397, 7400, 7401, 7402, 4089, 3025, 0, 7403, 2469, 315, 231, 2442, 301, 3319, 4335, 2380, # 3766
- 7404, 233, 4090, 3631, 1818, 4336, 4337, 7405, 96, 1776, 1315, 2082, 7406, 257, 7407, 1809, # 3782
- 3632, 2709, 1139, 1819, 4091, 2021, 1124, 2163, 2778, 1777, 2649, 7408, 3074, 363, 1655, 3183, # 3798
- 7409, 2975, 7410, 7411, 7412, 3889, 1567, 3890, 718, 103, 3184, 849, 1443, 341, 3320, 2934, # 3814
- 1484, 7413, 1712, 127, 67, 339, 4092, 2398, 679, 1412, 821, 7414, 7415, 834, 738, 351, # 3830
- 2976, 2146, 846, 235, 1497, 1880, 418, 1992, 3749, 2710, 186, 1100, 2147, 2746, 3520, 1545, # 3846
- 1355, 2935, 2858, 1377, 583, 3891, 4093, 2573, 2977, 7416, 1298, 3633, 1078, 2549, 3634, 2358, # 3862
- 78, 3750, 3751, 267, 1289, 2099, 2001, 1594, 4094, 348, 369, 1274, 2194, 2175, 1837, 4338, # 3878
- 1820, 2817, 3635, 2747, 2283, 2002, 4339, 2936, 2748, 144, 3321, 882, 4340, 3892, 2749, 3423, # 3894
- 4341, 2901, 7417, 4095, 1726, 320, 7418, 3893, 3026, 788, 2978, 7419, 2818, 1773, 1327, 2859, # 3910
- 3894, 2819, 7420, 1306, 4342, 2003, 1700, 3752, 3521, 2359, 2650, 787, 2022, 506, 824, 3636, # 3926
- 534, 323, 4343, 1044, 3322, 2023, 1900, 946, 3424, 7421, 1778, 1500, 1678, 7422, 1881, 4344, # 3942
- 165, 243, 4345, 3637, 2521, 123, 683, 4096, 764, 4346, 36, 3895, 1792, 589, 2902, 816, # 3958
- 626, 1667, 3027, 2233, 1639, 1555, 1622, 3753, 3896, 7423, 3897, 2860, 1370, 1228, 1932, 891, # 3974
- 2083, 2903, 304, 4097, 7424, 292, 2979, 2711, 3522, 691, 2100, 4098, 1115, 4347, 118, 662, # 3990
- 7425, 611, 1156, 854, 2381, 1316, 2861, 2, 386, 515, 2904, 7426, 7427, 3253, 868, 2234, # 4006
- 1486, 855, 2651, 785, 2212, 3028, 7428, 1040, 3185, 3523, 7429, 3121, 448, 7430, 1525, 7431, # 4022
- 2164, 4348, 7432, 3754, 7433, 4099, 2820, 3524, 3122, 503, 818, 3898, 3123, 1568, 814, 676, # 4038
- 1444, 306, 1749, 7434, 3755, 1416, 1030, 197, 1428, 805, 2821, 1501, 4349, 7435, 7436, 7437, # 4054
- 1993, 7438, 4350, 7439, 7440, 2195, 13, 2779, 3638, 2980, 3124, 1229, 1916, 7441, 3756, 2131, # 4070
- 7442, 4100, 4351, 2399, 3525, 7443, 2213, 1511, 1727, 1120, 7444, 7445, 646, 3757, 2443, 307, # 4086
- 7446, 7447, 1595, 3186, 7448, 7449, 7450, 3639, 1113, 1356, 3899, 1465, 2522, 2523, 7451, 519, # 4102
- 7452, 128, 2132, 92, 2284, 1979, 7453, 3900, 1512, 342, 3125, 2196, 7454, 2780, 2214, 1980, # 4118
- 3323, 7455, 290, 1656, 1317, 789, 827, 2360, 7456, 3758, 4352, 562, 581, 3901, 7457, 401, # 4134
- 4353, 2248, 94, 4354, 1399, 2781, 7458, 1463, 2024, 4355, 3187, 1943, 7459, 828, 1105, 4101, # 4150
- 1262, 1394, 7460, 4102, 605, 4356, 7461, 1783, 2862, 7462, 2822, 819, 2101, 578, 2197, 2937, # 4166
- 7463, 1502, 436, 3254, 4103, 3255, 2823, 3902, 2905, 3425, 3426, 7464, 2712, 2315, 7465, 7466, # 4182
- 2332, 2067, 23, 4357, 193, 826, 3759, 2102, 699, 1630, 4104, 3075, 390, 1793, 1064, 3526, # 4198
- 7467, 1579, 3076, 3077, 1400, 7468, 4105, 1838, 1640, 2863, 7469, 4358, 4359, 137, 4106, 598, # 4214
- 3078, 1966, 780, 104, 974, 2938, 7470, 278, 899, 253, 402, 572, 504, 493, 1339, 7471, # 4230
- 3903, 1275, 4360, 2574, 2550, 7472, 3640, 3029, 3079, 2249, 565, 1334, 2713, 863, 41, 7473, # 4246
- 7474, 4361, 7475, 1657, 2333, 19, 463, 2750, 4107, 606, 7476, 2981, 3256, 1087, 2084, 1323, # 4262
- 2652, 2982, 7477, 1631, 1623, 1750, 4108, 2682, 7478, 2864, 791, 2714, 2653, 2334, 232, 2416, # 4278
- 7479, 2983, 1498, 7480, 2654, 2620, 755, 1366, 3641, 3257, 3126, 2025, 1609, 119, 1917, 3427, # 4294
- 862, 1026, 4109, 7481, 3904, 3760, 4362, 3905, 4363, 2260, 1951, 2470, 7482, 1125, 817, 4110, # 4310
- 4111, 3906, 1513, 1766, 2040, 1487, 4112, 3030, 3258, 2824, 3761, 3127, 7483, 7484, 1507, 7485, # 4326
- 2683, 733, 40, 1632, 1106, 2865, 345, 4113, 841, 2524, 230, 4364, 2984, 1846, 3259, 3428, # 4342
- 7486, 1263, 986, 3429, 7487, 735, 879, 254, 1137, 857, 622, 1300, 1180, 1388, 1562, 3907, # 4358
- 3908, 2939, 967, 2751, 2655, 1349, 592, 2133, 1692, 3324, 2985, 1994, 4114, 1679, 3909, 1901, # 4374
- 2185, 7488, 739, 3642, 2715, 1296, 1290, 7489, 4115, 2198, 2199, 1921, 1563, 2595, 2551, 1870, # 4390
- 2752, 2986, 7490, 435, 7491, 343, 1108, 596, 17, 1751, 4365, 2235, 3430, 3643, 7492, 4366, # 4406
- 294, 3527, 2940, 1693, 477, 979, 281, 2041, 3528, 643, 2042, 3644, 2621, 2782, 2261, 1031, # 4422
- 2335, 2134, 2298, 3529, 4367, 367, 1249, 2552, 7493, 3530, 7494, 4368, 1283, 3325, 2004, 240, # 4438
- 1762, 3326, 4369, 4370, 836, 1069, 3128, 474, 7495, 2148, 2525, 268, 3531, 7496, 3188, 1521, # 4454
- 1284, 7497, 1658, 1546, 4116, 7498, 3532, 3533, 7499, 4117, 3327, 2684, 1685, 4118, 961, 1673, # 4470
- 2622, 190, 2005, 2200, 3762, 4371, 4372, 7500, 570, 2497, 3645, 1490, 7501, 4373, 2623, 3260, # 4486
- 1956, 4374, 584, 1514, 396, 1045, 1944, 7502, 4375, 1967, 2444, 7503, 7504, 4376, 3910, 619, # 4502
- 7505, 3129, 3261, 215, 2006, 2783, 2553, 3189, 4377, 3190, 4378, 763, 4119, 3763, 4379, 7506, # 4518
- 7507, 1957, 1767, 2941, 3328, 3646, 1174, 452, 1477, 4380, 3329, 3130, 7508, 2825, 1253, 2382, # 4534
- 2186, 1091, 2285, 4120, 492, 7509, 638, 1169, 1824, 2135, 1752, 3911, 648, 926, 1021, 1324, # 4550
- 4381, 520, 4382, 997, 847, 1007, 892, 4383, 3764, 2262, 1871, 3647, 7510, 2400, 1784, 4384, # 4566
- 1952, 2942, 3080, 3191, 1728, 4121, 2043, 3648, 4385, 2007, 1701, 3131, 1551, 30, 2263, 4122, # 4582
- 7511, 2026, 4386, 3534, 7512, 501, 7513, 4123, 594, 3431, 2165, 1821, 3535, 3432, 3536, 3192, # 4598
- 829, 2826, 4124, 7514, 1680, 3132, 1225, 4125, 7515, 3262, 4387, 4126, 3133, 2336, 7516, 4388, # 4614
- 4127, 7517, 3912, 3913, 7518, 1847, 2383, 2596, 3330, 7519, 4389, 374, 3914, 652, 4128, 4129, # 4630
- 375, 1140, 798, 7520, 7521, 7522, 2361, 4390, 2264, 546, 1659, 138, 3031, 2445, 4391, 7523, # 4646
- 2250, 612, 1848, 910, 796, 3765, 1740, 1371, 825, 3766, 3767, 7524, 2906, 2554, 7525, 692, # 4662
- 444, 3032, 2624, 801, 4392, 4130, 7526, 1491, 244, 1053, 3033, 4131, 4132, 340, 7527, 3915, # 4678
- 1041, 2987, 293, 1168, 87, 1357, 7528, 1539, 959, 7529, 2236, 721, 694, 4133, 3768, 219, # 4694
- 1478, 644, 1417, 3331, 2656, 1413, 1401, 1335, 1389, 3916, 7530, 7531, 2988, 2362, 3134, 1825, # 4710
- 730, 1515, 184, 2827, 66, 4393, 7532, 1660, 2943, 246, 3332, 378, 1457, 226, 3433, 975, # 4726
- 3917, 2944, 1264, 3537, 674, 696, 7533, 163, 7534, 1141, 2417, 2166, 713, 3538, 3333, 4394, # 4742
- 3918, 7535, 7536, 1186, 15, 7537, 1079, 1070, 7538, 1522, 3193, 3539, 276, 1050, 2716, 758, # 4758
- 1126, 653, 2945, 3263, 7539, 2337, 889, 3540, 3919, 3081, 2989, 903, 1250, 4395, 3920, 3434, # 4774
- 3541, 1342, 1681, 1718, 766, 3264, 286, 89, 2946, 3649, 7540, 1713, 7541, 2597, 3334, 2990, # 4790
- 7542, 2947, 2215, 3194, 2866, 7543, 4396, 2498, 2526, 181, 387, 1075, 3921, 731, 2187, 3335, # 4806
- 7544, 3265, 310, 313, 3435, 2299, 770, 4134, 54, 3034, 189, 4397, 3082, 3769, 3922, 7545, # 4822
- 1230, 1617, 1849, 355, 3542, 4135, 4398, 3336, 111, 4136, 3650, 1350, 3135, 3436, 3035, 4137, # 4838
- 2149, 3266, 3543, 7546, 2784, 3923, 3924, 2991, 722, 2008, 7547, 1071, 247, 1207, 2338, 2471, # 4854
- 1378, 4399, 2009, 864, 1437, 1214, 4400, 373, 3770, 1142, 2216, 667, 4401, 442, 2753, 2555, # 4870
- 3771, 3925, 1968, 4138, 3267, 1839, 837, 170, 1107, 934, 1336, 1882, 7548, 7549, 2118, 4139, # 4886
- 2828, 743, 1569, 7550, 4402, 4140, 582, 2384, 1418, 3437, 7551, 1802, 7552, 357, 1395, 1729, # 4902
- 3651, 3268, 2418, 1564, 2237, 7553, 3083, 3772, 1633, 4403, 1114, 2085, 4141, 1532, 7554, 482, # 4918
- 2446, 4404, 7555, 7556, 1492, 833, 1466, 7557, 2717, 3544, 1641, 2829, 7558, 1526, 1272, 3652, # 4934
- 4142, 1686, 1794, 416, 2556, 1902, 1953, 1803, 7559, 3773, 2785, 3774, 1159, 2316, 7560, 2867, # 4950
- 4405, 1610, 1584, 3036, 2419, 2754, 443, 3269, 1163, 3136, 7561, 7562, 3926, 7563, 4143, 2499, # 4966
- 3037, 4406, 3927, 3137, 2103, 1647, 3545, 2010, 1872, 4144, 7564, 4145, 431, 3438, 7565, 250, # 4982
- 97, 81, 4146, 7566, 1648, 1850, 1558, 160, 848, 7567, 866, 740, 1694, 7568, 2201, 2830, # 4998
- 3195, 4147, 4407, 3653, 1687, 950, 2472, 426, 469, 3196, 3654, 3655, 3928, 7569, 7570, 1188, # 5014
- 424, 1995, 861, 3546, 4148, 3775, 2202, 2685, 168, 1235, 3547, 4149, 7571, 2086, 1674, 4408, # 5030
- 3337, 3270, 220, 2557, 1009, 7572, 3776, 670, 2992, 332, 1208, 717, 7573, 7574, 3548, 2447, # 5046
- 3929, 3338, 7575, 513, 7576, 1209, 2868, 3339, 3138, 4409, 1080, 7577, 7578, 7579, 7580, 2527, # 5062
- 3656, 3549, 815, 1587, 3930, 3931, 7581, 3550, 3439, 3777, 1254, 4410, 1328, 3038, 1390, 3932, # 5078
- 1741, 3933, 3778, 3934, 7582, 236, 3779, 2448, 3271, 7583, 7584, 3657, 3780, 1273, 3781, 4411, # 5094
- 7585, 308, 7586, 4412, 245, 4413, 1851, 2473, 1307, 2575, 430, 715, 2136, 2449, 7587, 270, # 5110
- 199, 2869, 3935, 7588, 3551, 2718, 1753, 761, 1754, 725, 1661, 1840, 4414, 3440, 3658, 7589, # 5126
- 7590, 587, 14, 3272, 227, 2598, 326, 480, 2265, 943, 2755, 3552, 291, 650, 1883, 7591, # 5142
- 1702, 1226, 102, 1547, 62, 3441, 904, 4415, 3442, 1164, 4150, 7592, 7593, 1224, 1548, 2756, # 5158
- 391, 498, 1493, 7594, 1386, 1419, 7595, 2055, 1177, 4416, 813, 880, 1081, 2363, 566, 1145, # 5174
- 4417, 2286, 1001, 1035, 2558, 2599, 2238, 394, 1286, 7596, 7597, 2068, 7598, 86, 1494, 1730, # 5190
- 3936, 491, 1588, 745, 897, 2948, 843, 3340, 3937, 2757, 2870, 3273, 1768, 998, 2217, 2069, # 5206
- 397, 1826, 1195, 1969, 3659, 2993, 3341, 284, 7599, 3782, 2500, 2137, 2119, 1903, 7600, 3938, # 5222
- 2150, 3939, 4151, 1036, 3443, 1904, 114, 2559, 4152, 209, 1527, 7601, 7602, 2949, 2831, 2625, # 5238
- 2385, 2719, 3139, 812, 2560, 7603, 3274, 7604, 1559, 737, 1884, 3660, 1210, 885, 28, 2686, # 5254
- 3553, 3783, 7605, 4153, 1004, 1779, 4418, 7606, 346, 1981, 2218, 2687, 4419, 3784, 1742, 797, # 5270
- 1642, 3940, 1933, 1072, 1384, 2151, 896, 3941, 3275, 3661, 3197, 2871, 3554, 7607, 2561, 1958, # 5286
- 4420, 2450, 1785, 7608, 7609, 7610, 3942, 4154, 1005, 1308, 3662, 4155, 2720, 4421, 4422, 1528, # 5302
- 2600, 161, 1178, 4156, 1982, 987, 4423, 1101, 4157, 631, 3943, 1157, 3198, 2420, 1343, 1241, # 5318
- 1016, 2239, 2562, 372, 877, 2339, 2501, 1160, 555, 1934, 911, 3944, 7611, 466, 1170, 169, # 5334
- 1051, 2907, 2688, 3663, 2474, 2994, 1182, 2011, 2563, 1251, 2626, 7612, 992, 2340, 3444, 1540, # 5350
- 2721, 1201, 2070, 2401, 1996, 2475, 7613, 4424, 528, 1922, 2188, 1503, 1873, 1570, 2364, 3342, # 5366
- 3276, 7614, 557, 1073, 7615, 1827, 3445, 2087, 2266, 3140, 3039, 3084, 767, 3085, 2786, 4425, # 5382
- 1006, 4158, 4426, 2341, 1267, 2176, 3664, 3199, 778, 3945, 3200, 2722, 1597, 2657, 7616, 4427, # 5398
- 7617, 3446, 7618, 7619, 7620, 3277, 2689, 1433, 3278, 131, 95, 1504, 3946, 723, 4159, 3141, # 5414
- 1841, 3555, 2758, 2189, 3947, 2027, 2104, 3665, 7621, 2995, 3948, 1218, 7622, 3343, 3201, 3949, # 5430
- 4160, 2576, 248, 1634, 3785, 912, 7623, 2832, 3666, 3040, 3786, 654, 53, 7624, 2996, 7625, # 5446
- 1688, 4428, 777, 3447, 1032, 3950, 1425, 7626, 191, 820, 2120, 2833, 971, 4429, 931, 3202, # 5462
- 135, 664, 783, 3787, 1997, 772, 2908, 1935, 3951, 3788, 4430, 2909, 3203, 282, 2723, 640, # 5478
- 1372, 3448, 1127, 922, 325, 3344, 7627, 7628, 711, 2044, 7629, 7630, 3952, 2219, 2787, 1936, # 5494
- 3953, 3345, 2220, 2251, 3789, 2300, 7631, 4431, 3790, 1258, 3279, 3954, 3204, 2138, 2950, 3955, # 5510
- 3956, 7632, 2221, 258, 3205, 4432, 101, 1227, 7633, 3280, 1755, 7634, 1391, 3281, 7635, 2910, # 5526
- 2056, 893, 7636, 7637, 7638, 1402, 4161, 2342, 7639, 7640, 3206, 3556, 7641, 7642, 878, 1325, # 5542
- 1780, 2788, 4433, 259, 1385, 2577, 744, 1183, 2267, 4434, 7643, 3957, 2502, 7644, 684, 1024, # 5558
- 4162, 7645, 472, 3557, 3449, 1165, 3282, 3958, 3959, 322, 2152, 881, 455, 1695, 1152, 1340, # 5574
- 660, 554, 2153, 4435, 1058, 4436, 4163, 830, 1065, 3346, 3960, 4437, 1923, 7646, 1703, 1918, # 5590
- 7647, 932, 2268, 122, 7648, 4438, 947, 677, 7649, 3791, 2627, 297, 1905, 1924, 2269, 4439, # 5606
- 2317, 3283, 7650, 7651, 4164, 7652, 4165, 84, 4166, 112, 989, 7653, 547, 1059, 3961, 701, # 5622
- 3558, 1019, 7654, 4167, 7655, 3450, 942, 639, 457, 2301, 2451, 993, 2951, 407, 851, 494, # 5638
- 4440, 3347, 927, 7656, 1237, 7657, 2421, 3348, 573, 4168, 680, 921, 2911, 1279, 1874, 285, # 5654
- 790, 1448, 1983, 719, 2167, 7658, 7659, 4441, 3962, 3963, 1649, 7660, 1541, 563, 7661, 1077, # 5670
- 7662, 3349, 3041, 3451, 511, 2997, 3964, 3965, 3667, 3966, 1268, 2564, 3350, 3207, 4442, 4443, # 5686
- 7663, 535, 1048, 1276, 1189, 2912, 2028, 3142, 1438, 1373, 2834, 2952, 1134, 2012, 7664, 4169, # 5702
- 1238, 2578, 3086, 1259, 7665, 700, 7666, 2953, 3143, 3668, 4170, 7667, 4171, 1146, 1875, 1906, # 5718
- 4444, 2601, 3967, 781, 2422, 132, 1589, 203, 147, 273, 2789, 2402, 898, 1786, 2154, 3968, # 5734
- 3969, 7668, 3792, 2790, 7669, 7670, 4445, 4446, 7671, 3208, 7672, 1635, 3793, 965, 7673, 1804, # 5750
- 2690, 1516, 3559, 1121, 1082, 1329, 3284, 3970, 1449, 3794, 65, 1128, 2835, 2913, 2759, 1590, # 5766
- 3795, 7674, 7675, 12, 2658, 45, 976, 2579, 3144, 4447, 517, 2528, 1013, 1037, 3209, 7676, # 5782
- 3796, 2836, 7677, 3797, 7678, 3452, 7679, 2602, 614, 1998, 2318, 3798, 3087, 2724, 2628, 7680, # 5798
- 2580, 4172, 599, 1269, 7681, 1810, 3669, 7682, 2691, 3088, 759, 1060, 489, 1805, 3351, 3285, # 5814
- 1358, 7683, 7684, 2386, 1387, 1215, 2629, 2252, 490, 7685, 7686, 4173, 1759, 2387, 2343, 7687, # 5830
- 4448, 3799, 1907, 3971, 2630, 1806, 3210, 4449, 3453, 3286, 2760, 2344, 874, 7688, 7689, 3454, # 5846
- 3670, 1858, 91, 2914, 3671, 3042, 3800, 4450, 7690, 3145, 3972, 2659, 7691, 3455, 1202, 1403, # 5862
- 3801, 2954, 2529, 1517, 2503, 4451, 3456, 2504, 7692, 4452, 7693, 2692, 1885, 1495, 1731, 3973, # 5878
- 2365, 4453, 7694, 2029, 7695, 7696, 3974, 2693, 1216, 237, 2581, 4174, 2319, 3975, 3802, 4454, # 5894
- 4455, 2694, 3560, 3457, 445, 4456, 7697, 7698, 7699, 7700, 2761, 61, 3976, 3672, 1822, 3977, # 5910
- 7701, 687, 2045, 935, 925, 405, 2660, 703, 1096, 1859, 2725, 4457, 3978, 1876, 1367, 2695, # 5926
- 3352, 918, 2105, 1781, 2476, 334, 3287, 1611, 1093, 4458, 564, 3146, 3458, 3673, 3353, 945, # 5942
- 2631, 2057, 4459, 7702, 1925, 872, 4175, 7703, 3459, 2696, 3089, 349, 4176, 3674, 3979, 4460, # 5958
- 3803, 4177, 3675, 2155, 3980, 4461, 4462, 4178, 4463, 2403, 2046, 782, 3981, 400, 251, 4179, # 5974
- 1624, 7704, 7705, 277, 3676, 299, 1265, 476, 1191, 3804, 2121, 4180, 4181, 1109, 205, 7706, # 5990
- 2582, 1000, 2156, 3561, 1860, 7707, 7708, 7709, 4464, 7710, 4465, 2565, 107, 2477, 2157, 3982, # 6006
- 3460, 3147, 7711, 1533, 541, 1301, 158, 753, 4182, 2872, 3562, 7712, 1696, 370, 1088, 4183, # 6022
- 4466, 3563, 579, 327, 440, 162, 2240, 269, 1937, 1374, 3461, 968, 3043, 56, 1396, 3090, # 6038
- 2106, 3288, 3354, 7713, 1926, 2158, 4467, 2998, 7714, 3564, 7715, 7716, 3677, 4468, 2478, 7717, # 6054
- 2791, 7718, 1650, 4469, 7719, 2603, 7720, 7721, 3983, 2661, 3355, 1149, 3356, 3984, 3805, 3985, # 6070
- 7722, 1076, 49, 7723, 951, 3211, 3289, 3290, 450, 2837, 920, 7724, 1811, 2792, 2366, 4184, # 6086
- 1908, 1138, 2367, 3806, 3462, 7725, 3212, 4470, 1909, 1147, 1518, 2423, 4471, 3807, 7726, 4472, # 6102
- 2388, 2604, 260, 1795, 3213, 7727, 7728, 3808, 3291, 708, 7729, 3565, 1704, 7730, 3566, 1351, # 6118
- 1618, 3357, 2999, 1886, 944, 4185, 3358, 4186, 3044, 3359, 4187, 7731, 3678, 422, 413, 1714, # 6134
- 3292, 500, 2058, 2345, 4188, 2479, 7732, 1344, 1910, 954, 7733, 1668, 7734, 7735, 3986, 2404, # 6150
- 4189, 3567, 3809, 4190, 7736, 2302, 1318, 2505, 3091, 133, 3092, 2873, 4473, 629, 31, 2838, # 6166
- 2697, 3810, 4474, 850, 949, 4475, 3987, 2955, 1732, 2088, 4191, 1496, 1852, 7737, 3988, 620, # 6182
- 3214, 981, 1242, 3679, 3360, 1619, 3680, 1643, 3293, 2139, 2452, 1970, 1719, 3463, 2168, 7738, # 6198
- 3215, 7739, 7740, 3361, 1828, 7741, 1277, 4476, 1565, 2047, 7742, 1636, 3568, 3093, 7743, 869, # 6214
- 2839, 655, 3811, 3812, 3094, 3989, 3000, 3813, 1310, 3569, 4477, 7744, 7745, 7746, 1733, 558, # 6230
- 4478, 3681, 335, 1549, 3045, 1756, 4192, 3682, 1945, 3464, 1829, 1291, 1192, 470, 2726, 2107, # 6246
- 2793, 913, 1054, 3990, 7747, 1027, 7748, 3046, 3991, 4479, 982, 2662, 3362, 3148, 3465, 3216, # 6262
- 3217, 1946, 2794, 7749, 571, 4480, 7750, 1830, 7751, 3570, 2583, 1523, 2424, 7752, 2089, 984, # 6278
- 4481, 3683, 1959, 7753, 3684, 852, 923, 2795, 3466, 3685, 969, 1519, 999, 2048, 2320, 1705, # 6294
- 7754, 3095, 615, 1662, 151, 597, 3992, 2405, 2321, 1049, 275, 4482, 3686, 4193, 568, 3687, # 6310
- 3571, 2480, 4194, 3688, 7755, 2425, 2270, 409, 3218, 7756, 1566, 2874, 3467, 1002, 769, 2840, # 6326
- 194, 2090, 3149, 3689, 2222, 3294, 4195, 628, 1505, 7757, 7758, 1763, 2177, 3001, 3993, 521, # 6342
- 1161, 2584, 1787, 2203, 2406, 4483, 3994, 1625, 4196, 4197, 412, 42, 3096, 464, 7759, 2632, # 6358
- 4484, 3363, 1760, 1571, 2875, 3468, 2530, 1219, 2204, 3814, 2633, 2140, 2368, 4485, 4486, 3295, # 6374
- 1651, 3364, 3572, 7760, 7761, 3573, 2481, 3469, 7762, 3690, 7763, 7764, 2271, 2091, 460, 7765, # 6390
- 4487, 7766, 3002, 962, 588, 3574, 289, 3219, 2634, 1116, 52, 7767, 3047, 1796, 7768, 7769, # 6406
- 7770, 1467, 7771, 1598, 1143, 3691, 4198, 1984, 1734, 1067, 4488, 1280, 3365, 465, 4489, 1572, # 6422
- 510, 7772, 1927, 2241, 1812, 1644, 3575, 7773, 4490, 3692, 7774, 7775, 2663, 1573, 1534, 7776, # 6438
- 7777, 4199, 536, 1807, 1761, 3470, 3815, 3150, 2635, 7778, 7779, 7780, 4491, 3471, 2915, 1911, # 6454
- 2796, 7781, 3296, 1122, 377, 3220, 7782, 360, 7783, 7784, 4200, 1529, 551, 7785, 2059, 3693, # 6470
- 1769, 2426, 7786, 2916, 4201, 3297, 3097, 2322, 2108, 2030, 4492, 1404, 136, 1468, 1479, 672, # 6486
- 1171, 3221, 2303, 271, 3151, 7787, 2762, 7788, 2049, 678, 2727, 865, 1947, 4493, 7789, 2013, # 6502
- 3995, 2956, 7790, 2728, 2223, 1397, 3048, 3694, 4494, 4495, 1735, 2917, 3366, 3576, 7791, 3816, # 6518
- 509, 2841, 2453, 2876, 3817, 7792, 7793, 3152, 3153, 4496, 4202, 2531, 4497, 2304, 1166, 1010, # 6534
- 552, 681, 1887, 7794, 7795, 2957, 2958, 3996, 1287, 1596, 1861, 3154, 358, 453, 736, 175, # 6550
- 478, 1117, 905, 1167, 1097, 7796, 1853, 1530, 7797, 1706, 7798, 2178, 3472, 2287, 3695, 3473, # 6566
- 3577, 4203, 2092, 4204, 7799, 3367, 1193, 2482, 4205, 1458, 2190, 2205, 1862, 1888, 1421, 3298, # 6582
- 2918, 3049, 2179, 3474, 595, 2122, 7800, 3997, 7801, 7802, 4206, 1707, 2636, 223, 3696, 1359, # 6598
- 751, 3098, 183, 3475, 7803, 2797, 3003, 419, 2369, 633, 704, 3818, 2389, 241, 7804, 7805, # 6614
- 7806, 838, 3004, 3697, 2272, 2763, 2454, 3819, 1938, 2050, 3998, 1309, 3099, 2242, 1181, 7807, # 6630
- 1136, 2206, 3820, 2370, 1446, 4207, 2305, 4498, 7808, 7809, 4208, 1055, 2605, 484, 3698, 7810, # 6646
- 3999, 625, 4209, 2273, 3368, 1499, 4210, 4000, 7811, 4001, 4211, 3222, 2274, 2275, 3476, 7812, # 6662
- 7813, 2764, 808, 2606, 3699, 3369, 4002, 4212, 3100, 2532, 526, 3370, 3821, 4213, 955, 7814, # 6678
- 1620, 4214, 2637, 2427, 7815, 1429, 3700, 1669, 1831, 994, 928, 7816, 3578, 1260, 7817, 7818, # 6694
- 7819, 1948, 2288, 741, 2919, 1626, 4215, 2729, 2455, 867, 1184, 362, 3371, 1392, 7820, 7821, # 6710
- 4003, 4216, 1770, 1736, 3223, 2920, 4499, 4500, 1928, 2698, 1459, 1158, 7822, 3050, 3372, 2877, # 6726
- 1292, 1929, 2506, 2842, 3701, 1985, 1187, 2071, 2014, 2607, 4217, 7823, 2566, 2507, 2169, 3702, # 6742
- 2483, 3299, 7824, 3703, 4501, 7825, 7826, 666, 1003, 3005, 1022, 3579, 4218, 7827, 4502, 1813, # 6758
- 2253, 574, 3822, 1603, 295, 1535, 705, 3823, 4219, 283, 858, 417, 7828, 7829, 3224, 4503, # 6774
- 4504, 3051, 1220, 1889, 1046, 2276, 2456, 4004, 1393, 1599, 689, 2567, 388, 4220, 7830, 2484, # 6790
- 802, 7831, 2798, 3824, 2060, 1405, 2254, 7832, 4505, 3825, 2109, 1052, 1345, 3225, 1585, 7833, # 6806
- 809, 7834, 7835, 7836, 575, 2730, 3477, 956, 1552, 1469, 1144, 2323, 7837, 2324, 1560, 2457, # 6822
- 3580, 3226, 4005, 616, 2207, 3155, 2180, 2289, 7838, 1832, 7839, 3478, 4506, 7840, 1319, 3704, # 6838
- 3705, 1211, 3581, 1023, 3227, 1293, 2799, 7841, 7842, 7843, 3826, 607, 2306, 3827, 762, 2878, # 6854
- 1439, 4221, 1360, 7844, 1485, 3052, 7845, 4507, 1038, 4222, 1450, 2061, 2638, 4223, 1379, 4508, # 6870
- 2585, 7846, 7847, 4224, 1352, 1414, 2325, 2921, 1172, 7848, 7849, 3828, 3829, 7850, 1797, 1451, # 6886
- 7851, 7852, 7853, 7854, 2922, 4006, 4007, 2485, 2346, 411, 4008, 4009, 3582, 3300, 3101, 4509, # 6902
- 1561, 2664, 1452, 4010, 1375, 7855, 7856, 47, 2959, 316, 7857, 1406, 1591, 2923, 3156, 7858, # 6918
- 1025, 2141, 3102, 3157, 354, 2731, 884, 2224, 4225, 2407, 508, 3706, 726, 3583, 996, 2428, # 6934
- 3584, 729, 7859, 392, 2191, 1453, 4011, 4510, 3707, 7860, 7861, 2458, 3585, 2608, 1675, 2800, # 6950
- 919, 2347, 2960, 2348, 1270, 4511, 4012, 73, 7862, 7863, 647, 7864, 3228, 2843, 2255, 1550, # 6966
- 1346, 3006, 7865, 1332, 883, 3479, 7866, 7867, 7868, 7869, 3301, 2765, 7870, 1212, 831, 1347, # 6982
- 4226, 4512, 2326, 3830, 1863, 3053, 720, 3831, 4513, 4514, 3832, 7871, 4227, 7872, 7873, 4515, # 6998
- 7874, 7875, 1798, 4516, 3708, 2609, 4517, 3586, 1645, 2371, 7876, 7877, 2924, 669, 2208, 2665, # 7014
- 2429, 7878, 2879, 7879, 7880, 1028, 3229, 7881, 4228, 2408, 7882, 2256, 1353, 7883, 7884, 4518, # 7030
- 3158, 518, 7885, 4013, 7886, 4229, 1960, 7887, 2142, 4230, 7888, 7889, 3007, 2349, 2350, 3833, # 7046
- 516, 1833, 1454, 4014, 2699, 4231, 4519, 2225, 2610, 1971, 1129, 3587, 7890, 2766, 7891, 2961, # 7062
- 1422, 577, 1470, 3008, 1524, 3373, 7892, 7893, 432, 4232, 3054, 3480, 7894, 2586, 1455, 2508, # 7078
- 2226, 1972, 1175, 7895, 1020, 2732, 4015, 3481, 4520, 7896, 2733, 7897, 1743, 1361, 3055, 3482, # 7094
- 2639, 4016, 4233, 4521, 2290, 895, 924, 4234, 2170, 331, 2243, 3056, 166, 1627, 3057, 1098, # 7110
- 7898, 1232, 2880, 2227, 3374, 4522, 657, 403, 1196, 2372, 542, 3709, 3375, 1600, 4235, 3483, # 7126
- 7899, 4523, 2767, 3230, 576, 530, 1362, 7900, 4524, 2533, 2666, 3710, 4017, 7901, 842, 3834, # 7142
- 7902, 2801, 2031, 1014, 4018, 213, 2700, 3376, 665, 621, 4236, 7903, 3711, 2925, 2430, 7904, # 7158
- 2431, 3302, 3588, 3377, 7905, 4237, 2534, 4238, 4525, 3589, 1682, 4239, 3484, 1380, 7906, 724, # 7174
- 2277, 600, 1670, 7907, 1337, 1233, 4526, 3103, 2244, 7908, 1621, 4527, 7909, 651, 4240, 7910, # 7190
- 1612, 4241, 2611, 7911, 2844, 7912, 2734, 2307, 3058, 7913, 716, 2459, 3059, 174, 1255, 2701, # 7206
- 4019, 3590, 548, 1320, 1398, 728, 4020, 1574, 7914, 1890, 1197, 3060, 4021, 7915, 3061, 3062, # 7222
- 3712, 3591, 3713, 747, 7916, 635, 4242, 4528, 7917, 7918, 7919, 4243, 7920, 7921, 4529, 7922, # 7238
- 3378, 4530, 2432, 451, 7923, 3714, 2535, 2072, 4244, 2735, 4245, 4022, 7924, 1764, 4531, 7925, # 7254
- 4246, 350, 7926, 2278, 2390, 2486, 7927, 4247, 4023, 2245, 1434, 4024, 488, 4532, 458, 4248, # 7270
- 4025, 3715, 771, 1330, 2391, 3835, 2568, 3159, 2159, 2409, 1553, 2667, 3160, 4249, 7928, 2487, # 7286
- 2881, 2612, 1720, 2702, 4250, 3379, 4533, 7929, 2536, 4251, 7930, 3231, 4252, 2768, 7931, 2015, # 7302
- 2736, 7932, 1155, 1017, 3716, 3836, 7933, 3303, 2308, 201, 1864, 4253, 1430, 7934, 4026, 7935, # 7318
- 7936, 7937, 7938, 7939, 4254, 1604, 7940, 414, 1865, 371, 2587, 4534, 4535, 3485, 2016, 3104, # 7334
- 4536, 1708, 960, 4255, 887, 389, 2171, 1536, 1663, 1721, 7941, 2228, 4027, 2351, 2926, 1580, # 7350
- 7942, 7943, 7944, 1744, 7945, 2537, 4537, 4538, 7946, 4539, 7947, 2073, 7948, 7949, 3592, 3380, # 7366
- 2882, 4256, 7950, 4257, 2640, 3381, 2802, 673, 2703, 2460, 709, 3486, 4028, 3593, 4258, 7951, # 7382
- 1148, 502, 634, 7952, 7953, 1204, 4540, 3594, 1575, 4541, 2613, 3717, 7954, 3718, 3105, 948, # 7398
- 3232, 121, 1745, 3837, 1110, 7955, 4259, 3063, 2509, 3009, 4029, 3719, 1151, 1771, 3838, 1488, # 7414
- 4030, 1986, 7956, 2433, 3487, 7957, 7958, 2093, 7959, 4260, 3839, 1213, 1407, 2803, 531, 2737, # 7430
- 2538, 3233, 1011, 1537, 7960, 2769, 4261, 3106, 1061, 7961, 3720, 3721, 1866, 2883, 7962, 2017, # 7446
- 120, 4262, 4263, 2062, 3595, 3234, 2309, 3840, 2668, 3382, 1954, 4542, 7963, 7964, 3488, 1047, # 7462
- 2704, 1266, 7965, 1368, 4543, 2845, 649, 3383, 3841, 2539, 2738, 1102, 2846, 2669, 7966, 7967, # 7478
- 1999, 7968, 1111, 3596, 2962, 7969, 2488, 3842, 3597, 2804, 1854, 3384, 3722, 7970, 7971, 3385, # 7494
- 2410, 2884, 3304, 3235, 3598, 7972, 2569, 7973, 3599, 2805, 4031, 1460, 856, 7974, 3600, 7975, # 7510
- 2885, 2963, 7976, 2886, 3843, 7977, 4264, 632, 2510, 875, 3844, 1697, 3845, 2291, 7978, 7979, # 7526
- 4544, 3010, 1239, 580, 4545, 4265, 7980, 914, 936, 2074, 1190, 4032, 1039, 2123, 7981, 7982, # 7542
- 7983, 3386, 1473, 7984, 1354, 4266, 3846, 7985, 2172, 3064, 4033, 915, 3305, 4267, 4268, 3306, # 7558
- 1605, 1834, 7986, 2739, 398, 3601, 4269, 3847, 4034, 328, 1912, 2847, 4035, 3848, 1331, 4270, # 7574
- 3011, 937, 4271, 7987, 3602, 4036, 4037, 3387, 2160, 4546, 3388, 524, 742, 538, 3065, 1012, # 7590
- 7988, 7989, 3849, 2461, 7990, 658, 1103, 225, 3850, 7991, 7992, 4547, 7993, 4548, 7994, 3236, # 7606
- 1243, 7995, 4038, 963, 2246, 4549, 7996, 2705, 3603, 3161, 7997, 7998, 2588, 2327, 7999, 4550, # 7622
- 8000, 8001, 8002, 3489, 3307, 957, 3389, 2540, 2032, 1930, 2927, 2462, 870, 2018, 3604, 1746, # 7638
- 2770, 2771, 2434, 2463, 8003, 3851, 8004, 3723, 3107, 3724, 3490, 3390, 3725, 8005, 1179, 3066, # 7654
- 8006, 3162, 2373, 4272, 3726, 2541, 3163, 3108, 2740, 4039, 8007, 3391, 1556, 2542, 2292, 977, # 7670
- 2887, 2033, 4040, 1205, 3392, 8008, 1765, 3393, 3164, 2124, 1271, 1689, 714, 4551, 3491, 8009, # 7686
- 2328, 3852, 533, 4273, 3605, 2181, 617, 8010, 2464, 3308, 3492, 2310, 8011, 8012, 3165, 8013, # 7702
- 8014, 3853, 1987, 618, 427, 2641, 3493, 3394, 8015, 8016, 1244, 1690, 8017, 2806, 4274, 4552, # 7718
- 8018, 3494, 8019, 8020, 2279, 1576, 473, 3606, 4275, 3395, 972, 8021, 3607, 8022, 3067, 8023, # 7734
- 8024, 4553, 4554, 8025, 3727, 4041, 4042, 8026, 153, 4555, 356, 8027, 1891, 2888, 4276, 2143, # 7750
- 408, 803, 2352, 8028, 3854, 8029, 4277, 1646, 2570, 2511, 4556, 4557, 3855, 8030, 3856, 4278, # 7766
- 8031, 2411, 3396, 752, 8032, 8033, 1961, 2964, 8034, 746, 3012, 2465, 8035, 4279, 3728, 698, # 7782
- 4558, 1892, 4280, 3608, 2543, 4559, 3609, 3857, 8036, 3166, 3397, 8037, 1823, 1302, 4043, 2706, # 7798
- 3858, 1973, 4281, 8038, 4282, 3167, 823, 1303, 1288, 1236, 2848, 3495, 4044, 3398, 774, 3859, # 7814
- 8039, 1581, 4560, 1304, 2849, 3860, 4561, 8040, 2435, 2161, 1083, 3237, 4283, 4045, 4284, 344, # 7830
- 1173, 288, 2311, 454, 1683, 8041, 8042, 1461, 4562, 4046, 2589, 8043, 8044, 4563, 985, 894, # 7846
- 8045, 3399, 3168, 8046, 1913, 2928, 3729, 1988, 8047, 2110, 1974, 8048, 4047, 8049, 2571, 1194, # 7862
- 425, 8050, 4564, 3169, 1245, 3730, 4285, 8051, 8052, 2850, 8053, 636, 4565, 1855, 3861, 760, # 7878
- 1799, 8054, 4286, 2209, 1508, 4566, 4048, 1893, 1684, 2293, 8055, 8056, 8057, 4287, 4288, 2210, # 7894
- 479, 8058, 8059, 832, 8060, 4049, 2489, 8061, 2965, 2490, 3731, 990, 3109, 627, 1814, 2642, # 7910
- 4289, 1582, 4290, 2125, 2111, 3496, 4567, 8062, 799, 4291, 3170, 8063, 4568, 2112, 1737, 3013, # 7926
- 1018, 543, 754, 4292, 3309, 1676, 4569, 4570, 4050, 8064, 1489, 8065, 3497, 8066, 2614, 2889, # 7942
- 4051, 8067, 8068, 2966, 8069, 8070, 8071, 8072, 3171, 4571, 4572, 2182, 1722, 8073, 3238, 3239, # 7958
- 1842, 3610, 1715, 481, 365, 1975, 1856, 8074, 8075, 1962, 2491, 4573, 8076, 2126, 3611, 3240, # 7974
- 433, 1894, 2063, 2075, 8077, 602, 2741, 8078, 8079, 8080, 8081, 8082, 3014, 1628, 3400, 8083, # 7990
- 3172, 4574, 4052, 2890, 4575, 2512, 8084, 2544, 2772, 8085, 8086, 8087, 3310, 4576, 2891, 8088, # 8006
- 4577, 8089, 2851, 4578, 4579, 1221, 2967, 4053, 2513, 8090, 8091, 8092, 1867, 1989, 8093, 8094, # 8022
- 8095, 1895, 8096, 8097, 4580, 1896, 4054, 318, 8098, 2094, 4055, 4293, 8099, 8100, 485, 8101, # 8038
- 938, 3862, 553, 2670, 116, 8102, 3863, 3612, 8103, 3498, 2671, 2773, 3401, 3311, 2807, 8104, # 8054
- 3613, 2929, 4056, 1747, 2930, 2968, 8105, 8106, 207, 8107, 8108, 2672, 4581, 2514, 8109, 3015, # 8070
- 890, 3614, 3864, 8110, 1877, 3732, 3402, 8111, 2183, 2353, 3403, 1652, 8112, 8113, 8114, 941, # 8086
- 2294, 208, 3499, 4057, 2019, 330, 4294, 3865, 2892, 2492, 3733, 4295, 8115, 8116, 8117, 8118, # 8102
-)
-# fmt: on
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py
deleted file mode 100644
index a37ab189..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import EUCTWDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import EUCTW_SM_MODEL
-
-
-class EUCTWProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(EUCTW_SM_MODEL)
- self.distribution_analyzer = EUCTWDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "EUC-TW"
-
- @property
- def language(self) -> str:
- return "Taiwan"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py
deleted file mode 100644
index b32bfc74..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py
+++ /dev/null
@@ -1,284 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# GB2312 most frequently used character table
-#
-# Char to FreqOrder table , from hz6763
-
-# 512 --> 0.79 -- 0.79
-# 1024 --> 0.92 -- 0.13
-# 2048 --> 0.98 -- 0.06
-# 6768 --> 1.00 -- 0.02
-#
-# Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79
-# Random Distribution Ration = 512 / (3755 - 512) = 0.157
-#
-# Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR
-
-GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9
-
-GB2312_TABLE_SIZE = 3760
-
-# fmt: off
-GB2312_CHAR_TO_FREQ_ORDER = (
-1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205,
-2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842,
-2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409,
- 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670,
-1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820,
-1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585,
- 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566,
-1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575,
-2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853,
-3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061,
- 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155,
-1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406,
- 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816,
-2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606,
- 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023,
-2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414,
-1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513,
-3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052,
- 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570,
-1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575,
- 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250,
-2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506,
-1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26,
-3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835,
-1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686,
-2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054,
-1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894,
- 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105,
-3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403,
-3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694,
- 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873,
-3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940,
- 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121,
-1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648,
-3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992,
-2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233,
-1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157,
- 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807,
-1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094,
-4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258,
- 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478,
-3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152,
-3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909,
- 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272,
-1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221,
-2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252,
-1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301,
-1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254,
- 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070,
-3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461,
-3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360,
-4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124,
- 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535,
-3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243,
-1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713,
-1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071,
-4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442,
- 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946,
- 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257,
-3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180,
-1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427,
- 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781,
-1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724,
-2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937,
- 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943,
- 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789,
- 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552,
-3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246,
-4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451,
-3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310,
- 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860,
-2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297,
-2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780,
-2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745,
- 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936,
-2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032,
- 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657,
- 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414,
- 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976,
-3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436,
-2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254,
-2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536,
-1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238,
- 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059,
-2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741,
- 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447,
- 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601,
-1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269,
-1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894,
- 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173,
- 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994,
-1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956,
-2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437,
-3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154,
-2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240,
-2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143,
-2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634,
-3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472,
-1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541,
-1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143,
-2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312,
-1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414,
-3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754,
-1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424,
-1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302,
-3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739,
- 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004,
-2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484,
-1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739,
-4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535,
-1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641,
-1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307,
-3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573,
-1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533,
- 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965,
- 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99,
-1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280,
- 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505,
-1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012,
-1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039,
- 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982,
-3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530,
-4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392,
-3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656,
-2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220,
-2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766,
-1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535,
-3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728,
-2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338,
-1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627,
-1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885,
- 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411,
-2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671,
-2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162,
-3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774,
-4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524,
-3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346,
- 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040,
-3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188,
-2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280,
-1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131,
- 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947,
- 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970,
-3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814,
-4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557,
-2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997,
-1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972,
-1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369,
- 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376,
-1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480,
-3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610,
- 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128,
- 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769,
-1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207,
- 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392,
-1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623,
- 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782,
-2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650,
- 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478,
-2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773,
-2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007,
-1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323,
-1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598,
-2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961,
- 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302,
-1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409,
-1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683,
-2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191,
-2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616,
-3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302,
-1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774,
-4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147,
- 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731,
- 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464,
-3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377,
-1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315,
- 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557,
-3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903,
-1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060,
-4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261,
-1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092,
-2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810,
-1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708,
- 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658,
-1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871,
-3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503,
- 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229,
-2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112,
- 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504,
-1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389,
-1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27,
-1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542,
-3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861,
-2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845,
-3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700,
-3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469,
-3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582,
- 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999,
-2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274,
- 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020,
-2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601,
- 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628,
-1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31,
- 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668,
- 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778,
-1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169,
-3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667,
-3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881,
-1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276,
-1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320,
-3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751,
-2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432,
-2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772,
-1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843,
-3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116,
- 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904,
-4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652,
-1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664,
-2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770,
-3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283,
-3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626,
-1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713,
- 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333,
- 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062,
-2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555,
- 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014,
-1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510,
- 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015,
-1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459,
-1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390,
-1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238,
-1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232,
-1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624,
- 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189,
- 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, #last 512
-)
-# fmt: on
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py
deleted file mode 100644
index d423e731..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import GB2312DistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import GB2312_SM_MODEL
-
-
-class GB2312Prober(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(GB2312_SM_MODEL)
- self.distribution_analyzer = GB2312DistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "GB2312"
-
- @property
- def language(self) -> str:
- return "Chinese"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
deleted file mode 100644
index 785d0057..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+++ /dev/null
@@ -1,316 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Shy Shalom
-# Portions created by the Initial Developer are Copyright (C) 2005
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-from .sbcharsetprober import SingleByteCharSetProber
-
-# This prober doesn't actually recognize a language or a charset.
-# It is a helper prober for the use of the Hebrew model probers
-
-### General ideas of the Hebrew charset recognition ###
-#
-# Four main charsets exist in Hebrew:
-# "ISO-8859-8" - Visual Hebrew
-# "windows-1255" - Logical Hebrew
-# "ISO-8859-8-I" - Logical Hebrew
-# "x-mac-hebrew" - ?? Logical Hebrew ??
-#
-# Both "ISO" charsets use a completely identical set of code points, whereas
-# "windows-1255" and "x-mac-hebrew" are two different proper supersets of
-# these code points. windows-1255 defines additional characters in the range
-# 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific
-# diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6.
-# x-mac-hebrew defines similar additional code points but with a different
-# mapping.
-#
-# As far as an average Hebrew text with no diacritics is concerned, all four
-# charsets are identical with respect to code points. Meaning that for the
-# main Hebrew alphabet, all four map the same values to all 27 Hebrew letters
-# (including final letters).
-#
-# The dominant difference between these charsets is their directionality.
-# "Visual" directionality means that the text is ordered as if the renderer is
-# not aware of a BIDI rendering algorithm. The renderer sees the text and
-# draws it from left to right. The text itself when ordered naturally is read
-# backwards. A buffer of Visual Hebrew generally looks like so:
-# "[last word of first line spelled backwards] [whole line ordered backwards
-# and spelled backwards] [first word of first line spelled backwards]
-# [end of line] [last word of second line] ... etc' "
-# adding punctuation marks, numbers and English text to visual text is
-# naturally also "visual" and from left to right.
-#
-# "Logical" directionality means the text is ordered "naturally" according to
-# the order it is read. It is the responsibility of the renderer to display
-# the text from right to left. A BIDI algorithm is used to place general
-# punctuation marks, numbers and English text in the text.
-#
-# Texts in x-mac-hebrew are almost impossible to find on the Internet. From
-# what little evidence I could find, it seems that its general directionality
-# is Logical.
-#
-# To sum up all of the above, the Hebrew probing mechanism knows about two
-# charsets:
-# Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are
-# backwards while line order is natural. For charset recognition purposes
-# the line order is unimportant (In fact, for this implementation, even
-# word order is unimportant).
-# Logical Hebrew - "windows-1255" - normal, naturally ordered text.
-#
-# "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be
-# specifically identified.
-# "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew
-# that contain special punctuation marks or diacritics is displayed with
-# some unconverted characters showing as question marks. This problem might
-# be corrected using another model prober for x-mac-hebrew. Due to the fact
-# that x-mac-hebrew texts are so rare, writing another model prober isn't
-# worth the effort and performance hit.
-#
-#### The Prober ####
-#
-# The prober is divided between two SBCharSetProbers and a HebrewProber,
-# all of which are managed, created, fed data, inquired and deleted by the
-# SBCSGroupProber. The two SBCharSetProbers identify that the text is in
-# fact some kind of Hebrew, Logical or Visual. The final decision about which
-# one is it is made by the HebrewProber by combining final-letter scores
-# with the scores of the two SBCharSetProbers to produce a final answer.
-#
-# The SBCSGroupProber is responsible for stripping the original text of HTML
-# tags, English characters, numbers, low-ASCII punctuation characters, spaces
-# and new lines. It reduces any sequence of such characters to a single space.
-# The buffer fed to each prober in the SBCS group prober is pure text in
-# high-ASCII.
-# The two SBCharSetProbers (model probers) share the same language model:
-# Win1255Model.
-# The first SBCharSetProber uses the model normally as any other
-# SBCharSetProber does, to recognize windows-1255, upon which this model was
-# built. The second SBCharSetProber is told to make the pair-of-letter
-# lookup in the language model backwards. This in practice exactly simulates
-# a visual Hebrew model using the windows-1255 logical Hebrew model.
-#
-# The HebrewProber is not using any language model. All it does is look for
-# final-letter evidence suggesting the text is either logical Hebrew or visual
-# Hebrew. Disjointed from the model probers, the results of the HebrewProber
-# alone are meaningless. HebrewProber always returns 0.00 as confidence
-# since it never identifies a charset by itself. Instead, the pointer to the
-# HebrewProber is passed to the model probers as a helper "Name Prober".
-# When the Group prober receives a positive identification from any prober,
-# it asks for the name of the charset identified. If the prober queried is a
-# Hebrew model prober, the model prober forwards the call to the
-# HebrewProber to make the final decision. In the HebrewProber, the
-# decision is made according to the final-letters scores maintained and Both
-# model probers scores. The answer is returned in the form of the name of the
-# charset identified, either "windows-1255" or "ISO-8859-8".
-
-
-class HebrewProber(CharSetProber):
- SPACE = 0x20
- # windows-1255 / ISO-8859-8 code points of interest
- FINAL_KAF = 0xEA
- NORMAL_KAF = 0xEB
- FINAL_MEM = 0xED
- NORMAL_MEM = 0xEE
- FINAL_NUN = 0xEF
- NORMAL_NUN = 0xF0
- FINAL_PE = 0xF3
- NORMAL_PE = 0xF4
- FINAL_TSADI = 0xF5
- NORMAL_TSADI = 0xF6
-
- # Minimum Visual vs Logical final letter score difference.
- # If the difference is below this, don't rely solely on the final letter score
- # distance.
- MIN_FINAL_CHAR_DISTANCE = 5
-
- # Minimum Visual vs Logical model score difference.
- # If the difference is below this, don't rely at all on the model score
- # distance.
- MIN_MODEL_DISTANCE = 0.01
-
- VISUAL_HEBREW_NAME = "ISO-8859-8"
- LOGICAL_HEBREW_NAME = "windows-1255"
-
- def __init__(self) -> None:
- super().__init__()
- self._final_char_logical_score = 0
- self._final_char_visual_score = 0
- self._prev = self.SPACE
- self._before_prev = self.SPACE
- self._logical_prober: Optional[SingleByteCharSetProber] = None
- self._visual_prober: Optional[SingleByteCharSetProber] = None
- self.reset()
-
- def reset(self) -> None:
- self._final_char_logical_score = 0
- self._final_char_visual_score = 0
- # The two last characters seen in the previous buffer,
- # mPrev and mBeforePrev are initialized to space in order to simulate
- # a word delimiter at the beginning of the data
- self._prev = self.SPACE
- self._before_prev = self.SPACE
- # These probers are owned by the group prober.
-
- def set_model_probers(
- self,
- logical_prober: SingleByteCharSetProber,
- visual_prober: SingleByteCharSetProber,
- ) -> None:
- self._logical_prober = logical_prober
- self._visual_prober = visual_prober
-
- def is_final(self, c: int) -> bool:
- return c in [
- self.FINAL_KAF,
- self.FINAL_MEM,
- self.FINAL_NUN,
- self.FINAL_PE,
- self.FINAL_TSADI,
- ]
-
- def is_non_final(self, c: int) -> bool:
- # The normal Tsadi is not a good Non-Final letter due to words like
- # 'lechotet' (to chat) containing an apostrophe after the tsadi. This
- # apostrophe is converted to a space in FilterWithoutEnglishLetters
- # causing the Non-Final tsadi to appear at an end of a word even
- # though this is not the case in the original text.
- # The letters Pe and Kaf rarely display a related behavior of not being
- # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak'
- # for example legally end with a Non-Final Pe or Kaf. However, the
- # benefit of these letters as Non-Final letters outweighs the damage
- # since these words are quite rare.
- return c in [self.NORMAL_KAF, self.NORMAL_MEM, self.NORMAL_NUN, self.NORMAL_PE]
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- # Final letter analysis for logical-visual decision.
- # Look for evidence that the received buffer is either logical Hebrew
- # or visual Hebrew.
- # The following cases are checked:
- # 1) A word longer than 1 letter, ending with a final letter. This is
- # an indication that the text is laid out "naturally" since the
- # final letter really appears at the end. +1 for logical score.
- # 2) A word longer than 1 letter, ending with a Non-Final letter. In
- # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi,
- # should not end with the Non-Final form of that letter. Exceptions
- # to this rule are mentioned above in isNonFinal(). This is an
- # indication that the text is laid out backwards. +1 for visual
- # score
- # 3) A word longer than 1 letter, starting with a final letter. Final
- # letters should not appear at the beginning of a word. This is an
- # indication that the text is laid out backwards. +1 for visual
- # score.
- #
- # The visual score and logical score are accumulated throughout the
- # text and are finally checked against each other in GetCharSetName().
- # No checking for final letters in the middle of words is done since
- # that case is not an indication for either Logical or Visual text.
- #
- # We automatically filter out all 7-bit characters (replace them with
- # spaces) so the word boundary detection works properly. [MAP]
-
- if self.state == ProbingState.NOT_ME:
- # Both model probers say it's not them. No reason to continue.
- return ProbingState.NOT_ME
-
- byte_str = self.filter_high_byte_only(byte_str)
-
- for cur in byte_str:
- if cur == self.SPACE:
- # We stand on a space - a word just ended
- if self._before_prev != self.SPACE:
- # next-to-last char was not a space so self._prev is not a
- # 1 letter word
- if self.is_final(self._prev):
- # case (1) [-2:not space][-1:final letter][cur:space]
- self._final_char_logical_score += 1
- elif self.is_non_final(self._prev):
- # case (2) [-2:not space][-1:Non-Final letter][
- # cur:space]
- self._final_char_visual_score += 1
- else:
- # Not standing on a space
- if (
- (self._before_prev == self.SPACE)
- and (self.is_final(self._prev))
- and (cur != self.SPACE)
- ):
- # case (3) [-2:space][-1:final letter][cur:not space]
- self._final_char_visual_score += 1
- self._before_prev = self._prev
- self._prev = cur
-
- # Forever detecting, till the end or until both model probers return
- # ProbingState.NOT_ME (handled above)
- return ProbingState.DETECTING
-
- @property
- def charset_name(self) -> str:
- assert self._logical_prober is not None
- assert self._visual_prober is not None
-
- # Make the decision: is it Logical or Visual?
- # If the final letter score distance is dominant enough, rely on it.
- finalsub = self._final_char_logical_score - self._final_char_visual_score
- if finalsub >= self.MIN_FINAL_CHAR_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if finalsub <= -self.MIN_FINAL_CHAR_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # It's not dominant enough, try to rely on the model scores instead.
- modelsub = (
- self._logical_prober.get_confidence() - self._visual_prober.get_confidence()
- )
- if modelsub > self.MIN_MODEL_DISTANCE:
- return self.LOGICAL_HEBREW_NAME
- if modelsub < -self.MIN_MODEL_DISTANCE:
- return self.VISUAL_HEBREW_NAME
-
- # Still no good, back to final letter distance, maybe it'll save the
- # day.
- if finalsub < 0.0:
- return self.VISUAL_HEBREW_NAME
-
- # (finalsub > 0 - Logical) or (don't know what to do) default to
- # Logical.
- return self.LOGICAL_HEBREW_NAME
-
- @property
- def language(self) -> str:
- return "Hebrew"
-
- @property
- def state(self) -> ProbingState:
- assert self._logical_prober is not None
- assert self._visual_prober is not None
-
- # Remain active as long as any of the model probers are active.
- if (self._logical_prober.state == ProbingState.NOT_ME) and (
- self._visual_prober.state == ProbingState.NOT_ME
- ):
- return ProbingState.NOT_ME
- return ProbingState.DETECTING
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py
deleted file mode 100644
index 3293576e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py
+++ /dev/null
@@ -1,325 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# Sampling from about 20M text materials include literature and computer technology
-#
-# Japanese frequency table, applied to both S-JIS and EUC-JP
-# They are sorted in order.
-
-# 128 --> 0.77094
-# 256 --> 0.85710
-# 512 --> 0.92635
-# 1024 --> 0.97130
-# 2048 --> 0.99431
-#
-# Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58
-# Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191
-#
-# Typical Distribution Ratio, 25% of IDR
-
-JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0
-
-# Char to FreqOrder table ,
-JIS_TABLE_SIZE = 4368
-
-# fmt: off
-JIS_CHAR_TO_FREQ_ORDER = (
- 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16
-3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32
-1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48
-2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64
-2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80
-5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96
-1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112
-5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128
-5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144
-5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160
-5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176
-5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192
-5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208
-1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224
-1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240
-1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256
-2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272
-3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288
-3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304
- 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320
- 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336
-1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352
- 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368
-5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384
- 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400
- 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416
- 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432
- 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448
- 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464
-5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480
-5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496
-5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512
-4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528
-5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544
-5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560
-5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576
-5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592
-5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608
-5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624
-5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640
-5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656
-5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672
-3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688
-5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704
-5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720
-5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736
-5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752
-5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768
-5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784
-5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800
-5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816
-5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832
-5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848
-5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864
-5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880
-5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896
-5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912
-5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928
-5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944
-5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960
-5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976
-5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992
-5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008
-5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024
-5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040
-5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056
-5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072
-5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088
-5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104
-5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120
-5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136
-5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152
-5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168
-5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184
-5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200
-5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216
-5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232
-5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248
-5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264
-5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280
-5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296
-6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312
-6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328
-6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344
-6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360
-6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376
-6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392
-6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408
-6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424
-4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440
- 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456
- 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472
-1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488
-1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504
- 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520
-3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536
-3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552
- 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568
-3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584
-3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600
- 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616
-2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632
- 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648
-3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664
-1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680
- 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696
-1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712
- 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728
-2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744
-2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760
-2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776
-2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792
-1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808
-1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824
-1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840
-1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856
-2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872
-1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888
-2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904
-1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920
-1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936
-1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952
-1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968
-1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984
-1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000
- 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016
- 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032
-1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048
-2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064
-2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080
-2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096
-3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112
-3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128
- 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144
-3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160
-1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176
- 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192
-2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208
-1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224
- 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240
-3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256
-4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272
-2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288
-1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304
-2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320
-1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336
- 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352
- 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368
-1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384
-2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400
-2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416
-2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432
-3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448
-1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464
-2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480
- 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496
- 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512
- 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528
-1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544
-2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560
- 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576
-1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592
-1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608
- 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624
-1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640
-1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656
-1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672
- 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688
-2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704
- 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720
-2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736
-3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752
-2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768
-1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784
-6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800
-1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816
-2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832
-1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848
- 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864
- 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880
-3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896
-3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912
-1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928
-1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944
-1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960
-1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976
- 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992
- 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008
-2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024
- 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040
-3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056
-2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072
- 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088
-1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104
-2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120
- 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136
-1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152
- 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168
-4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184
-2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200
-1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216
- 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232
-1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248
-2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264
- 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280
-6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296
-1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312
-1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328
-2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344
-3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360
- 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376
-3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392
-1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408
- 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424
-1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440
- 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456
-3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472
- 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488
-2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504
- 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520
-4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536
-2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552
-1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568
-1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584
-1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600
- 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616
-1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632
-3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648
-1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664
-3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680
- 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696
- 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712
- 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728
-2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744
-1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760
- 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776
-1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792
- 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808
-1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824
- 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840
- 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856
- 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872
-1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888
-1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904
-2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920
-4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936
- 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952
-1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968
- 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984
-1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000
-3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016
-1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032
-2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048
-2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064
-1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080
-1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096
-2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112
- 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128
-2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144
-1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160
-1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176
-1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192
-1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208
-3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224
-2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240
-2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256
- 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272
-3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288
-3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304
-1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320
-2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336
-1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352
-2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512
-)
-# fmt: on
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py
deleted file mode 100644
index c1296999..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py
+++ /dev/null
@@ -1,2382 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-# The frequency data itself is the same as euc-kr.
-# This is just a mapping table to euc-kr.
-
-JOHAB_TO_EUCKR_ORDER_TABLE = {
- 0x8861: 0,
- 0x8862: 1,
- 0x8865: 2,
- 0x8868: 3,
- 0x8869: 4,
- 0x886A: 5,
- 0x886B: 6,
- 0x8871: 7,
- 0x8873: 8,
- 0x8874: 9,
- 0x8875: 10,
- 0x8876: 11,
- 0x8877: 12,
- 0x8878: 13,
- 0x8879: 14,
- 0x887B: 15,
- 0x887C: 16,
- 0x887D: 17,
- 0x8881: 18,
- 0x8882: 19,
- 0x8885: 20,
- 0x8889: 21,
- 0x8891: 22,
- 0x8893: 23,
- 0x8895: 24,
- 0x8896: 25,
- 0x8897: 26,
- 0x88A1: 27,
- 0x88A2: 28,
- 0x88A5: 29,
- 0x88A9: 30,
- 0x88B5: 31,
- 0x88B7: 32,
- 0x88C1: 33,
- 0x88C5: 34,
- 0x88C9: 35,
- 0x88E1: 36,
- 0x88E2: 37,
- 0x88E5: 38,
- 0x88E8: 39,
- 0x88E9: 40,
- 0x88EB: 41,
- 0x88F1: 42,
- 0x88F3: 43,
- 0x88F5: 44,
- 0x88F6: 45,
- 0x88F7: 46,
- 0x88F8: 47,
- 0x88FB: 48,
- 0x88FC: 49,
- 0x88FD: 50,
- 0x8941: 51,
- 0x8945: 52,
- 0x8949: 53,
- 0x8951: 54,
- 0x8953: 55,
- 0x8955: 56,
- 0x8956: 57,
- 0x8957: 58,
- 0x8961: 59,
- 0x8962: 60,
- 0x8963: 61,
- 0x8965: 62,
- 0x8968: 63,
- 0x8969: 64,
- 0x8971: 65,
- 0x8973: 66,
- 0x8975: 67,
- 0x8976: 68,
- 0x8977: 69,
- 0x897B: 70,
- 0x8981: 71,
- 0x8985: 72,
- 0x8989: 73,
- 0x8993: 74,
- 0x8995: 75,
- 0x89A1: 76,
- 0x89A2: 77,
- 0x89A5: 78,
- 0x89A8: 79,
- 0x89A9: 80,
- 0x89AB: 81,
- 0x89AD: 82,
- 0x89B0: 83,
- 0x89B1: 84,
- 0x89B3: 85,
- 0x89B5: 86,
- 0x89B7: 87,
- 0x89B8: 88,
- 0x89C1: 89,
- 0x89C2: 90,
- 0x89C5: 91,
- 0x89C9: 92,
- 0x89CB: 93,
- 0x89D1: 94,
- 0x89D3: 95,
- 0x89D5: 96,
- 0x89D7: 97,
- 0x89E1: 98,
- 0x89E5: 99,
- 0x89E9: 100,
- 0x89F3: 101,
- 0x89F6: 102,
- 0x89F7: 103,
- 0x8A41: 104,
- 0x8A42: 105,
- 0x8A45: 106,
- 0x8A49: 107,
- 0x8A51: 108,
- 0x8A53: 109,
- 0x8A55: 110,
- 0x8A57: 111,
- 0x8A61: 112,
- 0x8A65: 113,
- 0x8A69: 114,
- 0x8A73: 115,
- 0x8A75: 116,
- 0x8A81: 117,
- 0x8A82: 118,
- 0x8A85: 119,
- 0x8A88: 120,
- 0x8A89: 121,
- 0x8A8A: 122,
- 0x8A8B: 123,
- 0x8A90: 124,
- 0x8A91: 125,
- 0x8A93: 126,
- 0x8A95: 127,
- 0x8A97: 128,
- 0x8A98: 129,
- 0x8AA1: 130,
- 0x8AA2: 131,
- 0x8AA5: 132,
- 0x8AA9: 133,
- 0x8AB6: 134,
- 0x8AB7: 135,
- 0x8AC1: 136,
- 0x8AD5: 137,
- 0x8AE1: 138,
- 0x8AE2: 139,
- 0x8AE5: 140,
- 0x8AE9: 141,
- 0x8AF1: 142,
- 0x8AF3: 143,
- 0x8AF5: 144,
- 0x8B41: 145,
- 0x8B45: 146,
- 0x8B49: 147,
- 0x8B61: 148,
- 0x8B62: 149,
- 0x8B65: 150,
- 0x8B68: 151,
- 0x8B69: 152,
- 0x8B6A: 153,
- 0x8B71: 154,
- 0x8B73: 155,
- 0x8B75: 156,
- 0x8B77: 157,
- 0x8B81: 158,
- 0x8BA1: 159,
- 0x8BA2: 160,
- 0x8BA5: 161,
- 0x8BA8: 162,
- 0x8BA9: 163,
- 0x8BAB: 164,
- 0x8BB1: 165,
- 0x8BB3: 166,
- 0x8BB5: 167,
- 0x8BB7: 168,
- 0x8BB8: 169,
- 0x8BBC: 170,
- 0x8C61: 171,
- 0x8C62: 172,
- 0x8C63: 173,
- 0x8C65: 174,
- 0x8C69: 175,
- 0x8C6B: 176,
- 0x8C71: 177,
- 0x8C73: 178,
- 0x8C75: 179,
- 0x8C76: 180,
- 0x8C77: 181,
- 0x8C7B: 182,
- 0x8C81: 183,
- 0x8C82: 184,
- 0x8C85: 185,
- 0x8C89: 186,
- 0x8C91: 187,
- 0x8C93: 188,
- 0x8C95: 189,
- 0x8C96: 190,
- 0x8C97: 191,
- 0x8CA1: 192,
- 0x8CA2: 193,
- 0x8CA9: 194,
- 0x8CE1: 195,
- 0x8CE2: 196,
- 0x8CE3: 197,
- 0x8CE5: 198,
- 0x8CE9: 199,
- 0x8CF1: 200,
- 0x8CF3: 201,
- 0x8CF5: 202,
- 0x8CF6: 203,
- 0x8CF7: 204,
- 0x8D41: 205,
- 0x8D42: 206,
- 0x8D45: 207,
- 0x8D51: 208,
- 0x8D55: 209,
- 0x8D57: 210,
- 0x8D61: 211,
- 0x8D65: 212,
- 0x8D69: 213,
- 0x8D75: 214,
- 0x8D76: 215,
- 0x8D7B: 216,
- 0x8D81: 217,
- 0x8DA1: 218,
- 0x8DA2: 219,
- 0x8DA5: 220,
- 0x8DA7: 221,
- 0x8DA9: 222,
- 0x8DB1: 223,
- 0x8DB3: 224,
- 0x8DB5: 225,
- 0x8DB7: 226,
- 0x8DB8: 227,
- 0x8DB9: 228,
- 0x8DC1: 229,
- 0x8DC2: 230,
- 0x8DC9: 231,
- 0x8DD6: 232,
- 0x8DD7: 233,
- 0x8DE1: 234,
- 0x8DE2: 235,
- 0x8DF7: 236,
- 0x8E41: 237,
- 0x8E45: 238,
- 0x8E49: 239,
- 0x8E51: 240,
- 0x8E53: 241,
- 0x8E57: 242,
- 0x8E61: 243,
- 0x8E81: 244,
- 0x8E82: 245,
- 0x8E85: 246,
- 0x8E89: 247,
- 0x8E90: 248,
- 0x8E91: 249,
- 0x8E93: 250,
- 0x8E95: 251,
- 0x8E97: 252,
- 0x8E98: 253,
- 0x8EA1: 254,
- 0x8EA9: 255,
- 0x8EB6: 256,
- 0x8EB7: 257,
- 0x8EC1: 258,
- 0x8EC2: 259,
- 0x8EC5: 260,
- 0x8EC9: 261,
- 0x8ED1: 262,
- 0x8ED3: 263,
- 0x8ED6: 264,
- 0x8EE1: 265,
- 0x8EE5: 266,
- 0x8EE9: 267,
- 0x8EF1: 268,
- 0x8EF3: 269,
- 0x8F41: 270,
- 0x8F61: 271,
- 0x8F62: 272,
- 0x8F65: 273,
- 0x8F67: 274,
- 0x8F69: 275,
- 0x8F6B: 276,
- 0x8F70: 277,
- 0x8F71: 278,
- 0x8F73: 279,
- 0x8F75: 280,
- 0x8F77: 281,
- 0x8F7B: 282,
- 0x8FA1: 283,
- 0x8FA2: 284,
- 0x8FA5: 285,
- 0x8FA9: 286,
- 0x8FB1: 287,
- 0x8FB3: 288,
- 0x8FB5: 289,
- 0x8FB7: 290,
- 0x9061: 291,
- 0x9062: 292,
- 0x9063: 293,
- 0x9065: 294,
- 0x9068: 295,
- 0x9069: 296,
- 0x906A: 297,
- 0x906B: 298,
- 0x9071: 299,
- 0x9073: 300,
- 0x9075: 301,
- 0x9076: 302,
- 0x9077: 303,
- 0x9078: 304,
- 0x9079: 305,
- 0x907B: 306,
- 0x907D: 307,
- 0x9081: 308,
- 0x9082: 309,
- 0x9085: 310,
- 0x9089: 311,
- 0x9091: 312,
- 0x9093: 313,
- 0x9095: 314,
- 0x9096: 315,
- 0x9097: 316,
- 0x90A1: 317,
- 0x90A2: 318,
- 0x90A5: 319,
- 0x90A9: 320,
- 0x90B1: 321,
- 0x90B7: 322,
- 0x90E1: 323,
- 0x90E2: 324,
- 0x90E4: 325,
- 0x90E5: 326,
- 0x90E9: 327,
- 0x90EB: 328,
- 0x90EC: 329,
- 0x90F1: 330,
- 0x90F3: 331,
- 0x90F5: 332,
- 0x90F6: 333,
- 0x90F7: 334,
- 0x90FD: 335,
- 0x9141: 336,
- 0x9142: 337,
- 0x9145: 338,
- 0x9149: 339,
- 0x9151: 340,
- 0x9153: 341,
- 0x9155: 342,
- 0x9156: 343,
- 0x9157: 344,
- 0x9161: 345,
- 0x9162: 346,
- 0x9165: 347,
- 0x9169: 348,
- 0x9171: 349,
- 0x9173: 350,
- 0x9176: 351,
- 0x9177: 352,
- 0x917A: 353,
- 0x9181: 354,
- 0x9185: 355,
- 0x91A1: 356,
- 0x91A2: 357,
- 0x91A5: 358,
- 0x91A9: 359,
- 0x91AB: 360,
- 0x91B1: 361,
- 0x91B3: 362,
- 0x91B5: 363,
- 0x91B7: 364,
- 0x91BC: 365,
- 0x91BD: 366,
- 0x91C1: 367,
- 0x91C5: 368,
- 0x91C9: 369,
- 0x91D6: 370,
- 0x9241: 371,
- 0x9245: 372,
- 0x9249: 373,
- 0x9251: 374,
- 0x9253: 375,
- 0x9255: 376,
- 0x9261: 377,
- 0x9262: 378,
- 0x9265: 379,
- 0x9269: 380,
- 0x9273: 381,
- 0x9275: 382,
- 0x9277: 383,
- 0x9281: 384,
- 0x9282: 385,
- 0x9285: 386,
- 0x9288: 387,
- 0x9289: 388,
- 0x9291: 389,
- 0x9293: 390,
- 0x9295: 391,
- 0x9297: 392,
- 0x92A1: 393,
- 0x92B6: 394,
- 0x92C1: 395,
- 0x92E1: 396,
- 0x92E5: 397,
- 0x92E9: 398,
- 0x92F1: 399,
- 0x92F3: 400,
- 0x9341: 401,
- 0x9342: 402,
- 0x9349: 403,
- 0x9351: 404,
- 0x9353: 405,
- 0x9357: 406,
- 0x9361: 407,
- 0x9362: 408,
- 0x9365: 409,
- 0x9369: 410,
- 0x936A: 411,
- 0x936B: 412,
- 0x9371: 413,
- 0x9373: 414,
- 0x9375: 415,
- 0x9377: 416,
- 0x9378: 417,
- 0x937C: 418,
- 0x9381: 419,
- 0x9385: 420,
- 0x9389: 421,
- 0x93A1: 422,
- 0x93A2: 423,
- 0x93A5: 424,
- 0x93A9: 425,
- 0x93AB: 426,
- 0x93B1: 427,
- 0x93B3: 428,
- 0x93B5: 429,
- 0x93B7: 430,
- 0x93BC: 431,
- 0x9461: 432,
- 0x9462: 433,
- 0x9463: 434,
- 0x9465: 435,
- 0x9468: 436,
- 0x9469: 437,
- 0x946A: 438,
- 0x946B: 439,
- 0x946C: 440,
- 0x9470: 441,
- 0x9471: 442,
- 0x9473: 443,
- 0x9475: 444,
- 0x9476: 445,
- 0x9477: 446,
- 0x9478: 447,
- 0x9479: 448,
- 0x947D: 449,
- 0x9481: 450,
- 0x9482: 451,
- 0x9485: 452,
- 0x9489: 453,
- 0x9491: 454,
- 0x9493: 455,
- 0x9495: 456,
- 0x9496: 457,
- 0x9497: 458,
- 0x94A1: 459,
- 0x94E1: 460,
- 0x94E2: 461,
- 0x94E3: 462,
- 0x94E5: 463,
- 0x94E8: 464,
- 0x94E9: 465,
- 0x94EB: 466,
- 0x94EC: 467,
- 0x94F1: 468,
- 0x94F3: 469,
- 0x94F5: 470,
- 0x94F7: 471,
- 0x94F9: 472,
- 0x94FC: 473,
- 0x9541: 474,
- 0x9542: 475,
- 0x9545: 476,
- 0x9549: 477,
- 0x9551: 478,
- 0x9553: 479,
- 0x9555: 480,
- 0x9556: 481,
- 0x9557: 482,
- 0x9561: 483,
- 0x9565: 484,
- 0x9569: 485,
- 0x9576: 486,
- 0x9577: 487,
- 0x9581: 488,
- 0x9585: 489,
- 0x95A1: 490,
- 0x95A2: 491,
- 0x95A5: 492,
- 0x95A8: 493,
- 0x95A9: 494,
- 0x95AB: 495,
- 0x95AD: 496,
- 0x95B1: 497,
- 0x95B3: 498,
- 0x95B5: 499,
- 0x95B7: 500,
- 0x95B9: 501,
- 0x95BB: 502,
- 0x95C1: 503,
- 0x95C5: 504,
- 0x95C9: 505,
- 0x95E1: 506,
- 0x95F6: 507,
- 0x9641: 508,
- 0x9645: 509,
- 0x9649: 510,
- 0x9651: 511,
- 0x9653: 512,
- 0x9655: 513,
- 0x9661: 514,
- 0x9681: 515,
- 0x9682: 516,
- 0x9685: 517,
- 0x9689: 518,
- 0x9691: 519,
- 0x9693: 520,
- 0x9695: 521,
- 0x9697: 522,
- 0x96A1: 523,
- 0x96B6: 524,
- 0x96C1: 525,
- 0x96D7: 526,
- 0x96E1: 527,
- 0x96E5: 528,
- 0x96E9: 529,
- 0x96F3: 530,
- 0x96F5: 531,
- 0x96F7: 532,
- 0x9741: 533,
- 0x9745: 534,
- 0x9749: 535,
- 0x9751: 536,
- 0x9757: 537,
- 0x9761: 538,
- 0x9762: 539,
- 0x9765: 540,
- 0x9768: 541,
- 0x9769: 542,
- 0x976B: 543,
- 0x9771: 544,
- 0x9773: 545,
- 0x9775: 546,
- 0x9777: 547,
- 0x9781: 548,
- 0x97A1: 549,
- 0x97A2: 550,
- 0x97A5: 551,
- 0x97A8: 552,
- 0x97A9: 553,
- 0x97B1: 554,
- 0x97B3: 555,
- 0x97B5: 556,
- 0x97B6: 557,
- 0x97B7: 558,
- 0x97B8: 559,
- 0x9861: 560,
- 0x9862: 561,
- 0x9865: 562,
- 0x9869: 563,
- 0x9871: 564,
- 0x9873: 565,
- 0x9875: 566,
- 0x9876: 567,
- 0x9877: 568,
- 0x987D: 569,
- 0x9881: 570,
- 0x9882: 571,
- 0x9885: 572,
- 0x9889: 573,
- 0x9891: 574,
- 0x9893: 575,
- 0x9895: 576,
- 0x9896: 577,
- 0x9897: 578,
- 0x98E1: 579,
- 0x98E2: 580,
- 0x98E5: 581,
- 0x98E9: 582,
- 0x98EB: 583,
- 0x98EC: 584,
- 0x98F1: 585,
- 0x98F3: 586,
- 0x98F5: 587,
- 0x98F6: 588,
- 0x98F7: 589,
- 0x98FD: 590,
- 0x9941: 591,
- 0x9942: 592,
- 0x9945: 593,
- 0x9949: 594,
- 0x9951: 595,
- 0x9953: 596,
- 0x9955: 597,
- 0x9956: 598,
- 0x9957: 599,
- 0x9961: 600,
- 0x9976: 601,
- 0x99A1: 602,
- 0x99A2: 603,
- 0x99A5: 604,
- 0x99A9: 605,
- 0x99B7: 606,
- 0x99C1: 607,
- 0x99C9: 608,
- 0x99E1: 609,
- 0x9A41: 610,
- 0x9A45: 611,
- 0x9A81: 612,
- 0x9A82: 613,
- 0x9A85: 614,
- 0x9A89: 615,
- 0x9A90: 616,
- 0x9A91: 617,
- 0x9A97: 618,
- 0x9AC1: 619,
- 0x9AE1: 620,
- 0x9AE5: 621,
- 0x9AE9: 622,
- 0x9AF1: 623,
- 0x9AF3: 624,
- 0x9AF7: 625,
- 0x9B61: 626,
- 0x9B62: 627,
- 0x9B65: 628,
- 0x9B68: 629,
- 0x9B69: 630,
- 0x9B71: 631,
- 0x9B73: 632,
- 0x9B75: 633,
- 0x9B81: 634,
- 0x9B85: 635,
- 0x9B89: 636,
- 0x9B91: 637,
- 0x9B93: 638,
- 0x9BA1: 639,
- 0x9BA5: 640,
- 0x9BA9: 641,
- 0x9BB1: 642,
- 0x9BB3: 643,
- 0x9BB5: 644,
- 0x9BB7: 645,
- 0x9C61: 646,
- 0x9C62: 647,
- 0x9C65: 648,
- 0x9C69: 649,
- 0x9C71: 650,
- 0x9C73: 651,
- 0x9C75: 652,
- 0x9C76: 653,
- 0x9C77: 654,
- 0x9C78: 655,
- 0x9C7C: 656,
- 0x9C7D: 657,
- 0x9C81: 658,
- 0x9C82: 659,
- 0x9C85: 660,
- 0x9C89: 661,
- 0x9C91: 662,
- 0x9C93: 663,
- 0x9C95: 664,
- 0x9C96: 665,
- 0x9C97: 666,
- 0x9CA1: 667,
- 0x9CA2: 668,
- 0x9CA5: 669,
- 0x9CB5: 670,
- 0x9CB7: 671,
- 0x9CE1: 672,
- 0x9CE2: 673,
- 0x9CE5: 674,
- 0x9CE9: 675,
- 0x9CF1: 676,
- 0x9CF3: 677,
- 0x9CF5: 678,
- 0x9CF6: 679,
- 0x9CF7: 680,
- 0x9CFD: 681,
- 0x9D41: 682,
- 0x9D42: 683,
- 0x9D45: 684,
- 0x9D49: 685,
- 0x9D51: 686,
- 0x9D53: 687,
- 0x9D55: 688,
- 0x9D57: 689,
- 0x9D61: 690,
- 0x9D62: 691,
- 0x9D65: 692,
- 0x9D69: 693,
- 0x9D71: 694,
- 0x9D73: 695,
- 0x9D75: 696,
- 0x9D76: 697,
- 0x9D77: 698,
- 0x9D81: 699,
- 0x9D85: 700,
- 0x9D93: 701,
- 0x9D95: 702,
- 0x9DA1: 703,
- 0x9DA2: 704,
- 0x9DA5: 705,
- 0x9DA9: 706,
- 0x9DB1: 707,
- 0x9DB3: 708,
- 0x9DB5: 709,
- 0x9DB7: 710,
- 0x9DC1: 711,
- 0x9DC5: 712,
- 0x9DD7: 713,
- 0x9DF6: 714,
- 0x9E41: 715,
- 0x9E45: 716,
- 0x9E49: 717,
- 0x9E51: 718,
- 0x9E53: 719,
- 0x9E55: 720,
- 0x9E57: 721,
- 0x9E61: 722,
- 0x9E65: 723,
- 0x9E69: 724,
- 0x9E73: 725,
- 0x9E75: 726,
- 0x9E77: 727,
- 0x9E81: 728,
- 0x9E82: 729,
- 0x9E85: 730,
- 0x9E89: 731,
- 0x9E91: 732,
- 0x9E93: 733,
- 0x9E95: 734,
- 0x9E97: 735,
- 0x9EA1: 736,
- 0x9EB6: 737,
- 0x9EC1: 738,
- 0x9EE1: 739,
- 0x9EE2: 740,
- 0x9EE5: 741,
- 0x9EE9: 742,
- 0x9EF1: 743,
- 0x9EF5: 744,
- 0x9EF7: 745,
- 0x9F41: 746,
- 0x9F42: 747,
- 0x9F45: 748,
- 0x9F49: 749,
- 0x9F51: 750,
- 0x9F53: 751,
- 0x9F55: 752,
- 0x9F57: 753,
- 0x9F61: 754,
- 0x9F62: 755,
- 0x9F65: 756,
- 0x9F69: 757,
- 0x9F71: 758,
- 0x9F73: 759,
- 0x9F75: 760,
- 0x9F77: 761,
- 0x9F78: 762,
- 0x9F7B: 763,
- 0x9F7C: 764,
- 0x9FA1: 765,
- 0x9FA2: 766,
- 0x9FA5: 767,
- 0x9FA9: 768,
- 0x9FB1: 769,
- 0x9FB3: 770,
- 0x9FB5: 771,
- 0x9FB7: 772,
- 0xA061: 773,
- 0xA062: 774,
- 0xA065: 775,
- 0xA067: 776,
- 0xA068: 777,
- 0xA069: 778,
- 0xA06A: 779,
- 0xA06B: 780,
- 0xA071: 781,
- 0xA073: 782,
- 0xA075: 783,
- 0xA077: 784,
- 0xA078: 785,
- 0xA07B: 786,
- 0xA07D: 787,
- 0xA081: 788,
- 0xA082: 789,
- 0xA085: 790,
- 0xA089: 791,
- 0xA091: 792,
- 0xA093: 793,
- 0xA095: 794,
- 0xA096: 795,
- 0xA097: 796,
- 0xA098: 797,
- 0xA0A1: 798,
- 0xA0A2: 799,
- 0xA0A9: 800,
- 0xA0B7: 801,
- 0xA0E1: 802,
- 0xA0E2: 803,
- 0xA0E5: 804,
- 0xA0E9: 805,
- 0xA0EB: 806,
- 0xA0F1: 807,
- 0xA0F3: 808,
- 0xA0F5: 809,
- 0xA0F7: 810,
- 0xA0F8: 811,
- 0xA0FD: 812,
- 0xA141: 813,
- 0xA142: 814,
- 0xA145: 815,
- 0xA149: 816,
- 0xA151: 817,
- 0xA153: 818,
- 0xA155: 819,
- 0xA156: 820,
- 0xA157: 821,
- 0xA161: 822,
- 0xA162: 823,
- 0xA165: 824,
- 0xA169: 825,
- 0xA175: 826,
- 0xA176: 827,
- 0xA177: 828,
- 0xA179: 829,
- 0xA181: 830,
- 0xA1A1: 831,
- 0xA1A2: 832,
- 0xA1A4: 833,
- 0xA1A5: 834,
- 0xA1A9: 835,
- 0xA1AB: 836,
- 0xA1B1: 837,
- 0xA1B3: 838,
- 0xA1B5: 839,
- 0xA1B7: 840,
- 0xA1C1: 841,
- 0xA1C5: 842,
- 0xA1D6: 843,
- 0xA1D7: 844,
- 0xA241: 845,
- 0xA245: 846,
- 0xA249: 847,
- 0xA253: 848,
- 0xA255: 849,
- 0xA257: 850,
- 0xA261: 851,
- 0xA265: 852,
- 0xA269: 853,
- 0xA273: 854,
- 0xA275: 855,
- 0xA281: 856,
- 0xA282: 857,
- 0xA283: 858,
- 0xA285: 859,
- 0xA288: 860,
- 0xA289: 861,
- 0xA28A: 862,
- 0xA28B: 863,
- 0xA291: 864,
- 0xA293: 865,
- 0xA295: 866,
- 0xA297: 867,
- 0xA29B: 868,
- 0xA29D: 869,
- 0xA2A1: 870,
- 0xA2A5: 871,
- 0xA2A9: 872,
- 0xA2B3: 873,
- 0xA2B5: 874,
- 0xA2C1: 875,
- 0xA2E1: 876,
- 0xA2E5: 877,
- 0xA2E9: 878,
- 0xA341: 879,
- 0xA345: 880,
- 0xA349: 881,
- 0xA351: 882,
- 0xA355: 883,
- 0xA361: 884,
- 0xA365: 885,
- 0xA369: 886,
- 0xA371: 887,
- 0xA375: 888,
- 0xA3A1: 889,
- 0xA3A2: 890,
- 0xA3A5: 891,
- 0xA3A8: 892,
- 0xA3A9: 893,
- 0xA3AB: 894,
- 0xA3B1: 895,
- 0xA3B3: 896,
- 0xA3B5: 897,
- 0xA3B6: 898,
- 0xA3B7: 899,
- 0xA3B9: 900,
- 0xA3BB: 901,
- 0xA461: 902,
- 0xA462: 903,
- 0xA463: 904,
- 0xA464: 905,
- 0xA465: 906,
- 0xA468: 907,
- 0xA469: 908,
- 0xA46A: 909,
- 0xA46B: 910,
- 0xA46C: 911,
- 0xA471: 912,
- 0xA473: 913,
- 0xA475: 914,
- 0xA477: 915,
- 0xA47B: 916,
- 0xA481: 917,
- 0xA482: 918,
- 0xA485: 919,
- 0xA489: 920,
- 0xA491: 921,
- 0xA493: 922,
- 0xA495: 923,
- 0xA496: 924,
- 0xA497: 925,
- 0xA49B: 926,
- 0xA4A1: 927,
- 0xA4A2: 928,
- 0xA4A5: 929,
- 0xA4B3: 930,
- 0xA4E1: 931,
- 0xA4E2: 932,
- 0xA4E5: 933,
- 0xA4E8: 934,
- 0xA4E9: 935,
- 0xA4EB: 936,
- 0xA4F1: 937,
- 0xA4F3: 938,
- 0xA4F5: 939,
- 0xA4F7: 940,
- 0xA4F8: 941,
- 0xA541: 942,
- 0xA542: 943,
- 0xA545: 944,
- 0xA548: 945,
- 0xA549: 946,
- 0xA551: 947,
- 0xA553: 948,
- 0xA555: 949,
- 0xA556: 950,
- 0xA557: 951,
- 0xA561: 952,
- 0xA562: 953,
- 0xA565: 954,
- 0xA569: 955,
- 0xA573: 956,
- 0xA575: 957,
- 0xA576: 958,
- 0xA577: 959,
- 0xA57B: 960,
- 0xA581: 961,
- 0xA585: 962,
- 0xA5A1: 963,
- 0xA5A2: 964,
- 0xA5A3: 965,
- 0xA5A5: 966,
- 0xA5A9: 967,
- 0xA5B1: 968,
- 0xA5B3: 969,
- 0xA5B5: 970,
- 0xA5B7: 971,
- 0xA5C1: 972,
- 0xA5C5: 973,
- 0xA5D6: 974,
- 0xA5E1: 975,
- 0xA5F6: 976,
- 0xA641: 977,
- 0xA642: 978,
- 0xA645: 979,
- 0xA649: 980,
- 0xA651: 981,
- 0xA653: 982,
- 0xA661: 983,
- 0xA665: 984,
- 0xA681: 985,
- 0xA682: 986,
- 0xA685: 987,
- 0xA688: 988,
- 0xA689: 989,
- 0xA68A: 990,
- 0xA68B: 991,
- 0xA691: 992,
- 0xA693: 993,
- 0xA695: 994,
- 0xA697: 995,
- 0xA69B: 996,
- 0xA69C: 997,
- 0xA6A1: 998,
- 0xA6A9: 999,
- 0xA6B6: 1000,
- 0xA6C1: 1001,
- 0xA6E1: 1002,
- 0xA6E2: 1003,
- 0xA6E5: 1004,
- 0xA6E9: 1005,
- 0xA6F7: 1006,
- 0xA741: 1007,
- 0xA745: 1008,
- 0xA749: 1009,
- 0xA751: 1010,
- 0xA755: 1011,
- 0xA757: 1012,
- 0xA761: 1013,
- 0xA762: 1014,
- 0xA765: 1015,
- 0xA769: 1016,
- 0xA771: 1017,
- 0xA773: 1018,
- 0xA775: 1019,
- 0xA7A1: 1020,
- 0xA7A2: 1021,
- 0xA7A5: 1022,
- 0xA7A9: 1023,
- 0xA7AB: 1024,
- 0xA7B1: 1025,
- 0xA7B3: 1026,
- 0xA7B5: 1027,
- 0xA7B7: 1028,
- 0xA7B8: 1029,
- 0xA7B9: 1030,
- 0xA861: 1031,
- 0xA862: 1032,
- 0xA865: 1033,
- 0xA869: 1034,
- 0xA86B: 1035,
- 0xA871: 1036,
- 0xA873: 1037,
- 0xA875: 1038,
- 0xA876: 1039,
- 0xA877: 1040,
- 0xA87D: 1041,
- 0xA881: 1042,
- 0xA882: 1043,
- 0xA885: 1044,
- 0xA889: 1045,
- 0xA891: 1046,
- 0xA893: 1047,
- 0xA895: 1048,
- 0xA896: 1049,
- 0xA897: 1050,
- 0xA8A1: 1051,
- 0xA8A2: 1052,
- 0xA8B1: 1053,
- 0xA8E1: 1054,
- 0xA8E2: 1055,
- 0xA8E5: 1056,
- 0xA8E8: 1057,
- 0xA8E9: 1058,
- 0xA8F1: 1059,
- 0xA8F5: 1060,
- 0xA8F6: 1061,
- 0xA8F7: 1062,
- 0xA941: 1063,
- 0xA957: 1064,
- 0xA961: 1065,
- 0xA962: 1066,
- 0xA971: 1067,
- 0xA973: 1068,
- 0xA975: 1069,
- 0xA976: 1070,
- 0xA977: 1071,
- 0xA9A1: 1072,
- 0xA9A2: 1073,
- 0xA9A5: 1074,
- 0xA9A9: 1075,
- 0xA9B1: 1076,
- 0xA9B3: 1077,
- 0xA9B7: 1078,
- 0xAA41: 1079,
- 0xAA61: 1080,
- 0xAA77: 1081,
- 0xAA81: 1082,
- 0xAA82: 1083,
- 0xAA85: 1084,
- 0xAA89: 1085,
- 0xAA91: 1086,
- 0xAA95: 1087,
- 0xAA97: 1088,
- 0xAB41: 1089,
- 0xAB57: 1090,
- 0xAB61: 1091,
- 0xAB65: 1092,
- 0xAB69: 1093,
- 0xAB71: 1094,
- 0xAB73: 1095,
- 0xABA1: 1096,
- 0xABA2: 1097,
- 0xABA5: 1098,
- 0xABA9: 1099,
- 0xABB1: 1100,
- 0xABB3: 1101,
- 0xABB5: 1102,
- 0xABB7: 1103,
- 0xAC61: 1104,
- 0xAC62: 1105,
- 0xAC64: 1106,
- 0xAC65: 1107,
- 0xAC68: 1108,
- 0xAC69: 1109,
- 0xAC6A: 1110,
- 0xAC6B: 1111,
- 0xAC71: 1112,
- 0xAC73: 1113,
- 0xAC75: 1114,
- 0xAC76: 1115,
- 0xAC77: 1116,
- 0xAC7B: 1117,
- 0xAC81: 1118,
- 0xAC82: 1119,
- 0xAC85: 1120,
- 0xAC89: 1121,
- 0xAC91: 1122,
- 0xAC93: 1123,
- 0xAC95: 1124,
- 0xAC96: 1125,
- 0xAC97: 1126,
- 0xACA1: 1127,
- 0xACA2: 1128,
- 0xACA5: 1129,
- 0xACA9: 1130,
- 0xACB1: 1131,
- 0xACB3: 1132,
- 0xACB5: 1133,
- 0xACB7: 1134,
- 0xACC1: 1135,
- 0xACC5: 1136,
- 0xACC9: 1137,
- 0xACD1: 1138,
- 0xACD7: 1139,
- 0xACE1: 1140,
- 0xACE2: 1141,
- 0xACE3: 1142,
- 0xACE4: 1143,
- 0xACE5: 1144,
- 0xACE8: 1145,
- 0xACE9: 1146,
- 0xACEB: 1147,
- 0xACEC: 1148,
- 0xACF1: 1149,
- 0xACF3: 1150,
- 0xACF5: 1151,
- 0xACF6: 1152,
- 0xACF7: 1153,
- 0xACFC: 1154,
- 0xAD41: 1155,
- 0xAD42: 1156,
- 0xAD45: 1157,
- 0xAD49: 1158,
- 0xAD51: 1159,
- 0xAD53: 1160,
- 0xAD55: 1161,
- 0xAD56: 1162,
- 0xAD57: 1163,
- 0xAD61: 1164,
- 0xAD62: 1165,
- 0xAD65: 1166,
- 0xAD69: 1167,
- 0xAD71: 1168,
- 0xAD73: 1169,
- 0xAD75: 1170,
- 0xAD76: 1171,
- 0xAD77: 1172,
- 0xAD81: 1173,
- 0xAD85: 1174,
- 0xAD89: 1175,
- 0xAD97: 1176,
- 0xADA1: 1177,
- 0xADA2: 1178,
- 0xADA3: 1179,
- 0xADA5: 1180,
- 0xADA9: 1181,
- 0xADAB: 1182,
- 0xADB1: 1183,
- 0xADB3: 1184,
- 0xADB5: 1185,
- 0xADB7: 1186,
- 0xADBB: 1187,
- 0xADC1: 1188,
- 0xADC2: 1189,
- 0xADC5: 1190,
- 0xADC9: 1191,
- 0xADD7: 1192,
- 0xADE1: 1193,
- 0xADE5: 1194,
- 0xADE9: 1195,
- 0xADF1: 1196,
- 0xADF5: 1197,
- 0xADF6: 1198,
- 0xAE41: 1199,
- 0xAE45: 1200,
- 0xAE49: 1201,
- 0xAE51: 1202,
- 0xAE53: 1203,
- 0xAE55: 1204,
- 0xAE61: 1205,
- 0xAE62: 1206,
- 0xAE65: 1207,
- 0xAE69: 1208,
- 0xAE71: 1209,
- 0xAE73: 1210,
- 0xAE75: 1211,
- 0xAE77: 1212,
- 0xAE81: 1213,
- 0xAE82: 1214,
- 0xAE85: 1215,
- 0xAE88: 1216,
- 0xAE89: 1217,
- 0xAE91: 1218,
- 0xAE93: 1219,
- 0xAE95: 1220,
- 0xAE97: 1221,
- 0xAE99: 1222,
- 0xAE9B: 1223,
- 0xAE9C: 1224,
- 0xAEA1: 1225,
- 0xAEB6: 1226,
- 0xAEC1: 1227,
- 0xAEC2: 1228,
- 0xAEC5: 1229,
- 0xAEC9: 1230,
- 0xAED1: 1231,
- 0xAED7: 1232,
- 0xAEE1: 1233,
- 0xAEE2: 1234,
- 0xAEE5: 1235,
- 0xAEE9: 1236,
- 0xAEF1: 1237,
- 0xAEF3: 1238,
- 0xAEF5: 1239,
- 0xAEF7: 1240,
- 0xAF41: 1241,
- 0xAF42: 1242,
- 0xAF49: 1243,
- 0xAF51: 1244,
- 0xAF55: 1245,
- 0xAF57: 1246,
- 0xAF61: 1247,
- 0xAF62: 1248,
- 0xAF65: 1249,
- 0xAF69: 1250,
- 0xAF6A: 1251,
- 0xAF71: 1252,
- 0xAF73: 1253,
- 0xAF75: 1254,
- 0xAF77: 1255,
- 0xAFA1: 1256,
- 0xAFA2: 1257,
- 0xAFA5: 1258,
- 0xAFA8: 1259,
- 0xAFA9: 1260,
- 0xAFB0: 1261,
- 0xAFB1: 1262,
- 0xAFB3: 1263,
- 0xAFB5: 1264,
- 0xAFB7: 1265,
- 0xAFBC: 1266,
- 0xB061: 1267,
- 0xB062: 1268,
- 0xB064: 1269,
- 0xB065: 1270,
- 0xB069: 1271,
- 0xB071: 1272,
- 0xB073: 1273,
- 0xB076: 1274,
- 0xB077: 1275,
- 0xB07D: 1276,
- 0xB081: 1277,
- 0xB082: 1278,
- 0xB085: 1279,
- 0xB089: 1280,
- 0xB091: 1281,
- 0xB093: 1282,
- 0xB096: 1283,
- 0xB097: 1284,
- 0xB0B7: 1285,
- 0xB0E1: 1286,
- 0xB0E2: 1287,
- 0xB0E5: 1288,
- 0xB0E9: 1289,
- 0xB0EB: 1290,
- 0xB0F1: 1291,
- 0xB0F3: 1292,
- 0xB0F6: 1293,
- 0xB0F7: 1294,
- 0xB141: 1295,
- 0xB145: 1296,
- 0xB149: 1297,
- 0xB185: 1298,
- 0xB1A1: 1299,
- 0xB1A2: 1300,
- 0xB1A5: 1301,
- 0xB1A8: 1302,
- 0xB1A9: 1303,
- 0xB1AB: 1304,
- 0xB1B1: 1305,
- 0xB1B3: 1306,
- 0xB1B7: 1307,
- 0xB1C1: 1308,
- 0xB1C2: 1309,
- 0xB1C5: 1310,
- 0xB1D6: 1311,
- 0xB1E1: 1312,
- 0xB1F6: 1313,
- 0xB241: 1314,
- 0xB245: 1315,
- 0xB249: 1316,
- 0xB251: 1317,
- 0xB253: 1318,
- 0xB261: 1319,
- 0xB281: 1320,
- 0xB282: 1321,
- 0xB285: 1322,
- 0xB289: 1323,
- 0xB291: 1324,
- 0xB293: 1325,
- 0xB297: 1326,
- 0xB2A1: 1327,
- 0xB2B6: 1328,
- 0xB2C1: 1329,
- 0xB2E1: 1330,
- 0xB2E5: 1331,
- 0xB357: 1332,
- 0xB361: 1333,
- 0xB362: 1334,
- 0xB365: 1335,
- 0xB369: 1336,
- 0xB36B: 1337,
- 0xB370: 1338,
- 0xB371: 1339,
- 0xB373: 1340,
- 0xB381: 1341,
- 0xB385: 1342,
- 0xB389: 1343,
- 0xB391: 1344,
- 0xB3A1: 1345,
- 0xB3A2: 1346,
- 0xB3A5: 1347,
- 0xB3A9: 1348,
- 0xB3B1: 1349,
- 0xB3B3: 1350,
- 0xB3B5: 1351,
- 0xB3B7: 1352,
- 0xB461: 1353,
- 0xB462: 1354,
- 0xB465: 1355,
- 0xB466: 1356,
- 0xB467: 1357,
- 0xB469: 1358,
- 0xB46A: 1359,
- 0xB46B: 1360,
- 0xB470: 1361,
- 0xB471: 1362,
- 0xB473: 1363,
- 0xB475: 1364,
- 0xB476: 1365,
- 0xB477: 1366,
- 0xB47B: 1367,
- 0xB47C: 1368,
- 0xB481: 1369,
- 0xB482: 1370,
- 0xB485: 1371,
- 0xB489: 1372,
- 0xB491: 1373,
- 0xB493: 1374,
- 0xB495: 1375,
- 0xB496: 1376,
- 0xB497: 1377,
- 0xB4A1: 1378,
- 0xB4A2: 1379,
- 0xB4A5: 1380,
- 0xB4A9: 1381,
- 0xB4AC: 1382,
- 0xB4B1: 1383,
- 0xB4B3: 1384,
- 0xB4B5: 1385,
- 0xB4B7: 1386,
- 0xB4BB: 1387,
- 0xB4BD: 1388,
- 0xB4C1: 1389,
- 0xB4C5: 1390,
- 0xB4C9: 1391,
- 0xB4D3: 1392,
- 0xB4E1: 1393,
- 0xB4E2: 1394,
- 0xB4E5: 1395,
- 0xB4E6: 1396,
- 0xB4E8: 1397,
- 0xB4E9: 1398,
- 0xB4EA: 1399,
- 0xB4EB: 1400,
- 0xB4F1: 1401,
- 0xB4F3: 1402,
- 0xB4F4: 1403,
- 0xB4F5: 1404,
- 0xB4F6: 1405,
- 0xB4F7: 1406,
- 0xB4F8: 1407,
- 0xB4FA: 1408,
- 0xB4FC: 1409,
- 0xB541: 1410,
- 0xB542: 1411,
- 0xB545: 1412,
- 0xB549: 1413,
- 0xB551: 1414,
- 0xB553: 1415,
- 0xB555: 1416,
- 0xB557: 1417,
- 0xB561: 1418,
- 0xB562: 1419,
- 0xB563: 1420,
- 0xB565: 1421,
- 0xB569: 1422,
- 0xB56B: 1423,
- 0xB56C: 1424,
- 0xB571: 1425,
- 0xB573: 1426,
- 0xB574: 1427,
- 0xB575: 1428,
- 0xB576: 1429,
- 0xB577: 1430,
- 0xB57B: 1431,
- 0xB57C: 1432,
- 0xB57D: 1433,
- 0xB581: 1434,
- 0xB585: 1435,
- 0xB589: 1436,
- 0xB591: 1437,
- 0xB593: 1438,
- 0xB595: 1439,
- 0xB596: 1440,
- 0xB5A1: 1441,
- 0xB5A2: 1442,
- 0xB5A5: 1443,
- 0xB5A9: 1444,
- 0xB5AA: 1445,
- 0xB5AB: 1446,
- 0xB5AD: 1447,
- 0xB5B0: 1448,
- 0xB5B1: 1449,
- 0xB5B3: 1450,
- 0xB5B5: 1451,
- 0xB5B7: 1452,
- 0xB5B9: 1453,
- 0xB5C1: 1454,
- 0xB5C2: 1455,
- 0xB5C5: 1456,
- 0xB5C9: 1457,
- 0xB5D1: 1458,
- 0xB5D3: 1459,
- 0xB5D5: 1460,
- 0xB5D6: 1461,
- 0xB5D7: 1462,
- 0xB5E1: 1463,
- 0xB5E2: 1464,
- 0xB5E5: 1465,
- 0xB5F1: 1466,
- 0xB5F5: 1467,
- 0xB5F7: 1468,
- 0xB641: 1469,
- 0xB642: 1470,
- 0xB645: 1471,
- 0xB649: 1472,
- 0xB651: 1473,
- 0xB653: 1474,
- 0xB655: 1475,
- 0xB657: 1476,
- 0xB661: 1477,
- 0xB662: 1478,
- 0xB665: 1479,
- 0xB669: 1480,
- 0xB671: 1481,
- 0xB673: 1482,
- 0xB675: 1483,
- 0xB677: 1484,
- 0xB681: 1485,
- 0xB682: 1486,
- 0xB685: 1487,
- 0xB689: 1488,
- 0xB68A: 1489,
- 0xB68B: 1490,
- 0xB691: 1491,
- 0xB693: 1492,
- 0xB695: 1493,
- 0xB697: 1494,
- 0xB6A1: 1495,
- 0xB6A2: 1496,
- 0xB6A5: 1497,
- 0xB6A9: 1498,
- 0xB6B1: 1499,
- 0xB6B3: 1500,
- 0xB6B6: 1501,
- 0xB6B7: 1502,
- 0xB6C1: 1503,
- 0xB6C2: 1504,
- 0xB6C5: 1505,
- 0xB6C9: 1506,
- 0xB6D1: 1507,
- 0xB6D3: 1508,
- 0xB6D7: 1509,
- 0xB6E1: 1510,
- 0xB6E2: 1511,
- 0xB6E5: 1512,
- 0xB6E9: 1513,
- 0xB6F1: 1514,
- 0xB6F3: 1515,
- 0xB6F5: 1516,
- 0xB6F7: 1517,
- 0xB741: 1518,
- 0xB742: 1519,
- 0xB745: 1520,
- 0xB749: 1521,
- 0xB751: 1522,
- 0xB753: 1523,
- 0xB755: 1524,
- 0xB757: 1525,
- 0xB759: 1526,
- 0xB761: 1527,
- 0xB762: 1528,
- 0xB765: 1529,
- 0xB769: 1530,
- 0xB76F: 1531,
- 0xB771: 1532,
- 0xB773: 1533,
- 0xB775: 1534,
- 0xB777: 1535,
- 0xB778: 1536,
- 0xB779: 1537,
- 0xB77A: 1538,
- 0xB77B: 1539,
- 0xB77C: 1540,
- 0xB77D: 1541,
- 0xB781: 1542,
- 0xB785: 1543,
- 0xB789: 1544,
- 0xB791: 1545,
- 0xB795: 1546,
- 0xB7A1: 1547,
- 0xB7A2: 1548,
- 0xB7A5: 1549,
- 0xB7A9: 1550,
- 0xB7AA: 1551,
- 0xB7AB: 1552,
- 0xB7B0: 1553,
- 0xB7B1: 1554,
- 0xB7B3: 1555,
- 0xB7B5: 1556,
- 0xB7B6: 1557,
- 0xB7B7: 1558,
- 0xB7B8: 1559,
- 0xB7BC: 1560,
- 0xB861: 1561,
- 0xB862: 1562,
- 0xB865: 1563,
- 0xB867: 1564,
- 0xB868: 1565,
- 0xB869: 1566,
- 0xB86B: 1567,
- 0xB871: 1568,
- 0xB873: 1569,
- 0xB875: 1570,
- 0xB876: 1571,
- 0xB877: 1572,
- 0xB878: 1573,
- 0xB881: 1574,
- 0xB882: 1575,
- 0xB885: 1576,
- 0xB889: 1577,
- 0xB891: 1578,
- 0xB893: 1579,
- 0xB895: 1580,
- 0xB896: 1581,
- 0xB897: 1582,
- 0xB8A1: 1583,
- 0xB8A2: 1584,
- 0xB8A5: 1585,
- 0xB8A7: 1586,
- 0xB8A9: 1587,
- 0xB8B1: 1588,
- 0xB8B7: 1589,
- 0xB8C1: 1590,
- 0xB8C5: 1591,
- 0xB8C9: 1592,
- 0xB8E1: 1593,
- 0xB8E2: 1594,
- 0xB8E5: 1595,
- 0xB8E9: 1596,
- 0xB8EB: 1597,
- 0xB8F1: 1598,
- 0xB8F3: 1599,
- 0xB8F5: 1600,
- 0xB8F7: 1601,
- 0xB8F8: 1602,
- 0xB941: 1603,
- 0xB942: 1604,
- 0xB945: 1605,
- 0xB949: 1606,
- 0xB951: 1607,
- 0xB953: 1608,
- 0xB955: 1609,
- 0xB957: 1610,
- 0xB961: 1611,
- 0xB965: 1612,
- 0xB969: 1613,
- 0xB971: 1614,
- 0xB973: 1615,
- 0xB976: 1616,
- 0xB977: 1617,
- 0xB981: 1618,
- 0xB9A1: 1619,
- 0xB9A2: 1620,
- 0xB9A5: 1621,
- 0xB9A9: 1622,
- 0xB9AB: 1623,
- 0xB9B1: 1624,
- 0xB9B3: 1625,
- 0xB9B5: 1626,
- 0xB9B7: 1627,
- 0xB9B8: 1628,
- 0xB9B9: 1629,
- 0xB9BD: 1630,
- 0xB9C1: 1631,
- 0xB9C2: 1632,
- 0xB9C9: 1633,
- 0xB9D3: 1634,
- 0xB9D5: 1635,
- 0xB9D7: 1636,
- 0xB9E1: 1637,
- 0xB9F6: 1638,
- 0xB9F7: 1639,
- 0xBA41: 1640,
- 0xBA45: 1641,
- 0xBA49: 1642,
- 0xBA51: 1643,
- 0xBA53: 1644,
- 0xBA55: 1645,
- 0xBA57: 1646,
- 0xBA61: 1647,
- 0xBA62: 1648,
- 0xBA65: 1649,
- 0xBA77: 1650,
- 0xBA81: 1651,
- 0xBA82: 1652,
- 0xBA85: 1653,
- 0xBA89: 1654,
- 0xBA8A: 1655,
- 0xBA8B: 1656,
- 0xBA91: 1657,
- 0xBA93: 1658,
- 0xBA95: 1659,
- 0xBA97: 1660,
- 0xBAA1: 1661,
- 0xBAB6: 1662,
- 0xBAC1: 1663,
- 0xBAE1: 1664,
- 0xBAE2: 1665,
- 0xBAE5: 1666,
- 0xBAE9: 1667,
- 0xBAF1: 1668,
- 0xBAF3: 1669,
- 0xBAF5: 1670,
- 0xBB41: 1671,
- 0xBB45: 1672,
- 0xBB49: 1673,
- 0xBB51: 1674,
- 0xBB61: 1675,
- 0xBB62: 1676,
- 0xBB65: 1677,
- 0xBB69: 1678,
- 0xBB71: 1679,
- 0xBB73: 1680,
- 0xBB75: 1681,
- 0xBB77: 1682,
- 0xBBA1: 1683,
- 0xBBA2: 1684,
- 0xBBA5: 1685,
- 0xBBA8: 1686,
- 0xBBA9: 1687,
- 0xBBAB: 1688,
- 0xBBB1: 1689,
- 0xBBB3: 1690,
- 0xBBB5: 1691,
- 0xBBB7: 1692,
- 0xBBB8: 1693,
- 0xBBBB: 1694,
- 0xBBBC: 1695,
- 0xBC61: 1696,
- 0xBC62: 1697,
- 0xBC65: 1698,
- 0xBC67: 1699,
- 0xBC69: 1700,
- 0xBC6C: 1701,
- 0xBC71: 1702,
- 0xBC73: 1703,
- 0xBC75: 1704,
- 0xBC76: 1705,
- 0xBC77: 1706,
- 0xBC81: 1707,
- 0xBC82: 1708,
- 0xBC85: 1709,
- 0xBC89: 1710,
- 0xBC91: 1711,
- 0xBC93: 1712,
- 0xBC95: 1713,
- 0xBC96: 1714,
- 0xBC97: 1715,
- 0xBCA1: 1716,
- 0xBCA5: 1717,
- 0xBCB7: 1718,
- 0xBCE1: 1719,
- 0xBCE2: 1720,
- 0xBCE5: 1721,
- 0xBCE9: 1722,
- 0xBCF1: 1723,
- 0xBCF3: 1724,
- 0xBCF5: 1725,
- 0xBCF6: 1726,
- 0xBCF7: 1727,
- 0xBD41: 1728,
- 0xBD57: 1729,
- 0xBD61: 1730,
- 0xBD76: 1731,
- 0xBDA1: 1732,
- 0xBDA2: 1733,
- 0xBDA5: 1734,
- 0xBDA9: 1735,
- 0xBDB1: 1736,
- 0xBDB3: 1737,
- 0xBDB5: 1738,
- 0xBDB7: 1739,
- 0xBDB9: 1740,
- 0xBDC1: 1741,
- 0xBDC2: 1742,
- 0xBDC9: 1743,
- 0xBDD6: 1744,
- 0xBDE1: 1745,
- 0xBDF6: 1746,
- 0xBE41: 1747,
- 0xBE45: 1748,
- 0xBE49: 1749,
- 0xBE51: 1750,
- 0xBE53: 1751,
- 0xBE77: 1752,
- 0xBE81: 1753,
- 0xBE82: 1754,
- 0xBE85: 1755,
- 0xBE89: 1756,
- 0xBE91: 1757,
- 0xBE93: 1758,
- 0xBE97: 1759,
- 0xBEA1: 1760,
- 0xBEB6: 1761,
- 0xBEB7: 1762,
- 0xBEE1: 1763,
- 0xBF41: 1764,
- 0xBF61: 1765,
- 0xBF71: 1766,
- 0xBF75: 1767,
- 0xBF77: 1768,
- 0xBFA1: 1769,
- 0xBFA2: 1770,
- 0xBFA5: 1771,
- 0xBFA9: 1772,
- 0xBFB1: 1773,
- 0xBFB3: 1774,
- 0xBFB7: 1775,
- 0xBFB8: 1776,
- 0xBFBD: 1777,
- 0xC061: 1778,
- 0xC062: 1779,
- 0xC065: 1780,
- 0xC067: 1781,
- 0xC069: 1782,
- 0xC071: 1783,
- 0xC073: 1784,
- 0xC075: 1785,
- 0xC076: 1786,
- 0xC077: 1787,
- 0xC078: 1788,
- 0xC081: 1789,
- 0xC082: 1790,
- 0xC085: 1791,
- 0xC089: 1792,
- 0xC091: 1793,
- 0xC093: 1794,
- 0xC095: 1795,
- 0xC096: 1796,
- 0xC097: 1797,
- 0xC0A1: 1798,
- 0xC0A5: 1799,
- 0xC0A7: 1800,
- 0xC0A9: 1801,
- 0xC0B1: 1802,
- 0xC0B7: 1803,
- 0xC0E1: 1804,
- 0xC0E2: 1805,
- 0xC0E5: 1806,
- 0xC0E9: 1807,
- 0xC0F1: 1808,
- 0xC0F3: 1809,
- 0xC0F5: 1810,
- 0xC0F6: 1811,
- 0xC0F7: 1812,
- 0xC141: 1813,
- 0xC142: 1814,
- 0xC145: 1815,
- 0xC149: 1816,
- 0xC151: 1817,
- 0xC153: 1818,
- 0xC155: 1819,
- 0xC157: 1820,
- 0xC161: 1821,
- 0xC165: 1822,
- 0xC176: 1823,
- 0xC181: 1824,
- 0xC185: 1825,
- 0xC197: 1826,
- 0xC1A1: 1827,
- 0xC1A2: 1828,
- 0xC1A5: 1829,
- 0xC1A9: 1830,
- 0xC1B1: 1831,
- 0xC1B3: 1832,
- 0xC1B5: 1833,
- 0xC1B7: 1834,
- 0xC1C1: 1835,
- 0xC1C5: 1836,
- 0xC1C9: 1837,
- 0xC1D7: 1838,
- 0xC241: 1839,
- 0xC245: 1840,
- 0xC249: 1841,
- 0xC251: 1842,
- 0xC253: 1843,
- 0xC255: 1844,
- 0xC257: 1845,
- 0xC261: 1846,
- 0xC271: 1847,
- 0xC281: 1848,
- 0xC282: 1849,
- 0xC285: 1850,
- 0xC289: 1851,
- 0xC291: 1852,
- 0xC293: 1853,
- 0xC295: 1854,
- 0xC297: 1855,
- 0xC2A1: 1856,
- 0xC2B6: 1857,
- 0xC2C1: 1858,
- 0xC2C5: 1859,
- 0xC2E1: 1860,
- 0xC2E5: 1861,
- 0xC2E9: 1862,
- 0xC2F1: 1863,
- 0xC2F3: 1864,
- 0xC2F5: 1865,
- 0xC2F7: 1866,
- 0xC341: 1867,
- 0xC345: 1868,
- 0xC349: 1869,
- 0xC351: 1870,
- 0xC357: 1871,
- 0xC361: 1872,
- 0xC362: 1873,
- 0xC365: 1874,
- 0xC369: 1875,
- 0xC371: 1876,
- 0xC373: 1877,
- 0xC375: 1878,
- 0xC377: 1879,
- 0xC3A1: 1880,
- 0xC3A2: 1881,
- 0xC3A5: 1882,
- 0xC3A8: 1883,
- 0xC3A9: 1884,
- 0xC3AA: 1885,
- 0xC3B1: 1886,
- 0xC3B3: 1887,
- 0xC3B5: 1888,
- 0xC3B7: 1889,
- 0xC461: 1890,
- 0xC462: 1891,
- 0xC465: 1892,
- 0xC469: 1893,
- 0xC471: 1894,
- 0xC473: 1895,
- 0xC475: 1896,
- 0xC477: 1897,
- 0xC481: 1898,
- 0xC482: 1899,
- 0xC485: 1900,
- 0xC489: 1901,
- 0xC491: 1902,
- 0xC493: 1903,
- 0xC495: 1904,
- 0xC496: 1905,
- 0xC497: 1906,
- 0xC4A1: 1907,
- 0xC4A2: 1908,
- 0xC4B7: 1909,
- 0xC4E1: 1910,
- 0xC4E2: 1911,
- 0xC4E5: 1912,
- 0xC4E8: 1913,
- 0xC4E9: 1914,
- 0xC4F1: 1915,
- 0xC4F3: 1916,
- 0xC4F5: 1917,
- 0xC4F6: 1918,
- 0xC4F7: 1919,
- 0xC541: 1920,
- 0xC542: 1921,
- 0xC545: 1922,
- 0xC549: 1923,
- 0xC551: 1924,
- 0xC553: 1925,
- 0xC555: 1926,
- 0xC557: 1927,
- 0xC561: 1928,
- 0xC565: 1929,
- 0xC569: 1930,
- 0xC571: 1931,
- 0xC573: 1932,
- 0xC575: 1933,
- 0xC576: 1934,
- 0xC577: 1935,
- 0xC581: 1936,
- 0xC5A1: 1937,
- 0xC5A2: 1938,
- 0xC5A5: 1939,
- 0xC5A9: 1940,
- 0xC5B1: 1941,
- 0xC5B3: 1942,
- 0xC5B5: 1943,
- 0xC5B7: 1944,
- 0xC5C1: 1945,
- 0xC5C2: 1946,
- 0xC5C5: 1947,
- 0xC5C9: 1948,
- 0xC5D1: 1949,
- 0xC5D7: 1950,
- 0xC5E1: 1951,
- 0xC5F7: 1952,
- 0xC641: 1953,
- 0xC649: 1954,
- 0xC661: 1955,
- 0xC681: 1956,
- 0xC682: 1957,
- 0xC685: 1958,
- 0xC689: 1959,
- 0xC691: 1960,
- 0xC693: 1961,
- 0xC695: 1962,
- 0xC697: 1963,
- 0xC6A1: 1964,
- 0xC6A5: 1965,
- 0xC6A9: 1966,
- 0xC6B7: 1967,
- 0xC6C1: 1968,
- 0xC6D7: 1969,
- 0xC6E1: 1970,
- 0xC6E2: 1971,
- 0xC6E5: 1972,
- 0xC6E9: 1973,
- 0xC6F1: 1974,
- 0xC6F3: 1975,
- 0xC6F5: 1976,
- 0xC6F7: 1977,
- 0xC741: 1978,
- 0xC745: 1979,
- 0xC749: 1980,
- 0xC751: 1981,
- 0xC761: 1982,
- 0xC762: 1983,
- 0xC765: 1984,
- 0xC769: 1985,
- 0xC771: 1986,
- 0xC773: 1987,
- 0xC777: 1988,
- 0xC7A1: 1989,
- 0xC7A2: 1990,
- 0xC7A5: 1991,
- 0xC7A9: 1992,
- 0xC7B1: 1993,
- 0xC7B3: 1994,
- 0xC7B5: 1995,
- 0xC7B7: 1996,
- 0xC861: 1997,
- 0xC862: 1998,
- 0xC865: 1999,
- 0xC869: 2000,
- 0xC86A: 2001,
- 0xC871: 2002,
- 0xC873: 2003,
- 0xC875: 2004,
- 0xC876: 2005,
- 0xC877: 2006,
- 0xC881: 2007,
- 0xC882: 2008,
- 0xC885: 2009,
- 0xC889: 2010,
- 0xC891: 2011,
- 0xC893: 2012,
- 0xC895: 2013,
- 0xC896: 2014,
- 0xC897: 2015,
- 0xC8A1: 2016,
- 0xC8B7: 2017,
- 0xC8E1: 2018,
- 0xC8E2: 2019,
- 0xC8E5: 2020,
- 0xC8E9: 2021,
- 0xC8EB: 2022,
- 0xC8F1: 2023,
- 0xC8F3: 2024,
- 0xC8F5: 2025,
- 0xC8F6: 2026,
- 0xC8F7: 2027,
- 0xC941: 2028,
- 0xC942: 2029,
- 0xC945: 2030,
- 0xC949: 2031,
- 0xC951: 2032,
- 0xC953: 2033,
- 0xC955: 2034,
- 0xC957: 2035,
- 0xC961: 2036,
- 0xC965: 2037,
- 0xC976: 2038,
- 0xC981: 2039,
- 0xC985: 2040,
- 0xC9A1: 2041,
- 0xC9A2: 2042,
- 0xC9A5: 2043,
- 0xC9A9: 2044,
- 0xC9B1: 2045,
- 0xC9B3: 2046,
- 0xC9B5: 2047,
- 0xC9B7: 2048,
- 0xC9BC: 2049,
- 0xC9C1: 2050,
- 0xC9C5: 2051,
- 0xC9E1: 2052,
- 0xCA41: 2053,
- 0xCA45: 2054,
- 0xCA55: 2055,
- 0xCA57: 2056,
- 0xCA61: 2057,
- 0xCA81: 2058,
- 0xCA82: 2059,
- 0xCA85: 2060,
- 0xCA89: 2061,
- 0xCA91: 2062,
- 0xCA93: 2063,
- 0xCA95: 2064,
- 0xCA97: 2065,
- 0xCAA1: 2066,
- 0xCAB6: 2067,
- 0xCAC1: 2068,
- 0xCAE1: 2069,
- 0xCAE2: 2070,
- 0xCAE5: 2071,
- 0xCAE9: 2072,
- 0xCAF1: 2073,
- 0xCAF3: 2074,
- 0xCAF7: 2075,
- 0xCB41: 2076,
- 0xCB45: 2077,
- 0xCB49: 2078,
- 0xCB51: 2079,
- 0xCB57: 2080,
- 0xCB61: 2081,
- 0xCB62: 2082,
- 0xCB65: 2083,
- 0xCB68: 2084,
- 0xCB69: 2085,
- 0xCB6B: 2086,
- 0xCB71: 2087,
- 0xCB73: 2088,
- 0xCB75: 2089,
- 0xCB81: 2090,
- 0xCB85: 2091,
- 0xCB89: 2092,
- 0xCB91: 2093,
- 0xCB93: 2094,
- 0xCBA1: 2095,
- 0xCBA2: 2096,
- 0xCBA5: 2097,
- 0xCBA9: 2098,
- 0xCBB1: 2099,
- 0xCBB3: 2100,
- 0xCBB5: 2101,
- 0xCBB7: 2102,
- 0xCC61: 2103,
- 0xCC62: 2104,
- 0xCC63: 2105,
- 0xCC65: 2106,
- 0xCC69: 2107,
- 0xCC6B: 2108,
- 0xCC71: 2109,
- 0xCC73: 2110,
- 0xCC75: 2111,
- 0xCC76: 2112,
- 0xCC77: 2113,
- 0xCC7B: 2114,
- 0xCC81: 2115,
- 0xCC82: 2116,
- 0xCC85: 2117,
- 0xCC89: 2118,
- 0xCC91: 2119,
- 0xCC93: 2120,
- 0xCC95: 2121,
- 0xCC96: 2122,
- 0xCC97: 2123,
- 0xCCA1: 2124,
- 0xCCA2: 2125,
- 0xCCE1: 2126,
- 0xCCE2: 2127,
- 0xCCE5: 2128,
- 0xCCE9: 2129,
- 0xCCF1: 2130,
- 0xCCF3: 2131,
- 0xCCF5: 2132,
- 0xCCF6: 2133,
- 0xCCF7: 2134,
- 0xCD41: 2135,
- 0xCD42: 2136,
- 0xCD45: 2137,
- 0xCD49: 2138,
- 0xCD51: 2139,
- 0xCD53: 2140,
- 0xCD55: 2141,
- 0xCD57: 2142,
- 0xCD61: 2143,
- 0xCD65: 2144,
- 0xCD69: 2145,
- 0xCD71: 2146,
- 0xCD73: 2147,
- 0xCD76: 2148,
- 0xCD77: 2149,
- 0xCD81: 2150,
- 0xCD89: 2151,
- 0xCD93: 2152,
- 0xCD95: 2153,
- 0xCDA1: 2154,
- 0xCDA2: 2155,
- 0xCDA5: 2156,
- 0xCDA9: 2157,
- 0xCDB1: 2158,
- 0xCDB3: 2159,
- 0xCDB5: 2160,
- 0xCDB7: 2161,
- 0xCDC1: 2162,
- 0xCDD7: 2163,
- 0xCE41: 2164,
- 0xCE45: 2165,
- 0xCE61: 2166,
- 0xCE65: 2167,
- 0xCE69: 2168,
- 0xCE73: 2169,
- 0xCE75: 2170,
- 0xCE81: 2171,
- 0xCE82: 2172,
- 0xCE85: 2173,
- 0xCE88: 2174,
- 0xCE89: 2175,
- 0xCE8B: 2176,
- 0xCE91: 2177,
- 0xCE93: 2178,
- 0xCE95: 2179,
- 0xCE97: 2180,
- 0xCEA1: 2181,
- 0xCEB7: 2182,
- 0xCEE1: 2183,
- 0xCEE5: 2184,
- 0xCEE9: 2185,
- 0xCEF1: 2186,
- 0xCEF5: 2187,
- 0xCF41: 2188,
- 0xCF45: 2189,
- 0xCF49: 2190,
- 0xCF51: 2191,
- 0xCF55: 2192,
- 0xCF57: 2193,
- 0xCF61: 2194,
- 0xCF65: 2195,
- 0xCF69: 2196,
- 0xCF71: 2197,
- 0xCF73: 2198,
- 0xCF75: 2199,
- 0xCFA1: 2200,
- 0xCFA2: 2201,
- 0xCFA5: 2202,
- 0xCFA9: 2203,
- 0xCFB1: 2204,
- 0xCFB3: 2205,
- 0xCFB5: 2206,
- 0xCFB7: 2207,
- 0xD061: 2208,
- 0xD062: 2209,
- 0xD065: 2210,
- 0xD069: 2211,
- 0xD06E: 2212,
- 0xD071: 2213,
- 0xD073: 2214,
- 0xD075: 2215,
- 0xD077: 2216,
- 0xD081: 2217,
- 0xD082: 2218,
- 0xD085: 2219,
- 0xD089: 2220,
- 0xD091: 2221,
- 0xD093: 2222,
- 0xD095: 2223,
- 0xD096: 2224,
- 0xD097: 2225,
- 0xD0A1: 2226,
- 0xD0B7: 2227,
- 0xD0E1: 2228,
- 0xD0E2: 2229,
- 0xD0E5: 2230,
- 0xD0E9: 2231,
- 0xD0EB: 2232,
- 0xD0F1: 2233,
- 0xD0F3: 2234,
- 0xD0F5: 2235,
- 0xD0F7: 2236,
- 0xD141: 2237,
- 0xD142: 2238,
- 0xD145: 2239,
- 0xD149: 2240,
- 0xD151: 2241,
- 0xD153: 2242,
- 0xD155: 2243,
- 0xD157: 2244,
- 0xD161: 2245,
- 0xD162: 2246,
- 0xD165: 2247,
- 0xD169: 2248,
- 0xD171: 2249,
- 0xD173: 2250,
- 0xD175: 2251,
- 0xD176: 2252,
- 0xD177: 2253,
- 0xD181: 2254,
- 0xD185: 2255,
- 0xD189: 2256,
- 0xD193: 2257,
- 0xD1A1: 2258,
- 0xD1A2: 2259,
- 0xD1A5: 2260,
- 0xD1A9: 2261,
- 0xD1AE: 2262,
- 0xD1B1: 2263,
- 0xD1B3: 2264,
- 0xD1B5: 2265,
- 0xD1B7: 2266,
- 0xD1BB: 2267,
- 0xD1C1: 2268,
- 0xD1C2: 2269,
- 0xD1C5: 2270,
- 0xD1C9: 2271,
- 0xD1D5: 2272,
- 0xD1D7: 2273,
- 0xD1E1: 2274,
- 0xD1E2: 2275,
- 0xD1E5: 2276,
- 0xD1F5: 2277,
- 0xD1F7: 2278,
- 0xD241: 2279,
- 0xD242: 2280,
- 0xD245: 2281,
- 0xD249: 2282,
- 0xD253: 2283,
- 0xD255: 2284,
- 0xD257: 2285,
- 0xD261: 2286,
- 0xD265: 2287,
- 0xD269: 2288,
- 0xD273: 2289,
- 0xD275: 2290,
- 0xD281: 2291,
- 0xD282: 2292,
- 0xD285: 2293,
- 0xD289: 2294,
- 0xD28E: 2295,
- 0xD291: 2296,
- 0xD295: 2297,
- 0xD297: 2298,
- 0xD2A1: 2299,
- 0xD2A5: 2300,
- 0xD2A9: 2301,
- 0xD2B1: 2302,
- 0xD2B7: 2303,
- 0xD2C1: 2304,
- 0xD2C2: 2305,
- 0xD2C5: 2306,
- 0xD2C9: 2307,
- 0xD2D7: 2308,
- 0xD2E1: 2309,
- 0xD2E2: 2310,
- 0xD2E5: 2311,
- 0xD2E9: 2312,
- 0xD2F1: 2313,
- 0xD2F3: 2314,
- 0xD2F5: 2315,
- 0xD2F7: 2316,
- 0xD341: 2317,
- 0xD342: 2318,
- 0xD345: 2319,
- 0xD349: 2320,
- 0xD351: 2321,
- 0xD355: 2322,
- 0xD357: 2323,
- 0xD361: 2324,
- 0xD362: 2325,
- 0xD365: 2326,
- 0xD367: 2327,
- 0xD368: 2328,
- 0xD369: 2329,
- 0xD36A: 2330,
- 0xD371: 2331,
- 0xD373: 2332,
- 0xD375: 2333,
- 0xD377: 2334,
- 0xD37B: 2335,
- 0xD381: 2336,
- 0xD385: 2337,
- 0xD389: 2338,
- 0xD391: 2339,
- 0xD393: 2340,
- 0xD397: 2341,
- 0xD3A1: 2342,
- 0xD3A2: 2343,
- 0xD3A5: 2344,
- 0xD3A9: 2345,
- 0xD3B1: 2346,
- 0xD3B3: 2347,
- 0xD3B5: 2348,
- 0xD3B7: 2349,
-}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py
deleted file mode 100644
index d7364ba6..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py
+++ /dev/null
@@ -1,47 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .chardistribution import JOHABDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import JOHAB_SM_MODEL
-
-
-class JOHABProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(JOHAB_SM_MODEL)
- self.distribution_analyzer = JOHABDistributionAnalysis()
- self.reset()
-
- @property
- def charset_name(self) -> str:
- return "Johab"
-
- @property
- def language(self) -> str:
- return "Korean"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py
deleted file mode 100644
index 2f53bdda..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py
+++ /dev/null
@@ -1,238 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Communicator client code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Tuple, Union
-
-# This is hiragana 2-char sequence table, the number in each cell represents its frequency category
-# fmt: off
-jp2_char_context = (
- (0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1),
- (2, 4, 0, 4, 0, 3, 0, 4, 0, 3, 4, 4, 4, 2, 4, 3, 3, 4, 3, 2, 3, 3, 4, 2, 3, 3, 3, 2, 4, 1, 4, 3, 3, 1, 5, 4, 3, 4, 3, 4, 3, 5, 3, 0, 3, 5, 4, 2, 0, 3, 1, 0, 3, 3, 0, 3, 3, 0, 1, 1, 0, 4, 3, 0, 3, 3, 0, 4, 0, 2, 0, 3, 5, 5, 5, 5, 4, 0, 4, 1, 0, 3, 4),
- (0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2),
- (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 4, 4, 3, 5, 3, 5, 1, 5, 3, 4, 3, 4, 4, 3, 4, 3, 3, 4, 3, 5, 4, 4, 3, 5, 5, 3, 5, 5, 5, 3, 5, 5, 3, 4, 5, 5, 3, 1, 3, 2, 0, 3, 4, 0, 4, 2, 0, 4, 2, 1, 5, 3, 2, 3, 5, 0, 4, 0, 2, 0, 5, 4, 4, 5, 4, 5, 0, 4, 0, 0, 4, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 5, 4, 3, 3, 3, 3, 4, 3, 5, 4, 4, 3, 5, 4, 4, 3, 4, 3, 4, 4, 4, 4, 5, 3, 4, 4, 3, 4, 5, 5, 4, 5, 5, 1, 4, 5, 4, 3, 0, 3, 3, 1, 3, 3, 0, 4, 4, 0, 3, 3, 1, 5, 3, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 0, 4, 1, 1, 3, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 4, 0, 3, 0, 3, 0, 4, 0, 3, 4, 4, 3, 2, 2, 1, 2, 1, 3, 1, 3, 3, 3, 3, 3, 4, 3, 1, 3, 3, 5, 3, 3, 0, 4, 3, 0, 5, 4, 3, 3, 5, 4, 4, 3, 4, 4, 5, 0, 1, 2, 0, 1, 2, 0, 2, 2, 0, 1, 0, 0, 5, 2, 2, 1, 4, 0, 3, 0, 1, 0, 4, 4, 3, 5, 4, 3, 0, 2, 1, 0, 4, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 5, 0, 4, 0, 2, 1, 4, 4, 2, 4, 1, 4, 2, 4, 2, 4, 3, 3, 3, 4, 3, 3, 3, 3, 1, 4, 2, 3, 3, 3, 1, 4, 4, 1, 1, 1, 4, 3, 3, 2, 0, 2, 4, 3, 2, 0, 3, 3, 0, 3, 1, 1, 0, 0, 0, 3, 3, 0, 4, 2, 2, 3, 4, 0, 4, 0, 3, 0, 4, 4, 5, 3, 4, 4, 0, 3, 0, 0, 1, 4),
- (1, 4, 0, 4, 0, 4, 0, 4, 0, 3, 5, 4, 4, 3, 4, 3, 5, 4, 3, 3, 4, 3, 5, 4, 4, 4, 4, 3, 4, 2, 4, 3, 3, 1, 5, 4, 3, 2, 4, 5, 4, 5, 5, 4, 4, 5, 4, 4, 0, 3, 2, 2, 3, 3, 0, 4, 3, 1, 3, 2, 1, 4, 3, 3, 4, 5, 0, 3, 0, 2, 0, 4, 5, 5, 4, 5, 4, 0, 4, 0, 0, 5, 4),
- (0, 5, 0, 5, 0, 4, 0, 3, 0, 4, 4, 3, 4, 3, 3, 3, 4, 0, 4, 4, 4, 3, 4, 3, 4, 3, 3, 1, 4, 2, 4, 3, 4, 0, 5, 4, 1, 4, 5, 4, 4, 5, 3, 2, 4, 3, 4, 3, 2, 4, 1, 3, 3, 3, 2, 3, 2, 0, 4, 3, 3, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 4, 3, 0, 4, 1, 0, 1, 3),
- (0, 3, 1, 4, 0, 3, 0, 2, 0, 3, 4, 4, 3, 1, 4, 2, 3, 3, 4, 3, 4, 3, 4, 3, 4, 4, 3, 2, 3, 1, 5, 4, 4, 1, 4, 4, 3, 5, 4, 4, 3, 5, 5, 4, 3, 4, 4, 3, 1, 2, 3, 1, 2, 2, 0, 3, 2, 0, 3, 1, 0, 5, 3, 3, 3, 4, 3, 3, 3, 3, 4, 4, 4, 4, 5, 4, 2, 0, 3, 3, 2, 4, 3),
- (0, 2, 0, 3, 0, 1, 0, 1, 0, 0, 3, 2, 0, 0, 2, 0, 1, 0, 2, 1, 3, 3, 3, 1, 2, 3, 1, 0, 1, 0, 4, 2, 1, 1, 3, 3, 0, 4, 3, 3, 1, 4, 3, 3, 0, 3, 3, 2, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 4, 1, 0, 2, 3, 2, 2, 2, 1, 3, 3, 3, 4, 4, 3, 2, 0, 3, 1, 0, 3, 3),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 4, 2, 4, 3, 4, 3, 3, 2, 4, 3, 4, 5, 4, 1, 4, 5, 3, 5, 4, 5, 3, 5, 4, 0, 3, 5, 5, 3, 1, 3, 3, 2, 2, 3, 0, 3, 4, 1, 3, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 5, 4, 4, 5, 3, 0, 4, 1, 0, 3, 4),
- (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 2, 2, 1, 0, 1, 0, 0, 0, 3, 0, 3, 0, 3, 0, 1, 3, 1, 0, 3, 1, 3, 3, 3, 1, 3, 3, 3, 0, 1, 3, 1, 3, 4, 0, 0, 3, 1, 1, 0, 3, 2, 0, 0, 0, 0, 1, 3, 0, 1, 0, 0, 3, 3, 2, 0, 3, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 3, 0, 3, 0, 0, 2, 3),
- (2, 3, 0, 3, 0, 2, 0, 1, 0, 3, 3, 4, 3, 1, 3, 1, 1, 1, 3, 1, 4, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 4, 3, 1, 4, 3, 2, 5, 5, 4, 4, 4, 4, 3, 3, 4, 4, 4, 0, 2, 1, 1, 3, 2, 0, 1, 2, 0, 0, 1, 0, 4, 1, 3, 3, 3, 0, 3, 0, 1, 0, 4, 4, 4, 5, 5, 3, 0, 2, 0, 0, 4, 4),
- (0, 2, 0, 1, 0, 3, 1, 3, 0, 2, 3, 3, 3, 0, 3, 1, 0, 0, 3, 0, 3, 2, 3, 1, 3, 2, 1, 1, 0, 0, 4, 2, 1, 0, 2, 3, 1, 4, 3, 2, 0, 4, 4, 3, 1, 3, 1, 3, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 1, 1, 1, 2, 0, 3, 0, 0, 0, 3, 4, 2, 4, 3, 2, 0, 1, 0, 0, 3, 3),
- (0, 1, 0, 4, 0, 5, 0, 4, 0, 2, 4, 4, 2, 3, 3, 2, 3, 3, 5, 3, 3, 3, 4, 3, 4, 2, 3, 0, 4, 3, 3, 3, 4, 1, 4, 3, 2, 1, 5, 5, 3, 4, 5, 1, 3, 5, 4, 2, 0, 3, 3, 0, 1, 3, 0, 4, 2, 0, 1, 3, 1, 4, 3, 3, 3, 3, 0, 3, 0, 1, 0, 3, 4, 4, 4, 5, 5, 0, 3, 0, 1, 4, 5),
- (0, 2, 0, 3, 0, 3, 0, 0, 0, 2, 3, 1, 3, 0, 4, 0, 1, 1, 3, 0, 3, 4, 3, 2, 3, 1, 0, 3, 3, 2, 3, 1, 3, 0, 2, 3, 0, 2, 1, 4, 1, 2, 2, 0, 0, 3, 3, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 2, 2, 0, 3, 2, 1, 3, 3, 0, 2, 0, 2, 0, 0, 3, 3, 1, 2, 4, 0, 3, 0, 2, 2, 3),
- (2, 4, 0, 5, 0, 4, 0, 4, 0, 2, 4, 4, 4, 3, 4, 3, 3, 3, 1, 2, 4, 3, 4, 3, 4, 4, 5, 0, 3, 3, 3, 3, 2, 0, 4, 3, 1, 4, 3, 4, 1, 4, 4, 3, 3, 4, 4, 3, 1, 2, 3, 0, 4, 2, 0, 4, 1, 0, 3, 3, 0, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 3, 5, 3, 4, 5, 2, 0, 3, 0, 0, 4, 5),
- (0, 3, 0, 4, 0, 1, 0, 1, 0, 1, 3, 2, 2, 1, 3, 0, 3, 0, 2, 0, 2, 0, 3, 0, 2, 0, 0, 0, 1, 0, 1, 1, 0, 0, 3, 1, 0, 0, 0, 4, 0, 3, 1, 0, 2, 1, 3, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4, 2, 2, 3, 1, 0, 3, 0, 0, 0, 1, 4, 4, 4, 3, 0, 0, 4, 0, 0, 1, 4),
- (1, 4, 1, 5, 0, 3, 0, 3, 0, 4, 5, 4, 4, 3, 5, 3, 3, 4, 4, 3, 4, 1, 3, 3, 3, 3, 2, 1, 4, 1, 5, 4, 3, 1, 4, 4, 3, 5, 4, 4, 3, 5, 4, 3, 3, 4, 4, 4, 0, 3, 3, 1, 2, 3, 0, 3, 1, 0, 3, 3, 0, 5, 4, 4, 4, 4, 4, 4, 3, 3, 5, 4, 4, 3, 3, 5, 4, 0, 3, 2, 0, 4, 4),
- (0, 2, 0, 3, 0, 1, 0, 0, 0, 1, 3, 3, 3, 2, 4, 1, 3, 0, 3, 1, 3, 0, 2, 2, 1, 1, 0, 0, 2, 0, 4, 3, 1, 0, 4, 3, 0, 4, 4, 4, 1, 4, 3, 1, 1, 3, 3, 1, 0, 2, 0, 0, 1, 3, 0, 0, 0, 0, 2, 0, 0, 4, 3, 2, 4, 3, 5, 4, 3, 3, 3, 4, 3, 3, 4, 3, 3, 0, 2, 1, 0, 3, 3),
- (0, 2, 0, 4, 0, 3, 0, 2, 0, 2, 5, 5, 3, 4, 4, 4, 4, 1, 4, 3, 3, 0, 4, 3, 4, 3, 1, 3, 3, 2, 4, 3, 0, 3, 4, 3, 0, 3, 4, 4, 2, 4, 4, 0, 4, 5, 3, 3, 2, 2, 1, 1, 1, 2, 0, 1, 5, 0, 3, 3, 2, 4, 3, 3, 3, 4, 0, 3, 0, 2, 0, 4, 4, 3, 5, 5, 0, 0, 3, 0, 2, 3, 3),
- (0, 3, 0, 4, 0, 3, 0, 1, 0, 3, 4, 3, 3, 1, 3, 3, 3, 0, 3, 1, 3, 0, 4, 3, 3, 1, 1, 0, 3, 0, 3, 3, 0, 0, 4, 4, 0, 1, 5, 4, 3, 3, 5, 0, 3, 3, 4, 3, 0, 2, 0, 1, 1, 1, 0, 1, 3, 0, 1, 2, 1, 3, 3, 2, 3, 3, 0, 3, 0, 1, 0, 1, 3, 3, 4, 4, 1, 0, 1, 2, 2, 1, 3),
- (0, 1, 0, 4, 0, 4, 0, 3, 0, 1, 3, 3, 3, 2, 3, 1, 1, 0, 3, 0, 3, 3, 4, 3, 2, 4, 2, 0, 1, 0, 4, 3, 2, 0, 4, 3, 0, 5, 3, 3, 2, 4, 4, 4, 3, 3, 3, 4, 0, 1, 3, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 4, 2, 3, 3, 3, 0, 3, 0, 0, 0, 4, 4, 4, 5, 3, 2, 0, 3, 3, 0, 3, 5),
- (0, 2, 0, 3, 0, 0, 0, 3, 0, 1, 3, 0, 2, 0, 0, 0, 1, 0, 3, 1, 1, 3, 3, 0, 0, 3, 0, 0, 3, 0, 2, 3, 1, 0, 3, 1, 0, 3, 3, 2, 0, 4, 2, 2, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 0, 1, 0, 1, 0, 0, 0, 1, 3, 1, 2, 0, 0, 0, 1, 0, 0, 1, 4),
- (0, 3, 0, 3, 0, 5, 0, 1, 0, 2, 4, 3, 1, 3, 3, 2, 1, 1, 5, 2, 1, 0, 5, 1, 2, 0, 0, 0, 3, 3, 2, 2, 3, 2, 4, 3, 0, 0, 3, 3, 1, 3, 3, 0, 2, 5, 3, 4, 0, 3, 3, 0, 1, 2, 0, 2, 2, 0, 3, 2, 0, 2, 2, 3, 3, 3, 0, 2, 0, 1, 0, 3, 4, 4, 2, 5, 4, 0, 3, 0, 0, 3, 5),
- (0, 3, 0, 3, 0, 3, 0, 1, 0, 3, 3, 3, 3, 0, 3, 0, 2, 0, 2, 1, 1, 0, 2, 0, 1, 0, 0, 0, 2, 1, 0, 0, 1, 0, 3, 2, 0, 0, 3, 3, 1, 2, 3, 1, 0, 3, 3, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 3, 1, 2, 3, 0, 3, 0, 1, 0, 3, 2, 1, 0, 4, 3, 0, 1, 1, 0, 3, 3),
- (0, 4, 0, 5, 0, 3, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 4, 3, 5, 3, 3, 2, 5, 3, 4, 4, 4, 3, 4, 3, 4, 5, 5, 3, 4, 4, 3, 4, 4, 5, 4, 4, 4, 3, 4, 5, 5, 4, 2, 3, 4, 2, 3, 4, 0, 3, 3, 1, 4, 3, 2, 4, 3, 3, 5, 5, 0, 3, 0, 3, 0, 5, 5, 5, 5, 4, 4, 0, 4, 0, 1, 4, 4),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 5, 4, 4, 2, 3, 2, 5, 1, 3, 2, 5, 1, 4, 2, 3, 2, 3, 3, 4, 3, 3, 3, 3, 2, 5, 4, 1, 3, 3, 5, 3, 4, 4, 0, 4, 4, 3, 1, 1, 3, 1, 0, 2, 3, 0, 2, 3, 0, 3, 0, 0, 4, 3, 1, 3, 4, 0, 3, 0, 2, 0, 4, 4, 4, 3, 4, 5, 0, 4, 0, 0, 3, 4),
- (0, 3, 0, 3, 0, 3, 1, 2, 0, 3, 4, 4, 3, 3, 3, 0, 2, 2, 4, 3, 3, 1, 3, 3, 3, 1, 1, 0, 3, 1, 4, 3, 2, 3, 4, 4, 2, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 3, 1, 3, 3, 1, 3, 3, 0, 4, 1, 0, 2, 2, 1, 4, 3, 2, 3, 3, 5, 4, 3, 3, 5, 4, 4, 3, 3, 0, 4, 0, 3, 2, 2, 4, 4),
- (0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 2, 1, 3, 0, 0, 0, 0, 0, 2, 0, 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 3, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 0, 3, 4, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1),
- (0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 4, 1, 4, 0, 3, 0, 4, 0, 3, 0, 4, 0, 3, 0, 3, 0, 4, 1, 5, 1, 4, 0, 0, 3, 0, 5, 0, 5, 2, 0, 1, 0, 0, 0, 2, 1, 4, 0, 1, 3, 0, 0, 3, 0, 0, 3, 1, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0),
- (1, 4, 0, 5, 0, 3, 0, 2, 0, 3, 5, 4, 4, 3, 4, 3, 5, 3, 4, 3, 3, 0, 4, 3, 3, 3, 3, 3, 3, 2, 4, 4, 3, 1, 3, 4, 4, 5, 4, 4, 3, 4, 4, 1, 3, 5, 4, 3, 3, 3, 1, 2, 2, 3, 3, 1, 3, 1, 3, 3, 3, 5, 3, 3, 4, 5, 0, 3, 0, 3, 0, 3, 4, 3, 4, 4, 3, 0, 3, 0, 2, 4, 3),
- (0, 1, 0, 4, 0, 0, 0, 0, 0, 1, 4, 0, 4, 1, 4, 2, 4, 0, 3, 0, 1, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 1, 1, 1, 0, 3, 0, 0, 0, 1, 2, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 3, 2, 0, 2, 2, 0, 1, 0, 0, 0, 2, 3, 2, 3, 3, 0, 0, 0, 0, 2, 1, 0),
- (0, 5, 1, 5, 0, 3, 0, 3, 0, 5, 4, 4, 5, 1, 5, 3, 3, 0, 4, 3, 4, 3, 5, 3, 4, 3, 3, 2, 4, 3, 4, 3, 3, 0, 3, 3, 1, 4, 4, 3, 4, 4, 4, 3, 4, 5, 5, 3, 2, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 2, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 4, 4, 3, 5, 3, 3, 0, 3, 4, 0, 4, 3),
- (0, 5, 0, 5, 0, 3, 0, 2, 0, 4, 4, 3, 5, 2, 4, 3, 3, 3, 4, 4, 4, 3, 5, 3, 5, 3, 3, 1, 4, 0, 4, 3, 3, 0, 3, 3, 0, 4, 4, 4, 4, 5, 4, 3, 3, 5, 5, 3, 2, 3, 1, 2, 3, 2, 0, 1, 0, 0, 3, 2, 2, 4, 4, 3, 1, 5, 0, 4, 0, 3, 0, 4, 3, 1, 3, 2, 1, 0, 3, 3, 0, 3, 3),
- (0, 4, 0, 5, 0, 5, 0, 4, 0, 4, 5, 5, 5, 3, 4, 3, 3, 2, 5, 4, 4, 3, 5, 3, 5, 3, 4, 0, 4, 3, 4, 4, 3, 2, 4, 4, 3, 4, 5, 4, 4, 5, 5, 0, 3, 5, 5, 4, 1, 3, 3, 2, 3, 3, 1, 3, 1, 0, 4, 3, 1, 4, 4, 3, 4, 5, 0, 4, 0, 2, 0, 4, 3, 4, 4, 3, 3, 0, 4, 0, 0, 5, 5),
- (0, 4, 0, 4, 0, 5, 0, 1, 1, 3, 3, 4, 4, 3, 4, 1, 3, 0, 5, 1, 3, 0, 3, 1, 3, 1, 1, 0, 3, 0, 3, 3, 4, 0, 4, 3, 0, 4, 4, 4, 3, 4, 4, 0, 3, 5, 4, 1, 0, 3, 0, 0, 2, 3, 0, 3, 1, 0, 3, 1, 0, 3, 2, 1, 3, 5, 0, 3, 0, 1, 0, 3, 2, 3, 3, 4, 4, 0, 2, 2, 0, 4, 4),
- (2, 4, 0, 5, 0, 4, 0, 3, 0, 4, 5, 5, 4, 3, 5, 3, 5, 3, 5, 3, 5, 2, 5, 3, 4, 3, 3, 4, 3, 4, 5, 3, 2, 1, 5, 4, 3, 2, 3, 4, 5, 3, 4, 1, 2, 5, 4, 3, 0, 3, 3, 0, 3, 2, 0, 2, 3, 0, 4, 1, 0, 3, 4, 3, 3, 5, 0, 3, 0, 1, 0, 4, 5, 5, 5, 4, 3, 0, 4, 2, 0, 3, 5),
- (0, 5, 0, 4, 0, 4, 0, 2, 0, 5, 4, 3, 4, 3, 4, 3, 3, 3, 4, 3, 4, 2, 5, 3, 5, 3, 4, 1, 4, 3, 4, 4, 4, 0, 3, 5, 0, 4, 4, 4, 4, 5, 3, 1, 3, 4, 5, 3, 3, 3, 3, 3, 3, 3, 0, 2, 2, 0, 3, 3, 2, 4, 3, 3, 3, 5, 3, 4, 1, 3, 3, 5, 3, 2, 0, 0, 0, 0, 4, 3, 1, 3, 3),
- (0, 1, 0, 3, 0, 3, 0, 1, 0, 1, 3, 3, 3, 2, 3, 3, 3, 0, 3, 0, 0, 0, 3, 1, 3, 0, 0, 0, 2, 2, 2, 3, 0, 0, 3, 2, 0, 1, 2, 4, 1, 3, 3, 0, 0, 3, 3, 3, 0, 1, 0, 0, 2, 1, 0, 0, 3, 0, 3, 1, 0, 3, 0, 0, 1, 3, 0, 2, 0, 1, 0, 3, 3, 1, 3, 3, 0, 0, 1, 1, 0, 3, 3),
- (0, 2, 0, 3, 0, 2, 1, 4, 0, 2, 2, 3, 1, 1, 3, 1, 1, 0, 2, 0, 3, 1, 2, 3, 1, 3, 0, 0, 1, 0, 4, 3, 2, 3, 3, 3, 1, 4, 2, 3, 3, 3, 3, 1, 0, 3, 1, 4, 0, 1, 1, 0, 1, 2, 0, 1, 1, 0, 1, 1, 0, 3, 1, 3, 2, 2, 0, 1, 0, 0, 0, 2, 3, 3, 3, 1, 0, 0, 0, 0, 0, 2, 3),
- (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 5, 5, 3, 3, 4, 3, 3, 1, 5, 4, 4, 2, 4, 4, 4, 3, 4, 2, 4, 3, 5, 5, 4, 3, 3, 4, 3, 3, 5, 5, 4, 5, 5, 1, 3, 4, 5, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 1, 4, 5, 3, 3, 5, 0, 4, 0, 3, 0, 5, 3, 3, 1, 4, 3, 0, 4, 0, 1, 5, 3),
- (0, 5, 0, 5, 0, 4, 0, 2, 0, 4, 4, 3, 4, 3, 3, 3, 3, 3, 5, 4, 4, 4, 4, 4, 4, 5, 3, 3, 5, 2, 4, 4, 4, 3, 4, 4, 3, 3, 4, 4, 5, 5, 3, 3, 4, 3, 4, 3, 3, 4, 3, 3, 3, 3, 1, 2, 2, 1, 4, 3, 3, 5, 4, 4, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 4, 4, 1, 0, 4, 2, 0, 2, 4),
- (0, 4, 0, 4, 0, 3, 0, 1, 0, 3, 5, 2, 3, 0, 3, 0, 2, 1, 4, 2, 3, 3, 4, 1, 4, 3, 3, 2, 4, 1, 3, 3, 3, 0, 3, 3, 0, 0, 3, 3, 3, 5, 3, 3, 3, 3, 3, 2, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 0, 0, 3, 1, 2, 2, 3, 0, 3, 0, 2, 0, 4, 4, 3, 3, 4, 1, 0, 3, 0, 0, 2, 4),
- (0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 3, 1, 3, 0, 3, 2, 0, 0, 0, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 0, 2, 0, 0, 0, 0, 0, 0, 2),
- (0, 2, 1, 3, 0, 2, 0, 2, 0, 3, 3, 3, 3, 1, 3, 1, 3, 3, 3, 3, 3, 3, 4, 2, 2, 1, 2, 1, 4, 0, 4, 3, 1, 3, 3, 3, 2, 4, 3, 5, 4, 3, 3, 3, 3, 3, 3, 3, 0, 1, 3, 0, 2, 0, 0, 1, 0, 0, 1, 0, 0, 4, 2, 0, 2, 3, 0, 3, 3, 0, 3, 3, 4, 2, 3, 1, 4, 0, 1, 2, 0, 2, 3),
- (0, 3, 0, 3, 0, 1, 0, 3, 0, 2, 3, 3, 3, 0, 3, 1, 2, 0, 3, 3, 2, 3, 3, 2, 3, 2, 3, 1, 3, 0, 4, 3, 2, 0, 3, 3, 1, 4, 3, 3, 2, 3, 4, 3, 1, 3, 3, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 4, 1, 1, 0, 3, 0, 3, 1, 0, 2, 3, 3, 3, 3, 3, 1, 0, 0, 2, 0, 3, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 2, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 3),
- (0, 2, 0, 3, 1, 3, 0, 3, 0, 2, 3, 3, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 1, 3, 0, 2, 3, 1, 1, 4, 3, 3, 2, 3, 3, 1, 2, 2, 4, 1, 3, 3, 0, 1, 4, 2, 3, 0, 1, 3, 0, 3, 0, 0, 1, 3, 0, 2, 0, 0, 3, 3, 2, 1, 3, 0, 3, 0, 2, 0, 3, 4, 4, 4, 3, 1, 0, 3, 0, 0, 3, 3),
- (0, 2, 0, 1, 0, 2, 0, 0, 0, 1, 3, 2, 2, 1, 3, 0, 1, 1, 3, 0, 3, 2, 3, 1, 2, 0, 2, 0, 1, 1, 3, 3, 3, 0, 3, 3, 1, 1, 2, 3, 2, 3, 3, 1, 2, 3, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 2, 1, 2, 1, 3, 0, 3, 0, 0, 0, 3, 4, 4, 4, 3, 2, 0, 2, 0, 0, 2, 4),
- (0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 0, 0, 3),
- (0, 3, 0, 3, 0, 2, 0, 3, 0, 3, 3, 3, 2, 3, 2, 2, 2, 0, 3, 1, 3, 3, 3, 2, 3, 3, 0, 0, 3, 0, 3, 2, 2, 0, 2, 3, 1, 4, 3, 4, 3, 3, 2, 3, 1, 5, 4, 4, 0, 3, 1, 2, 1, 3, 0, 3, 1, 1, 2, 0, 2, 3, 1, 3, 1, 3, 0, 3, 0, 1, 0, 3, 3, 4, 4, 2, 1, 0, 2, 1, 0, 2, 4),
- (0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 4, 2, 5, 1, 4, 0, 2, 0, 2, 1, 3, 1, 4, 0, 2, 1, 0, 0, 2, 1, 4, 1, 1, 0, 3, 3, 0, 5, 1, 3, 2, 3, 3, 1, 0, 3, 2, 3, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 4, 0, 1, 0, 3, 0, 2, 0, 1, 0, 3, 3, 3, 4, 3, 3, 0, 0, 0, 0, 2, 3),
- (0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 3),
- (0, 1, 0, 3, 0, 4, 0, 3, 0, 2, 4, 3, 1, 0, 3, 2, 2, 1, 3, 1, 2, 2, 3, 1, 1, 1, 2, 1, 3, 0, 1, 2, 0, 1, 3, 2, 1, 3, 0, 5, 5, 1, 0, 0, 1, 3, 2, 1, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 3, 4, 0, 1, 1, 1, 3, 2, 0, 2, 0, 1, 0, 2, 3, 3, 1, 2, 3, 0, 1, 0, 1, 0, 4),
- (0, 0, 0, 1, 0, 3, 0, 3, 0, 2, 2, 1, 0, 0, 4, 0, 3, 0, 3, 1, 3, 0, 3, 0, 3, 0, 1, 0, 3, 0, 3, 1, 3, 0, 3, 3, 0, 0, 1, 2, 1, 1, 1, 0, 1, 2, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 1, 2, 0, 0, 2, 0, 0, 0, 0, 2, 3, 3, 3, 3, 0, 0, 0, 0, 1, 4),
- (0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, 1, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 2, 0, 2, 3, 0, 0, 2, 2, 3, 1, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 0, 0, 0, 2, 3),
- (2, 4, 0, 5, 0, 5, 0, 4, 0, 3, 4, 3, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 2, 3, 0, 5, 5, 4, 1, 5, 4, 3, 1, 5, 4, 3, 4, 4, 3, 3, 4, 3, 3, 0, 3, 2, 0, 2, 3, 0, 3, 0, 0, 3, 3, 0, 5, 3, 2, 3, 3, 0, 3, 0, 3, 0, 3, 4, 5, 4, 5, 3, 0, 4, 3, 0, 3, 4),
- (0, 3, 0, 3, 0, 3, 0, 3, 0, 3, 3, 4, 3, 2, 3, 2, 3, 0, 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 2, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 3, 4, 4, 3, 2, 4, 4, 1, 0, 2, 0, 0, 1, 1, 0, 2, 0, 0, 3, 1, 0, 5, 3, 2, 1, 3, 0, 3, 0, 1, 2, 4, 3, 2, 4, 3, 3, 0, 3, 2, 0, 4, 4),
- (0, 3, 0, 3, 0, 1, 0, 0, 0, 1, 4, 3, 3, 2, 3, 1, 3, 1, 4, 2, 3, 2, 4, 2, 3, 4, 3, 0, 2, 2, 3, 3, 3, 0, 3, 3, 3, 0, 3, 4, 1, 3, 3, 0, 3, 4, 3, 3, 0, 1, 1, 0, 1, 0, 0, 0, 4, 0, 3, 0, 0, 3, 1, 2, 1, 3, 0, 4, 0, 1, 0, 4, 3, 3, 4, 3, 3, 0, 2, 0, 0, 3, 3),
- (0, 3, 0, 4, 0, 1, 0, 3, 0, 3, 4, 3, 3, 0, 3, 3, 3, 1, 3, 1, 3, 3, 4, 3, 3, 3, 0, 0, 3, 1, 5, 3, 3, 1, 3, 3, 2, 5, 4, 3, 3, 4, 5, 3, 2, 5, 3, 4, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 4, 2, 2, 1, 3, 0, 3, 0, 2, 0, 4, 4, 3, 5, 3, 2, 0, 1, 1, 0, 3, 4),
- (0, 5, 0, 4, 0, 5, 0, 2, 0, 4, 4, 3, 3, 2, 3, 3, 3, 1, 4, 3, 4, 1, 5, 3, 4, 3, 4, 0, 4, 2, 4, 3, 4, 1, 5, 4, 0, 4, 4, 4, 4, 5, 4, 1, 3, 5, 4, 2, 1, 4, 1, 1, 3, 2, 0, 3, 1, 0, 3, 2, 1, 4, 3, 3, 3, 4, 0, 4, 0, 3, 0, 4, 4, 4, 3, 3, 3, 0, 4, 2, 0, 3, 4),
- (1, 4, 0, 4, 0, 3, 0, 1, 0, 3, 3, 3, 1, 1, 3, 3, 2, 2, 3, 3, 1, 0, 3, 2, 2, 1, 2, 0, 3, 1, 2, 1, 2, 0, 3, 2, 0, 2, 2, 3, 3, 4, 3, 0, 3, 3, 1, 2, 0, 1, 1, 3, 1, 2, 0, 0, 3, 0, 1, 1, 0, 3, 2, 2, 3, 3, 0, 3, 0, 0, 0, 2, 3, 3, 4, 3, 3, 0, 1, 0, 0, 1, 4),
- (0, 4, 0, 4, 0, 4, 0, 0, 0, 3, 4, 4, 3, 1, 4, 2, 3, 2, 3, 3, 3, 1, 4, 3, 4, 0, 3, 0, 4, 2, 3, 3, 2, 2, 5, 4, 2, 1, 3, 4, 3, 4, 3, 1, 3, 3, 4, 2, 0, 2, 1, 0, 3, 3, 0, 0, 2, 0, 3, 1, 0, 4, 4, 3, 4, 3, 0, 4, 0, 1, 0, 2, 4, 4, 4, 4, 4, 0, 3, 2, 0, 3, 3),
- (0, 0, 0, 1, 0, 4, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 2, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2),
- (0, 2, 0, 3, 0, 4, 0, 4, 0, 1, 3, 3, 3, 0, 4, 0, 2, 1, 2, 1, 1, 1, 2, 0, 3, 1, 1, 0, 1, 0, 3, 1, 0, 0, 3, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 2, 0, 3, 1, 0, 0, 1, 0, 1, 1, 0, 1, 2, 0, 3, 0, 0, 0, 0, 1, 0, 0, 3, 3, 4, 3, 1, 0, 1, 0, 3, 0, 2),
- (0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 3, 1, 0, 1, 3, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 2, 3, 0, 1, 4, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 3),
- (0, 2, 0, 5, 0, 5, 0, 1, 0, 2, 4, 3, 3, 2, 5, 1, 3, 2, 3, 3, 3, 0, 4, 1, 2, 0, 3, 0, 4, 0, 2, 2, 1, 1, 5, 3, 0, 0, 1, 4, 2, 3, 2, 0, 3, 3, 3, 2, 0, 2, 4, 1, 1, 2, 0, 1, 1, 0, 3, 1, 0, 1, 3, 1, 2, 3, 0, 2, 0, 0, 0, 1, 3, 5, 4, 4, 4, 0, 3, 0, 0, 1, 3),
- (0, 4, 0, 5, 0, 4, 0, 4, 0, 4, 5, 4, 3, 3, 4, 3, 3, 3, 4, 3, 4, 4, 5, 3, 4, 5, 4, 2, 4, 2, 3, 4, 3, 1, 4, 4, 1, 3, 5, 4, 4, 5, 5, 4, 4, 5, 5, 5, 2, 3, 3, 1, 4, 3, 1, 3, 3, 0, 3, 3, 1, 4, 3, 4, 4, 4, 0, 3, 0, 4, 0, 3, 3, 4, 4, 5, 0, 0, 4, 3, 0, 4, 5),
- (0, 4, 0, 4, 0, 3, 0, 3, 0, 3, 4, 4, 4, 3, 3, 2, 4, 3, 4, 3, 4, 3, 5, 3, 4, 3, 2, 1, 4, 2, 4, 4, 3, 1, 3, 4, 2, 4, 5, 5, 3, 4, 5, 4, 1, 5, 4, 3, 0, 3, 2, 2, 3, 2, 1, 3, 1, 0, 3, 3, 3, 5, 3, 3, 3, 5, 4, 4, 2, 3, 3, 4, 3, 3, 3, 2, 1, 0, 3, 2, 1, 4, 3),
- (0, 4, 0, 5, 0, 4, 0, 3, 0, 3, 5, 5, 3, 2, 4, 3, 4, 0, 5, 4, 4, 1, 4, 4, 4, 3, 3, 3, 4, 3, 5, 5, 2, 3, 3, 4, 1, 2, 5, 5, 3, 5, 5, 2, 3, 5, 5, 4, 0, 3, 2, 0, 3, 3, 1, 1, 5, 1, 4, 1, 0, 4, 3, 2, 3, 5, 0, 4, 0, 3, 0, 5, 4, 3, 4, 3, 0, 0, 4, 1, 0, 4, 4),
- (1, 3, 0, 4, 0, 2, 0, 2, 0, 2, 5, 5, 3, 3, 3, 3, 3, 0, 4, 2, 3, 4, 4, 4, 3, 4, 0, 0, 3, 4, 5, 4, 3, 3, 3, 3, 2, 5, 5, 4, 5, 5, 5, 4, 3, 5, 5, 5, 1, 3, 1, 0, 1, 0, 0, 3, 2, 0, 4, 2, 0, 5, 2, 3, 2, 4, 1, 3, 0, 3, 0, 4, 5, 4, 5, 4, 3, 0, 4, 2, 0, 5, 4),
- (0, 3, 0, 4, 0, 5, 0, 3, 0, 3, 4, 4, 3, 2, 3, 2, 3, 3, 3, 3, 3, 2, 4, 3, 3, 2, 2, 0, 3, 3, 3, 3, 3, 1, 3, 3, 3, 0, 4, 4, 3, 4, 4, 1, 1, 4, 4, 2, 0, 3, 1, 0, 1, 1, 0, 4, 1, 0, 2, 3, 1, 3, 3, 1, 3, 4, 0, 3, 0, 1, 0, 3, 1, 3, 0, 0, 1, 0, 2, 0, 0, 4, 4),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
- (0, 3, 0, 3, 0, 2, 0, 3, 0, 1, 5, 4, 3, 3, 3, 1, 4, 2, 1, 2, 3, 4, 4, 2, 4, 4, 5, 0, 3, 1, 4, 3, 4, 0, 4, 3, 3, 3, 2, 3, 2, 5, 3, 4, 3, 2, 2, 3, 0, 0, 3, 0, 2, 1, 0, 1, 2, 0, 0, 0, 0, 2, 1, 1, 3, 1, 0, 2, 0, 4, 0, 3, 4, 4, 4, 5, 2, 0, 2, 0, 0, 1, 3),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 4, 2, 1, 1, 0, 1, 0, 3, 2, 0, 0, 3, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 4, 0, 4, 2, 1, 0, 0, 0, 0, 0, 1),
- (0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 2, 0, 2, 1, 0, 0, 1, 2, 1, 0, 1, 1, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
- (0, 4, 0, 4, 0, 4, 0, 3, 0, 4, 4, 3, 4, 2, 4, 3, 2, 0, 4, 4, 4, 3, 5, 3, 5, 3, 3, 2, 4, 2, 4, 3, 4, 3, 1, 4, 0, 2, 3, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3, 4, 1, 3, 4, 3, 2, 1, 2, 1, 3, 3, 3, 4, 4, 3, 3, 5, 0, 4, 0, 3, 0, 4, 3, 3, 3, 2, 1, 0, 3, 0, 0, 3, 3),
- (0, 4, 0, 3, 0, 3, 0, 3, 0, 3, 5, 5, 3, 3, 3, 3, 4, 3, 4, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 4, 3, 5, 3, 3, 1, 3, 2, 4, 5, 5, 5, 5, 4, 3, 4, 5, 5, 3, 2, 2, 3, 3, 3, 3, 2, 3, 3, 1, 2, 3, 2, 4, 3, 3, 3, 4, 0, 4, 0, 2, 0, 4, 3, 2, 2, 1, 2, 0, 3, 0, 0, 4, 1),
-)
-# fmt: on
-
-
-class JapaneseContextAnalysis:
- NUM_OF_CATEGORY = 6
- DONT_KNOW = -1
- ENOUGH_REL_THRESHOLD = 100
- MAX_REL_THRESHOLD = 1000
- MINIMUM_DATA_THRESHOLD = 4
-
- def __init__(self) -> None:
- self._total_rel = 0
- self._rel_sample: List[int] = []
- self._need_to_skip_char_num = 0
- self._last_char_order = -1
- self._done = False
- self.reset()
-
- def reset(self) -> None:
- self._total_rel = 0 # total sequence received
- # category counters, each integer counts sequence in its category
- self._rel_sample = [0] * self.NUM_OF_CATEGORY
- # if last byte in current buffer is not the last byte of a character,
- # we need to know how many bytes to skip in next buffer
- self._need_to_skip_char_num = 0
- self._last_char_order = -1 # The order of previous char
- # If this flag is set to True, detection is done and conclusion has
- # been made
- self._done = False
-
- def feed(self, byte_str: Union[bytes, bytearray], num_bytes: int) -> None:
- if self._done:
- return
-
- # The buffer we got is byte oriented, and a character may span in more than one
- # buffers. In case the last one or two byte in last buffer is not
- # complete, we record how many byte needed to complete that character
- # and skip these bytes here. We can choose to record those bytes as
- # well and analyse the character once it is complete, but since a
- # character will not make much difference, by simply skipping
- # this character will simply our logic and improve performance.
- i = self._need_to_skip_char_num
- while i < num_bytes:
- order, char_len = self.get_order(byte_str[i : i + 2])
- i += char_len
- if i > num_bytes:
- self._need_to_skip_char_num = i - num_bytes
- self._last_char_order = -1
- else:
- if (order != -1) and (self._last_char_order != -1):
- self._total_rel += 1
- if self._total_rel > self.MAX_REL_THRESHOLD:
- self._done = True
- break
- self._rel_sample[
- jp2_char_context[self._last_char_order][order]
- ] += 1
- self._last_char_order = order
-
- def got_enough_data(self) -> bool:
- return self._total_rel > self.ENOUGH_REL_THRESHOLD
-
- def get_confidence(self) -> float:
- # This is just one way to calculate confidence. It works well for me.
- if self._total_rel > self.MINIMUM_DATA_THRESHOLD:
- return (self._total_rel - self._rel_sample[0]) / self._total_rel
- return self.DONT_KNOW
-
- def get_order(self, _: Union[bytes, bytearray]) -> Tuple[int, int]:
- return -1, 1
-
-
-class SJISContextAnalysis(JapaneseContextAnalysis):
- def __init__(self) -> None:
- super().__init__()
- self._charset_name = "SHIFT_JIS"
-
- @property
- def charset_name(self) -> str:
- return self._charset_name
-
- def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]:
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC):
- char_len = 2
- if (first_char == 0x87) or (0xFA <= first_char <= 0xFC):
- self._charset_name = "CP932"
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 202) and (0x9F <= second_char <= 0xF1):
- return second_char - 0x9F, char_len
-
- return -1, char_len
-
-
-class EUCJPContextAnalysis(JapaneseContextAnalysis):
- def get_order(self, byte_str: Union[bytes, bytearray]) -> Tuple[int, int]:
- if not byte_str:
- return -1, 1
- # find out current char's byte length
- first_char = byte_str[0]
- if (first_char == 0x8E) or (0xA1 <= first_char <= 0xFE):
- char_len = 2
- elif first_char == 0x8F:
- char_len = 3
- else:
- char_len = 1
-
- # return its order if it is hiragana
- if len(byte_str) > 1:
- second_char = byte_str[1]
- if (first_char == 0xA4) and (0xA1 <= second_char <= 0xF3):
- return second_char - 0xA1, char_len
-
- return -1, char_len
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
deleted file mode 100644
index 99466821..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py
+++ /dev/null
@@ -1,4649 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-BULGARIAN_LANG_MODEL = {
- 63: { # 'e'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 45: { # '\xad'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 31: { # 'А'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 2, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 0, # 'и'
- 26: 2, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 32: { # 'Б'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 2, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 35: { # 'В'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 2, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 43: { # 'Г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 1, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 37: { # 'Д'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 2, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 44: { # 'Е'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 2, # 'Ф'
- 49: 1, # 'Х'
- 53: 2, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 0, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 55: { # 'Ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 47: { # 'З'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 40: { # 'И'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 2, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 2, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 3, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 0, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 59: { # 'Й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 33: { # 'К'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 46: { # 'Л'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 2, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 38: { # 'М'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 36: { # 'Н'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 2, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 41: { # 'О'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 1, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 1, # 'Й'
- 33: 2, # 'К'
- 46: 2, # 'Л'
- 38: 2, # 'М'
- 36: 2, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 1, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 0, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 2, # 'ч'
- 27: 0, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 30: { # 'П'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 2, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 39: { # 'Р'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 2, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 1, # 'с'
- 5: 0, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 28: { # 'С'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 3, # 'А'
- 32: 2, # 'Б'
- 35: 2, # 'В'
- 43: 1, # 'Г'
- 37: 2, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 2, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 1, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 34: { # 'Т'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 2, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 2, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 1, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 1, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 1, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 3, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 51: { # 'У'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 2, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 48: { # 'Ф'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 2, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 1, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 2, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 49: { # 'Х'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 1, # 'П'
- 39: 1, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 53: { # 'Ц'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 2, # 'И'
- 59: 0, # 'Й'
- 33: 2, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 2, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 50: { # 'Ч'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 2, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 2, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 54: { # 'Ш'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 1, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 1, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 2, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 57: { # 'Щ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 1, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 1, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 1, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 61: { # 'Ъ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 1, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 2, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 2, # 'Р'
- 28: 1, # 'С'
- 34: 1, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 1, # 'Х'
- 53: 1, # 'Ц'
- 50: 1, # 'Ч'
- 54: 1, # 'Ш'
- 57: 1, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 1, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 60: { # 'Ю'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 1, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 0, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 2, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 0, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 56: { # 'Я'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 1, # 'В'
- 43: 1, # 'Г'
- 37: 1, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 1, # 'Л'
- 38: 1, # 'М'
- 36: 1, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 2, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 1, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 0, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 1: { # 'а'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 1, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 18: { # 'б'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 0, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 2, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 3, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 9: { # 'в'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 1, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 0, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 20: { # 'г'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 11: { # 'д'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 1, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 3: { # 'е'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 23: { # 'ж'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 15: { # 'з'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 2: { # 'и'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 1, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 1, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 1, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 1, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 26: { # 'й'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 2, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 12: { # 'к'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 1, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 1, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 10: { # 'л'
- 63: 1, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 1, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 1, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 3, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 14: { # 'м'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 1, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 1, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 6: { # 'н'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 1, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 2, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 3, # 'ф'
- 25: 2, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 4: { # 'о'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 2, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 3, # 'и'
- 26: 3, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 2, # 'у'
- 29: 3, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 3, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 13: { # 'п'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 3, # 'л'
- 14: 1, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 7: { # 'р'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 3, # 'е'
- 23: 3, # 'ж'
- 15: 2, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 3, # 'х'
- 22: 3, # 'ц'
- 21: 2, # 'ч'
- 27: 3, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 1, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 8: { # 'с'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 2, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 2, # 'ш'
- 24: 0, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 5: { # 'т'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 2, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 3, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 2, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 3, # 'ъ'
- 52: 2, # 'ь'
- 42: 2, # 'ю'
- 16: 3, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 19: { # 'у'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 2, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 2, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 3, # 'ш'
- 24: 2, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 29: { # 'ф'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 1, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 2, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 2, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 25: { # 'х'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 2, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 1, # 'п'
- 7: 3, # 'р'
- 8: 1, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 1, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 22: { # 'ц'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 2, # 'в'
- 20: 1, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 1, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 2, # 'к'
- 10: 1, # 'л'
- 14: 1, # 'м'
- 6: 1, # 'н'
- 4: 2, # 'о'
- 13: 1, # 'п'
- 7: 1, # 'р'
- 8: 1, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 1, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 0, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 21: { # 'ч'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 1, # 'б'
- 9: 3, # 'в'
- 20: 1, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 1, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 2, # 'р'
- 8: 0, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 1, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 27: { # 'ш'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 2, # 'в'
- 20: 0, # 'г'
- 11: 1, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 3, # 'к'
- 10: 2, # 'л'
- 14: 1, # 'м'
- 6: 3, # 'н'
- 4: 2, # 'о'
- 13: 2, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 2, # 'у'
- 29: 1, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 1, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 2, # 'ъ'
- 52: 1, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 24: { # 'щ'
- 63: 1, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 3, # 'а'
- 18: 0, # 'б'
- 9: 1, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 3, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 3, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 2, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 1, # 'р'
- 8: 0, # 'с'
- 5: 2, # 'т'
- 19: 3, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 2, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 17: { # 'ъ'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 3, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 3, # 'ж'
- 15: 3, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 3, # 'о'
- 13: 3, # 'п'
- 7: 3, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 2, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 2, # 'ш'
- 24: 3, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 2, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 52: { # 'ь'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 1, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 1, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 1, # 'н'
- 4: 3, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 1, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 1, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 1, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 42: { # 'ю'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 1, # 'а'
- 18: 2, # 'б'
- 9: 1, # 'в'
- 20: 2, # 'г'
- 11: 2, # 'д'
- 3: 1, # 'е'
- 23: 2, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 1, # 'й'
- 12: 2, # 'к'
- 10: 2, # 'л'
- 14: 2, # 'м'
- 6: 2, # 'н'
- 4: 1, # 'о'
- 13: 1, # 'п'
- 7: 2, # 'р'
- 8: 2, # 'с'
- 5: 2, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 1, # 'х'
- 22: 2, # 'ц'
- 21: 3, # 'ч'
- 27: 1, # 'ш'
- 24: 1, # 'щ'
- 17: 1, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 16: { # 'я'
- 63: 0, # 'e'
- 45: 1, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 3, # 'б'
- 9: 3, # 'в'
- 20: 2, # 'г'
- 11: 3, # 'д'
- 3: 2, # 'е'
- 23: 1, # 'ж'
- 15: 2, # 'з'
- 2: 1, # 'и'
- 26: 2, # 'й'
- 12: 3, # 'к'
- 10: 3, # 'л'
- 14: 3, # 'м'
- 6: 3, # 'н'
- 4: 1, # 'о'
- 13: 2, # 'п'
- 7: 2, # 'р'
- 8: 3, # 'с'
- 5: 3, # 'т'
- 19: 1, # 'у'
- 29: 1, # 'ф'
- 25: 3, # 'х'
- 22: 2, # 'ц'
- 21: 1, # 'ч'
- 27: 1, # 'ш'
- 24: 2, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 1, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 58: { # 'є'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
- 62: { # '№'
- 63: 0, # 'e'
- 45: 0, # '\xad'
- 31: 0, # 'А'
- 32: 0, # 'Б'
- 35: 0, # 'В'
- 43: 0, # 'Г'
- 37: 0, # 'Д'
- 44: 0, # 'Е'
- 55: 0, # 'Ж'
- 47: 0, # 'З'
- 40: 0, # 'И'
- 59: 0, # 'Й'
- 33: 0, # 'К'
- 46: 0, # 'Л'
- 38: 0, # 'М'
- 36: 0, # 'Н'
- 41: 0, # 'О'
- 30: 0, # 'П'
- 39: 0, # 'Р'
- 28: 0, # 'С'
- 34: 0, # 'Т'
- 51: 0, # 'У'
- 48: 0, # 'Ф'
- 49: 0, # 'Х'
- 53: 0, # 'Ц'
- 50: 0, # 'Ч'
- 54: 0, # 'Ш'
- 57: 0, # 'Щ'
- 61: 0, # 'Ъ'
- 60: 0, # 'Ю'
- 56: 0, # 'Я'
- 1: 0, # 'а'
- 18: 0, # 'б'
- 9: 0, # 'в'
- 20: 0, # 'г'
- 11: 0, # 'д'
- 3: 0, # 'е'
- 23: 0, # 'ж'
- 15: 0, # 'з'
- 2: 0, # 'и'
- 26: 0, # 'й'
- 12: 0, # 'к'
- 10: 0, # 'л'
- 14: 0, # 'м'
- 6: 0, # 'н'
- 4: 0, # 'о'
- 13: 0, # 'п'
- 7: 0, # 'р'
- 8: 0, # 'с'
- 5: 0, # 'т'
- 19: 0, # 'у'
- 29: 0, # 'ф'
- 25: 0, # 'х'
- 22: 0, # 'ц'
- 21: 0, # 'ч'
- 27: 0, # 'ш'
- 24: 0, # 'щ'
- 17: 0, # 'ъ'
- 52: 0, # 'ь'
- 42: 0, # 'ю'
- 16: 0, # 'я'
- 58: 0, # 'є'
- 62: 0, # '№'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_5_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 194, # '\x80'
- 129: 195, # '\x81'
- 130: 196, # '\x82'
- 131: 197, # '\x83'
- 132: 198, # '\x84'
- 133: 199, # '\x85'
- 134: 200, # '\x86'
- 135: 201, # '\x87'
- 136: 202, # '\x88'
- 137: 203, # '\x89'
- 138: 204, # '\x8a'
- 139: 205, # '\x8b'
- 140: 206, # '\x8c'
- 141: 207, # '\x8d'
- 142: 208, # '\x8e'
- 143: 209, # '\x8f'
- 144: 210, # '\x90'
- 145: 211, # '\x91'
- 146: 212, # '\x92'
- 147: 213, # '\x93'
- 148: 214, # '\x94'
- 149: 215, # '\x95'
- 150: 216, # '\x96'
- 151: 217, # '\x97'
- 152: 218, # '\x98'
- 153: 219, # '\x99'
- 154: 220, # '\x9a'
- 155: 221, # '\x9b'
- 156: 222, # '\x9c'
- 157: 223, # '\x9d'
- 158: 224, # '\x9e'
- 159: 225, # '\x9f'
- 160: 81, # '\xa0'
- 161: 226, # 'Ё'
- 162: 227, # 'Ђ'
- 163: 228, # 'Ѓ'
- 164: 229, # 'Є'
- 165: 230, # 'Ѕ'
- 166: 105, # 'І'
- 167: 231, # 'Ї'
- 168: 232, # 'Ј'
- 169: 233, # 'Љ'
- 170: 234, # 'Њ'
- 171: 235, # 'Ћ'
- 172: 236, # 'Ќ'
- 173: 45, # '\xad'
- 174: 237, # 'Ў'
- 175: 238, # 'Џ'
- 176: 31, # 'А'
- 177: 32, # 'Б'
- 178: 35, # 'В'
- 179: 43, # 'Г'
- 180: 37, # 'Д'
- 181: 44, # 'Е'
- 182: 55, # 'Ж'
- 183: 47, # 'З'
- 184: 40, # 'И'
- 185: 59, # 'Й'
- 186: 33, # 'К'
- 187: 46, # 'Л'
- 188: 38, # 'М'
- 189: 36, # 'Н'
- 190: 41, # 'О'
- 191: 30, # 'П'
- 192: 39, # 'Р'
- 193: 28, # 'С'
- 194: 34, # 'Т'
- 195: 51, # 'У'
- 196: 48, # 'Ф'
- 197: 49, # 'Х'
- 198: 53, # 'Ц'
- 199: 50, # 'Ч'
- 200: 54, # 'Ш'
- 201: 57, # 'Щ'
- 202: 61, # 'Ъ'
- 203: 239, # 'Ы'
- 204: 67, # 'Ь'
- 205: 240, # 'Э'
- 206: 60, # 'Ю'
- 207: 56, # 'Я'
- 208: 1, # 'а'
- 209: 18, # 'б'
- 210: 9, # 'в'
- 211: 20, # 'г'
- 212: 11, # 'д'
- 213: 3, # 'е'
- 214: 23, # 'ж'
- 215: 15, # 'з'
- 216: 2, # 'и'
- 217: 26, # 'й'
- 218: 12, # 'к'
- 219: 10, # 'л'
- 220: 14, # 'м'
- 221: 6, # 'н'
- 222: 4, # 'о'
- 223: 13, # 'п'
- 224: 7, # 'р'
- 225: 8, # 'с'
- 226: 5, # 'т'
- 227: 19, # 'у'
- 228: 29, # 'ф'
- 229: 25, # 'х'
- 230: 22, # 'ц'
- 231: 21, # 'ч'
- 232: 27, # 'ш'
- 233: 24, # 'щ'
- 234: 17, # 'ъ'
- 235: 75, # 'ы'
- 236: 52, # 'ь'
- 237: 241, # 'э'
- 238: 42, # 'ю'
- 239: 16, # 'я'
- 240: 62, # '№'
- 241: 242, # 'ё'
- 242: 243, # 'ђ'
- 243: 244, # 'ѓ'
- 244: 58, # 'є'
- 245: 245, # 'ѕ'
- 246: 98, # 'і'
- 247: 246, # 'ї'
- 248: 247, # 'ј'
- 249: 248, # 'љ'
- 250: 249, # 'њ'
- 251: 250, # 'ћ'
- 252: 251, # 'ќ'
- 253: 91, # '§'
- 254: 252, # 'ў'
- 255: 253, # 'џ'
-}
-
-ISO_8859_5_BULGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-5",
- language="Bulgarian",
- char_to_order_map=ISO_8859_5_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
-)
-
-WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 77, # 'A'
- 66: 90, # 'B'
- 67: 99, # 'C'
- 68: 100, # 'D'
- 69: 72, # 'E'
- 70: 109, # 'F'
- 71: 107, # 'G'
- 72: 101, # 'H'
- 73: 79, # 'I'
- 74: 185, # 'J'
- 75: 81, # 'K'
- 76: 102, # 'L'
- 77: 76, # 'M'
- 78: 94, # 'N'
- 79: 82, # 'O'
- 80: 110, # 'P'
- 81: 186, # 'Q'
- 82: 108, # 'R'
- 83: 91, # 'S'
- 84: 74, # 'T'
- 85: 119, # 'U'
- 86: 84, # 'V'
- 87: 96, # 'W'
- 88: 111, # 'X'
- 89: 187, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 65, # 'a'
- 98: 69, # 'b'
- 99: 70, # 'c'
- 100: 66, # 'd'
- 101: 63, # 'e'
- 102: 68, # 'f'
- 103: 112, # 'g'
- 104: 103, # 'h'
- 105: 92, # 'i'
- 106: 194, # 'j'
- 107: 104, # 'k'
- 108: 95, # 'l'
- 109: 86, # 'm'
- 110: 87, # 'n'
- 111: 71, # 'o'
- 112: 116, # 'p'
- 113: 195, # 'q'
- 114: 85, # 'r'
- 115: 93, # 's'
- 116: 97, # 't'
- 117: 113, # 'u'
- 118: 196, # 'v'
- 119: 197, # 'w'
- 120: 198, # 'x'
- 121: 199, # 'y'
- 122: 200, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 206, # 'Ђ'
- 129: 207, # 'Ѓ'
- 130: 208, # '‚'
- 131: 209, # 'ѓ'
- 132: 210, # '„'
- 133: 211, # '…'
- 134: 212, # '†'
- 135: 213, # '‡'
- 136: 120, # '€'
- 137: 214, # '‰'
- 138: 215, # 'Љ'
- 139: 216, # '‹'
- 140: 217, # 'Њ'
- 141: 218, # 'Ќ'
- 142: 219, # 'Ћ'
- 143: 220, # 'Џ'
- 144: 221, # 'ђ'
- 145: 78, # '‘'
- 146: 64, # '’'
- 147: 83, # '“'
- 148: 121, # '”'
- 149: 98, # '•'
- 150: 117, # '–'
- 151: 105, # '—'
- 152: 222, # None
- 153: 223, # '™'
- 154: 224, # 'љ'
- 155: 225, # '›'
- 156: 226, # 'њ'
- 157: 227, # 'ќ'
- 158: 228, # 'ћ'
- 159: 229, # 'џ'
- 160: 88, # '\xa0'
- 161: 230, # 'Ў'
- 162: 231, # 'ў'
- 163: 232, # 'Ј'
- 164: 233, # '¤'
- 165: 122, # 'Ґ'
- 166: 89, # '¦'
- 167: 106, # '§'
- 168: 234, # 'Ё'
- 169: 235, # '©'
- 170: 236, # 'Є'
- 171: 237, # '«'
- 172: 238, # '¬'
- 173: 45, # '\xad'
- 174: 239, # '®'
- 175: 240, # 'Ї'
- 176: 73, # '°'
- 177: 80, # '±'
- 178: 118, # 'І'
- 179: 114, # 'і'
- 180: 241, # 'ґ'
- 181: 242, # 'µ'
- 182: 243, # '¶'
- 183: 244, # '·'
- 184: 245, # 'ё'
- 185: 62, # '№'
- 186: 58, # 'є'
- 187: 246, # '»'
- 188: 247, # 'ј'
- 189: 248, # 'Ѕ'
- 190: 249, # 'ѕ'
- 191: 250, # 'ї'
- 192: 31, # 'А'
- 193: 32, # 'Б'
- 194: 35, # 'В'
- 195: 43, # 'Г'
- 196: 37, # 'Д'
- 197: 44, # 'Е'
- 198: 55, # 'Ж'
- 199: 47, # 'З'
- 200: 40, # 'И'
- 201: 59, # 'Й'
- 202: 33, # 'К'
- 203: 46, # 'Л'
- 204: 38, # 'М'
- 205: 36, # 'Н'
- 206: 41, # 'О'
- 207: 30, # 'П'
- 208: 39, # 'Р'
- 209: 28, # 'С'
- 210: 34, # 'Т'
- 211: 51, # 'У'
- 212: 48, # 'Ф'
- 213: 49, # 'Х'
- 214: 53, # 'Ц'
- 215: 50, # 'Ч'
- 216: 54, # 'Ш'
- 217: 57, # 'Щ'
- 218: 61, # 'Ъ'
- 219: 251, # 'Ы'
- 220: 67, # 'Ь'
- 221: 252, # 'Э'
- 222: 60, # 'Ю'
- 223: 56, # 'Я'
- 224: 1, # 'а'
- 225: 18, # 'б'
- 226: 9, # 'в'
- 227: 20, # 'г'
- 228: 11, # 'д'
- 229: 3, # 'е'
- 230: 23, # 'ж'
- 231: 15, # 'з'
- 232: 2, # 'и'
- 233: 26, # 'й'
- 234: 12, # 'к'
- 235: 10, # 'л'
- 236: 14, # 'м'
- 237: 6, # 'н'
- 238: 4, # 'о'
- 239: 13, # 'п'
- 240: 7, # 'р'
- 241: 8, # 'с'
- 242: 5, # 'т'
- 243: 19, # 'у'
- 244: 29, # 'ф'
- 245: 25, # 'х'
- 246: 22, # 'ц'
- 247: 21, # 'ч'
- 248: 27, # 'ш'
- 249: 24, # 'щ'
- 250: 17, # 'ъ'
- 251: 75, # 'ы'
- 252: 52, # 'ь'
- 253: 253, # 'э'
- 254: 42, # 'ю'
- 255: 16, # 'я'
-}
-
-WINDOWS_1251_BULGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1251",
- language="Bulgarian",
- char_to_order_map=WINDOWS_1251_BULGARIAN_CHAR_TO_ORDER,
- language_model=BULGARIAN_LANG_MODEL,
- typical_positive_ratio=0.969392,
- keep_ascii_letters=False,
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py
deleted file mode 100644
index cfb8639e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py
+++ /dev/null
@@ -1,4397 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-GREEK_LANG_MODEL = {
- 60: { # 'e'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 55: { # 'o'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 2, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 58: { # 't'
- 60: 2, # 'e'
- 55: 1, # 'o'
- 58: 1, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 36: { # '·'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 61: { # 'Ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 1, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 1, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 46: { # 'Έ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 1, # 'σ'
- 2: 2, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 54: { # 'Ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 31: { # 'Α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 2, # 'Β'
- 43: 2, # 'Γ'
- 41: 1, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 0, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 2, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 51: { # 'Β'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 1, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 43: { # 'Γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 1, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 41: { # 'Δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 34: { # 'Ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 1, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 1, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'ύ'
- 27: 0, # 'ώ'
- },
- 40: { # 'Η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 52: { # 'Θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 1, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 47: { # 'Ι'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 1, # 'Β'
- 43: 1, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 2, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 1, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 44: { # 'Κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 1, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 53: { # 'Λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 0, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 1, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 38: { # 'Μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 2, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 2, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 49: { # 'Ν'
- 60: 2, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 1, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 1, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 59: { # 'Ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 39: { # 'Ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 1, # 'Β'
- 43: 2, # 'Γ'
- 41: 2, # 'Δ'
- 34: 2, # 'Ε'
- 40: 1, # 'Η'
- 52: 2, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 2, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 2, # 'Φ'
- 50: 2, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 35: { # 'Π'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 2, # 'Λ'
- 38: 1, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 1, # 'έ'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 3, # 'ώ'
- },
- 48: { # 'Ρ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 1, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 37: { # 'Σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 1, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 2, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 2, # 'Υ'
- 56: 0, # 'Φ'
- 50: 2, # 'Χ'
- 57: 2, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 2, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 2, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 33: { # 'Τ'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 2, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 2, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 1, # 'Τ'
- 45: 1, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 2, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 2, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 45: { # 'Υ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 2, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 2, # 'Η'
- 52: 2, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 2, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 2, # 'Π'
- 48: 1, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 56: { # 'Φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 1, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 2, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 1, # 'ύ'
- 27: 1, # 'ώ'
- },
- 50: { # 'Χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 1, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 2, # 'Ε'
- 40: 2, # 'Η'
- 52: 0, # 'Θ'
- 47: 2, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 1, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 1, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 1, # 'Χ'
- 57: 1, # 'Ω'
- 17: 2, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 2, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 57: { # 'Ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 1, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 1, # 'Λ'
- 38: 0, # 'Μ'
- 49: 2, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 2, # 'Ρ'
- 37: 2, # 'Σ'
- 33: 2, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 2, # 'ρ'
- 14: 2, # 'ς'
- 7: 2, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 17: { # 'ά'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 18: { # 'έ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 3, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 22: { # 'ή'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 1, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 15: { # 'ί'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 3, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 1, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 1: { # 'α'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 3, # 'ζ'
- 13: 1, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 0, # 'ώ'
- },
- 29: { # 'β'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 2, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 20: { # 'γ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 21: { # 'δ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 3: { # 'ε'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 32: { # 'ζ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 2, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 2, # 'ώ'
- },
- 13: { # 'η'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 25: { # 'θ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 5: { # 'ι'
- 60: 0, # 'e'
- 55: 1, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 0, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 0, # 'ύ'
- 27: 3, # 'ώ'
- },
- 11: { # 'κ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 16: { # 'λ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 1, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 3, # 'λ'
- 10: 2, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 10: { # 'μ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 1, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 2, # 'υ'
- 28: 3, # 'φ'
- 23: 0, # 'χ'
- 42: 2, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 6: { # 'ν'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 1, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 30: { # 'ξ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 2, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 2, # 'ό'
- 26: 3, # 'ύ'
- 27: 1, # 'ώ'
- },
- 4: { # 'ο'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 2, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 1, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 9: { # 'π'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 3, # 'λ'
- 10: 0, # 'μ'
- 6: 2, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 2, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 3, # 'ώ'
- },
- 8: { # 'ρ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 1, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 2, # 'π'
- 8: 2, # 'ρ'
- 14: 0, # 'ς'
- 7: 2, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 14: { # 'ς'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 2, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 0, # 'θ'
- 5: 0, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 0, # 'τ'
- 12: 0, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 7: { # 'σ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 3, # 'β'
- 20: 0, # 'γ'
- 21: 2, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 3, # 'θ'
- 5: 3, # 'ι'
- 11: 3, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 3, # 'φ'
- 23: 3, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 2, # 'ώ'
- },
- 2: { # 'τ'
- 60: 0, # 'e'
- 55: 2, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 2, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 3, # 'ι'
- 11: 2, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 2, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 12: { # 'υ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 2, # 'ί'
- 1: 3, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 2, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 3, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 2, # 'ό'
- 26: 0, # 'ύ'
- 27: 2, # 'ώ'
- },
- 28: { # 'φ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 3, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 0, # 'μ'
- 6: 1, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 1, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 2, # 'ύ'
- 27: 2, # 'ώ'
- },
- 23: { # 'χ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 3, # 'ά'
- 18: 2, # 'έ'
- 22: 3, # 'ή'
- 15: 3, # 'ί'
- 1: 3, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 3, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 2, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 3, # 'ο'
- 9: 0, # 'π'
- 8: 3, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 3, # 'τ'
- 12: 3, # 'υ'
- 28: 0, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 3, # 'ω'
- 19: 3, # 'ό'
- 26: 3, # 'ύ'
- 27: 3, # 'ώ'
- },
- 42: { # 'ψ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 2, # 'ά'
- 18: 2, # 'έ'
- 22: 1, # 'ή'
- 15: 2, # 'ί'
- 1: 2, # 'α'
- 29: 0, # 'β'
- 20: 0, # 'γ'
- 21: 0, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 3, # 'η'
- 25: 0, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 0, # 'λ'
- 10: 0, # 'μ'
- 6: 0, # 'ν'
- 30: 0, # 'ξ'
- 4: 2, # 'ο'
- 9: 0, # 'π'
- 8: 0, # 'ρ'
- 14: 0, # 'ς'
- 7: 0, # 'σ'
- 2: 2, # 'τ'
- 12: 1, # 'υ'
- 28: 0, # 'φ'
- 23: 0, # 'χ'
- 42: 0, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 24: { # 'ω'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 1, # 'ά'
- 18: 0, # 'έ'
- 22: 2, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 2, # 'β'
- 20: 3, # 'γ'
- 21: 2, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 0, # 'η'
- 25: 3, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 0, # 'ξ'
- 4: 0, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 19: { # 'ό'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 3, # 'β'
- 20: 3, # 'γ'
- 21: 3, # 'δ'
- 3: 1, # 'ε'
- 32: 2, # 'ζ'
- 13: 2, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 2, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 3, # 'χ'
- 42: 2, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 26: { # 'ύ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 2, # 'α'
- 29: 2, # 'β'
- 20: 2, # 'γ'
- 21: 1, # 'δ'
- 3: 3, # 'ε'
- 32: 0, # 'ζ'
- 13: 2, # 'η'
- 25: 3, # 'θ'
- 5: 0, # 'ι'
- 11: 3, # 'κ'
- 16: 3, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 2, # 'ξ'
- 4: 3, # 'ο'
- 9: 3, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 2, # 'φ'
- 23: 2, # 'χ'
- 42: 2, # 'ψ'
- 24: 2, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
- 27: { # 'ώ'
- 60: 0, # 'e'
- 55: 0, # 'o'
- 58: 0, # 't'
- 36: 0, # '·'
- 61: 0, # 'Ά'
- 46: 0, # 'Έ'
- 54: 0, # 'Ό'
- 31: 0, # 'Α'
- 51: 0, # 'Β'
- 43: 0, # 'Γ'
- 41: 0, # 'Δ'
- 34: 0, # 'Ε'
- 40: 0, # 'Η'
- 52: 0, # 'Θ'
- 47: 0, # 'Ι'
- 44: 0, # 'Κ'
- 53: 0, # 'Λ'
- 38: 0, # 'Μ'
- 49: 0, # 'Ν'
- 59: 0, # 'Ξ'
- 39: 0, # 'Ο'
- 35: 0, # 'Π'
- 48: 0, # 'Ρ'
- 37: 0, # 'Σ'
- 33: 0, # 'Τ'
- 45: 0, # 'Υ'
- 56: 0, # 'Φ'
- 50: 0, # 'Χ'
- 57: 0, # 'Ω'
- 17: 0, # 'ά'
- 18: 0, # 'έ'
- 22: 0, # 'ή'
- 15: 0, # 'ί'
- 1: 0, # 'α'
- 29: 1, # 'β'
- 20: 0, # 'γ'
- 21: 3, # 'δ'
- 3: 0, # 'ε'
- 32: 0, # 'ζ'
- 13: 1, # 'η'
- 25: 2, # 'θ'
- 5: 2, # 'ι'
- 11: 0, # 'κ'
- 16: 2, # 'λ'
- 10: 3, # 'μ'
- 6: 3, # 'ν'
- 30: 1, # 'ξ'
- 4: 0, # 'ο'
- 9: 2, # 'π'
- 8: 3, # 'ρ'
- 14: 3, # 'ς'
- 7: 3, # 'σ'
- 2: 3, # 'τ'
- 12: 0, # 'υ'
- 28: 1, # 'φ'
- 23: 1, # 'χ'
- 42: 0, # 'ψ'
- 24: 0, # 'ω'
- 19: 0, # 'ό'
- 26: 0, # 'ύ'
- 27: 0, # 'ώ'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1253_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '€'
- 129: 255, # None
- 130: 255, # '‚'
- 131: 255, # 'ƒ'
- 132: 255, # '„'
- 133: 255, # '…'
- 134: 255, # '†'
- 135: 255, # '‡'
- 136: 255, # None
- 137: 255, # '‰'
- 138: 255, # None
- 139: 255, # '‹'
- 140: 255, # None
- 141: 255, # None
- 142: 255, # None
- 143: 255, # None
- 144: 255, # None
- 145: 255, # '‘'
- 146: 255, # '’'
- 147: 255, # '“'
- 148: 255, # '”'
- 149: 255, # '•'
- 150: 255, # '–'
- 151: 255, # '—'
- 152: 255, # None
- 153: 255, # '™'
- 154: 255, # None
- 155: 255, # '›'
- 156: 255, # None
- 157: 255, # None
- 158: 255, # None
- 159: 255, # None
- 160: 253, # '\xa0'
- 161: 233, # '΅'
- 162: 61, # 'Ά'
- 163: 253, # '£'
- 164: 253, # '¤'
- 165: 253, # '¥'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # None
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # '®'
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 253, # 'µ'
- 182: 253, # '¶'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'Ύ'
- 191: 123, # 'Ώ'
- 192: 110, # 'ΐ'
- 193: 31, # 'Α'
- 194: 51, # 'Β'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Ν'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Π'
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Υ'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'έ'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'π'
- 241: 8, # 'ρ'
- 242: 14, # 'ς'
- 243: 7, # 'σ'
- 244: 2, # 'τ'
- 245: 12, # 'υ'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ϊ'
- 251: 75, # 'ϋ'
- 252: 19, # 'ό'
- 253: 26, # 'ύ'
- 254: 27, # 'ώ'
- 255: 253, # None
-}
-
-WINDOWS_1253_GREEK_MODEL = SingleByteCharSetModel(
- charset_name="windows-1253",
- language="Greek",
- char_to_order_map=WINDOWS_1253_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ",
-)
-
-ISO_8859_7_GREEK_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 82, # 'A'
- 66: 100, # 'B'
- 67: 104, # 'C'
- 68: 94, # 'D'
- 69: 98, # 'E'
- 70: 101, # 'F'
- 71: 116, # 'G'
- 72: 102, # 'H'
- 73: 111, # 'I'
- 74: 187, # 'J'
- 75: 117, # 'K'
- 76: 92, # 'L'
- 77: 88, # 'M'
- 78: 113, # 'N'
- 79: 85, # 'O'
- 80: 79, # 'P'
- 81: 118, # 'Q'
- 82: 105, # 'R'
- 83: 83, # 'S'
- 84: 67, # 'T'
- 85: 114, # 'U'
- 86: 119, # 'V'
- 87: 95, # 'W'
- 88: 99, # 'X'
- 89: 109, # 'Y'
- 90: 188, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 72, # 'a'
- 98: 70, # 'b'
- 99: 80, # 'c'
- 100: 81, # 'd'
- 101: 60, # 'e'
- 102: 96, # 'f'
- 103: 93, # 'g'
- 104: 89, # 'h'
- 105: 68, # 'i'
- 106: 120, # 'j'
- 107: 97, # 'k'
- 108: 77, # 'l'
- 109: 86, # 'm'
- 110: 69, # 'n'
- 111: 55, # 'o'
- 112: 78, # 'p'
- 113: 115, # 'q'
- 114: 65, # 'r'
- 115: 66, # 's'
- 116: 58, # 't'
- 117: 76, # 'u'
- 118: 106, # 'v'
- 119: 103, # 'w'
- 120: 87, # 'x'
- 121: 107, # 'y'
- 122: 112, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 255, # '\x80'
- 129: 255, # '\x81'
- 130: 255, # '\x82'
- 131: 255, # '\x83'
- 132: 255, # '\x84'
- 133: 255, # '\x85'
- 134: 255, # '\x86'
- 135: 255, # '\x87'
- 136: 255, # '\x88'
- 137: 255, # '\x89'
- 138: 255, # '\x8a'
- 139: 255, # '\x8b'
- 140: 255, # '\x8c'
- 141: 255, # '\x8d'
- 142: 255, # '\x8e'
- 143: 255, # '\x8f'
- 144: 255, # '\x90'
- 145: 255, # '\x91'
- 146: 255, # '\x92'
- 147: 255, # '\x93'
- 148: 255, # '\x94'
- 149: 255, # '\x95'
- 150: 255, # '\x96'
- 151: 255, # '\x97'
- 152: 255, # '\x98'
- 153: 255, # '\x99'
- 154: 255, # '\x9a'
- 155: 255, # '\x9b'
- 156: 255, # '\x9c'
- 157: 255, # '\x9d'
- 158: 255, # '\x9e'
- 159: 255, # '\x9f'
- 160: 253, # '\xa0'
- 161: 233, # '‘'
- 162: 90, # '’'
- 163: 253, # '£'
- 164: 253, # '€'
- 165: 253, # '₯'
- 166: 253, # '¦'
- 167: 253, # '§'
- 168: 253, # '¨'
- 169: 253, # '©'
- 170: 253, # 'ͺ'
- 171: 253, # '«'
- 172: 253, # '¬'
- 173: 74, # '\xad'
- 174: 253, # None
- 175: 253, # '―'
- 176: 253, # '°'
- 177: 253, # '±'
- 178: 253, # '²'
- 179: 253, # '³'
- 180: 247, # '΄'
- 181: 248, # '΅'
- 182: 61, # 'Ά'
- 183: 36, # '·'
- 184: 46, # 'Έ'
- 185: 71, # 'Ή'
- 186: 73, # 'Ί'
- 187: 253, # '»'
- 188: 54, # 'Ό'
- 189: 253, # '½'
- 190: 108, # 'Ύ'
- 191: 123, # 'Ώ'
- 192: 110, # 'ΐ'
- 193: 31, # 'Α'
- 194: 51, # 'Β'
- 195: 43, # 'Γ'
- 196: 41, # 'Δ'
- 197: 34, # 'Ε'
- 198: 91, # 'Ζ'
- 199: 40, # 'Η'
- 200: 52, # 'Θ'
- 201: 47, # 'Ι'
- 202: 44, # 'Κ'
- 203: 53, # 'Λ'
- 204: 38, # 'Μ'
- 205: 49, # 'Ν'
- 206: 59, # 'Ξ'
- 207: 39, # 'Ο'
- 208: 35, # 'Π'
- 209: 48, # 'Ρ'
- 210: 250, # None
- 211: 37, # 'Σ'
- 212: 33, # 'Τ'
- 213: 45, # 'Υ'
- 214: 56, # 'Φ'
- 215: 50, # 'Χ'
- 216: 84, # 'Ψ'
- 217: 57, # 'Ω'
- 218: 120, # 'Ϊ'
- 219: 121, # 'Ϋ'
- 220: 17, # 'ά'
- 221: 18, # 'έ'
- 222: 22, # 'ή'
- 223: 15, # 'ί'
- 224: 124, # 'ΰ'
- 225: 1, # 'α'
- 226: 29, # 'β'
- 227: 20, # 'γ'
- 228: 21, # 'δ'
- 229: 3, # 'ε'
- 230: 32, # 'ζ'
- 231: 13, # 'η'
- 232: 25, # 'θ'
- 233: 5, # 'ι'
- 234: 11, # 'κ'
- 235: 16, # 'λ'
- 236: 10, # 'μ'
- 237: 6, # 'ν'
- 238: 30, # 'ξ'
- 239: 4, # 'ο'
- 240: 9, # 'π'
- 241: 8, # 'ρ'
- 242: 14, # 'ς'
- 243: 7, # 'σ'
- 244: 2, # 'τ'
- 245: 12, # 'υ'
- 246: 28, # 'φ'
- 247: 23, # 'χ'
- 248: 42, # 'ψ'
- 249: 24, # 'ω'
- 250: 64, # 'ϊ'
- 251: 75, # 'ϋ'
- 252: 19, # 'ό'
- 253: 26, # 'ύ'
- 254: 27, # 'ώ'
- 255: 253, # None
-}
-
-ISO_8859_7_GREEK_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-7",
- language="Greek",
- char_to_order_map=ISO_8859_7_GREEK_CHAR_TO_ORDER,
- language_model=GREEK_LANG_MODEL,
- typical_positive_ratio=0.982851,
- keep_ascii_letters=False,
- alphabet="ΆΈΉΊΌΎΏΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩάέήίαβγδεζηθικλμνξοπρςστυφχψωόύώ",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py
deleted file mode 100644
index 56d29758..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HEBREW_LANG_MODEL = {
- 50: { # 'a'
- 50: 0, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 0, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 60: { # 'c'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 61: { # 'd'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 42: { # 'e'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 2, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 2, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 1, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 53: { # 'i'
- 50: 1, # 'a'
- 60: 2, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 0, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 56: { # 'l'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 2, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 54: { # 'n'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 49: { # 'o'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 2, # 'n'
- 49: 1, # 'o'
- 51: 2, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 51: { # 'r'
- 50: 2, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 2, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 43: { # 's'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 2, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 44: { # 't'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 0, # 'd'
- 42: 2, # 'e'
- 53: 2, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 2, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 63: { # 'u'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 34: { # '\xa0'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 2, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 55: { # '´'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 1, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 2, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 48: { # '¼'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 39: { # '½'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 57: { # '¾'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 30: { # 'ְ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 2, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 0, # 'ף'
- 18: 2, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 59: { # 'ֱ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 1, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 41: { # 'ֲ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 0, # 'ם'
- 6: 2, # 'מ'
- 23: 0, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 33: { # 'ִ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 2, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 37: { # 'ֵ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 1, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 36: { # 'ֶ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 1, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 2, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 31: { # 'ַ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 29: { # 'ָ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 2, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 35: { # 'ֹ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 2, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 2, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 62: { # 'ֻ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 1, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 28: { # 'ּ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 3, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 3, # 'ַ'
- 29: 3, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 2, # 'ׁ'
- 45: 1, # 'ׂ'
- 9: 2, # 'א'
- 8: 2, # 'ב'
- 20: 1, # 'ג'
- 16: 2, # 'ד'
- 3: 1, # 'ה'
- 2: 2, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 2, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 2, # 'ל'
- 11: 1, # 'ם'
- 6: 2, # 'מ'
- 23: 1, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 2, # 'ר'
- 10: 2, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 38: { # 'ׁ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 2, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 45: { # 'ׂ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 2, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 9: { # 'א'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 2, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 8: { # 'ב'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 1, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 20: { # 'ג'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 16: { # 'ד'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 3: { # 'ה'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 3, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 0, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 2: { # 'ו'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 3, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 24: { # 'ז'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 2, # 'ב'
- 20: 2, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 2, # 'ח'
- 22: 1, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 2, # 'נ'
- 19: 1, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 2, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 14: { # 'ח'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 2, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 1, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 22: { # 'ט'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 1, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 2, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 1: { # 'י'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 25: { # 'ך'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 2, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 1, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 15: { # 'כ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 3, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 4: { # 'ל'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 3, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 11: { # 'ם'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 1, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 6: { # 'מ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 0, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 23: { # 'ן'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 1, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 1, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 12: { # 'נ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 19: { # 'ס'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 2, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 3, # 'ף'
- 18: 3, # 'פ'
- 27: 0, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 1, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 13: { # 'ע'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 1, # 'ֱ'
- 41: 2, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 1, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 2, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 2, # 'ע'
- 26: 1, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 26: { # 'ף'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 1, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 18: { # 'פ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 2, # 'ב'
- 20: 3, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 2, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 2, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 27: { # 'ץ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 21: { # 'צ'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 1, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 1, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 0, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 17: { # 'ק'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 1, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 2, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 1, # 'ך'
- 15: 1, # 'כ'
- 4: 3, # 'ל'
- 11: 2, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 2, # 'ץ'
- 21: 3, # 'צ'
- 17: 2, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 7: { # 'ר'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 2, # '´'
- 48: 1, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 1, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 2, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 3, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 3, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 3, # 'ץ'
- 21: 3, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 10: { # 'ש'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 1, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 1, # 'ִ'
- 37: 1, # 'ֵ'
- 36: 1, # 'ֶ'
- 31: 1, # 'ַ'
- 29: 1, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 3, # 'ׁ'
- 45: 2, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 3, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 3, # 'ט'
- 1: 3, # 'י'
- 25: 3, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 2, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 1, # '…'
- },
- 5: { # 'ת'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 1, # '\xa0'
- 55: 0, # '´'
- 48: 1, # '¼'
- 39: 1, # '½'
- 57: 0, # '¾'
- 30: 2, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 2, # 'ִ'
- 37: 2, # 'ֵ'
- 36: 2, # 'ֶ'
- 31: 2, # 'ַ'
- 29: 2, # 'ָ'
- 35: 1, # 'ֹ'
- 62: 1, # 'ֻ'
- 28: 2, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 3, # 'א'
- 8: 3, # 'ב'
- 20: 3, # 'ג'
- 16: 2, # 'ד'
- 3: 3, # 'ה'
- 2: 3, # 'ו'
- 24: 2, # 'ז'
- 14: 3, # 'ח'
- 22: 2, # 'ט'
- 1: 3, # 'י'
- 25: 2, # 'ך'
- 15: 3, # 'כ'
- 4: 3, # 'ל'
- 11: 3, # 'ם'
- 6: 3, # 'מ'
- 23: 3, # 'ן'
- 12: 3, # 'נ'
- 19: 2, # 'ס'
- 13: 3, # 'ע'
- 26: 2, # 'ף'
- 18: 3, # 'פ'
- 27: 1, # 'ץ'
- 21: 2, # 'צ'
- 17: 3, # 'ק'
- 7: 3, # 'ר'
- 10: 3, # 'ש'
- 5: 3, # 'ת'
- 32: 1, # '–'
- 52: 1, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
- 32: { # '–'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 1, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 52: { # '’'
- 50: 1, # 'a'
- 60: 0, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 2, # 's'
- 44: 2, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 1, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 47: { # '“'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 1, # 'l'
- 54: 1, # 'n'
- 49: 1, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 1, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 2, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 1, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 1, # 'ח'
- 22: 1, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 1, # 'ס'
- 13: 1, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 1, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 46: { # '”'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 1, # 'ב'
- 20: 1, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 1, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 0, # '†'
- 40: 0, # '…'
- },
- 58: { # '†'
- 50: 0, # 'a'
- 60: 0, # 'c'
- 61: 0, # 'd'
- 42: 0, # 'e'
- 53: 0, # 'i'
- 56: 0, # 'l'
- 54: 0, # 'n'
- 49: 0, # 'o'
- 51: 0, # 'r'
- 43: 0, # 's'
- 44: 0, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 0, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 0, # 'ה'
- 2: 0, # 'ו'
- 24: 0, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 0, # 'י'
- 25: 0, # 'ך'
- 15: 0, # 'כ'
- 4: 0, # 'ל'
- 11: 0, # 'ם'
- 6: 0, # 'מ'
- 23: 0, # 'ן'
- 12: 0, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 0, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 0, # 'ר'
- 10: 0, # 'ש'
- 5: 0, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 0, # '”'
- 58: 2, # '†'
- 40: 0, # '…'
- },
- 40: { # '…'
- 50: 1, # 'a'
- 60: 1, # 'c'
- 61: 1, # 'd'
- 42: 1, # 'e'
- 53: 1, # 'i'
- 56: 0, # 'l'
- 54: 1, # 'n'
- 49: 0, # 'o'
- 51: 1, # 'r'
- 43: 1, # 's'
- 44: 1, # 't'
- 63: 0, # 'u'
- 34: 0, # '\xa0'
- 55: 0, # '´'
- 48: 0, # '¼'
- 39: 0, # '½'
- 57: 0, # '¾'
- 30: 0, # 'ְ'
- 59: 0, # 'ֱ'
- 41: 0, # 'ֲ'
- 33: 0, # 'ִ'
- 37: 0, # 'ֵ'
- 36: 0, # 'ֶ'
- 31: 0, # 'ַ'
- 29: 0, # 'ָ'
- 35: 0, # 'ֹ'
- 62: 0, # 'ֻ'
- 28: 0, # 'ּ'
- 38: 0, # 'ׁ'
- 45: 0, # 'ׂ'
- 9: 1, # 'א'
- 8: 0, # 'ב'
- 20: 0, # 'ג'
- 16: 0, # 'ד'
- 3: 1, # 'ה'
- 2: 1, # 'ו'
- 24: 1, # 'ז'
- 14: 0, # 'ח'
- 22: 0, # 'ט'
- 1: 1, # 'י'
- 25: 0, # 'ך'
- 15: 1, # 'כ'
- 4: 1, # 'ל'
- 11: 0, # 'ם'
- 6: 1, # 'מ'
- 23: 0, # 'ן'
- 12: 1, # 'נ'
- 19: 0, # 'ס'
- 13: 0, # 'ע'
- 26: 0, # 'ף'
- 18: 1, # 'פ'
- 27: 0, # 'ץ'
- 21: 0, # 'צ'
- 17: 0, # 'ק'
- 7: 1, # 'ר'
- 10: 1, # 'ש'
- 5: 1, # 'ת'
- 32: 0, # '–'
- 52: 0, # '’'
- 47: 0, # '“'
- 46: 1, # '”'
- 58: 0, # '†'
- 40: 2, # '…'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1255_HEBREW_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 69, # 'A'
- 66: 91, # 'B'
- 67: 79, # 'C'
- 68: 80, # 'D'
- 69: 92, # 'E'
- 70: 89, # 'F'
- 71: 97, # 'G'
- 72: 90, # 'H'
- 73: 68, # 'I'
- 74: 111, # 'J'
- 75: 112, # 'K'
- 76: 82, # 'L'
- 77: 73, # 'M'
- 78: 95, # 'N'
- 79: 85, # 'O'
- 80: 78, # 'P'
- 81: 121, # 'Q'
- 82: 86, # 'R'
- 83: 71, # 'S'
- 84: 67, # 'T'
- 85: 102, # 'U'
- 86: 107, # 'V'
- 87: 84, # 'W'
- 88: 114, # 'X'
- 89: 103, # 'Y'
- 90: 115, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 50, # 'a'
- 98: 74, # 'b'
- 99: 60, # 'c'
- 100: 61, # 'd'
- 101: 42, # 'e'
- 102: 76, # 'f'
- 103: 70, # 'g'
- 104: 64, # 'h'
- 105: 53, # 'i'
- 106: 105, # 'j'
- 107: 93, # 'k'
- 108: 56, # 'l'
- 109: 65, # 'm'
- 110: 54, # 'n'
- 111: 49, # 'o'
- 112: 66, # 'p'
- 113: 110, # 'q'
- 114: 51, # 'r'
- 115: 43, # 's'
- 116: 44, # 't'
- 117: 63, # 'u'
- 118: 81, # 'v'
- 119: 77, # 'w'
- 120: 98, # 'x'
- 121: 75, # 'y'
- 122: 108, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 124, # '€'
- 129: 202, # None
- 130: 203, # '‚'
- 131: 204, # 'ƒ'
- 132: 205, # '„'
- 133: 40, # '…'
- 134: 58, # '†'
- 135: 206, # '‡'
- 136: 207, # 'ˆ'
- 137: 208, # '‰'
- 138: 209, # None
- 139: 210, # '‹'
- 140: 211, # None
- 141: 212, # None
- 142: 213, # None
- 143: 214, # None
- 144: 215, # None
- 145: 83, # '‘'
- 146: 52, # '’'
- 147: 47, # '“'
- 148: 46, # '”'
- 149: 72, # '•'
- 150: 32, # '–'
- 151: 94, # '—'
- 152: 216, # '˜'
- 153: 113, # '™'
- 154: 217, # None
- 155: 109, # '›'
- 156: 218, # None
- 157: 219, # None
- 158: 220, # None
- 159: 221, # None
- 160: 34, # '\xa0'
- 161: 116, # '¡'
- 162: 222, # '¢'
- 163: 118, # '£'
- 164: 100, # '₪'
- 165: 223, # '¥'
- 166: 224, # '¦'
- 167: 117, # '§'
- 168: 119, # '¨'
- 169: 104, # '©'
- 170: 125, # '×'
- 171: 225, # '«'
- 172: 226, # '¬'
- 173: 87, # '\xad'
- 174: 99, # '®'
- 175: 227, # '¯'
- 176: 106, # '°'
- 177: 122, # '±'
- 178: 123, # '²'
- 179: 228, # '³'
- 180: 55, # '´'
- 181: 229, # 'µ'
- 182: 230, # '¶'
- 183: 101, # '·'
- 184: 231, # '¸'
- 185: 232, # '¹'
- 186: 120, # '÷'
- 187: 233, # '»'
- 188: 48, # '¼'
- 189: 39, # '½'
- 190: 57, # '¾'
- 191: 234, # '¿'
- 192: 30, # 'ְ'
- 193: 59, # 'ֱ'
- 194: 41, # 'ֲ'
- 195: 88, # 'ֳ'
- 196: 33, # 'ִ'
- 197: 37, # 'ֵ'
- 198: 36, # 'ֶ'
- 199: 31, # 'ַ'
- 200: 29, # 'ָ'
- 201: 35, # 'ֹ'
- 202: 235, # None
- 203: 62, # 'ֻ'
- 204: 28, # 'ּ'
- 205: 236, # 'ֽ'
- 206: 126, # '־'
- 207: 237, # 'ֿ'
- 208: 238, # '׀'
- 209: 38, # 'ׁ'
- 210: 45, # 'ׂ'
- 211: 239, # '׃'
- 212: 240, # 'װ'
- 213: 241, # 'ױ'
- 214: 242, # 'ײ'
- 215: 243, # '׳'
- 216: 127, # '״'
- 217: 244, # None
- 218: 245, # None
- 219: 246, # None
- 220: 247, # None
- 221: 248, # None
- 222: 249, # None
- 223: 250, # None
- 224: 9, # 'א'
- 225: 8, # 'ב'
- 226: 20, # 'ג'
- 227: 16, # 'ד'
- 228: 3, # 'ה'
- 229: 2, # 'ו'
- 230: 24, # 'ז'
- 231: 14, # 'ח'
- 232: 22, # 'ט'
- 233: 1, # 'י'
- 234: 25, # 'ך'
- 235: 15, # 'כ'
- 236: 4, # 'ל'
- 237: 11, # 'ם'
- 238: 6, # 'מ'
- 239: 23, # 'ן'
- 240: 12, # 'נ'
- 241: 19, # 'ס'
- 242: 13, # 'ע'
- 243: 26, # 'ף'
- 244: 18, # 'פ'
- 245: 27, # 'ץ'
- 246: 21, # 'צ'
- 247: 17, # 'ק'
- 248: 7, # 'ר'
- 249: 10, # 'ש'
- 250: 5, # 'ת'
- 251: 251, # None
- 252: 252, # None
- 253: 128, # '\u200e'
- 254: 96, # '\u200f'
- 255: 253, # None
-}
-
-WINDOWS_1255_HEBREW_MODEL = SingleByteCharSetModel(
- charset_name="windows-1255",
- language="Hebrew",
- char_to_order_map=WINDOWS_1255_HEBREW_CHAR_TO_ORDER,
- language_model=HEBREW_LANG_MODEL,
- typical_positive_ratio=0.984004,
- keep_ascii_letters=False,
- alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py
deleted file mode 100644
index 09a0d326..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py
+++ /dev/null
@@ -1,4649 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-HUNGARIAN_LANG_MODEL = {
- 28: { # 'A'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 2, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 40: { # 'B'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 3, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 54: { # 'C'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 3, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 45: { # 'D'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 32: { # 'E'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 50: { # 'F'
- 28: 1, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 0, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 49: { # 'G'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 38: { # 'H'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 1, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 2, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 39: { # 'I'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 53: { # 'J'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 36: { # 'K'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 2, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 41: { # 'L'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 1, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 34: { # 'M'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 3, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 1, # 'ű'
- },
- 35: { # 'N'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 2, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 2, # 'Y'
- 52: 1, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 47: { # 'O'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 2, # 'K'
- 41: 2, # 'L'
- 34: 2, # 'M'
- 35: 2, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 1, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 1, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 46: { # 'P'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 0, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 0, # 'ű'
- },
- 43: { # 'R'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 2, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 2, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 33: { # 'S'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 3, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 37: { # 'T'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 1, # 'S'
- 37: 2, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 2, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 1, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 2, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 57: { # 'U'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 48: { # 'V'
- 28: 2, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 2, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 2, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 2, # 'o'
- 23: 0, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 2, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 0, # 'Ú'
- 63: 1, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 55: { # 'Y'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 1, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 2, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 0, # 'r'
- 5: 0, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 1, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 52: { # 'Z'
- 28: 2, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 2, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 2, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 2, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 1, # 'U'
- 48: 1, # 'V'
- 55: 1, # 'Y'
- 52: 1, # 'Z'
- 2: 1, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 0, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 2, # 'Á'
- 44: 1, # 'É'
- 61: 1, # 'Í'
- 58: 1, # 'Ó'
- 59: 1, # 'Ö'
- 60: 1, # 'Ú'
- 63: 1, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 2: { # 'a'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 18: { # 'b'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 26: { # 'c'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 1, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 2, # 'é'
- 30: 2, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 17: { # 'd'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 1, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 1: { # 'e'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 2, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 27: { # 'f'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 3, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 2, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 12: { # 'g'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 20: { # 'h'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 3, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 1, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 9: { # 'i'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 2, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 3, # 'ó'
- 24: 1, # 'ö'
- 31: 2, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 1, # 'ű'
- },
- 22: { # 'j'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 1, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 7: { # 'k'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 2, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 1, # 'ú'
- 29: 3, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 6: { # 'l'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 1, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 3, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 3, # 'ő'
- 56: 1, # 'ű'
- },
- 13: { # 'm'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 2, # 'ű'
- },
- 4: { # 'n'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 1, # 'x'
- 16: 3, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 8: { # 'o'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 1, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 23: { # 'p'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 3, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 10: { # 'r'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 2, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 2, # 'ű'
- },
- 5: { # 's'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 2, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 3: { # 't'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 1, # 'g'
- 20: 3, # 'h'
- 9: 3, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 3, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 3, # 'ú'
- 29: 3, # 'ü'
- 42: 3, # 'ő'
- 56: 2, # 'ű'
- },
- 21: { # 'u'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 2, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 3, # 'v'
- 62: 1, # 'x'
- 16: 1, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 2, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 1, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 19: { # 'v'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 2, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 2, # 'ö'
- 31: 1, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 1, # 'ű'
- },
- 62: { # 'x'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 0, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 1, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 1, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 1, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 16: { # 'y'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 3, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 2, # 'j'
- 7: 2, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 2, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 2, # 'í'
- 25: 2, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 2, # 'ü'
- 42: 1, # 'ő'
- 56: 2, # 'ű'
- },
- 11: { # 'z'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 3, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 3, # 'd'
- 1: 3, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 3, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 3, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 3, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 3, # 'á'
- 15: 3, # 'é'
- 30: 3, # 'í'
- 25: 3, # 'ó'
- 24: 3, # 'ö'
- 31: 2, # 'ú'
- 29: 3, # 'ü'
- 42: 2, # 'ő'
- 56: 1, # 'ű'
- },
- 51: { # 'Á'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 1, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 44: { # 'É'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 1, # 'E'
- 50: 0, # 'F'
- 49: 2, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 2, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 2, # 'R'
- 33: 2, # 'S'
- 37: 2, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 3, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 61: { # 'Í'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 0, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 1, # 'm'
- 4: 0, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 0, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 58: { # 'Ó'
- 28: 1, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 1, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 2, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 2, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 0, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 1, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 59: { # 'Ö'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 1, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 1, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 0, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 2, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 60: { # 'Ú'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 1, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 1, # 'F'
- 49: 1, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 0, # 'b'
- 26: 0, # 'c'
- 17: 0, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 2, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 2, # 'j'
- 7: 0, # 'k'
- 6: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 0, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 0, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 63: { # 'Ü'
- 28: 0, # 'A'
- 40: 1, # 'B'
- 54: 0, # 'C'
- 45: 1, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 1, # 'G'
- 38: 1, # 'H'
- 39: 0, # 'I'
- 53: 1, # 'J'
- 36: 1, # 'K'
- 41: 1, # 'L'
- 34: 1, # 'M'
- 35: 1, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 1, # 'R'
- 33: 1, # 'S'
- 37: 1, # 'T'
- 57: 0, # 'U'
- 48: 1, # 'V'
- 55: 0, # 'Y'
- 52: 1, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 0, # 'f'
- 12: 1, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 0, # 'j'
- 7: 0, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 1, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 14: { # 'á'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 3, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 3, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 2, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 1, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 2, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 15: { # 'é'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 3, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 3, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 30: { # 'í'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 0, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 2, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 2, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 25: { # 'ó'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 2, # 'a'
- 18: 3, # 'b'
- 26: 2, # 'c'
- 17: 3, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 2, # 'g'
- 20: 2, # 'h'
- 9: 2, # 'i'
- 22: 2, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 8: 1, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 1, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 1, # 'ö'
- 31: 1, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 24: { # 'ö'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 0, # 'a'
- 18: 3, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 0, # 'e'
- 27: 1, # 'f'
- 12: 2, # 'g'
- 20: 1, # 'h'
- 9: 0, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 2, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 3, # 't'
- 21: 0, # 'u'
- 19: 3, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 3, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 31: { # 'ú'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 2, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 2, # 'f'
- 12: 3, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 3, # 'j'
- 7: 1, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 3, # 'r'
- 5: 3, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 1, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 29: { # 'ü'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 3, # 'g'
- 20: 2, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 3, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 8: 0, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 0, # 'u'
- 19: 2, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 42: { # 'ő'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 2, # 'b'
- 26: 1, # 'c'
- 17: 2, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 2, # 'k'
- 6: 3, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 8: 1, # 'o'
- 23: 1, # 'p'
- 10: 2, # 'r'
- 5: 2, # 's'
- 3: 2, # 't'
- 21: 1, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 1, # 'é'
- 30: 1, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 1, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
- 56: { # 'ű'
- 28: 0, # 'A'
- 40: 0, # 'B'
- 54: 0, # 'C'
- 45: 0, # 'D'
- 32: 0, # 'E'
- 50: 0, # 'F'
- 49: 0, # 'G'
- 38: 0, # 'H'
- 39: 0, # 'I'
- 53: 0, # 'J'
- 36: 0, # 'K'
- 41: 0, # 'L'
- 34: 0, # 'M'
- 35: 0, # 'N'
- 47: 0, # 'O'
- 46: 0, # 'P'
- 43: 0, # 'R'
- 33: 0, # 'S'
- 37: 0, # 'T'
- 57: 0, # 'U'
- 48: 0, # 'V'
- 55: 0, # 'Y'
- 52: 0, # 'Z'
- 2: 1, # 'a'
- 18: 1, # 'b'
- 26: 0, # 'c'
- 17: 1, # 'd'
- 1: 1, # 'e'
- 27: 1, # 'f'
- 12: 1, # 'g'
- 20: 1, # 'h'
- 9: 1, # 'i'
- 22: 1, # 'j'
- 7: 1, # 'k'
- 6: 1, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 8: 0, # 'o'
- 23: 0, # 'p'
- 10: 1, # 'r'
- 5: 1, # 's'
- 3: 1, # 't'
- 21: 0, # 'u'
- 19: 1, # 'v'
- 62: 0, # 'x'
- 16: 0, # 'y'
- 11: 2, # 'z'
- 51: 0, # 'Á'
- 44: 0, # 'É'
- 61: 0, # 'Í'
- 58: 0, # 'Ó'
- 59: 0, # 'Ö'
- 60: 0, # 'Ú'
- 63: 0, # 'Ü'
- 14: 0, # 'á'
- 15: 0, # 'é'
- 30: 0, # 'í'
- 25: 0, # 'ó'
- 24: 0, # 'ö'
- 31: 0, # 'ú'
- 29: 0, # 'ü'
- 42: 0, # 'ő'
- 56: 0, # 'ű'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 72, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 161, # '€'
- 129: 162, # None
- 130: 163, # '‚'
- 131: 164, # None
- 132: 165, # '„'
- 133: 166, # '…'
- 134: 167, # '†'
- 135: 168, # '‡'
- 136: 169, # None
- 137: 170, # '‰'
- 138: 171, # 'Š'
- 139: 172, # '‹'
- 140: 173, # 'Ś'
- 141: 174, # 'Ť'
- 142: 175, # 'Ž'
- 143: 176, # 'Ź'
- 144: 177, # None
- 145: 178, # '‘'
- 146: 179, # '’'
- 147: 180, # '“'
- 148: 78, # '”'
- 149: 181, # '•'
- 150: 69, # '–'
- 151: 182, # '—'
- 152: 183, # None
- 153: 184, # '™'
- 154: 185, # 'š'
- 155: 186, # '›'
- 156: 187, # 'ś'
- 157: 188, # 'ť'
- 158: 189, # 'ž'
- 159: 190, # 'ź'
- 160: 191, # '\xa0'
- 161: 192, # 'ˇ'
- 162: 193, # '˘'
- 163: 194, # 'Ł'
- 164: 195, # '¤'
- 165: 196, # 'Ą'
- 166: 197, # '¦'
- 167: 76, # '§'
- 168: 198, # '¨'
- 169: 199, # '©'
- 170: 200, # 'Ş'
- 171: 201, # '«'
- 172: 202, # '¬'
- 173: 203, # '\xad'
- 174: 204, # '®'
- 175: 205, # 'Ż'
- 176: 81, # '°'
- 177: 206, # '±'
- 178: 207, # '˛'
- 179: 208, # 'ł'
- 180: 209, # '´'
- 181: 210, # 'µ'
- 182: 211, # '¶'
- 183: 212, # '·'
- 184: 213, # '¸'
- 185: 214, # 'ą'
- 186: 215, # 'ş'
- 187: 216, # '»'
- 188: 217, # 'Ľ'
- 189: 218, # '˝'
- 190: 219, # 'ľ'
- 191: 220, # 'ż'
- 192: 221, # 'Ŕ'
- 193: 51, # 'Á'
- 194: 83, # 'Â'
- 195: 222, # 'Ă'
- 196: 80, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Ě'
- 205: 61, # 'Í'
- 206: 230, # 'Î'
- 207: 231, # 'Ď'
- 208: 232, # 'Đ'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Ő'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Ů'
- 218: 60, # 'Ú'
- 219: 70, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ý'
- 222: 240, # 'Ţ'
- 223: 241, # 'ß'
- 224: 84, # 'ŕ'
- 225: 14, # 'á'
- 226: 75, # 'â'
- 227: 242, # 'ă'
- 228: 71, # 'ä'
- 229: 82, # 'ĺ'
- 230: 243, # 'ć'
- 231: 73, # 'ç'
- 232: 244, # 'č'
- 233: 15, # 'é'
- 234: 85, # 'ę'
- 235: 79, # 'ë'
- 236: 86, # 'ě'
- 237: 30, # 'í'
- 238: 77, # 'î'
- 239: 87, # 'ď'
- 240: 245, # 'đ'
- 241: 246, # 'ń'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 74, # 'ô'
- 245: 42, # 'ő'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'ř'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'ţ'
- 255: 253, # '˙'
-}
-
-WINDOWS_1250_HUNGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1250",
- language="Hungarian",
- char_to_order_map=WINDOWS_1250_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű",
-)
-
-ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 28, # 'A'
- 66: 40, # 'B'
- 67: 54, # 'C'
- 68: 45, # 'D'
- 69: 32, # 'E'
- 70: 50, # 'F'
- 71: 49, # 'G'
- 72: 38, # 'H'
- 73: 39, # 'I'
- 74: 53, # 'J'
- 75: 36, # 'K'
- 76: 41, # 'L'
- 77: 34, # 'M'
- 78: 35, # 'N'
- 79: 47, # 'O'
- 80: 46, # 'P'
- 81: 71, # 'Q'
- 82: 43, # 'R'
- 83: 33, # 'S'
- 84: 37, # 'T'
- 85: 57, # 'U'
- 86: 48, # 'V'
- 87: 64, # 'W'
- 88: 68, # 'X'
- 89: 55, # 'Y'
- 90: 52, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 2, # 'a'
- 98: 18, # 'b'
- 99: 26, # 'c'
- 100: 17, # 'd'
- 101: 1, # 'e'
- 102: 27, # 'f'
- 103: 12, # 'g'
- 104: 20, # 'h'
- 105: 9, # 'i'
- 106: 22, # 'j'
- 107: 7, # 'k'
- 108: 6, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 8, # 'o'
- 112: 23, # 'p'
- 113: 67, # 'q'
- 114: 10, # 'r'
- 115: 5, # 's'
- 116: 3, # 't'
- 117: 21, # 'u'
- 118: 19, # 'v'
- 119: 65, # 'w'
- 120: 62, # 'x'
- 121: 16, # 'y'
- 122: 11, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 159, # '\x80'
- 129: 160, # '\x81'
- 130: 161, # '\x82'
- 131: 162, # '\x83'
- 132: 163, # '\x84'
- 133: 164, # '\x85'
- 134: 165, # '\x86'
- 135: 166, # '\x87'
- 136: 167, # '\x88'
- 137: 168, # '\x89'
- 138: 169, # '\x8a'
- 139: 170, # '\x8b'
- 140: 171, # '\x8c'
- 141: 172, # '\x8d'
- 142: 173, # '\x8e'
- 143: 174, # '\x8f'
- 144: 175, # '\x90'
- 145: 176, # '\x91'
- 146: 177, # '\x92'
- 147: 178, # '\x93'
- 148: 179, # '\x94'
- 149: 180, # '\x95'
- 150: 181, # '\x96'
- 151: 182, # '\x97'
- 152: 183, # '\x98'
- 153: 184, # '\x99'
- 154: 185, # '\x9a'
- 155: 186, # '\x9b'
- 156: 187, # '\x9c'
- 157: 188, # '\x9d'
- 158: 189, # '\x9e'
- 159: 190, # '\x9f'
- 160: 191, # '\xa0'
- 161: 192, # 'Ą'
- 162: 193, # '˘'
- 163: 194, # 'Ł'
- 164: 195, # '¤'
- 165: 196, # 'Ľ'
- 166: 197, # 'Ś'
- 167: 75, # '§'
- 168: 198, # '¨'
- 169: 199, # 'Š'
- 170: 200, # 'Ş'
- 171: 201, # 'Ť'
- 172: 202, # 'Ź'
- 173: 203, # '\xad'
- 174: 204, # 'Ž'
- 175: 205, # 'Ż'
- 176: 79, # '°'
- 177: 206, # 'ą'
- 178: 207, # '˛'
- 179: 208, # 'ł'
- 180: 209, # '´'
- 181: 210, # 'ľ'
- 182: 211, # 'ś'
- 183: 212, # 'ˇ'
- 184: 213, # '¸'
- 185: 214, # 'š'
- 186: 215, # 'ş'
- 187: 216, # 'ť'
- 188: 217, # 'ź'
- 189: 218, # '˝'
- 190: 219, # 'ž'
- 191: 220, # 'ż'
- 192: 221, # 'Ŕ'
- 193: 51, # 'Á'
- 194: 81, # 'Â'
- 195: 222, # 'Ă'
- 196: 78, # 'Ä'
- 197: 223, # 'Ĺ'
- 198: 224, # 'Ć'
- 199: 225, # 'Ç'
- 200: 226, # 'Č'
- 201: 44, # 'É'
- 202: 227, # 'Ę'
- 203: 228, # 'Ë'
- 204: 229, # 'Ě'
- 205: 61, # 'Í'
- 206: 230, # 'Î'
- 207: 231, # 'Ď'
- 208: 232, # 'Đ'
- 209: 233, # 'Ń'
- 210: 234, # 'Ň'
- 211: 58, # 'Ó'
- 212: 235, # 'Ô'
- 213: 66, # 'Ő'
- 214: 59, # 'Ö'
- 215: 236, # '×'
- 216: 237, # 'Ř'
- 217: 238, # 'Ů'
- 218: 60, # 'Ú'
- 219: 69, # 'Ű'
- 220: 63, # 'Ü'
- 221: 239, # 'Ý'
- 222: 240, # 'Ţ'
- 223: 241, # 'ß'
- 224: 82, # 'ŕ'
- 225: 14, # 'á'
- 226: 74, # 'â'
- 227: 242, # 'ă'
- 228: 70, # 'ä'
- 229: 80, # 'ĺ'
- 230: 243, # 'ć'
- 231: 72, # 'ç'
- 232: 244, # 'č'
- 233: 15, # 'é'
- 234: 83, # 'ę'
- 235: 77, # 'ë'
- 236: 84, # 'ě'
- 237: 30, # 'í'
- 238: 76, # 'î'
- 239: 85, # 'ď'
- 240: 245, # 'đ'
- 241: 246, # 'ń'
- 242: 247, # 'ň'
- 243: 25, # 'ó'
- 244: 73, # 'ô'
- 245: 42, # 'ő'
- 246: 24, # 'ö'
- 247: 248, # '÷'
- 248: 249, # 'ř'
- 249: 250, # 'ů'
- 250: 31, # 'ú'
- 251: 56, # 'ű'
- 252: 29, # 'ü'
- 253: 251, # 'ý'
- 254: 252, # 'ţ'
- 255: 253, # '˙'
-}
-
-ISO_8859_2_HUNGARIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-2",
- language="Hungarian",
- char_to_order_map=ISO_8859_2_HUNGARIAN_CHAR_TO_ORDER,
- language_model=HUNGARIAN_LANG_MODEL,
- typical_positive_ratio=0.947368,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVZabcdefghijklmnoprstuvzÁÉÍÓÖÚÜáéíóöúüŐőŰű",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py
deleted file mode 100644
index 39a53889..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py
+++ /dev/null
@@ -1,5725 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-RUSSIAN_LANG_MODEL = {
- 37: { # 'А'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 44: { # 'Б'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 33: { # 'В'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 0, # 'ю'
- 16: 1, # 'я'
- },
- 46: { # 'Г'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 41: { # 'Д'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 3, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 48: { # 'Е'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 56: { # 'Ж'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 2, # 'ю'
- 16: 0, # 'я'
- },
- 51: { # 'З'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 1, # 'я'
- },
- 42: { # 'И'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 2, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 60: { # 'Й'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 36: { # 'К'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 49: { # 'Л'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 1, # 'я'
- },
- 38: { # 'М'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 1, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 31: { # 'Н'
- 37: 2, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 34: { # 'О'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 2, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 1, # 'З'
- 42: 1, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 2, # 'Л'
- 38: 1, # 'М'
- 31: 2, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 1, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 35: { # 'П'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 2, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 1, # 'с'
- 6: 1, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 2, # 'я'
- },
- 45: { # 'Р'
- 37: 2, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 2, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 2, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 32: { # 'С'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 2, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 2, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 40: { # 'Т'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 2, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 1, # 'Ь'
- 47: 1, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 52: { # 'У'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 1, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 1, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 53: { # 'Ф'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 1, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 55: { # 'Х'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 2, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 0, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 58: { # 'Ц'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 1, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 50: { # 'Ч'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 1, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 57: { # 'Ш'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 1, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 63: { # 'Щ'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 1, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 62: { # 'Ы'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 1, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 61: { # 'Ь'
- 37: 0, # 'А'
- 44: 1, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 1, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 1, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 47: { # 'Э'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 1, # 'Й'
- 36: 1, # 'К'
- 49: 1, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 1, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 59: { # 'Ю'
- 37: 1, # 'А'
- 44: 1, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 1, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 0, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 43: { # 'Я'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 1, # 'В'
- 46: 1, # 'Г'
- 41: 0, # 'Д'
- 48: 1, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 1, # 'С'
- 40: 1, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 1, # 'Х'
- 58: 0, # 'Ц'
- 50: 1, # 'Ч'
- 57: 0, # 'Ш'
- 63: 1, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 1, # 'Ю'
- 43: 1, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 0, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 1, # 'й'
- 11: 1, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 1, # 'п'
- 9: 1, # 'р'
- 7: 1, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 3: { # 'а'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 1, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 21: { # 'б'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 1, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 10: { # 'в'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 19: { # 'г'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 13: { # 'д'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 3, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 2: { # 'е'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 24: { # 'ж'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 1, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 20: { # 'з'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 4: { # 'и'
- 37: 1, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 23: { # 'й'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 1, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 11: { # 'к'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 1, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 8: { # 'л'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 1, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 12: { # 'м'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 5: { # 'н'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 3, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 1, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 1: { # 'о'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 3, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 15: { # 'п'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 3, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 0, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 1, # 'ш'
- 29: 1, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 2, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 3, # 'я'
- },
- 9: { # 'р'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 7: { # 'с'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 1, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 2, # 'ш'
- 29: 1, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 6: { # 'т'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 2, # 'щ'
- 54: 2, # 'ъ'
- 18: 3, # 'ы'
- 17: 3, # 'ь'
- 30: 2, # 'э'
- 27: 2, # 'ю'
- 16: 3, # 'я'
- },
- 14: { # 'у'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 3, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 2, # 'э'
- 27: 3, # 'ю'
- 16: 2, # 'я'
- },
- 39: { # 'ф'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 0, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 2, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 2, # 'ы'
- 17: 1, # 'ь'
- 30: 2, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 26: { # 'х'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 3, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 1, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 1, # 'п'
- 9: 3, # 'р'
- 7: 2, # 'с'
- 6: 2, # 'т'
- 14: 2, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 1, # 'ъ'
- 18: 0, # 'ы'
- 17: 1, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 28: { # 'ц'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 1, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 2, # 'к'
- 8: 1, # 'л'
- 12: 1, # 'м'
- 5: 1, # 'н'
- 1: 3, # 'о'
- 15: 0, # 'п'
- 9: 1, # 'р'
- 7: 0, # 'с'
- 6: 1, # 'т'
- 14: 3, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 1, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 3, # 'ы'
- 17: 1, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 22: { # 'ч'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 2, # 'л'
- 12: 1, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 3, # 'т'
- 14: 3, # 'у'
- 39: 1, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 1, # 'ч'
- 25: 2, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 3, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 25: { # 'ш'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 1, # 'б'
- 10: 2, # 'в'
- 19: 1, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 2, # 'м'
- 5: 3, # 'н'
- 1: 3, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 1, # 'с'
- 6: 2, # 'т'
- 14: 3, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 1, # 'ц'
- 22: 1, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 3, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 0, # 'я'
- },
- 29: { # 'щ'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 3, # 'а'
- 21: 0, # 'б'
- 10: 1, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 3, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 3, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 1, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 0, # 'п'
- 9: 2, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 2, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 2, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 0, # 'я'
- },
- 54: { # 'ъ'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 0, # 'б'
- 10: 0, # 'в'
- 19: 0, # 'г'
- 13: 0, # 'д'
- 2: 2, # 'е'
- 24: 0, # 'ж'
- 20: 0, # 'з'
- 4: 0, # 'и'
- 23: 0, # 'й'
- 11: 0, # 'к'
- 8: 0, # 'л'
- 12: 0, # 'м'
- 5: 0, # 'н'
- 1: 0, # 'о'
- 15: 0, # 'п'
- 9: 0, # 'р'
- 7: 0, # 'с'
- 6: 0, # 'т'
- 14: 0, # 'у'
- 39: 0, # 'ф'
- 26: 0, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 0, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 1, # 'ю'
- 16: 2, # 'я'
- },
- 18: { # 'ы'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 3, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 2, # 'и'
- 23: 3, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 1, # 'о'
- 15: 3, # 'п'
- 9: 3, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 0, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 3, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 0, # 'ю'
- 16: 2, # 'я'
- },
- 17: { # 'ь'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 2, # 'в'
- 19: 2, # 'г'
- 13: 2, # 'д'
- 2: 3, # 'е'
- 24: 1, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 0, # 'й'
- 11: 3, # 'к'
- 8: 0, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 2, # 'о'
- 15: 2, # 'п'
- 9: 1, # 'р'
- 7: 3, # 'с'
- 6: 2, # 'т'
- 14: 0, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 3, # 'ш'
- 29: 2, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 3, # 'ю'
- 16: 3, # 'я'
- },
- 30: { # 'э'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 1, # 'М'
- 31: 1, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 1, # 'Р'
- 32: 1, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 1, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 1, # 'б'
- 10: 1, # 'в'
- 19: 1, # 'г'
- 13: 2, # 'д'
- 2: 1, # 'е'
- 24: 0, # 'ж'
- 20: 1, # 'з'
- 4: 0, # 'и'
- 23: 2, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 2, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 2, # 'ф'
- 26: 1, # 'х'
- 28: 0, # 'ц'
- 22: 0, # 'ч'
- 25: 1, # 'ш'
- 29: 0, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 1, # 'ю'
- 16: 1, # 'я'
- },
- 27: { # 'ю'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 2, # 'а'
- 21: 3, # 'б'
- 10: 1, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 1, # 'е'
- 24: 2, # 'ж'
- 20: 2, # 'з'
- 4: 1, # 'и'
- 23: 1, # 'й'
- 11: 2, # 'к'
- 8: 2, # 'л'
- 12: 2, # 'м'
- 5: 2, # 'н'
- 1: 1, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 0, # 'у'
- 39: 1, # 'ф'
- 26: 2, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 1, # 'э'
- 27: 2, # 'ю'
- 16: 1, # 'я'
- },
- 16: { # 'я'
- 37: 0, # 'А'
- 44: 0, # 'Б'
- 33: 0, # 'В'
- 46: 0, # 'Г'
- 41: 0, # 'Д'
- 48: 0, # 'Е'
- 56: 0, # 'Ж'
- 51: 0, # 'З'
- 42: 0, # 'И'
- 60: 0, # 'Й'
- 36: 0, # 'К'
- 49: 0, # 'Л'
- 38: 0, # 'М'
- 31: 0, # 'Н'
- 34: 0, # 'О'
- 35: 0, # 'П'
- 45: 0, # 'Р'
- 32: 0, # 'С'
- 40: 0, # 'Т'
- 52: 0, # 'У'
- 53: 0, # 'Ф'
- 55: 0, # 'Х'
- 58: 0, # 'Ц'
- 50: 0, # 'Ч'
- 57: 0, # 'Ш'
- 63: 0, # 'Щ'
- 62: 0, # 'Ы'
- 61: 0, # 'Ь'
- 47: 0, # 'Э'
- 59: 0, # 'Ю'
- 43: 0, # 'Я'
- 3: 0, # 'а'
- 21: 2, # 'б'
- 10: 3, # 'в'
- 19: 2, # 'г'
- 13: 3, # 'д'
- 2: 3, # 'е'
- 24: 3, # 'ж'
- 20: 3, # 'з'
- 4: 2, # 'и'
- 23: 2, # 'й'
- 11: 3, # 'к'
- 8: 3, # 'л'
- 12: 3, # 'м'
- 5: 3, # 'н'
- 1: 0, # 'о'
- 15: 2, # 'п'
- 9: 2, # 'р'
- 7: 3, # 'с'
- 6: 3, # 'т'
- 14: 1, # 'у'
- 39: 1, # 'ф'
- 26: 3, # 'х'
- 28: 2, # 'ц'
- 22: 2, # 'ч'
- 25: 2, # 'ш'
- 29: 3, # 'щ'
- 54: 0, # 'ъ'
- 18: 0, # 'ы'
- 17: 0, # 'ь'
- 30: 0, # 'э'
- 27: 2, # 'ю'
- 16: 2, # 'я'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-IBM866_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'А'
- 129: 44, # 'Б'
- 130: 33, # 'В'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Н'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Р'
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Х'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Э'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 3, # 'а'
- 161: 21, # 'б'
- 162: 10, # 'в'
- 163: 19, # 'г'
- 164: 13, # 'д'
- 165: 2, # 'е'
- 166: 24, # 'ж'
- 167: 20, # 'з'
- 168: 4, # 'и'
- 169: 23, # 'й'
- 170: 11, # 'к'
- 171: 8, # 'л'
- 172: 12, # 'м'
- 173: 5, # 'н'
- 174: 1, # 'о'
- 175: 15, # 'п'
- 176: 191, # '░'
- 177: 192, # '▒'
- 178: 193, # '▓'
- 179: 194, # '│'
- 180: 195, # '┤'
- 181: 196, # '╡'
- 182: 197, # '╢'
- 183: 198, # '╖'
- 184: 199, # '╕'
- 185: 200, # '╣'
- 186: 201, # '║'
- 187: 202, # '╗'
- 188: 203, # '╝'
- 189: 204, # '╜'
- 190: 205, # '╛'
- 191: 206, # '┐'
- 192: 207, # '└'
- 193: 208, # '┴'
- 194: 209, # '┬'
- 195: 210, # '├'
- 196: 211, # '─'
- 197: 212, # '┼'
- 198: 213, # '╞'
- 199: 214, # '╟'
- 200: 215, # '╚'
- 201: 216, # '╔'
- 202: 217, # '╩'
- 203: 218, # '╦'
- 204: 219, # '╠'
- 205: 220, # '═'
- 206: 221, # '╬'
- 207: 222, # '╧'
- 208: 223, # '╨'
- 209: 224, # '╤'
- 210: 225, # '╥'
- 211: 226, # '╙'
- 212: 227, # '╘'
- 213: 228, # '╒'
- 214: 229, # '╓'
- 215: 230, # '╫'
- 216: 231, # '╪'
- 217: 232, # '┘'
- 218: 233, # '┌'
- 219: 234, # '█'
- 220: 235, # '▄'
- 221: 236, # '▌'
- 222: 237, # '▐'
- 223: 238, # '▀'
- 224: 9, # 'р'
- 225: 7, # 'с'
- 226: 6, # 'т'
- 227: 14, # 'у'
- 228: 39, # 'ф'
- 229: 26, # 'х'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ъ'
- 235: 18, # 'ы'
- 236: 17, # 'ь'
- 237: 30, # 'э'
- 238: 27, # 'ю'
- 239: 16, # 'я'
- 240: 239, # 'Ё'
- 241: 68, # 'ё'
- 242: 240, # 'Є'
- 243: 241, # 'є'
- 244: 242, # 'Ї'
- 245: 243, # 'ї'
- 246: 244, # 'Ў'
- 247: 245, # 'ў'
- 248: 246, # '°'
- 249: 247, # '∙'
- 250: 248, # '·'
- 251: 249, # '√'
- 252: 250, # '№'
- 253: 251, # '¤'
- 254: 252, # '■'
- 255: 255, # '\xa0'
-}
-
-IBM866_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="IBM866",
- language="Russian",
- char_to_order_map=IBM866_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'Ђ'
- 129: 192, # 'Ѓ'
- 130: 193, # '‚'
- 131: 194, # 'ѓ'
- 132: 195, # '„'
- 133: 196, # '…'
- 134: 197, # '†'
- 135: 198, # '‡'
- 136: 199, # '€'
- 137: 200, # '‰'
- 138: 201, # 'Љ'
- 139: 202, # '‹'
- 140: 203, # 'Њ'
- 141: 204, # 'Ќ'
- 142: 205, # 'Ћ'
- 143: 206, # 'Џ'
- 144: 207, # 'ђ'
- 145: 208, # '‘'
- 146: 209, # '’'
- 147: 210, # '“'
- 148: 211, # '”'
- 149: 212, # '•'
- 150: 213, # '–'
- 151: 214, # '—'
- 152: 215, # None
- 153: 216, # '™'
- 154: 217, # 'љ'
- 155: 218, # '›'
- 156: 219, # 'њ'
- 157: 220, # 'ќ'
- 158: 221, # 'ћ'
- 159: 222, # 'џ'
- 160: 223, # '\xa0'
- 161: 224, # 'Ў'
- 162: 225, # 'ў'
- 163: 226, # 'Ј'
- 164: 227, # '¤'
- 165: 228, # 'Ґ'
- 166: 229, # '¦'
- 167: 230, # '§'
- 168: 231, # 'Ё'
- 169: 232, # '©'
- 170: 233, # 'Є'
- 171: 234, # '«'
- 172: 235, # '¬'
- 173: 236, # '\xad'
- 174: 237, # '®'
- 175: 238, # 'Ї'
- 176: 239, # '°'
- 177: 240, # '±'
- 178: 241, # 'І'
- 179: 242, # 'і'
- 180: 243, # 'ґ'
- 181: 244, # 'µ'
- 182: 245, # '¶'
- 183: 246, # '·'
- 184: 68, # 'ё'
- 185: 247, # '№'
- 186: 248, # 'є'
- 187: 249, # '»'
- 188: 250, # 'ј'
- 189: 251, # 'Ѕ'
- 190: 252, # 'ѕ'
- 191: 253, # 'ї'
- 192: 37, # 'А'
- 193: 44, # 'Б'
- 194: 33, # 'В'
- 195: 46, # 'Г'
- 196: 41, # 'Д'
- 197: 48, # 'Е'
- 198: 56, # 'Ж'
- 199: 51, # 'З'
- 200: 42, # 'И'
- 201: 60, # 'Й'
- 202: 36, # 'К'
- 203: 49, # 'Л'
- 204: 38, # 'М'
- 205: 31, # 'Н'
- 206: 34, # 'О'
- 207: 35, # 'П'
- 208: 45, # 'Р'
- 209: 32, # 'С'
- 210: 40, # 'Т'
- 211: 52, # 'У'
- 212: 53, # 'Ф'
- 213: 55, # 'Х'
- 214: 58, # 'Ц'
- 215: 50, # 'Ч'
- 216: 57, # 'Ш'
- 217: 63, # 'Щ'
- 218: 70, # 'Ъ'
- 219: 62, # 'Ы'
- 220: 61, # 'Ь'
- 221: 47, # 'Э'
- 222: 59, # 'Ю'
- 223: 43, # 'Я'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'р'
- 241: 7, # 'с'
- 242: 6, # 'т'
- 243: 14, # 'у'
- 244: 39, # 'ф'
- 245: 26, # 'х'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ъ'
- 251: 18, # 'ы'
- 252: 17, # 'ь'
- 253: 30, # 'э'
- 254: 27, # 'ю'
- 255: 16, # 'я'
-}
-
-WINDOWS_1251_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="windows-1251",
- language="Russian",
- char_to_order_map=WINDOWS_1251_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-IBM855_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # 'ђ'
- 129: 192, # 'Ђ'
- 130: 193, # 'ѓ'
- 131: 194, # 'Ѓ'
- 132: 68, # 'ё'
- 133: 195, # 'Ё'
- 134: 196, # 'є'
- 135: 197, # 'Є'
- 136: 198, # 'ѕ'
- 137: 199, # 'Ѕ'
- 138: 200, # 'і'
- 139: 201, # 'І'
- 140: 202, # 'ї'
- 141: 203, # 'Ї'
- 142: 204, # 'ј'
- 143: 205, # 'Ј'
- 144: 206, # 'љ'
- 145: 207, # 'Љ'
- 146: 208, # 'њ'
- 147: 209, # 'Њ'
- 148: 210, # 'ћ'
- 149: 211, # 'Ћ'
- 150: 212, # 'ќ'
- 151: 213, # 'Ќ'
- 152: 214, # 'ў'
- 153: 215, # 'Ў'
- 154: 216, # 'џ'
- 155: 217, # 'Џ'
- 156: 27, # 'ю'
- 157: 59, # 'Ю'
- 158: 54, # 'ъ'
- 159: 70, # 'Ъ'
- 160: 3, # 'а'
- 161: 37, # 'А'
- 162: 21, # 'б'
- 163: 44, # 'Б'
- 164: 28, # 'ц'
- 165: 58, # 'Ц'
- 166: 13, # 'д'
- 167: 41, # 'Д'
- 168: 2, # 'е'
- 169: 48, # 'Е'
- 170: 39, # 'ф'
- 171: 53, # 'Ф'
- 172: 19, # 'г'
- 173: 46, # 'Г'
- 174: 218, # '«'
- 175: 219, # '»'
- 176: 220, # '░'
- 177: 221, # '▒'
- 178: 222, # '▓'
- 179: 223, # '│'
- 180: 224, # '┤'
- 181: 26, # 'х'
- 182: 55, # 'Х'
- 183: 4, # 'и'
- 184: 42, # 'И'
- 185: 225, # '╣'
- 186: 226, # '║'
- 187: 227, # '╗'
- 188: 228, # '╝'
- 189: 23, # 'й'
- 190: 60, # 'Й'
- 191: 229, # '┐'
- 192: 230, # '└'
- 193: 231, # '┴'
- 194: 232, # '┬'
- 195: 233, # '├'
- 196: 234, # '─'
- 197: 235, # '┼'
- 198: 11, # 'к'
- 199: 36, # 'К'
- 200: 236, # '╚'
- 201: 237, # '╔'
- 202: 238, # '╩'
- 203: 239, # '╦'
- 204: 240, # '╠'
- 205: 241, # '═'
- 206: 242, # '╬'
- 207: 243, # '¤'
- 208: 8, # 'л'
- 209: 49, # 'Л'
- 210: 12, # 'м'
- 211: 38, # 'М'
- 212: 5, # 'н'
- 213: 31, # 'Н'
- 214: 1, # 'о'
- 215: 34, # 'О'
- 216: 15, # 'п'
- 217: 244, # '┘'
- 218: 245, # '┌'
- 219: 246, # '█'
- 220: 247, # '▄'
- 221: 35, # 'П'
- 222: 16, # 'я'
- 223: 248, # '▀'
- 224: 43, # 'Я'
- 225: 9, # 'р'
- 226: 45, # 'Р'
- 227: 7, # 'с'
- 228: 32, # 'С'
- 229: 6, # 'т'
- 230: 40, # 'Т'
- 231: 14, # 'у'
- 232: 52, # 'У'
- 233: 24, # 'ж'
- 234: 56, # 'Ж'
- 235: 10, # 'в'
- 236: 33, # 'В'
- 237: 17, # 'ь'
- 238: 61, # 'Ь'
- 239: 249, # '№'
- 240: 250, # '\xad'
- 241: 18, # 'ы'
- 242: 62, # 'Ы'
- 243: 20, # 'з'
- 244: 51, # 'З'
- 245: 25, # 'ш'
- 246: 57, # 'Ш'
- 247: 30, # 'э'
- 248: 47, # 'Э'
- 249: 29, # 'щ'
- 250: 63, # 'Щ'
- 251: 22, # 'ч'
- 252: 50, # 'Ч'
- 253: 251, # '§'
- 254: 252, # '■'
- 255: 255, # '\xa0'
-}
-
-IBM855_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="IBM855",
- language="Russian",
- char_to_order_map=IBM855_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-KOI8_R_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '─'
- 129: 192, # '│'
- 130: 193, # '┌'
- 131: 194, # '┐'
- 132: 195, # '└'
- 133: 196, # '┘'
- 134: 197, # '├'
- 135: 198, # '┤'
- 136: 199, # '┬'
- 137: 200, # '┴'
- 138: 201, # '┼'
- 139: 202, # '▀'
- 140: 203, # '▄'
- 141: 204, # '█'
- 142: 205, # '▌'
- 143: 206, # '▐'
- 144: 207, # '░'
- 145: 208, # '▒'
- 146: 209, # '▓'
- 147: 210, # '⌠'
- 148: 211, # '■'
- 149: 212, # '∙'
- 150: 213, # '√'
- 151: 214, # '≈'
- 152: 215, # '≤'
- 153: 216, # '≥'
- 154: 217, # '\xa0'
- 155: 218, # '⌡'
- 156: 219, # '°'
- 157: 220, # '²'
- 158: 221, # '·'
- 159: 222, # '÷'
- 160: 223, # '═'
- 161: 224, # '║'
- 162: 225, # '╒'
- 163: 68, # 'ё'
- 164: 226, # '╓'
- 165: 227, # '╔'
- 166: 228, # '╕'
- 167: 229, # '╖'
- 168: 230, # '╗'
- 169: 231, # '╘'
- 170: 232, # '╙'
- 171: 233, # '╚'
- 172: 234, # '╛'
- 173: 235, # '╜'
- 174: 236, # '╝'
- 175: 237, # '╞'
- 176: 238, # '╟'
- 177: 239, # '╠'
- 178: 240, # '╡'
- 179: 241, # 'Ё'
- 180: 242, # '╢'
- 181: 243, # '╣'
- 182: 244, # '╤'
- 183: 245, # '╥'
- 184: 246, # '╦'
- 185: 247, # '╧'
- 186: 248, # '╨'
- 187: 249, # '╩'
- 188: 250, # '╪'
- 189: 251, # '╫'
- 190: 252, # '╬'
- 191: 253, # '©'
- 192: 27, # 'ю'
- 193: 3, # 'а'
- 194: 21, # 'б'
- 195: 28, # 'ц'
- 196: 13, # 'д'
- 197: 2, # 'е'
- 198: 39, # 'ф'
- 199: 19, # 'г'
- 200: 26, # 'х'
- 201: 4, # 'и'
- 202: 23, # 'й'
- 203: 11, # 'к'
- 204: 8, # 'л'
- 205: 12, # 'м'
- 206: 5, # 'н'
- 207: 1, # 'о'
- 208: 15, # 'п'
- 209: 16, # 'я'
- 210: 9, # 'р'
- 211: 7, # 'с'
- 212: 6, # 'т'
- 213: 14, # 'у'
- 214: 24, # 'ж'
- 215: 10, # 'в'
- 216: 17, # 'ь'
- 217: 18, # 'ы'
- 218: 20, # 'з'
- 219: 25, # 'ш'
- 220: 30, # 'э'
- 221: 29, # 'щ'
- 222: 22, # 'ч'
- 223: 54, # 'ъ'
- 224: 59, # 'Ю'
- 225: 37, # 'А'
- 226: 44, # 'Б'
- 227: 58, # 'Ц'
- 228: 41, # 'Д'
- 229: 48, # 'Е'
- 230: 53, # 'Ф'
- 231: 46, # 'Г'
- 232: 55, # 'Х'
- 233: 42, # 'И'
- 234: 60, # 'Й'
- 235: 36, # 'К'
- 236: 49, # 'Л'
- 237: 38, # 'М'
- 238: 31, # 'Н'
- 239: 34, # 'О'
- 240: 35, # 'П'
- 241: 43, # 'Я'
- 242: 45, # 'Р'
- 243: 32, # 'С'
- 244: 40, # 'Т'
- 245: 52, # 'У'
- 246: 56, # 'Ж'
- 247: 33, # 'В'
- 248: 61, # 'Ь'
- 249: 62, # 'Ы'
- 250: 51, # 'З'
- 251: 57, # 'Ш'
- 252: 47, # 'Э'
- 253: 63, # 'Щ'
- 254: 50, # 'Ч'
- 255: 70, # 'Ъ'
-}
-
-KOI8_R_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="KOI8-R",
- language="Russian",
- char_to_order_map=KOI8_R_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 37, # 'А'
- 129: 44, # 'Б'
- 130: 33, # 'В'
- 131: 46, # 'Г'
- 132: 41, # 'Д'
- 133: 48, # 'Е'
- 134: 56, # 'Ж'
- 135: 51, # 'З'
- 136: 42, # 'И'
- 137: 60, # 'Й'
- 138: 36, # 'К'
- 139: 49, # 'Л'
- 140: 38, # 'М'
- 141: 31, # 'Н'
- 142: 34, # 'О'
- 143: 35, # 'П'
- 144: 45, # 'Р'
- 145: 32, # 'С'
- 146: 40, # 'Т'
- 147: 52, # 'У'
- 148: 53, # 'Ф'
- 149: 55, # 'Х'
- 150: 58, # 'Ц'
- 151: 50, # 'Ч'
- 152: 57, # 'Ш'
- 153: 63, # 'Щ'
- 154: 70, # 'Ъ'
- 155: 62, # 'Ы'
- 156: 61, # 'Ь'
- 157: 47, # 'Э'
- 158: 59, # 'Ю'
- 159: 43, # 'Я'
- 160: 191, # '†'
- 161: 192, # '°'
- 162: 193, # 'Ґ'
- 163: 194, # '£'
- 164: 195, # '§'
- 165: 196, # '•'
- 166: 197, # '¶'
- 167: 198, # 'І'
- 168: 199, # '®'
- 169: 200, # '©'
- 170: 201, # '™'
- 171: 202, # 'Ђ'
- 172: 203, # 'ђ'
- 173: 204, # '≠'
- 174: 205, # 'Ѓ'
- 175: 206, # 'ѓ'
- 176: 207, # '∞'
- 177: 208, # '±'
- 178: 209, # '≤'
- 179: 210, # '≥'
- 180: 211, # 'і'
- 181: 212, # 'µ'
- 182: 213, # 'ґ'
- 183: 214, # 'Ј'
- 184: 215, # 'Є'
- 185: 216, # 'є'
- 186: 217, # 'Ї'
- 187: 218, # 'ї'
- 188: 219, # 'Љ'
- 189: 220, # 'љ'
- 190: 221, # 'Њ'
- 191: 222, # 'њ'
- 192: 223, # 'ј'
- 193: 224, # 'Ѕ'
- 194: 225, # '¬'
- 195: 226, # '√'
- 196: 227, # 'ƒ'
- 197: 228, # '≈'
- 198: 229, # '∆'
- 199: 230, # '«'
- 200: 231, # '»'
- 201: 232, # '…'
- 202: 233, # '\xa0'
- 203: 234, # 'Ћ'
- 204: 235, # 'ћ'
- 205: 236, # 'Ќ'
- 206: 237, # 'ќ'
- 207: 238, # 'ѕ'
- 208: 239, # '–'
- 209: 240, # '—'
- 210: 241, # '“'
- 211: 242, # '”'
- 212: 243, # '‘'
- 213: 244, # '’'
- 214: 245, # '÷'
- 215: 246, # '„'
- 216: 247, # 'Ў'
- 217: 248, # 'ў'
- 218: 249, # 'Џ'
- 219: 250, # 'џ'
- 220: 251, # '№'
- 221: 252, # 'Ё'
- 222: 68, # 'ё'
- 223: 16, # 'я'
- 224: 3, # 'а'
- 225: 21, # 'б'
- 226: 10, # 'в'
- 227: 19, # 'г'
- 228: 13, # 'д'
- 229: 2, # 'е'
- 230: 24, # 'ж'
- 231: 20, # 'з'
- 232: 4, # 'и'
- 233: 23, # 'й'
- 234: 11, # 'к'
- 235: 8, # 'л'
- 236: 12, # 'м'
- 237: 5, # 'н'
- 238: 1, # 'о'
- 239: 15, # 'п'
- 240: 9, # 'р'
- 241: 7, # 'с'
- 242: 6, # 'т'
- 243: 14, # 'у'
- 244: 39, # 'ф'
- 245: 26, # 'х'
- 246: 28, # 'ц'
- 247: 22, # 'ч'
- 248: 25, # 'ш'
- 249: 29, # 'щ'
- 250: 54, # 'ъ'
- 251: 18, # 'ы'
- 252: 17, # 'ь'
- 253: 30, # 'э'
- 254: 27, # 'ю'
- 255: 255, # '€'
-}
-
-MACCYRILLIC_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="MacCyrillic",
- language="Russian",
- char_to_order_map=MACCYRILLIC_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
-
-ISO_8859_5_RUSSIAN_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 142, # 'A'
- 66: 143, # 'B'
- 67: 144, # 'C'
- 68: 145, # 'D'
- 69: 146, # 'E'
- 70: 147, # 'F'
- 71: 148, # 'G'
- 72: 149, # 'H'
- 73: 150, # 'I'
- 74: 151, # 'J'
- 75: 152, # 'K'
- 76: 74, # 'L'
- 77: 153, # 'M'
- 78: 75, # 'N'
- 79: 154, # 'O'
- 80: 155, # 'P'
- 81: 156, # 'Q'
- 82: 157, # 'R'
- 83: 158, # 'S'
- 84: 159, # 'T'
- 85: 160, # 'U'
- 86: 161, # 'V'
- 87: 162, # 'W'
- 88: 163, # 'X'
- 89: 164, # 'Y'
- 90: 165, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 71, # 'a'
- 98: 172, # 'b'
- 99: 66, # 'c'
- 100: 173, # 'd'
- 101: 65, # 'e'
- 102: 174, # 'f'
- 103: 76, # 'g'
- 104: 175, # 'h'
- 105: 64, # 'i'
- 106: 176, # 'j'
- 107: 177, # 'k'
- 108: 77, # 'l'
- 109: 72, # 'm'
- 110: 178, # 'n'
- 111: 69, # 'o'
- 112: 67, # 'p'
- 113: 179, # 'q'
- 114: 78, # 'r'
- 115: 73, # 's'
- 116: 180, # 't'
- 117: 181, # 'u'
- 118: 79, # 'v'
- 119: 182, # 'w'
- 120: 183, # 'x'
- 121: 184, # 'y'
- 122: 185, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 191, # '\x80'
- 129: 192, # '\x81'
- 130: 193, # '\x82'
- 131: 194, # '\x83'
- 132: 195, # '\x84'
- 133: 196, # '\x85'
- 134: 197, # '\x86'
- 135: 198, # '\x87'
- 136: 199, # '\x88'
- 137: 200, # '\x89'
- 138: 201, # '\x8a'
- 139: 202, # '\x8b'
- 140: 203, # '\x8c'
- 141: 204, # '\x8d'
- 142: 205, # '\x8e'
- 143: 206, # '\x8f'
- 144: 207, # '\x90'
- 145: 208, # '\x91'
- 146: 209, # '\x92'
- 147: 210, # '\x93'
- 148: 211, # '\x94'
- 149: 212, # '\x95'
- 150: 213, # '\x96'
- 151: 214, # '\x97'
- 152: 215, # '\x98'
- 153: 216, # '\x99'
- 154: 217, # '\x9a'
- 155: 218, # '\x9b'
- 156: 219, # '\x9c'
- 157: 220, # '\x9d'
- 158: 221, # '\x9e'
- 159: 222, # '\x9f'
- 160: 223, # '\xa0'
- 161: 224, # 'Ё'
- 162: 225, # 'Ђ'
- 163: 226, # 'Ѓ'
- 164: 227, # 'Є'
- 165: 228, # 'Ѕ'
- 166: 229, # 'І'
- 167: 230, # 'Ї'
- 168: 231, # 'Ј'
- 169: 232, # 'Љ'
- 170: 233, # 'Њ'
- 171: 234, # 'Ћ'
- 172: 235, # 'Ќ'
- 173: 236, # '\xad'
- 174: 237, # 'Ў'
- 175: 238, # 'Џ'
- 176: 37, # 'А'
- 177: 44, # 'Б'
- 178: 33, # 'В'
- 179: 46, # 'Г'
- 180: 41, # 'Д'
- 181: 48, # 'Е'
- 182: 56, # 'Ж'
- 183: 51, # 'З'
- 184: 42, # 'И'
- 185: 60, # 'Й'
- 186: 36, # 'К'
- 187: 49, # 'Л'
- 188: 38, # 'М'
- 189: 31, # 'Н'
- 190: 34, # 'О'
- 191: 35, # 'П'
- 192: 45, # 'Р'
- 193: 32, # 'С'
- 194: 40, # 'Т'
- 195: 52, # 'У'
- 196: 53, # 'Ф'
- 197: 55, # 'Х'
- 198: 58, # 'Ц'
- 199: 50, # 'Ч'
- 200: 57, # 'Ш'
- 201: 63, # 'Щ'
- 202: 70, # 'Ъ'
- 203: 62, # 'Ы'
- 204: 61, # 'Ь'
- 205: 47, # 'Э'
- 206: 59, # 'Ю'
- 207: 43, # 'Я'
- 208: 3, # 'а'
- 209: 21, # 'б'
- 210: 10, # 'в'
- 211: 19, # 'г'
- 212: 13, # 'д'
- 213: 2, # 'е'
- 214: 24, # 'ж'
- 215: 20, # 'з'
- 216: 4, # 'и'
- 217: 23, # 'й'
- 218: 11, # 'к'
- 219: 8, # 'л'
- 220: 12, # 'м'
- 221: 5, # 'н'
- 222: 1, # 'о'
- 223: 15, # 'п'
- 224: 9, # 'р'
- 225: 7, # 'с'
- 226: 6, # 'т'
- 227: 14, # 'у'
- 228: 39, # 'ф'
- 229: 26, # 'х'
- 230: 28, # 'ц'
- 231: 22, # 'ч'
- 232: 25, # 'ш'
- 233: 29, # 'щ'
- 234: 54, # 'ъ'
- 235: 18, # 'ы'
- 236: 17, # 'ь'
- 237: 30, # 'э'
- 238: 27, # 'ю'
- 239: 16, # 'я'
- 240: 239, # '№'
- 241: 68, # 'ё'
- 242: 240, # 'ђ'
- 243: 241, # 'ѓ'
- 244: 242, # 'є'
- 245: 243, # 'ѕ'
- 246: 244, # 'і'
- 247: 245, # 'ї'
- 248: 246, # 'ј'
- 249: 247, # 'љ'
- 250: 248, # 'њ'
- 251: 249, # 'ћ'
- 252: 250, # 'ќ'
- 253: 251, # '§'
- 254: 252, # 'ў'
- 255: 255, # 'џ'
-}
-
-ISO_8859_5_RUSSIAN_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-5",
- language="Russian",
- char_to_order_map=ISO_8859_5_RUSSIAN_CHAR_TO_ORDER,
- language_model=RUSSIAN_LANG_MODEL,
- typical_positive_ratio=0.976601,
- keep_ascii_letters=False,
- alphabet="ЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py
deleted file mode 100644
index 489cad93..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-THAI_LANG_MODEL = {
- 5: { # 'ก'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 3, # 'ฎ'
- 57: 2, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 1, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 30: { # 'ข'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 2, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 24: { # 'ค'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 2, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 3, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 8: { # 'ง'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 1, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 2, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 3, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 26: { # 'จ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 52: { # 'ฉ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 34: { # 'ช'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 1, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 51: { # 'ซ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 47: { # 'ญ'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 58: { # 'ฎ'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 57: { # 'ฏ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 49: { # 'ฐ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 53: { # 'ฑ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 55: { # 'ฒ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 43: { # 'ณ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 3, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 20: { # 'ด'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 2, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 2, # '็'
- 6: 1, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 19: { # 'ต'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 2, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 1, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 44: { # 'ถ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 1, # 'ี'
- 40: 3, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 14: { # 'ท'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 3, # 'ศ'
- 46: 1, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 1, # 'ื'
- 32: 3, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 48: { # 'ธ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 2, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 3: { # 'น'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 1, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 3, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 3, # 'โ'
- 29: 3, # 'ใ'
- 33: 3, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 17: { # 'บ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 2, # 'ื'
- 32: 3, # 'ุ'
- 35: 2, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 25: { # 'ป'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 1, # 'ฎ'
- 57: 3, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 1, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 1, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 2, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 1, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 39: { # 'ผ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 0, # 'ุ'
- 35: 3, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 62: { # 'ฝ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 1, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 2, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 2, # '่'
- 7: 1, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 31: { # 'พ'
- 5: 1, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 1, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 1, # 'ึ'
- 27: 3, # 'ื'
- 32: 1, # 'ุ'
- 35: 2, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 1, # '็'
- 6: 0, # '่'
- 7: 1, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 54: { # 'ฟ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 1, # 'ื'
- 32: 1, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 45: { # 'ภ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 9: { # 'ม'
- 5: 2, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 2, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 1, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 2, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 16: { # 'ย'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 1, # 'ึ'
- 27: 2, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 2, # 'ๆ'
- 37: 1, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 2: { # 'ร'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 2, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 3, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 3, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 2, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 3, # 'เ'
- 28: 3, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 3, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 61: { # 'ฤ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 2, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 15: { # 'ล'
- 5: 2, # 'ก'
- 30: 3, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 3, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 2, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 2, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 2, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 12: { # 'ว'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 3, # 'ิ'
- 13: 2, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 2, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 42: { # 'ศ'
- 5: 1, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 2, # 'ิ'
- 13: 0, # 'ี'
- 40: 3, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 2, # 'ู'
- 11: 0, # 'เ'
- 28: 1, # 'แ'
- 41: 0, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 46: { # 'ษ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 2, # 'ฎ'
- 57: 1, # 'ฏ'
- 49: 2, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 0, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 2, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 18: { # 'ส'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 3, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 3, # 'ำ'
- 23: 3, # 'ิ'
- 13: 3, # 'ี'
- 40: 2, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 3, # 'ู'
- 11: 2, # 'เ'
- 28: 0, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 1, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 21: { # 'ห'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 1, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 0, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 0, # 'ำ'
- 23: 1, # 'ิ'
- 13: 1, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 1, # 'ุ'
- 35: 1, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 3, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 4: { # 'อ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 2, # 'ะ'
- 10: 3, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 2, # 'ิ'
- 13: 3, # 'ี'
- 40: 0, # 'ึ'
- 27: 3, # 'ื'
- 32: 3, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 1, # '็'
- 6: 2, # '่'
- 7: 2, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 63: { # 'ฯ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 22: { # 'ะ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 10: { # 'ั'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 3, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 2, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 3, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 1: { # 'า'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 1, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 2, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 3, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 3, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 36: { # 'ำ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 23: { # 'ิ'
- 5: 3, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 3, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 2, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 3, # 'ศ'
- 46: 2, # 'ษ'
- 18: 2, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 2, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 13: { # 'ี'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 1, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 2, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 40: { # 'ึ'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 1, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 27: { # 'ื'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 32: { # 'ุ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 3, # 'ค'
- 8: 3, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 1, # 'ฒ'
- 43: 3, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 2, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 3, # 'ม'
- 16: 1, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 1, # 'ว'
- 42: 1, # 'ศ'
- 46: 2, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 2, # '้'
- 38: 1, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 35: { # 'ู'
- 5: 3, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 2, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 2, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 2, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 2, # 'น'
- 17: 0, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 1, # 'แ'
- 41: 1, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 3, # '่'
- 7: 3, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 11: { # 'เ'
- 5: 3, # 'ก'
- 30: 3, # 'ข'
- 24: 3, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 3, # 'ฉ'
- 34: 3, # 'ช'
- 51: 2, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 1, # 'ณ'
- 20: 3, # 'ด'
- 19: 3, # 'ต'
- 44: 1, # 'ถ'
- 14: 3, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 3, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 3, # 'พ'
- 54: 1, # 'ฟ'
- 45: 3, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 3, # 'ว'
- 42: 2, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 28: { # 'แ'
- 5: 3, # 'ก'
- 30: 2, # 'ข'
- 24: 2, # 'ค'
- 8: 1, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 3, # 'ต'
- 44: 2, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 2, # 'ป'
- 39: 3, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 2, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 41: { # 'โ'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 1, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 1, # 'ภ'
- 9: 1, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 3, # 'ล'
- 12: 0, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 0, # 'ห'
- 4: 2, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 29: { # 'ใ'
- 5: 2, # 'ก'
- 30: 0, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 3, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 3, # 'ส'
- 21: 3, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 33: { # 'ไ'
- 5: 1, # 'ก'
- 30: 2, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 3, # 'ด'
- 19: 1, # 'ต'
- 44: 0, # 'ถ'
- 14: 3, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 1, # 'บ'
- 25: 3, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 2, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 0, # 'ย'
- 2: 3, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 2, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 50: { # 'ๆ'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 37: { # '็'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 2, # 'ง'
- 26: 3, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 1, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 0, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 3, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 1, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 2, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 0, # 'ห'
- 4: 1, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 1, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 6: { # '่'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 1, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 1, # 'ธ'
- 3: 3, # 'น'
- 17: 1, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 1, # 'ฝ'
- 31: 1, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 3, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 2, # 'ล'
- 12: 3, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 1, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 1, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 3, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 1, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 7: { # '้'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 2, # 'ค'
- 8: 3, # 'ง'
- 26: 2, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 1, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 1, # 'ด'
- 19: 2, # 'ต'
- 44: 1, # 'ถ'
- 14: 2, # 'ท'
- 48: 0, # 'ธ'
- 3: 3, # 'น'
- 17: 2, # 'บ'
- 25: 2, # 'ป'
- 39: 2, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 3, # 'ม'
- 16: 2, # 'ย'
- 2: 2, # 'ร'
- 61: 0, # 'ฤ'
- 15: 1, # 'ล'
- 12: 3, # 'ว'
- 42: 1, # 'ศ'
- 46: 0, # 'ษ'
- 18: 2, # 'ส'
- 21: 2, # 'ห'
- 4: 3, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 3, # 'า'
- 36: 2, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 2, # 'ใ'
- 33: 2, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 38: { # '์'
- 5: 2, # 'ก'
- 30: 1, # 'ข'
- 24: 1, # 'ค'
- 8: 0, # 'ง'
- 26: 1, # 'จ'
- 52: 0, # 'ฉ'
- 34: 1, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 2, # 'ด'
- 19: 1, # 'ต'
- 44: 1, # 'ถ'
- 14: 1, # 'ท'
- 48: 0, # 'ธ'
- 3: 1, # 'น'
- 17: 1, # 'บ'
- 25: 1, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 1, # 'พ'
- 54: 1, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 2, # 'ม'
- 16: 0, # 'ย'
- 2: 1, # 'ร'
- 61: 1, # 'ฤ'
- 15: 1, # 'ล'
- 12: 1, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 1, # 'ส'
- 21: 1, # 'ห'
- 4: 2, # 'อ'
- 63: 1, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 2, # 'เ'
- 28: 2, # 'แ'
- 41: 1, # 'โ'
- 29: 1, # 'ใ'
- 33: 1, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 0, # '๑'
- 59: 0, # '๒'
- 60: 0, # '๕'
- },
- 56: { # '๑'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 1, # '๕'
- },
- 59: { # '๒'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 1, # '๑'
- 59: 1, # '๒'
- 60: 3, # '๕'
- },
- 60: { # '๕'
- 5: 0, # 'ก'
- 30: 0, # 'ข'
- 24: 0, # 'ค'
- 8: 0, # 'ง'
- 26: 0, # 'จ'
- 52: 0, # 'ฉ'
- 34: 0, # 'ช'
- 51: 0, # 'ซ'
- 47: 0, # 'ญ'
- 58: 0, # 'ฎ'
- 57: 0, # 'ฏ'
- 49: 0, # 'ฐ'
- 53: 0, # 'ฑ'
- 55: 0, # 'ฒ'
- 43: 0, # 'ณ'
- 20: 0, # 'ด'
- 19: 0, # 'ต'
- 44: 0, # 'ถ'
- 14: 0, # 'ท'
- 48: 0, # 'ธ'
- 3: 0, # 'น'
- 17: 0, # 'บ'
- 25: 0, # 'ป'
- 39: 0, # 'ผ'
- 62: 0, # 'ฝ'
- 31: 0, # 'พ'
- 54: 0, # 'ฟ'
- 45: 0, # 'ภ'
- 9: 0, # 'ม'
- 16: 0, # 'ย'
- 2: 0, # 'ร'
- 61: 0, # 'ฤ'
- 15: 0, # 'ล'
- 12: 0, # 'ว'
- 42: 0, # 'ศ'
- 46: 0, # 'ษ'
- 18: 0, # 'ส'
- 21: 0, # 'ห'
- 4: 0, # 'อ'
- 63: 0, # 'ฯ'
- 22: 0, # 'ะ'
- 10: 0, # 'ั'
- 1: 0, # 'า'
- 36: 0, # 'ำ'
- 23: 0, # 'ิ'
- 13: 0, # 'ี'
- 40: 0, # 'ึ'
- 27: 0, # 'ื'
- 32: 0, # 'ุ'
- 35: 0, # 'ู'
- 11: 0, # 'เ'
- 28: 0, # 'แ'
- 41: 0, # 'โ'
- 29: 0, # 'ใ'
- 33: 0, # 'ไ'
- 50: 0, # 'ๆ'
- 37: 0, # '็'
- 6: 0, # '่'
- 7: 0, # '้'
- 38: 0, # '์'
- 56: 2, # '๑'
- 59: 1, # '๒'
- 60: 0, # '๕'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-TIS_620_THAI_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 254, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 254, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 253, # ' '
- 33: 253, # '!'
- 34: 253, # '"'
- 35: 253, # '#'
- 36: 253, # '$'
- 37: 253, # '%'
- 38: 253, # '&'
- 39: 253, # "'"
- 40: 253, # '('
- 41: 253, # ')'
- 42: 253, # '*'
- 43: 253, # '+'
- 44: 253, # ','
- 45: 253, # '-'
- 46: 253, # '.'
- 47: 253, # '/'
- 48: 252, # '0'
- 49: 252, # '1'
- 50: 252, # '2'
- 51: 252, # '3'
- 52: 252, # '4'
- 53: 252, # '5'
- 54: 252, # '6'
- 55: 252, # '7'
- 56: 252, # '8'
- 57: 252, # '9'
- 58: 253, # ':'
- 59: 253, # ';'
- 60: 253, # '<'
- 61: 253, # '='
- 62: 253, # '>'
- 63: 253, # '?'
- 64: 253, # '@'
- 65: 182, # 'A'
- 66: 106, # 'B'
- 67: 107, # 'C'
- 68: 100, # 'D'
- 69: 183, # 'E'
- 70: 184, # 'F'
- 71: 185, # 'G'
- 72: 101, # 'H'
- 73: 94, # 'I'
- 74: 186, # 'J'
- 75: 187, # 'K'
- 76: 108, # 'L'
- 77: 109, # 'M'
- 78: 110, # 'N'
- 79: 111, # 'O'
- 80: 188, # 'P'
- 81: 189, # 'Q'
- 82: 190, # 'R'
- 83: 89, # 'S'
- 84: 95, # 'T'
- 85: 112, # 'U'
- 86: 113, # 'V'
- 87: 191, # 'W'
- 88: 192, # 'X'
- 89: 193, # 'Y'
- 90: 194, # 'Z'
- 91: 253, # '['
- 92: 253, # '\\'
- 93: 253, # ']'
- 94: 253, # '^'
- 95: 253, # '_'
- 96: 253, # '`'
- 97: 64, # 'a'
- 98: 72, # 'b'
- 99: 73, # 'c'
- 100: 114, # 'd'
- 101: 74, # 'e'
- 102: 115, # 'f'
- 103: 116, # 'g'
- 104: 102, # 'h'
- 105: 81, # 'i'
- 106: 201, # 'j'
- 107: 117, # 'k'
- 108: 90, # 'l'
- 109: 103, # 'm'
- 110: 78, # 'n'
- 111: 82, # 'o'
- 112: 96, # 'p'
- 113: 202, # 'q'
- 114: 91, # 'r'
- 115: 79, # 's'
- 116: 84, # 't'
- 117: 104, # 'u'
- 118: 105, # 'v'
- 119: 97, # 'w'
- 120: 98, # 'x'
- 121: 92, # 'y'
- 122: 203, # 'z'
- 123: 253, # '{'
- 124: 253, # '|'
- 125: 253, # '}'
- 126: 253, # '~'
- 127: 253, # '\x7f'
- 128: 209, # '\x80'
- 129: 210, # '\x81'
- 130: 211, # '\x82'
- 131: 212, # '\x83'
- 132: 213, # '\x84'
- 133: 88, # '\x85'
- 134: 214, # '\x86'
- 135: 215, # '\x87'
- 136: 216, # '\x88'
- 137: 217, # '\x89'
- 138: 218, # '\x8a'
- 139: 219, # '\x8b'
- 140: 220, # '\x8c'
- 141: 118, # '\x8d'
- 142: 221, # '\x8e'
- 143: 222, # '\x8f'
- 144: 223, # '\x90'
- 145: 224, # '\x91'
- 146: 99, # '\x92'
- 147: 85, # '\x93'
- 148: 83, # '\x94'
- 149: 225, # '\x95'
- 150: 226, # '\x96'
- 151: 227, # '\x97'
- 152: 228, # '\x98'
- 153: 229, # '\x99'
- 154: 230, # '\x9a'
- 155: 231, # '\x9b'
- 156: 232, # '\x9c'
- 157: 233, # '\x9d'
- 158: 234, # '\x9e'
- 159: 235, # '\x9f'
- 160: 236, # None
- 161: 5, # 'ก'
- 162: 30, # 'ข'
- 163: 237, # 'ฃ'
- 164: 24, # 'ค'
- 165: 238, # 'ฅ'
- 166: 75, # 'ฆ'
- 167: 8, # 'ง'
- 168: 26, # 'จ'
- 169: 52, # 'ฉ'
- 170: 34, # 'ช'
- 171: 51, # 'ซ'
- 172: 119, # 'ฌ'
- 173: 47, # 'ญ'
- 174: 58, # 'ฎ'
- 175: 57, # 'ฏ'
- 176: 49, # 'ฐ'
- 177: 53, # 'ฑ'
- 178: 55, # 'ฒ'
- 179: 43, # 'ณ'
- 180: 20, # 'ด'
- 181: 19, # 'ต'
- 182: 44, # 'ถ'
- 183: 14, # 'ท'
- 184: 48, # 'ธ'
- 185: 3, # 'น'
- 186: 17, # 'บ'
- 187: 25, # 'ป'
- 188: 39, # 'ผ'
- 189: 62, # 'ฝ'
- 190: 31, # 'พ'
- 191: 54, # 'ฟ'
- 192: 45, # 'ภ'
- 193: 9, # 'ม'
- 194: 16, # 'ย'
- 195: 2, # 'ร'
- 196: 61, # 'ฤ'
- 197: 15, # 'ล'
- 198: 239, # 'ฦ'
- 199: 12, # 'ว'
- 200: 42, # 'ศ'
- 201: 46, # 'ษ'
- 202: 18, # 'ส'
- 203: 21, # 'ห'
- 204: 76, # 'ฬ'
- 205: 4, # 'อ'
- 206: 66, # 'ฮ'
- 207: 63, # 'ฯ'
- 208: 22, # 'ะ'
- 209: 10, # 'ั'
- 210: 1, # 'า'
- 211: 36, # 'ำ'
- 212: 23, # 'ิ'
- 213: 13, # 'ี'
- 214: 40, # 'ึ'
- 215: 27, # 'ื'
- 216: 32, # 'ุ'
- 217: 35, # 'ู'
- 218: 86, # 'ฺ'
- 219: 240, # None
- 220: 241, # None
- 221: 242, # None
- 222: 243, # None
- 223: 244, # '฿'
- 224: 11, # 'เ'
- 225: 28, # 'แ'
- 226: 41, # 'โ'
- 227: 29, # 'ใ'
- 228: 33, # 'ไ'
- 229: 245, # 'ๅ'
- 230: 50, # 'ๆ'
- 231: 37, # '็'
- 232: 6, # '่'
- 233: 7, # '้'
- 234: 67, # '๊'
- 235: 77, # '๋'
- 236: 38, # '์'
- 237: 93, # 'ํ'
- 238: 246, # '๎'
- 239: 247, # '๏'
- 240: 68, # '๐'
- 241: 56, # '๑'
- 242: 59, # '๒'
- 243: 65, # '๓'
- 244: 69, # '๔'
- 245: 60, # '๕'
- 246: 70, # '๖'
- 247: 80, # '๗'
- 248: 71, # '๘'
- 249: 87, # '๙'
- 250: 248, # '๚'
- 251: 249, # '๛'
- 252: 250, # None
- 253: 251, # None
- 254: 252, # None
- 255: 253, # None
-}
-
-TIS_620_THAI_MODEL = SingleByteCharSetModel(
- charset_name="TIS-620",
- language="Thai",
- char_to_order_map=TIS_620_THAI_CHAR_TO_ORDER,
- language_model=THAI_LANG_MODEL,
- typical_positive_ratio=0.926386,
- keep_ascii_letters=False,
- alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py
deleted file mode 100644
index 291857c2..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py
+++ /dev/null
@@ -1,4380 +0,0 @@
-from pip._vendor.chardet.sbcharsetprober import SingleByteCharSetModel
-
-# 3: Positive
-# 2: Likely
-# 1: Unlikely
-# 0: Negative
-
-TURKISH_LANG_MODEL = {
- 23: { # 'A'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 37: { # 'B'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 47: { # 'C'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 39: { # 'D'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 0, # 'ş'
- },
- 29: { # 'E'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 52: { # 'F'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 2, # 'ş'
- },
- 36: { # 'G'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 45: { # 'H'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 2, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 2, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 53: { # 'I'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 60: { # 'J'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 16: { # 'K'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 49: { # 'L'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 2, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 20: { # 'M'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 46: { # 'N'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 42: { # 'O'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 2, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 48: { # 'P'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 44: { # 'R'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
- 35: { # 'S'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 2, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 31: { # 'T'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 51: { # 'U'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 1, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 38: { # 'V'
- 23: 1, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 2, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 1, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 62: { # 'W'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 43: { # 'Y'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 1, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 56: { # 'Z'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 1: { # 'a'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 21: { # 'b'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 2, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 28: { # 'c'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 3, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 1, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 2, # 'ş'
- },
- 12: { # 'd'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 2: { # 'e'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 2, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 18: { # 'f'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 1, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 1, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 27: { # 'g'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 25: { # 'h'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 3: { # 'i'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 1, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 1, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 1, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 24: { # 'j'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 2, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 10: { # 'k'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 5: { # 'l'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 1, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 13: { # 'm'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 2, # 'u'
- 32: 2, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 4: { # 'n'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 3, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 15: { # 'o'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 2, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 2, # 'İ'
- 6: 3, # 'ı'
- 40: 2, # 'Ş'
- 19: 2, # 'ş'
- },
- 26: { # 'p'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 1, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 7: { # 'r'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 1, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 3, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 8: { # 's'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 2, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 9: { # 't'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 2, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 2, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 14: { # 'u'
- 23: 3, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 3, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 2, # 'Z'
- 1: 2, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 2, # 'e'
- 18: 2, # 'f'
- 27: 3, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 2, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 32: { # 'v'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 1, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 57: { # 'w'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 1, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 1, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 2, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 58: { # 'x'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 2, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 11: { # 'y'
- 23: 1, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 2, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 3, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 22: { # 'z'
- 23: 2, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 2, # 'D'
- 29: 3, # 'E'
- 52: 1, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 3, # 'T'
- 51: 2, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 2, # 'e'
- 18: 3, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 3, # 'y'
- 22: 2, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 3, # 'ı'
- 40: 1, # 'Ş'
- 19: 2, # 'ş'
- },
- 63: { # '·'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 54: { # 'Ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 1, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 0, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 2, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 2, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 2, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 50: { # 'Ö'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 2, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 1, # 'N'
- 42: 2, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 1, # 'f'
- 27: 1, # 'g'
- 25: 1, # 'h'
- 3: 2, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 2, # 'p'
- 7: 3, # 'r'
- 8: 1, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 1, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 2, # 'ü'
- 30: 1, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 55: { # 'Ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 1, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 1, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 1, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 1, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 1, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 0, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 59: { # 'â'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 0, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 2, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 2, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 0, # 'ş'
- },
- 33: { # 'ç'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 3, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 0, # 'Z'
- 1: 0, # 'a'
- 21: 3, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 2, # 'f'
- 27: 1, # 'g'
- 25: 3, # 'h'
- 3: 3, # 'i'
- 24: 0, # 'j'
- 10: 3, # 'k'
- 5: 0, # 'l'
- 13: 0, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 3, # 't'
- 14: 0, # 'u'
- 32: 2, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 1, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 61: { # 'î'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 0, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 0, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 2, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 1, # 'j'
- 10: 0, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 1, # 'n'
- 15: 0, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 1, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 1, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 1, # 'î'
- 34: 0, # 'ö'
- 17: 0, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 1, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 34: { # 'ö'
- 23: 0, # 'A'
- 37: 1, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 1, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 1, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 2, # 'h'
- 3: 1, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 2, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 0, # 'r'
- 8: 3, # 's'
- 9: 1, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 1, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 2, # 'ğ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 17: { # 'ü'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 0, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 1, # 'J'
- 16: 1, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 0, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 0, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 0, # 'c'
- 12: 1, # 'd'
- 2: 3, # 'e'
- 18: 1, # 'f'
- 27: 2, # 'g'
- 25: 0, # 'h'
- 3: 1, # 'i'
- 24: 1, # 'j'
- 10: 2, # 'k'
- 5: 3, # 'l'
- 13: 2, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 2, # 'p'
- 7: 2, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 3, # 'u'
- 32: 1, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 2, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 30: { # 'ğ'
- 23: 0, # 'A'
- 37: 2, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 1, # 'M'
- 46: 2, # 'N'
- 42: 2, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 0, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 2, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 0, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 2, # 'e'
- 18: 0, # 'f'
- 27: 0, # 'g'
- 25: 0, # 'h'
- 3: 0, # 'i'
- 24: 3, # 'j'
- 10: 1, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 1, # 'o'
- 26: 0, # 'p'
- 7: 1, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 2, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 2, # 'İ'
- 6: 2, # 'ı'
- 40: 2, # 'Ş'
- 19: 1, # 'ş'
- },
- 41: { # 'İ'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 2, # 'G'
- 45: 2, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 0, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 0, # 'Z'
- 1: 1, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 2, # 'd'
- 2: 1, # 'e'
- 18: 0, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 2, # 'i'
- 24: 2, # 'j'
- 10: 2, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 1, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 2, # 't'
- 14: 0, # 'u'
- 32: 0, # 'v'
- 57: 1, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 1, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 1, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 1, # 'ş'
- },
- 6: { # 'ı'
- 23: 2, # 'A'
- 37: 0, # 'B'
- 47: 0, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 2, # 'J'
- 16: 3, # 'K'
- 49: 0, # 'L'
- 20: 3, # 'M'
- 46: 1, # 'N'
- 42: 0, # 'O'
- 48: 0, # 'P'
- 44: 0, # 'R'
- 35: 0, # 'S'
- 31: 2, # 'T'
- 51: 0, # 'U'
- 38: 0, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 3, # 'a'
- 21: 2, # 'b'
- 28: 1, # 'c'
- 12: 3, # 'd'
- 2: 3, # 'e'
- 18: 3, # 'f'
- 27: 3, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 3, # 'j'
- 10: 3, # 'k'
- 5: 3, # 'l'
- 13: 3, # 'm'
- 4: 3, # 'n'
- 15: 0, # 'o'
- 26: 3, # 'p'
- 7: 3, # 'r'
- 8: 3, # 's'
- 9: 3, # 't'
- 14: 3, # 'u'
- 32: 3, # 'v'
- 57: 1, # 'w'
- 58: 1, # 'x'
- 11: 3, # 'y'
- 22: 0, # 'z'
- 63: 1, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 2, # 'ç'
- 61: 0, # 'î'
- 34: 0, # 'ö'
- 17: 3, # 'ü'
- 30: 0, # 'ğ'
- 41: 0, # 'İ'
- 6: 3, # 'ı'
- 40: 0, # 'Ş'
- 19: 0, # 'ş'
- },
- 40: { # 'Ş'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 1, # 'D'
- 29: 1, # 'E'
- 52: 0, # 'F'
- 36: 1, # 'G'
- 45: 2, # 'H'
- 53: 1, # 'I'
- 60: 0, # 'J'
- 16: 0, # 'K'
- 49: 0, # 'L'
- 20: 2, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 2, # 'P'
- 44: 2, # 'R'
- 35: 1, # 'S'
- 31: 1, # 'T'
- 51: 0, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 2, # 'Y'
- 56: 1, # 'Z'
- 1: 0, # 'a'
- 21: 2, # 'b'
- 28: 0, # 'c'
- 12: 2, # 'd'
- 2: 0, # 'e'
- 18: 3, # 'f'
- 27: 0, # 'g'
- 25: 2, # 'h'
- 3: 3, # 'i'
- 24: 2, # 'j'
- 10: 1, # 'k'
- 5: 0, # 'l'
- 13: 1, # 'm'
- 4: 3, # 'n'
- 15: 2, # 'o'
- 26: 0, # 'p'
- 7: 3, # 'r'
- 8: 2, # 's'
- 9: 2, # 't'
- 14: 1, # 'u'
- 32: 3, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 2, # 'y'
- 22: 0, # 'z'
- 63: 0, # '·'
- 54: 0, # 'Ç'
- 50: 0, # 'Ö'
- 55: 1, # 'Ü'
- 59: 0, # 'â'
- 33: 0, # 'ç'
- 61: 0, # 'î'
- 34: 2, # 'ö'
- 17: 1, # 'ü'
- 30: 2, # 'ğ'
- 41: 0, # 'İ'
- 6: 2, # 'ı'
- 40: 1, # 'Ş'
- 19: 2, # 'ş'
- },
- 19: { # 'ş'
- 23: 0, # 'A'
- 37: 0, # 'B'
- 47: 1, # 'C'
- 39: 0, # 'D'
- 29: 0, # 'E'
- 52: 2, # 'F'
- 36: 1, # 'G'
- 45: 0, # 'H'
- 53: 0, # 'I'
- 60: 0, # 'J'
- 16: 3, # 'K'
- 49: 2, # 'L'
- 20: 0, # 'M'
- 46: 1, # 'N'
- 42: 1, # 'O'
- 48: 1, # 'P'
- 44: 1, # 'R'
- 35: 1, # 'S'
- 31: 0, # 'T'
- 51: 1, # 'U'
- 38: 1, # 'V'
- 62: 0, # 'W'
- 43: 1, # 'Y'
- 56: 0, # 'Z'
- 1: 3, # 'a'
- 21: 1, # 'b'
- 28: 2, # 'c'
- 12: 0, # 'd'
- 2: 3, # 'e'
- 18: 0, # 'f'
- 27: 2, # 'g'
- 25: 1, # 'h'
- 3: 1, # 'i'
- 24: 0, # 'j'
- 10: 2, # 'k'
- 5: 2, # 'l'
- 13: 3, # 'm'
- 4: 0, # 'n'
- 15: 0, # 'o'
- 26: 1, # 'p'
- 7: 3, # 'r'
- 8: 0, # 's'
- 9: 0, # 't'
- 14: 3, # 'u'
- 32: 0, # 'v'
- 57: 0, # 'w'
- 58: 0, # 'x'
- 11: 0, # 'y'
- 22: 2, # 'z'
- 63: 0, # '·'
- 54: 1, # 'Ç'
- 50: 2, # 'Ö'
- 55: 0, # 'Ü'
- 59: 0, # 'â'
- 33: 1, # 'ç'
- 61: 1, # 'î'
- 34: 2, # 'ö'
- 17: 0, # 'ü'
- 30: 1, # 'ğ'
- 41: 1, # 'İ'
- 6: 1, # 'ı'
- 40: 1, # 'Ş'
- 19: 1, # 'ş'
- },
-}
-
-# 255: Undefined characters that did not exist in training text
-# 254: Carriage/Return
-# 253: symbol (punctuation) that does not belong to word
-# 252: 0 - 9
-# 251: Control characters
-
-# Character Mapping Table(s):
-ISO_8859_9_TURKISH_CHAR_TO_ORDER = {
- 0: 255, # '\x00'
- 1: 255, # '\x01'
- 2: 255, # '\x02'
- 3: 255, # '\x03'
- 4: 255, # '\x04'
- 5: 255, # '\x05'
- 6: 255, # '\x06'
- 7: 255, # '\x07'
- 8: 255, # '\x08'
- 9: 255, # '\t'
- 10: 255, # '\n'
- 11: 255, # '\x0b'
- 12: 255, # '\x0c'
- 13: 255, # '\r'
- 14: 255, # '\x0e'
- 15: 255, # '\x0f'
- 16: 255, # '\x10'
- 17: 255, # '\x11'
- 18: 255, # '\x12'
- 19: 255, # '\x13'
- 20: 255, # '\x14'
- 21: 255, # '\x15'
- 22: 255, # '\x16'
- 23: 255, # '\x17'
- 24: 255, # '\x18'
- 25: 255, # '\x19'
- 26: 255, # '\x1a'
- 27: 255, # '\x1b'
- 28: 255, # '\x1c'
- 29: 255, # '\x1d'
- 30: 255, # '\x1e'
- 31: 255, # '\x1f'
- 32: 255, # ' '
- 33: 255, # '!'
- 34: 255, # '"'
- 35: 255, # '#'
- 36: 255, # '$'
- 37: 255, # '%'
- 38: 255, # '&'
- 39: 255, # "'"
- 40: 255, # '('
- 41: 255, # ')'
- 42: 255, # '*'
- 43: 255, # '+'
- 44: 255, # ','
- 45: 255, # '-'
- 46: 255, # '.'
- 47: 255, # '/'
- 48: 255, # '0'
- 49: 255, # '1'
- 50: 255, # '2'
- 51: 255, # '3'
- 52: 255, # '4'
- 53: 255, # '5'
- 54: 255, # '6'
- 55: 255, # '7'
- 56: 255, # '8'
- 57: 255, # '9'
- 58: 255, # ':'
- 59: 255, # ';'
- 60: 255, # '<'
- 61: 255, # '='
- 62: 255, # '>'
- 63: 255, # '?'
- 64: 255, # '@'
- 65: 23, # 'A'
- 66: 37, # 'B'
- 67: 47, # 'C'
- 68: 39, # 'D'
- 69: 29, # 'E'
- 70: 52, # 'F'
- 71: 36, # 'G'
- 72: 45, # 'H'
- 73: 53, # 'I'
- 74: 60, # 'J'
- 75: 16, # 'K'
- 76: 49, # 'L'
- 77: 20, # 'M'
- 78: 46, # 'N'
- 79: 42, # 'O'
- 80: 48, # 'P'
- 81: 69, # 'Q'
- 82: 44, # 'R'
- 83: 35, # 'S'
- 84: 31, # 'T'
- 85: 51, # 'U'
- 86: 38, # 'V'
- 87: 62, # 'W'
- 88: 65, # 'X'
- 89: 43, # 'Y'
- 90: 56, # 'Z'
- 91: 255, # '['
- 92: 255, # '\\'
- 93: 255, # ']'
- 94: 255, # '^'
- 95: 255, # '_'
- 96: 255, # '`'
- 97: 1, # 'a'
- 98: 21, # 'b'
- 99: 28, # 'c'
- 100: 12, # 'd'
- 101: 2, # 'e'
- 102: 18, # 'f'
- 103: 27, # 'g'
- 104: 25, # 'h'
- 105: 3, # 'i'
- 106: 24, # 'j'
- 107: 10, # 'k'
- 108: 5, # 'l'
- 109: 13, # 'm'
- 110: 4, # 'n'
- 111: 15, # 'o'
- 112: 26, # 'p'
- 113: 64, # 'q'
- 114: 7, # 'r'
- 115: 8, # 's'
- 116: 9, # 't'
- 117: 14, # 'u'
- 118: 32, # 'v'
- 119: 57, # 'w'
- 120: 58, # 'x'
- 121: 11, # 'y'
- 122: 22, # 'z'
- 123: 255, # '{'
- 124: 255, # '|'
- 125: 255, # '}'
- 126: 255, # '~'
- 127: 255, # '\x7f'
- 128: 180, # '\x80'
- 129: 179, # '\x81'
- 130: 178, # '\x82'
- 131: 177, # '\x83'
- 132: 176, # '\x84'
- 133: 175, # '\x85'
- 134: 174, # '\x86'
- 135: 173, # '\x87'
- 136: 172, # '\x88'
- 137: 171, # '\x89'
- 138: 170, # '\x8a'
- 139: 169, # '\x8b'
- 140: 168, # '\x8c'
- 141: 167, # '\x8d'
- 142: 166, # '\x8e'
- 143: 165, # '\x8f'
- 144: 164, # '\x90'
- 145: 163, # '\x91'
- 146: 162, # '\x92'
- 147: 161, # '\x93'
- 148: 160, # '\x94'
- 149: 159, # '\x95'
- 150: 101, # '\x96'
- 151: 158, # '\x97'
- 152: 157, # '\x98'
- 153: 156, # '\x99'
- 154: 155, # '\x9a'
- 155: 154, # '\x9b'
- 156: 153, # '\x9c'
- 157: 152, # '\x9d'
- 158: 151, # '\x9e'
- 159: 106, # '\x9f'
- 160: 150, # '\xa0'
- 161: 149, # '¡'
- 162: 148, # '¢'
- 163: 147, # '£'
- 164: 146, # '¤'
- 165: 145, # '¥'
- 166: 144, # '¦'
- 167: 100, # '§'
- 168: 143, # '¨'
- 169: 142, # '©'
- 170: 141, # 'ª'
- 171: 140, # '«'
- 172: 139, # '¬'
- 173: 138, # '\xad'
- 174: 137, # '®'
- 175: 136, # '¯'
- 176: 94, # '°'
- 177: 80, # '±'
- 178: 93, # '²'
- 179: 135, # '³'
- 180: 105, # '´'
- 181: 134, # 'µ'
- 182: 133, # '¶'
- 183: 63, # '·'
- 184: 132, # '¸'
- 185: 131, # '¹'
- 186: 130, # 'º'
- 187: 129, # '»'
- 188: 128, # '¼'
- 189: 127, # '½'
- 190: 126, # '¾'
- 191: 125, # '¿'
- 192: 124, # 'À'
- 193: 104, # 'Á'
- 194: 73, # 'Â'
- 195: 99, # 'Ã'
- 196: 79, # 'Ä'
- 197: 85, # 'Å'
- 198: 123, # 'Æ'
- 199: 54, # 'Ç'
- 200: 122, # 'È'
- 201: 98, # 'É'
- 202: 92, # 'Ê'
- 203: 121, # 'Ë'
- 204: 120, # 'Ì'
- 205: 91, # 'Í'
- 206: 103, # 'Î'
- 207: 119, # 'Ï'
- 208: 68, # 'Ğ'
- 209: 118, # 'Ñ'
- 210: 117, # 'Ò'
- 211: 97, # 'Ó'
- 212: 116, # 'Ô'
- 213: 115, # 'Õ'
- 214: 50, # 'Ö'
- 215: 90, # '×'
- 216: 114, # 'Ø'
- 217: 113, # 'Ù'
- 218: 112, # 'Ú'
- 219: 111, # 'Û'
- 220: 55, # 'Ü'
- 221: 41, # 'İ'
- 222: 40, # 'Ş'
- 223: 86, # 'ß'
- 224: 89, # 'à'
- 225: 70, # 'á'
- 226: 59, # 'â'
- 227: 78, # 'ã'
- 228: 71, # 'ä'
- 229: 82, # 'å'
- 230: 88, # 'æ'
- 231: 33, # 'ç'
- 232: 77, # 'è'
- 233: 66, # 'é'
- 234: 84, # 'ê'
- 235: 83, # 'ë'
- 236: 110, # 'ì'
- 237: 75, # 'í'
- 238: 61, # 'î'
- 239: 96, # 'ï'
- 240: 30, # 'ğ'
- 241: 67, # 'ñ'
- 242: 109, # 'ò'
- 243: 74, # 'ó'
- 244: 87, # 'ô'
- 245: 102, # 'õ'
- 246: 34, # 'ö'
- 247: 95, # '÷'
- 248: 81, # 'ø'
- 249: 108, # 'ù'
- 250: 76, # 'ú'
- 251: 72, # 'û'
- 252: 17, # 'ü'
- 253: 6, # 'ı'
- 254: 19, # 'ş'
- 255: 107, # 'ÿ'
-}
-
-ISO_8859_9_TURKISH_MODEL = SingleByteCharSetModel(
- charset_name="ISO-8859-9",
- language="Turkish",
- char_to_order_map=ISO_8859_9_TURKISH_CHAR_TO_ORDER,
- language_model=TURKISH_LANG_MODEL,
- typical_positive_ratio=0.97029,
- keep_ascii_letters=True,
- alphabet="ABCDEFGHIJKLMNOPRSTUVYZabcdefghijklmnoprstuvyzÂÇÎÖÛÜâçîöûüĞğİıŞş",
-)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py
deleted file mode 100644
index 59a01d91..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py
+++ /dev/null
@@ -1,147 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0 # undefined
-OTH = 1 # other
-ASC = 2 # ascii capital letter
-ASS = 3 # ascii small letter
-ACV = 4 # accent capital vowel
-ACO = 5 # accent capital other
-ASV = 6 # accent small vowel
-ASO = 7 # accent small other
-CLASS_NUM = 8 # total classes
-
-# fmt: off
-Latin1_CharToClass = (
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F
- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57
- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F
- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77
- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F
- OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87
- OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F
- UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97
- OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF
- ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7
- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF
- ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7
- ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF
- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7
- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF
- ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7
- ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-Latin1ClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO
- 0, 0, 0, 0, 0, 0, 0, 0, # UDF
- 0, 3, 3, 3, 3, 3, 3, 3, # OTH
- 0, 3, 3, 3, 3, 3, 3, 3, # ASC
- 0, 3, 3, 3, 1, 1, 3, 3, # ASS
- 0, 3, 3, 3, 1, 2, 1, 2, # ACV
- 0, 3, 3, 3, 3, 3, 3, 3, # ACO
- 0, 3, 1, 3, 1, 1, 1, 3, # ASV
- 0, 3, 1, 3, 1, 1, 3, 3, # ASO
-)
-# fmt: on
-
-
-class Latin1Prober(CharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self._last_char_class = OTH
- self._freq_counter: List[int] = []
- self.reset()
-
- def reset(self) -> None:
- self._last_char_class = OTH
- self._freq_counter = [0] * FREQ_CAT_NUM
- super().reset()
-
- @property
- def charset_name(self) -> str:
- return "ISO-8859-1"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- byte_str = self.remove_xml_tags(byte_str)
- for c in byte_str:
- char_class = Latin1_CharToClass[c]
- freq = Latin1ClassModel[(self._last_char_class * CLASS_NUM) + char_class]
- if freq == 0:
- self._state = ProbingState.NOT_ME
- break
- self._freq_counter[freq] += 1
- self._last_char_class = char_class
-
- return self.state
-
- def get_confidence(self) -> float:
- if self.state == ProbingState.NOT_ME:
- return 0.01
-
- total = sum(self._freq_counter)
- confidence = (
- 0.0
- if total < 0.01
- else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total
- )
- confidence = max(confidence, 0.0)
- # lower the confidence of latin1 so that other more accurate
- # detector can take priority.
- confidence *= 0.73
- return confidence
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py
deleted file mode 100644
index 1425d10e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py
+++ /dev/null
@@ -1,162 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# This code was modified from latin1prober.py by Rob Speer .
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Rob Speer - adapt to MacRoman encoding
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-FREQ_CAT_NUM = 4
-
-UDF = 0 # undefined
-OTH = 1 # other
-ASC = 2 # ascii capital letter
-ASS = 3 # ascii small letter
-ACV = 4 # accent capital vowel
-ACO = 5 # accent capital other
-ASV = 6 # accent small vowel
-ASO = 7 # accent small other
-ODD = 8 # character that is unlikely to appear
-CLASS_NUM = 9 # total classes
-
-# The change from Latin1 is that we explicitly look for extended characters
-# that are infrequently-occurring symbols, and consider them to always be
-# improbable. This should let MacRoman get out of the way of more likely
-# encodings in most situations.
-
-# fmt: off
-MacRoman_CharToClass = (
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F
- OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F
- ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57
- ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F
- OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F
- ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77
- ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F
- ACV, ACV, ACO, ACV, ACO, ACV, ACV, ASV, # 80 - 87
- ASV, ASV, ASV, ASV, ASV, ASO, ASV, ASV, # 88 - 8F
- ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASV, # 90 - 97
- ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # 98 - 9F
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, ASO, # A0 - A7
- OTH, OTH, ODD, ODD, OTH, OTH, ACV, ACV, # A8 - AF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7
- OTH, OTH, OTH, OTH, OTH, OTH, ASV, ASV, # B8 - BF
- OTH, OTH, ODD, OTH, ODD, OTH, OTH, OTH, # C0 - C7
- OTH, OTH, OTH, ACV, ACV, ACV, ACV, ASV, # C8 - CF
- OTH, OTH, OTH, OTH, OTH, OTH, OTH, ODD, # D0 - D7
- ASV, ACV, ODD, OTH, OTH, OTH, OTH, OTH, # D8 - DF
- OTH, OTH, OTH, OTH, OTH, ACV, ACV, ACV, # E0 - E7
- ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # E8 - EF
- ODD, ACV, ACV, ACV, ACV, ASV, ODD, ODD, # F0 - F7
- ODD, ODD, ODD, ODD, ODD, ODD, ODD, ODD, # F8 - FF
-)
-
-# 0 : illegal
-# 1 : very unlikely
-# 2 : normal
-# 3 : very likely
-MacRomanClassModel = (
-# UDF OTH ASC ASS ACV ACO ASV ASO ODD
- 0, 0, 0, 0, 0, 0, 0, 0, 0, # UDF
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # OTH
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # ASC
- 0, 3, 3, 3, 1, 1, 3, 3, 1, # ASS
- 0, 3, 3, 3, 1, 2, 1, 2, 1, # ACV
- 0, 3, 3, 3, 3, 3, 3, 3, 1, # ACO
- 0, 3, 1, 3, 1, 1, 1, 3, 1, # ASV
- 0, 3, 1, 3, 1, 1, 3, 3, 1, # ASO
- 0, 1, 1, 1, 1, 1, 1, 1, 1, # ODD
-)
-# fmt: on
-
-
-class MacRomanProber(CharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self._last_char_class = OTH
- self._freq_counter: List[int] = []
- self.reset()
-
- def reset(self) -> None:
- self._last_char_class = OTH
- self._freq_counter = [0] * FREQ_CAT_NUM
-
- # express the prior that MacRoman is a somewhat rare encoding;
- # this can be done by starting out in a slightly improbable state
- # that must be overcome
- self._freq_counter[2] = 10
-
- super().reset()
-
- @property
- def charset_name(self) -> str:
- return "MacRoman"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- byte_str = self.remove_xml_tags(byte_str)
- for c in byte_str:
- char_class = MacRoman_CharToClass[c]
- freq = MacRomanClassModel[(self._last_char_class * CLASS_NUM) + char_class]
- if freq == 0:
- self._state = ProbingState.NOT_ME
- break
- self._freq_counter[freq] += 1
- self._last_char_class = char_class
-
- return self.state
-
- def get_confidence(self) -> float:
- if self.state == ProbingState.NOT_ME:
- return 0.01
-
- total = sum(self._freq_counter)
- confidence = (
- 0.0
- if total < 0.01
- else (self._freq_counter[3] - self._freq_counter[1] * 20.0) / total
- )
- confidence = max(confidence, 0.0)
- # lower the confidence of MacRoman so that other more accurate
- # detector can take priority.
- confidence *= 0.73
- return confidence
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
deleted file mode 100644
index 666307e8..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+++ /dev/null
@@ -1,95 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Optional, Union
-
-from .chardistribution import CharDistributionAnalysis
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import LanguageFilter, MachineState, ProbingState
-
-
-class MultiByteCharSetProber(CharSetProber):
- """
- MultiByteCharSetProber
- """
-
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.distribution_analyzer: Optional[CharDistributionAnalysis] = None
- self.coding_sm: Optional[CodingStateMachine] = None
- self._last_char = bytearray(b"\0\0")
-
- def reset(self) -> None:
- super().reset()
- if self.coding_sm:
- self.coding_sm.reset()
- if self.distribution_analyzer:
- self.distribution_analyzer.reset()
- self._last_char = bytearray(b"\0\0")
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.distribution_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
- return self.distribution_analyzer.get_confidence()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
deleted file mode 100644
index 6cb9cc7b..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py
+++ /dev/null
@@ -1,57 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-# Proofpoint, Inc.
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .big5prober import Big5Prober
-from .charsetgroupprober import CharSetGroupProber
-from .cp949prober import CP949Prober
-from .enums import LanguageFilter
-from .eucjpprober import EUCJPProber
-from .euckrprober import EUCKRProber
-from .euctwprober import EUCTWProber
-from .gb2312prober import GB2312Prober
-from .johabprober import JOHABProber
-from .sjisprober import SJISProber
-from .utf8prober import UTF8Prober
-
-
-class MBCSGroupProber(CharSetGroupProber):
- def __init__(self, lang_filter: LanguageFilter = LanguageFilter.NONE) -> None:
- super().__init__(lang_filter=lang_filter)
- self.probers = [
- UTF8Prober(),
- SJISProber(),
- EUCJPProber(),
- GB2312Prober(),
- EUCKRProber(),
- CP949Prober(),
- Big5Prober(),
- EUCTWProber(),
- JOHABProber(),
- ]
- self.reset()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py
deleted file mode 100644
index 7bbe97e6..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py
+++ /dev/null
@@ -1,661 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .codingstatemachinedict import CodingStateMachineDict
-from .enums import MachineState
-
-# BIG5
-
-# fmt: off
-BIG5_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as legal value
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f
- 4, 4, 4, 4, 4, 4, 4, 4, # 80 - 87
- 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f
- 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97
- 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f
- 4, 3, 3, 3, 3, 3, 3, 3, # a0 - a7
- 3, 3, 3, 3, 3, 3, 3, 3, # a8 - af
- 3, 3, 3, 3, 3, 3, 3, 3, # b0 - b7
- 3, 3, 3, 3, 3, 3, 3, 3, # b8 - bf
- 3, 3, 3, 3, 3, 3, 3, 3, # c0 - c7
- 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf
- 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7
- 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff
-)
-
-BIG5_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,#08-0f
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START#10-17
-)
-# fmt: on
-
-BIG5_CHAR_LEN_TABLE = (0, 1, 1, 2, 0)
-
-BIG5_SM_MODEL: CodingStateMachineDict = {
- "class_table": BIG5_CLS,
- "class_factor": 5,
- "state_table": BIG5_ST,
- "char_len_table": BIG5_CHAR_LEN_TABLE,
- "name": "Big5",
-}
-
-# CP949
-# fmt: off
-CP949_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, # 00 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, # 10 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 3f
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 4f
- 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 50 - 5f
- 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, # 60 - 6f
- 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1, # 70 - 7f
- 0, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 80 - 8f
- 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 9f
- 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, # a0 - af
- 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, # b0 - bf
- 7, 7, 7, 7, 7, 7, 9, 2, 2, 3, 2, 2, 2, 2, 2, 2, # c0 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # d0 - df
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, # e0 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, # f0 - ff
-)
-
-CP949_ST = (
-#cls= 0 1 2 3 4 5 6 7 8 9 # previous state =
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.START,MachineState.START, 4, 5,MachineState.ERROR, 6, # MachineState.START
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, # MachineState.ERROR
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 3
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 4
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, # 5
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START, # 6
-)
-# fmt: on
-
-CP949_CHAR_LEN_TABLE = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2)
-
-CP949_SM_MODEL: CodingStateMachineDict = {
- "class_table": CP949_CLS,
- "class_factor": 10,
- "state_table": CP949_ST,
- "char_len_table": CP949_CHAR_LEN_TABLE,
- "name": "CP949",
-}
-
-# EUC-JP
-# fmt: off
-EUCJP_CLS = (
- 4, 4, 4, 4, 4, 4, 4, 4, # 00 - 07
- 4, 4, 4, 4, 4, 4, 5, 5, # 08 - 0f
- 4, 4, 4, 4, 4, 4, 4, 4, # 10 - 17
- 4, 4, 4, 5, 4, 4, 4, 4, # 18 - 1f
- 4, 4, 4, 4, 4, 4, 4, 4, # 20 - 27
- 4, 4, 4, 4, 4, 4, 4, 4, # 28 - 2f
- 4, 4, 4, 4, 4, 4, 4, 4, # 30 - 37
- 4, 4, 4, 4, 4, 4, 4, 4, # 38 - 3f
- 4, 4, 4, 4, 4, 4, 4, 4, # 40 - 47
- 4, 4, 4, 4, 4, 4, 4, 4, # 48 - 4f
- 4, 4, 4, 4, 4, 4, 4, 4, # 50 - 57
- 4, 4, 4, 4, 4, 4, 4, 4, # 58 - 5f
- 4, 4, 4, 4, 4, 4, 4, 4, # 60 - 67
- 4, 4, 4, 4, 4, 4, 4, 4, # 68 - 6f
- 4, 4, 4, 4, 4, 4, 4, 4, # 70 - 77
- 4, 4, 4, 4, 4, 4, 4, 4, # 78 - 7f
- 5, 5, 5, 5, 5, 5, 5, 5, # 80 - 87
- 5, 5, 5, 5, 5, 5, 1, 3, # 88 - 8f
- 5, 5, 5, 5, 5, 5, 5, 5, # 90 - 97
- 5, 5, 5, 5, 5, 5, 5, 5, # 98 - 9f
- 5, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 0, 5 # f8 - ff
-)
-
-EUCJP_ST = (
- 3, 4, 3, 5,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 3,MachineState.ERROR,#18-1f
- 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START#20-27
-)
-# fmt: on
-
-EUCJP_CHAR_LEN_TABLE = (2, 2, 2, 3, 1, 0)
-
-EUCJP_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCJP_CLS,
- "class_factor": 6,
- "state_table": EUCJP_ST,
- "char_len_table": EUCJP_CHAR_LEN_TABLE,
- "name": "EUC-JP",
-}
-
-# EUC-KR
-# fmt: off
-EUCKR_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47
- 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f
- 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57
- 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f
- 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67
- 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f
- 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77
- 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 3, 3, 3, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 3, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 2, 2, 2, 2, 2, 2, 2, 2, # e0 - e7
- 2, 2, 2, 2, 2, 2, 2, 2, # e8 - ef
- 2, 2, 2, 2, 2, 2, 2, 2, # f0 - f7
- 2, 2, 2, 2, 2, 2, 2, 0 # f8 - ff
-)
-
-EUCKR_ST = (
- MachineState.ERROR,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #08-0f
-)
-# fmt: on
-
-EUCKR_CHAR_LEN_TABLE = (0, 1, 2, 0)
-
-EUCKR_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCKR_CLS,
- "class_factor": 4,
- "state_table": EUCKR_ST,
- "char_len_table": EUCKR_CHAR_LEN_TABLE,
- "name": "EUC-KR",
-}
-
-# JOHAB
-# fmt: off
-JOHAB_CLS = (
- 4,4,4,4,4,4,4,4, # 00 - 07
- 4,4,4,4,4,4,0,0, # 08 - 0f
- 4,4,4,4,4,4,4,4, # 10 - 17
- 4,4,4,0,4,4,4,4, # 18 - 1f
- 4,4,4,4,4,4,4,4, # 20 - 27
- 4,4,4,4,4,4,4,4, # 28 - 2f
- 4,3,3,3,3,3,3,3, # 30 - 37
- 3,3,3,3,3,3,3,3, # 38 - 3f
- 3,1,1,1,1,1,1,1, # 40 - 47
- 1,1,1,1,1,1,1,1, # 48 - 4f
- 1,1,1,1,1,1,1,1, # 50 - 57
- 1,1,1,1,1,1,1,1, # 58 - 5f
- 1,1,1,1,1,1,1,1, # 60 - 67
- 1,1,1,1,1,1,1,1, # 68 - 6f
- 1,1,1,1,1,1,1,1, # 70 - 77
- 1,1,1,1,1,1,1,2, # 78 - 7f
- 6,6,6,6,8,8,8,8, # 80 - 87
- 8,8,8,8,8,8,8,8, # 88 - 8f
- 8,7,7,7,7,7,7,7, # 90 - 97
- 7,7,7,7,7,7,7,7, # 98 - 9f
- 7,7,7,7,7,7,7,7, # a0 - a7
- 7,7,7,7,7,7,7,7, # a8 - af
- 7,7,7,7,7,7,7,7, # b0 - b7
- 7,7,7,7,7,7,7,7, # b8 - bf
- 7,7,7,7,7,7,7,7, # c0 - c7
- 7,7,7,7,7,7,7,7, # c8 - cf
- 7,7,7,7,5,5,5,5, # d0 - d7
- 5,9,9,9,9,9,9,5, # d8 - df
- 9,9,9,9,9,9,9,9, # e0 - e7
- 9,9,9,9,9,9,9,9, # e8 - ef
- 9,9,9,9,9,9,9,9, # f0 - f7
- 9,9,5,5,5,5,5,0 # f8 - ff
-)
-
-JOHAB_ST = (
-# cls = 0 1 2 3 4 5 6 7 8 9
- MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,3 ,3 ,4 , # MachineState.START
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME, # MachineState.ITS_ME
- MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR ,MachineState.ERROR , # MachineState.ERROR
- MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.ERROR ,MachineState.ERROR ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START ,MachineState.START , # 3
- MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START ,MachineState.ERROR ,MachineState.START , # 4
-)
-# fmt: on
-
-JOHAB_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 0, 0, 2, 2, 2)
-
-JOHAB_SM_MODEL: CodingStateMachineDict = {
- "class_table": JOHAB_CLS,
- "class_factor": 10,
- "state_table": JOHAB_ST,
- "char_len_table": JOHAB_CHAR_LEN_TABLE,
- "name": "Johab",
-}
-
-# EUC-TW
-# fmt: off
-EUCTW_CLS = (
- 2, 2, 2, 2, 2, 2, 2, 2, # 00 - 07
- 2, 2, 2, 2, 2, 2, 0, 0, # 08 - 0f
- 2, 2, 2, 2, 2, 2, 2, 2, # 10 - 17
- 2, 2, 2, 0, 2, 2, 2, 2, # 18 - 1f
- 2, 2, 2, 2, 2, 2, 2, 2, # 20 - 27
- 2, 2, 2, 2, 2, 2, 2, 2, # 28 - 2f
- 2, 2, 2, 2, 2, 2, 2, 2, # 30 - 37
- 2, 2, 2, 2, 2, 2, 2, 2, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 2, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 6, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 3, 4, 4, 4, 4, 4, 4, # a0 - a7
- 5, 5, 1, 1, 1, 1, 1, 1, # a8 - af
- 1, 1, 1, 1, 1, 1, 1, 1, # b0 - b7
- 1, 1, 1, 1, 1, 1, 1, 1, # b8 - bf
- 1, 1, 3, 1, 3, 3, 3, 3, # c0 - c7
- 3, 3, 3, 3, 3, 3, 3, 3, # c8 - cf
- 3, 3, 3, 3, 3, 3, 3, 3, # d0 - d7
- 3, 3, 3, 3, 3, 3, 3, 3, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 3, 3, 3, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 3, 3, 0 # f8 - ff
-)
-
-EUCTW_ST = (
- MachineState.ERROR,MachineState.ERROR,MachineState.START, 3, 3, 3, 4,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.START,MachineState.ERROR,#10-17
- MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,#20-27
- MachineState.START,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-# fmt: on
-
-EUCTW_CHAR_LEN_TABLE = (0, 0, 1, 2, 2, 2, 3)
-
-EUCTW_SM_MODEL: CodingStateMachineDict = {
- "class_table": EUCTW_CLS,
- "class_factor": 7,
- "state_table": EUCTW_ST,
- "char_len_table": EUCTW_CHAR_LEN_TABLE,
- "name": "x-euc-tw",
-}
-
-# GB2312
-# fmt: off
-GB2312_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 3, 3, 3, 3, 3, 3, 3, 3, # 30 - 37
- 3, 3, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 4, # 78 - 7f
- 5, 6, 6, 6, 6, 6, 6, 6, # 80 - 87
- 6, 6, 6, 6, 6, 6, 6, 6, # 88 - 8f
- 6, 6, 6, 6, 6, 6, 6, 6, # 90 - 97
- 6, 6, 6, 6, 6, 6, 6, 6, # 98 - 9f
- 6, 6, 6, 6, 6, 6, 6, 6, # a0 - a7
- 6, 6, 6, 6, 6, 6, 6, 6, # a8 - af
- 6, 6, 6, 6, 6, 6, 6, 6, # b0 - b7
- 6, 6, 6, 6, 6, 6, 6, 6, # b8 - bf
- 6, 6, 6, 6, 6, 6, 6, 6, # c0 - c7
- 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf
- 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7
- 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df
- 6, 6, 6, 6, 6, 6, 6, 6, # e0 - e7
- 6, 6, 6, 6, 6, 6, 6, 6, # e8 - ef
- 6, 6, 6, 6, 6, 6, 6, 6, # f0 - f7
- 6, 6, 6, 6, 6, 6, 6, 0 # f8 - ff
-)
-
-GB2312_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START, 3,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,#10-17
- 4,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ERROR,MachineState.ERROR, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#20-27
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.START #28-2f
-)
-# fmt: on
-
-# To be accurate, the length of class 6 can be either 2 or 4.
-# But it is not necessary to discriminate between the two since
-# it is used for frequency analysis only, and we are validating
-# each code range there as well. So it is safe to set it to be
-# 2 here.
-GB2312_CHAR_LEN_TABLE = (0, 1, 1, 1, 1, 1, 2)
-
-GB2312_SM_MODEL: CodingStateMachineDict = {
- "class_table": GB2312_CLS,
- "class_factor": 7,
- "state_table": GB2312_ST,
- "char_len_table": GB2312_CHAR_LEN_TABLE,
- "name": "GB2312",
-}
-
-# Shift_JIS
-# fmt: off
-SJIS_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 2, 2, 2, 2, 2, 2, 2, 2, # 40 - 47
- 2, 2, 2, 2, 2, 2, 2, 2, # 48 - 4f
- 2, 2, 2, 2, 2, 2, 2, 2, # 50 - 57
- 2, 2, 2, 2, 2, 2, 2, 2, # 58 - 5f
- 2, 2, 2, 2, 2, 2, 2, 2, # 60 - 67
- 2, 2, 2, 2, 2, 2, 2, 2, # 68 - 6f
- 2, 2, 2, 2, 2, 2, 2, 2, # 70 - 77
- 2, 2, 2, 2, 2, 2, 2, 1, # 78 - 7f
- 3, 3, 3, 3, 3, 2, 2, 3, # 80 - 87
- 3, 3, 3, 3, 3, 3, 3, 3, # 88 - 8f
- 3, 3, 3, 3, 3, 3, 3, 3, # 90 - 97
- 3, 3, 3, 3, 3, 3, 3, 3, # 98 - 9f
- #0xa0 is illegal in sjis encoding, but some pages does
- #contain such byte. We need to be more error forgiven.
- 2, 2, 2, 2, 2, 2, 2, 2, # a0 - a7
- 2, 2, 2, 2, 2, 2, 2, 2, # a8 - af
- 2, 2, 2, 2, 2, 2, 2, 2, # b0 - b7
- 2, 2, 2, 2, 2, 2, 2, 2, # b8 - bf
- 2, 2, 2, 2, 2, 2, 2, 2, # c0 - c7
- 2, 2, 2, 2, 2, 2, 2, 2, # c8 - cf
- 2, 2, 2, 2, 2, 2, 2, 2, # d0 - d7
- 2, 2, 2, 2, 2, 2, 2, 2, # d8 - df
- 3, 3, 3, 3, 3, 3, 3, 3, # e0 - e7
- 3, 3, 3, 3, 3, 4, 4, 4, # e8 - ef
- 3, 3, 3, 3, 3, 3, 3, 3, # f0 - f7
- 3, 3, 3, 3, 3, 0, 0, 0, # f8 - ff
-)
-
-SJIS_ST = (
- MachineState.ERROR,MachineState.START,MachineState.START, 3,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START #10-17
-)
-# fmt: on
-
-SJIS_CHAR_LEN_TABLE = (0, 1, 1, 2, 0, 0)
-
-SJIS_SM_MODEL: CodingStateMachineDict = {
- "class_table": SJIS_CLS,
- "class_factor": 6,
- "state_table": SJIS_ST,
- "char_len_table": SJIS_CHAR_LEN_TABLE,
- "name": "Shift_JIS",
-}
-
-# UCS2-BE
-# fmt: off
-UCS2BE_CLS = (
- 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7
- 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af
- 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7
- 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf
- 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7
- 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf
- 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7
- 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff
-)
-
-UCS2BE_ST = (
- 5, 7, 7,MachineState.ERROR, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,#10-17
- 6, 6, 6, 6, 6,MachineState.ITS_ME, 6, 6,#18-1f
- 6, 6, 6, 6, 5, 7, 7,MachineState.ERROR,#20-27
- 5, 8, 6, 6,MachineState.ERROR, 6, 6, 6,#28-2f
- 6, 6, 6, 6,MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-# fmt: on
-
-UCS2BE_CHAR_LEN_TABLE = (2, 2, 2, 0, 2, 2)
-
-UCS2BE_SM_MODEL: CodingStateMachineDict = {
- "class_table": UCS2BE_CLS,
- "class_factor": 6,
- "state_table": UCS2BE_ST,
- "char_len_table": UCS2BE_CHAR_LEN_TABLE,
- "name": "UTF-16BE",
-}
-
-# UCS2-LE
-# fmt: off
-UCS2LE_CLS = (
- 0, 0, 0, 0, 0, 0, 0, 0, # 00 - 07
- 0, 0, 1, 0, 0, 2, 0, 0, # 08 - 0f
- 0, 0, 0, 0, 0, 0, 0, 0, # 10 - 17
- 0, 0, 0, 3, 0, 0, 0, 0, # 18 - 1f
- 0, 0, 0, 0, 0, 0, 0, 0, # 20 - 27
- 0, 3, 3, 3, 3, 3, 0, 0, # 28 - 2f
- 0, 0, 0, 0, 0, 0, 0, 0, # 30 - 37
- 0, 0, 0, 0, 0, 0, 0, 0, # 38 - 3f
- 0, 0, 0, 0, 0, 0, 0, 0, # 40 - 47
- 0, 0, 0, 0, 0, 0, 0, 0, # 48 - 4f
- 0, 0, 0, 0, 0, 0, 0, 0, # 50 - 57
- 0, 0, 0, 0, 0, 0, 0, 0, # 58 - 5f
- 0, 0, 0, 0, 0, 0, 0, 0, # 60 - 67
- 0, 0, 0, 0, 0, 0, 0, 0, # 68 - 6f
- 0, 0, 0, 0, 0, 0, 0, 0, # 70 - 77
- 0, 0, 0, 0, 0, 0, 0, 0, # 78 - 7f
- 0, 0, 0, 0, 0, 0, 0, 0, # 80 - 87
- 0, 0, 0, 0, 0, 0, 0, 0, # 88 - 8f
- 0, 0, 0, 0, 0, 0, 0, 0, # 90 - 97
- 0, 0, 0, 0, 0, 0, 0, 0, # 98 - 9f
- 0, 0, 0, 0, 0, 0, 0, 0, # a0 - a7
- 0, 0, 0, 0, 0, 0, 0, 0, # a8 - af
- 0, 0, 0, 0, 0, 0, 0, 0, # b0 - b7
- 0, 0, 0, 0, 0, 0, 0, 0, # b8 - bf
- 0, 0, 0, 0, 0, 0, 0, 0, # c0 - c7
- 0, 0, 0, 0, 0, 0, 0, 0, # c8 - cf
- 0, 0, 0, 0, 0, 0, 0, 0, # d0 - d7
- 0, 0, 0, 0, 0, 0, 0, 0, # d8 - df
- 0, 0, 0, 0, 0, 0, 0, 0, # e0 - e7
- 0, 0, 0, 0, 0, 0, 0, 0, # e8 - ef
- 0, 0, 0, 0, 0, 0, 0, 0, # f0 - f7
- 0, 0, 0, 0, 0, 0, 4, 5 # f8 - ff
-)
-
-UCS2LE_ST = (
- 6, 6, 7, 6, 4, 3,MachineState.ERROR,MachineState.ERROR,#00-07
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#08-0f
- MachineState.ITS_ME,MachineState.ITS_ME, 5, 5, 5,MachineState.ERROR,MachineState.ITS_ME,MachineState.ERROR,#10-17
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR, 6, 6,#18-1f
- 7, 6, 8, 8, 5, 5, 5,MachineState.ERROR,#20-27
- 5, 5, 5,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5,#28-2f
- 5, 5, 5,MachineState.ERROR, 5,MachineState.ERROR,MachineState.START,MachineState.START #30-37
-)
-# fmt: on
-
-UCS2LE_CHAR_LEN_TABLE = (2, 2, 2, 2, 2, 2)
-
-UCS2LE_SM_MODEL: CodingStateMachineDict = {
- "class_table": UCS2LE_CLS,
- "class_factor": 6,
- "state_table": UCS2LE_ST,
- "char_len_table": UCS2LE_CHAR_LEN_TABLE,
- "name": "UTF-16LE",
-}
-
-# UTF-8
-# fmt: off
-UTF8_CLS = (
- 1, 1, 1, 1, 1, 1, 1, 1, # 00 - 07 #allow 0x00 as a legal value
- 1, 1, 1, 1, 1, 1, 0, 0, # 08 - 0f
- 1, 1, 1, 1, 1, 1, 1, 1, # 10 - 17
- 1, 1, 1, 0, 1, 1, 1, 1, # 18 - 1f
- 1, 1, 1, 1, 1, 1, 1, 1, # 20 - 27
- 1, 1, 1, 1, 1, 1, 1, 1, # 28 - 2f
- 1, 1, 1, 1, 1, 1, 1, 1, # 30 - 37
- 1, 1, 1, 1, 1, 1, 1, 1, # 38 - 3f
- 1, 1, 1, 1, 1, 1, 1, 1, # 40 - 47
- 1, 1, 1, 1, 1, 1, 1, 1, # 48 - 4f
- 1, 1, 1, 1, 1, 1, 1, 1, # 50 - 57
- 1, 1, 1, 1, 1, 1, 1, 1, # 58 - 5f
- 1, 1, 1, 1, 1, 1, 1, 1, # 60 - 67
- 1, 1, 1, 1, 1, 1, 1, 1, # 68 - 6f
- 1, 1, 1, 1, 1, 1, 1, 1, # 70 - 77
- 1, 1, 1, 1, 1, 1, 1, 1, # 78 - 7f
- 2, 2, 2, 2, 3, 3, 3, 3, # 80 - 87
- 4, 4, 4, 4, 4, 4, 4, 4, # 88 - 8f
- 4, 4, 4, 4, 4, 4, 4, 4, # 90 - 97
- 4, 4, 4, 4, 4, 4, 4, 4, # 98 - 9f
- 5, 5, 5, 5, 5, 5, 5, 5, # a0 - a7
- 5, 5, 5, 5, 5, 5, 5, 5, # a8 - af
- 5, 5, 5, 5, 5, 5, 5, 5, # b0 - b7
- 5, 5, 5, 5, 5, 5, 5, 5, # b8 - bf
- 0, 0, 6, 6, 6, 6, 6, 6, # c0 - c7
- 6, 6, 6, 6, 6, 6, 6, 6, # c8 - cf
- 6, 6, 6, 6, 6, 6, 6, 6, # d0 - d7
- 6, 6, 6, 6, 6, 6, 6, 6, # d8 - df
- 7, 8, 8, 8, 8, 8, 8, 8, # e0 - e7
- 8, 8, 8, 8, 8, 9, 8, 8, # e8 - ef
- 10, 11, 11, 11, 11, 11, 11, 11, # f0 - f7
- 12, 13, 13, 13, 14, 15, 0, 0 # f8 - ff
-)
-
-UTF8_ST = (
- MachineState.ERROR,MachineState.START,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12, 10,#00-07
- 9, 11, 8, 7, 6, 5, 4, 3,#08-0f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#10-17
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#18-1f
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#20-27
- MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,MachineState.ITS_ME,#28-2f
- MachineState.ERROR,MachineState.ERROR, 5, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#30-37
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#38-3f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 5, 5, 5,MachineState.ERROR,MachineState.ERROR,#40-47
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#48-4f
- MachineState.ERROR,MachineState.ERROR, 7, 7, 7, 7,MachineState.ERROR,MachineState.ERROR,#50-57
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#58-5f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 7, 7,MachineState.ERROR,MachineState.ERROR,#60-67
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#68-6f
- MachineState.ERROR,MachineState.ERROR, 9, 9, 9, 9,MachineState.ERROR,MachineState.ERROR,#70-77
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#78-7f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 9,MachineState.ERROR,MachineState.ERROR,#80-87
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#88-8f
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,#90-97
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#98-9f
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR, 12,MachineState.ERROR,MachineState.ERROR,#a0-a7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#a8-af
- MachineState.ERROR,MachineState.ERROR, 12, 12, 12,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b0-b7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,#b8-bf
- MachineState.ERROR,MachineState.ERROR,MachineState.START,MachineState.START,MachineState.START,MachineState.START,MachineState.ERROR,MachineState.ERROR,#c0-c7
- MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR,MachineState.ERROR #c8-cf
-)
-# fmt: on
-
-UTF8_CHAR_LEN_TABLE = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6)
-
-UTF8_SM_MODEL: CodingStateMachineDict = {
- "class_table": UTF8_CLS,
- "class_factor": 16,
- "state_table": UTF8_ST,
- "char_len_table": UTF8_CHAR_LEN_TABLE,
- "name": "UTF-8",
-}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index 16ad6938..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc
deleted file mode 100644
index 4708f252..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py
deleted file mode 100644
index eb40c5f0..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py
+++ /dev/null
@@ -1,352 +0,0 @@
-"""
-Metadata about languages used by our model training code for our
-SingleByteCharSetProbers. Could be used for other things in the future.
-
-This code is based on the language metadata from the uchardet project.
-"""
-
-from string import ascii_letters
-from typing import List, Optional
-
-# TODO: Add Ukrainian (KOI8-U)
-
-
-class Language:
- """Metadata about a language useful for training models
-
- :ivar name: The human name for the language, in English.
- :type name: str
- :ivar iso_code: 2-letter ISO 639-1 if possible, 3-letter ISO code otherwise,
- or use another catalog as a last resort.
- :type iso_code: str
- :ivar use_ascii: Whether or not ASCII letters should be included in trained
- models.
- :type use_ascii: bool
- :ivar charsets: The charsets we want to support and create data for.
- :type charsets: list of str
- :ivar alphabet: The characters in the language's alphabet. If `use_ascii` is
- `True`, you only need to add those not in the ASCII set.
- :type alphabet: str
- :ivar wiki_start_pages: The Wikipedia pages to start from if we're crawling
- Wikipedia for training data.
- :type wiki_start_pages: list of str
- """
-
- def __init__(
- self,
- name: Optional[str] = None,
- iso_code: Optional[str] = None,
- use_ascii: bool = True,
- charsets: Optional[List[str]] = None,
- alphabet: Optional[str] = None,
- wiki_start_pages: Optional[List[str]] = None,
- ) -> None:
- super().__init__()
- self.name = name
- self.iso_code = iso_code
- self.use_ascii = use_ascii
- self.charsets = charsets
- if self.use_ascii:
- if alphabet:
- alphabet += ascii_letters
- else:
- alphabet = ascii_letters
- elif not alphabet:
- raise ValueError("Must supply alphabet if use_ascii is False")
- self.alphabet = "".join(sorted(set(alphabet))) if alphabet else None
- self.wiki_start_pages = wiki_start_pages
-
- def __repr__(self) -> str:
- param_str = ", ".join(
- f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_")
- )
- return f"{self.__class__.__name__}({param_str})"
-
-
-LANGUAGES = {
- "Arabic": Language(
- name="Arabic",
- iso_code="ar",
- use_ascii=False,
- # We only support encodings that use isolated
- # forms, because the current recommendation is
- # that the rendering system handles presentation
- # forms. This means we purposefully skip IBM864.
- charsets=["ISO-8859-6", "WINDOWS-1256", "CP720", "CP864"],
- alphabet="ءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّ",
- wiki_start_pages=["الصفحة_الرئيسية"],
- ),
- "Belarusian": Language(
- name="Belarusian",
- iso_code="be",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "IBM866", "MacCyrillic"],
- alphabet="АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШЫЬЭЮЯабвгдеёжзійклмнопрстуўфхцчшыьэюяʼ",
- wiki_start_pages=["Галоўная_старонка"],
- ),
- "Bulgarian": Language(
- name="Bulgarian",
- iso_code="bg",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "IBM855"],
- alphabet="АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЬЮЯабвгдежзийклмнопрстуфхцчшщъьюя",
- wiki_start_pages=["Начална_страница"],
- ),
- "Czech": Language(
- name="Czech",
- iso_code="cz",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ",
- wiki_start_pages=["Hlavní_strana"],
- ),
- "Danish": Language(
- name="Danish",
- iso_code="da",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="æøåÆØÅ",
- wiki_start_pages=["Forside"],
- ),
- "German": Language(
- name="German",
- iso_code="de",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="äöüßẞÄÖÜ",
- wiki_start_pages=["Wikipedia:Hauptseite"],
- ),
- "Greek": Language(
- name="Greek",
- iso_code="el",
- use_ascii=False,
- charsets=["ISO-8859-7", "WINDOWS-1253"],
- alphabet="αβγδεζηθικλμνξοπρσςτυφχψωάέήίόύώΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΣΤΥΦΧΨΩΆΈΉΊΌΎΏ",
- wiki_start_pages=["Πύλη:Κύρια"],
- ),
- "English": Language(
- name="English",
- iso_code="en",
- use_ascii=True,
- charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"],
- wiki_start_pages=["Main_Page"],
- ),
- "Esperanto": Language(
- name="Esperanto",
- iso_code="eo",
- # Q, W, X, and Y not used at all
- use_ascii=False,
- charsets=["ISO-8859-3"],
- alphabet="abcĉdefgĝhĥijĵklmnoprsŝtuŭvzABCĈDEFGĜHĤIJĴKLMNOPRSŜTUŬVZ",
- wiki_start_pages=["Vikipedio:Ĉefpaĝo"],
- ),
- "Spanish": Language(
- name="Spanish",
- iso_code="es",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ñáéíóúüÑÁÉÍÓÚÜ",
- wiki_start_pages=["Wikipedia:Portada"],
- ),
- "Estonian": Language(
- name="Estonian",
- iso_code="et",
- use_ascii=False,
- charsets=["ISO-8859-4", "ISO-8859-13", "WINDOWS-1257"],
- # C, F, Š, Q, W, X, Y, Z, Ž are only for
- # loanwords
- alphabet="ABDEGHIJKLMNOPRSTUVÕÄÖÜabdeghijklmnoprstuvõäöü",
- wiki_start_pages=["Esileht"],
- ),
- "Finnish": Language(
- name="Finnish",
- iso_code="fi",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÅÄÖŠŽåäöšž",
- wiki_start_pages=["Wikipedia:Etusivu"],
- ),
- "French": Language(
- name="French",
- iso_code="fr",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="œàâçèéîïùûêŒÀÂÇÈÉÎÏÙÛÊ",
- wiki_start_pages=["Wikipédia:Accueil_principal", "Bœuf (animal)"],
- ),
- "Hebrew": Language(
- name="Hebrew",
- iso_code="he",
- use_ascii=False,
- charsets=["ISO-8859-8", "WINDOWS-1255"],
- alphabet="אבגדהוזחטיךכלםמןנסעףפץצקרשתװױײ",
- wiki_start_pages=["עמוד_ראשי"],
- ),
- "Croatian": Language(
- name="Croatian",
- iso_code="hr",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcčćdđefghijklmnoprsštuvzžABCČĆDĐEFGHIJKLMNOPRSŠTUVZŽ",
- wiki_start_pages=["Glavna_stranica"],
- ),
- "Hungarian": Language(
- name="Hungarian",
- iso_code="hu",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcdefghijklmnoprstuvzáéíóöőúüűABCDEFGHIJKLMNOPRSTUVZÁÉÍÓÖŐÚÜŰ",
- wiki_start_pages=["Kezdőlap"],
- ),
- "Italian": Language(
- name="Italian",
- iso_code="it",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÀÈÉÌÒÓÙàèéìòóù",
- wiki_start_pages=["Pagina_principale"],
- ),
- "Lithuanian": Language(
- name="Lithuanian",
- iso_code="lt",
- use_ascii=False,
- charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"],
- # Q, W, and X not used at all
- alphabet="AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽaąbcčdeęėfghiįyjklmnoprsštuųūvzž",
- wiki_start_pages=["Pagrindinis_puslapis"],
- ),
- "Latvian": Language(
- name="Latvian",
- iso_code="lv",
- use_ascii=False,
- charsets=["ISO-8859-13", "WINDOWS-1257", "ISO-8859-4"],
- # Q, W, X, Y are only for loanwords
- alphabet="AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽaābcčdeēfgģhiījkķlļmnņoprsštuūvzž",
- wiki_start_pages=["Sākumlapa"],
- ),
- "Macedonian": Language(
- name="Macedonian",
- iso_code="mk",
- use_ascii=False,
- charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"],
- alphabet="АБВГДЃЕЖЗЅИЈКЛЉМНЊОПРСТЌУФХЦЧЏШабвгдѓежзѕијклљмнњопрстќуфхцчџш",
- wiki_start_pages=["Главна_страница"],
- ),
- "Dutch": Language(
- name="Dutch",
- iso_code="nl",
- use_ascii=True,
- charsets=["ISO-8859-1", "WINDOWS-1252", "MacRoman"],
- wiki_start_pages=["Hoofdpagina"],
- ),
- "Polish": Language(
- name="Polish",
- iso_code="pl",
- # Q and X are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż",
- wiki_start_pages=["Wikipedia:Strona_główna"],
- ),
- "Portuguese": Language(
- name="Portuguese",
- iso_code="pt",
- use_ascii=True,
- charsets=["ISO-8859-1", "ISO-8859-15", "WINDOWS-1252", "MacRoman"],
- alphabet="ÁÂÃÀÇÉÊÍÓÔÕÚáâãàçéêíóôõú",
- wiki_start_pages=["Wikipédia:Página_principal"],
- ),
- "Romanian": Language(
- name="Romanian",
- iso_code="ro",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="ăâîșțĂÂÎȘȚ",
- wiki_start_pages=["Pagina_principală"],
- ),
- "Russian": Language(
- name="Russian",
- iso_code="ru",
- use_ascii=False,
- charsets=[
- "ISO-8859-5",
- "WINDOWS-1251",
- "KOI8-R",
- "MacCyrillic",
- "IBM866",
- "IBM855",
- ],
- alphabet="абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ",
- wiki_start_pages=["Заглавная_страница"],
- ),
- "Slovak": Language(
- name="Slovak",
- iso_code="sk",
- use_ascii=True,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="áäčďéíĺľňóôŕšťúýžÁÄČĎÉÍĹĽŇÓÔŔŠŤÚÝŽ",
- wiki_start_pages=["Hlavná_stránka"],
- ),
- "Slovene": Language(
- name="Slovene",
- iso_code="sl",
- # Q, W, X, Y are only used for foreign words.
- use_ascii=False,
- charsets=["ISO-8859-2", "WINDOWS-1250"],
- alphabet="abcčdefghijklmnoprsštuvzžABCČDEFGHIJKLMNOPRSŠTUVZŽ",
- wiki_start_pages=["Glavna_stran"],
- ),
- # Serbian can be written in both Latin and Cyrillic, but there's no
- # simple way to get the Latin alphabet pages from Wikipedia through
- # the API, so for now we just support Cyrillic.
- "Serbian": Language(
- name="Serbian",
- iso_code="sr",
- alphabet="АБВГДЂЕЖЗИЈКЛЉМНЊОПРСТЋУФХЦЧЏШабвгдђежзијклљмнњопрстћуфхцчџш",
- charsets=["ISO-8859-5", "WINDOWS-1251", "MacCyrillic", "IBM855"],
- wiki_start_pages=["Главна_страна"],
- ),
- "Thai": Language(
- name="Thai",
- iso_code="th",
- use_ascii=False,
- charsets=["ISO-8859-11", "TIS-620", "CP874"],
- alphabet="กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛",
- wiki_start_pages=["หน้าหลัก"],
- ),
- "Turkish": Language(
- name="Turkish",
- iso_code="tr",
- # Q, W, and X are not used by Turkish
- use_ascii=False,
- charsets=["ISO-8859-3", "ISO-8859-9", "WINDOWS-1254"],
- alphabet="abcçdefgğhıijklmnoöprsştuüvyzâîûABCÇDEFGĞHIİJKLMNOÖPRSŞTUÜVYZÂÎÛ",
- wiki_start_pages=["Ana_Sayfa"],
- ),
- "Vietnamese": Language(
- name="Vietnamese",
- iso_code="vi",
- use_ascii=False,
- # Windows-1258 is the only common 8-bit
- # Vietnamese encoding supported by Python.
- # From Wikipedia:
- # For systems that lack support for Unicode,
- # dozens of 8-bit Vietnamese code pages are
- # available.[1] The most common are VISCII
- # (TCVN 5712:1993), VPS, and Windows-1258.[3]
- # Where ASCII is required, such as when
- # ensuring readability in plain text e-mail,
- # Vietnamese letters are often encoded
- # according to Vietnamese Quoted-Readable
- # (VIQR) or VSCII Mnemonic (VSCII-MNEM),[4]
- # though usage of either variable-width
- # scheme has declined dramatically following
- # the adoption of Unicode on the World Wide
- # Web.
- charsets=["WINDOWS-1258"],
- alphabet="aăâbcdđeêghiklmnoôơpqrstuưvxyAĂÂBCDĐEÊGHIKLMNOÔƠPQRSTUƯVXY",
- wiki_start_pages=["Chữ_Quốc_ngữ"],
- ),
-}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py
deleted file mode 100644
index 7d36e64c..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py
+++ /dev/null
@@ -1,16 +0,0 @@
-from typing import TYPE_CHECKING, Optional
-
-if TYPE_CHECKING:
- # TypedDict was introduced in Python 3.8.
- #
- # TODO: Remove the else block and TYPE_CHECKING check when dropping support
- # for Python 3.7.
- from typing import TypedDict
-
- class ResultDict(TypedDict):
- encoding: Optional[str]
- confidence: float
- language: Optional[str]
-
-else:
- ResultDict = dict
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py
deleted file mode 100644
index 0ffbcdd2..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py
+++ /dev/null
@@ -1,162 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Dict, List, NamedTuple, Optional, Union
-
-from .charsetprober import CharSetProber
-from .enums import CharacterCategory, ProbingState, SequenceLikelihood
-
-
-class SingleByteCharSetModel(NamedTuple):
- charset_name: str
- language: str
- char_to_order_map: Dict[int, int]
- language_model: Dict[int, Dict[int, int]]
- typical_positive_ratio: float
- keep_ascii_letters: bool
- alphabet: str
-
-
-class SingleByteCharSetProber(CharSetProber):
- SAMPLE_SIZE = 64
- SB_ENOUGH_REL_THRESHOLD = 1024 # 0.25 * SAMPLE_SIZE^2
- POSITIVE_SHORTCUT_THRESHOLD = 0.95
- NEGATIVE_SHORTCUT_THRESHOLD = 0.05
-
- def __init__(
- self,
- model: SingleByteCharSetModel,
- is_reversed: bool = False,
- name_prober: Optional[CharSetProber] = None,
- ) -> None:
- super().__init__()
- self._model = model
- # TRUE if we need to reverse every pair in the model lookup
- self._reversed = is_reversed
- # Optional auxiliary prober for name decision
- self._name_prober = name_prober
- self._last_order = 255
- self._seq_counters: List[int] = []
- self._total_seqs = 0
- self._total_char = 0
- self._control_char = 0
- self._freq_char = 0
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- # char order of last character
- self._last_order = 255
- self._seq_counters = [0] * SequenceLikelihood.get_num_categories()
- self._total_seqs = 0
- self._total_char = 0
- self._control_char = 0
- # characters that fall in our sampling range
- self._freq_char = 0
-
- @property
- def charset_name(self) -> Optional[str]:
- if self._name_prober:
- return self._name_prober.charset_name
- return self._model.charset_name
-
- @property
- def language(self) -> Optional[str]:
- if self._name_prober:
- return self._name_prober.language
- return self._model.language
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- # TODO: Make filter_international_words keep things in self.alphabet
- if not self._model.keep_ascii_letters:
- byte_str = self.filter_international_words(byte_str)
- else:
- byte_str = self.remove_xml_tags(byte_str)
- if not byte_str:
- return self.state
- char_to_order_map = self._model.char_to_order_map
- language_model = self._model.language_model
- for char in byte_str:
- order = char_to_order_map.get(char, CharacterCategory.UNDEFINED)
- # XXX: This was SYMBOL_CAT_ORDER before, with a value of 250, but
- # CharacterCategory.SYMBOL is actually 253, so we use CONTROL
- # to make it closer to the original intent. The only difference
- # is whether or not we count digits and control characters for
- # _total_char purposes.
- if order < CharacterCategory.CONTROL:
- self._total_char += 1
- if order < self.SAMPLE_SIZE:
- self._freq_char += 1
- if self._last_order < self.SAMPLE_SIZE:
- self._total_seqs += 1
- if not self._reversed:
- lm_cat = language_model[self._last_order][order]
- else:
- lm_cat = language_model[order][self._last_order]
- self._seq_counters[lm_cat] += 1
- self._last_order = order
-
- charset_name = self._model.charset_name
- if self.state == ProbingState.DETECTING:
- if self._total_seqs > self.SB_ENOUGH_REL_THRESHOLD:
- confidence = self.get_confidence()
- if confidence > self.POSITIVE_SHORTCUT_THRESHOLD:
- self.logger.debug(
- "%s confidence = %s, we have a winner", charset_name, confidence
- )
- self._state = ProbingState.FOUND_IT
- elif confidence < self.NEGATIVE_SHORTCUT_THRESHOLD:
- self.logger.debug(
- "%s confidence = %s, below negative shortcut threshold %s",
- charset_name,
- confidence,
- self.NEGATIVE_SHORTCUT_THRESHOLD,
- )
- self._state = ProbingState.NOT_ME
-
- return self.state
-
- def get_confidence(self) -> float:
- r = 0.01
- if self._total_seqs > 0:
- r = (
- (
- self._seq_counters[SequenceLikelihood.POSITIVE]
- + 0.25 * self._seq_counters[SequenceLikelihood.LIKELY]
- )
- / self._total_seqs
- / self._model.typical_positive_ratio
- )
- # The more control characters (proportionnaly to the size
- # of the text), the less confident we become in the current
- # charset.
- r = r * (self._total_char - self._control_char) / self._total_char
- r = r * self._freq_char / self._total_char
- if r >= 1.0:
- r = 0.99
- return r
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
deleted file mode 100644
index 890ae846..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py
+++ /dev/null
@@ -1,88 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from .charsetgroupprober import CharSetGroupProber
-from .hebrewprober import HebrewProber
-from .langbulgarianmodel import ISO_8859_5_BULGARIAN_MODEL, WINDOWS_1251_BULGARIAN_MODEL
-from .langgreekmodel import ISO_8859_7_GREEK_MODEL, WINDOWS_1253_GREEK_MODEL
-from .langhebrewmodel import WINDOWS_1255_HEBREW_MODEL
-
-# from .langhungarianmodel import (ISO_8859_2_HUNGARIAN_MODEL,
-# WINDOWS_1250_HUNGARIAN_MODEL)
-from .langrussianmodel import (
- IBM855_RUSSIAN_MODEL,
- IBM866_RUSSIAN_MODEL,
- ISO_8859_5_RUSSIAN_MODEL,
- KOI8_R_RUSSIAN_MODEL,
- MACCYRILLIC_RUSSIAN_MODEL,
- WINDOWS_1251_RUSSIAN_MODEL,
-)
-from .langthaimodel import TIS_620_THAI_MODEL
-from .langturkishmodel import ISO_8859_9_TURKISH_MODEL
-from .sbcharsetprober import SingleByteCharSetProber
-
-
-class SBCSGroupProber(CharSetGroupProber):
- def __init__(self) -> None:
- super().__init__()
- hebrew_prober = HebrewProber()
- logical_hebrew_prober = SingleByteCharSetProber(
- WINDOWS_1255_HEBREW_MODEL, is_reversed=False, name_prober=hebrew_prober
- )
- # TODO: See if using ISO-8859-8 Hebrew model works better here, since
- # it's actually the visual one
- visual_hebrew_prober = SingleByteCharSetProber(
- WINDOWS_1255_HEBREW_MODEL, is_reversed=True, name_prober=hebrew_prober
- )
- hebrew_prober.set_model_probers(logical_hebrew_prober, visual_hebrew_prober)
- # TODO: ORDER MATTERS HERE. I changed the order vs what was in master
- # and several tests failed that did not before. Some thought
- # should be put into the ordering, and we should consider making
- # order not matter here, because that is very counter-intuitive.
- self.probers = [
- SingleByteCharSetProber(WINDOWS_1251_RUSSIAN_MODEL),
- SingleByteCharSetProber(KOI8_R_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_5_RUSSIAN_MODEL),
- SingleByteCharSetProber(MACCYRILLIC_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM866_RUSSIAN_MODEL),
- SingleByteCharSetProber(IBM855_RUSSIAN_MODEL),
- SingleByteCharSetProber(ISO_8859_7_GREEK_MODEL),
- SingleByteCharSetProber(WINDOWS_1253_GREEK_MODEL),
- SingleByteCharSetProber(ISO_8859_5_BULGARIAN_MODEL),
- SingleByteCharSetProber(WINDOWS_1251_BULGARIAN_MODEL),
- # TODO: Restore Hungarian encodings (iso-8859-2 and windows-1250)
- # after we retrain model.
- # SingleByteCharSetProber(ISO_8859_2_HUNGARIAN_MODEL),
- # SingleByteCharSetProber(WINDOWS_1250_HUNGARIAN_MODEL),
- SingleByteCharSetProber(TIS_620_THAI_MODEL),
- SingleByteCharSetProber(ISO_8859_9_TURKISH_MODEL),
- hebrew_prober,
- logical_hebrew_prober,
- visual_hebrew_prober,
- ]
- self.reset()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
deleted file mode 100644
index 91df0779..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+++ /dev/null
@@ -1,105 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .chardistribution import SJISDistributionAnalysis
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .jpcntx import SJISContextAnalysis
-from .mbcharsetprober import MultiByteCharSetProber
-from .mbcssm import SJIS_SM_MODEL
-
-
-class SJISProber(MultiByteCharSetProber):
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(SJIS_SM_MODEL)
- self.distribution_analyzer = SJISDistributionAnalysis()
- self.context_analyzer = SJISContextAnalysis()
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.context_analyzer.reset()
-
- @property
- def charset_name(self) -> str:
- return self.context_analyzer.charset_name
-
- @property
- def language(self) -> str:
- return "Japanese"
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- assert self.coding_sm is not None
- assert self.distribution_analyzer is not None
-
- for i, byte in enumerate(byte_str):
- coding_state = self.coding_sm.next_state(byte)
- if coding_state == MachineState.ERROR:
- self.logger.debug(
- "%s %s prober hit error at byte %s",
- self.charset_name,
- self.language,
- i,
- )
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- char_len = self.coding_sm.get_current_charlen()
- if i == 0:
- self._last_char[1] = byte
- self.context_analyzer.feed(
- self._last_char[2 - char_len :], char_len
- )
- self.distribution_analyzer.feed(self._last_char, char_len)
- else:
- self.context_analyzer.feed(
- byte_str[i + 1 - char_len : i + 3 - char_len], char_len
- )
- self.distribution_analyzer.feed(byte_str[i - 1 : i + 1], char_len)
-
- self._last_char[0] = byte_str[-1]
-
- if self.state == ProbingState.DETECTING:
- if self.context_analyzer.got_enough_data() and (
- self.get_confidence() > self.SHORTCUT_THRESHOLD
- ):
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- assert self.distribution_analyzer is not None
-
- context_conf = self.context_analyzer.get_confidence()
- distrib_conf = self.distribution_analyzer.get_confidence()
- return max(context_conf, distrib_conf)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py
deleted file mode 100644
index 30c441dc..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py
+++ /dev/null
@@ -1,362 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is Mozilla Universal charset detector code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 2001
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-# Shy Shalom - original C code
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-"""
-Module containing the UniversalDetector detector class, which is the primary
-class a user of ``chardet`` should use.
-
-:author: Mark Pilgrim (initial port to Python)
-:author: Shy Shalom (original C code)
-:author: Dan Blanchard (major refactoring for 3.0)
-:author: Ian Cordasco
-"""
-
-
-import codecs
-import logging
-import re
-from typing import List, Optional, Union
-
-from .charsetgroupprober import CharSetGroupProber
-from .charsetprober import CharSetProber
-from .enums import InputState, LanguageFilter, ProbingState
-from .escprober import EscCharSetProber
-from .latin1prober import Latin1Prober
-from .macromanprober import MacRomanProber
-from .mbcsgroupprober import MBCSGroupProber
-from .resultdict import ResultDict
-from .sbcsgroupprober import SBCSGroupProber
-from .utf1632prober import UTF1632Prober
-
-
-class UniversalDetector:
- """
- The ``UniversalDetector`` class underlies the ``chardet.detect`` function
- and coordinates all of the different charset probers.
-
- To get a ``dict`` containing an encoding and its confidence, you can simply
- run:
-
- .. code::
-
- u = UniversalDetector()
- u.feed(some_bytes)
- u.close()
- detected = u.result
-
- """
-
- MINIMUM_THRESHOLD = 0.20
- HIGH_BYTE_DETECTOR = re.compile(b"[\x80-\xFF]")
- ESC_DETECTOR = re.compile(b"(\033|~{)")
- WIN_BYTE_DETECTOR = re.compile(b"[\x80-\x9F]")
- ISO_WIN_MAP = {
- "iso-8859-1": "Windows-1252",
- "iso-8859-2": "Windows-1250",
- "iso-8859-5": "Windows-1251",
- "iso-8859-6": "Windows-1256",
- "iso-8859-7": "Windows-1253",
- "iso-8859-8": "Windows-1255",
- "iso-8859-9": "Windows-1254",
- "iso-8859-13": "Windows-1257",
- }
- # Based on https://encoding.spec.whatwg.org/#names-and-labels
- # but altered to match Python names for encodings and remove mappings
- # that break tests.
- LEGACY_MAP = {
- "ascii": "Windows-1252",
- "iso-8859-1": "Windows-1252",
- "tis-620": "ISO-8859-11",
- "iso-8859-9": "Windows-1254",
- "gb2312": "GB18030",
- "euc-kr": "CP949",
- "utf-16le": "UTF-16",
- }
-
- def __init__(
- self,
- lang_filter: LanguageFilter = LanguageFilter.ALL,
- should_rename_legacy: bool = False,
- ) -> None:
- self._esc_charset_prober: Optional[EscCharSetProber] = None
- self._utf1632_prober: Optional[UTF1632Prober] = None
- self._charset_probers: List[CharSetProber] = []
- self.result: ResultDict = {
- "encoding": None,
- "confidence": 0.0,
- "language": None,
- }
- self.done = False
- self._got_data = False
- self._input_state = InputState.PURE_ASCII
- self._last_char = b""
- self.lang_filter = lang_filter
- self.logger = logging.getLogger(__name__)
- self._has_win_bytes = False
- self.should_rename_legacy = should_rename_legacy
- self.reset()
-
- @property
- def input_state(self) -> int:
- return self._input_state
-
- @property
- def has_win_bytes(self) -> bool:
- return self._has_win_bytes
-
- @property
- def charset_probers(self) -> List[CharSetProber]:
- return self._charset_probers
-
- def reset(self) -> None:
- """
- Reset the UniversalDetector and all of its probers back to their
- initial states. This is called by ``__init__``, so you only need to
- call this directly in between analyses of different documents.
- """
- self.result = {"encoding": None, "confidence": 0.0, "language": None}
- self.done = False
- self._got_data = False
- self._has_win_bytes = False
- self._input_state = InputState.PURE_ASCII
- self._last_char = b""
- if self._esc_charset_prober:
- self._esc_charset_prober.reset()
- if self._utf1632_prober:
- self._utf1632_prober.reset()
- for prober in self._charset_probers:
- prober.reset()
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> None:
- """
- Takes a chunk of a document and feeds it through all of the relevant
- charset probers.
-
- After calling ``feed``, you can check the value of the ``done``
- attribute to see if you need to continue feeding the
- ``UniversalDetector`` more data, or if it has made a prediction
- (in the ``result`` attribute).
-
- .. note::
- You should always call ``close`` when you're done feeding in your
- document if ``done`` is not already ``True``.
- """
- if self.done:
- return
-
- if not byte_str:
- return
-
- if not isinstance(byte_str, bytearray):
- byte_str = bytearray(byte_str)
-
- # First check for known BOMs, since these are guaranteed to be correct
- if not self._got_data:
- # If the data starts with BOM, we know it is UTF
- if byte_str.startswith(codecs.BOM_UTF8):
- # EF BB BF UTF-8 with BOM
- self.result = {
- "encoding": "UTF-8-SIG",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith((codecs.BOM_UTF32_LE, codecs.BOM_UTF32_BE)):
- # FF FE 00 00 UTF-32, little-endian BOM
- # 00 00 FE FF UTF-32, big-endian BOM
- self.result = {"encoding": "UTF-32", "confidence": 1.0, "language": ""}
- elif byte_str.startswith(b"\xFE\xFF\x00\x00"):
- # FE FF 00 00 UCS-4, unusual octet order BOM (3412)
- self.result = {
- # TODO: This encoding is not supported by Python. Should remove?
- "encoding": "X-ISO-10646-UCS-4-3412",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith(b"\x00\x00\xFF\xFE"):
- # 00 00 FF FE UCS-4, unusual octet order BOM (2143)
- self.result = {
- # TODO: This encoding is not supported by Python. Should remove?
- "encoding": "X-ISO-10646-UCS-4-2143",
- "confidence": 1.0,
- "language": "",
- }
- elif byte_str.startswith((codecs.BOM_LE, codecs.BOM_BE)):
- # FF FE UTF-16, little endian BOM
- # FE FF UTF-16, big endian BOM
- self.result = {"encoding": "UTF-16", "confidence": 1.0, "language": ""}
-
- self._got_data = True
- if self.result["encoding"] is not None:
- self.done = True
- return
-
- # If none of those matched and we've only see ASCII so far, check
- # for high bytes and escape sequences
- if self._input_state == InputState.PURE_ASCII:
- if self.HIGH_BYTE_DETECTOR.search(byte_str):
- self._input_state = InputState.HIGH_BYTE
- elif (
- self._input_state == InputState.PURE_ASCII
- and self.ESC_DETECTOR.search(self._last_char + byte_str)
- ):
- self._input_state = InputState.ESC_ASCII
-
- self._last_char = byte_str[-1:]
-
- # next we will look to see if it is appears to be either a UTF-16 or
- # UTF-32 encoding
- if not self._utf1632_prober:
- self._utf1632_prober = UTF1632Prober()
-
- if self._utf1632_prober.state == ProbingState.DETECTING:
- if self._utf1632_prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": self._utf1632_prober.charset_name,
- "confidence": self._utf1632_prober.get_confidence(),
- "language": "",
- }
- self.done = True
- return
-
- # If we've seen escape sequences, use the EscCharSetProber, which
- # uses a simple state machine to check for known escape sequences in
- # HZ and ISO-2022 encodings, since those are the only encodings that
- # use such sequences.
- if self._input_state == InputState.ESC_ASCII:
- if not self._esc_charset_prober:
- self._esc_charset_prober = EscCharSetProber(self.lang_filter)
- if self._esc_charset_prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": self._esc_charset_prober.charset_name,
- "confidence": self._esc_charset_prober.get_confidence(),
- "language": self._esc_charset_prober.language,
- }
- self.done = True
- # If we've seen high bytes (i.e., those with values greater than 127),
- # we need to do more complicated checks using all our multi-byte and
- # single-byte probers that are left. The single-byte probers
- # use character bigram distributions to determine the encoding, whereas
- # the multi-byte probers use a combination of character unigram and
- # bigram distributions.
- elif self._input_state == InputState.HIGH_BYTE:
- if not self._charset_probers:
- self._charset_probers = [MBCSGroupProber(self.lang_filter)]
- # If we're checking non-CJK encodings, use single-byte prober
- if self.lang_filter & LanguageFilter.NON_CJK:
- self._charset_probers.append(SBCSGroupProber())
- self._charset_probers.append(Latin1Prober())
- self._charset_probers.append(MacRomanProber())
- for prober in self._charset_probers:
- if prober.feed(byte_str) == ProbingState.FOUND_IT:
- self.result = {
- "encoding": prober.charset_name,
- "confidence": prober.get_confidence(),
- "language": prober.language,
- }
- self.done = True
- break
- if self.WIN_BYTE_DETECTOR.search(byte_str):
- self._has_win_bytes = True
-
- def close(self) -> ResultDict:
- """
- Stop analyzing the current document and come up with a final
- prediction.
-
- :returns: The ``result`` attribute, a ``dict`` with the keys
- `encoding`, `confidence`, and `language`.
- """
- # Don't bother with checks if we're already done
- if self.done:
- return self.result
- self.done = True
-
- if not self._got_data:
- self.logger.debug("no data received!")
-
- # Default to ASCII if it is all we've seen so far
- elif self._input_state == InputState.PURE_ASCII:
- self.result = {"encoding": "ascii", "confidence": 1.0, "language": ""}
-
- # If we have seen non-ASCII, return the best that met MINIMUM_THRESHOLD
- elif self._input_state == InputState.HIGH_BYTE:
- prober_confidence = None
- max_prober_confidence = 0.0
- max_prober = None
- for prober in self._charset_probers:
- if not prober:
- continue
- prober_confidence = prober.get_confidence()
- if prober_confidence > max_prober_confidence:
- max_prober_confidence = prober_confidence
- max_prober = prober
- if max_prober and (max_prober_confidence > self.MINIMUM_THRESHOLD):
- charset_name = max_prober.charset_name
- assert charset_name is not None
- lower_charset_name = charset_name.lower()
- confidence = max_prober.get_confidence()
- # Use Windows encoding name instead of ISO-8859 if we saw any
- # extra Windows-specific bytes
- if lower_charset_name.startswith("iso-8859"):
- if self._has_win_bytes:
- charset_name = self.ISO_WIN_MAP.get(
- lower_charset_name, charset_name
- )
- # Rename legacy encodings with superset encodings if asked
- if self.should_rename_legacy:
- charset_name = self.LEGACY_MAP.get(
- (charset_name or "").lower(), charset_name
- )
- self.result = {
- "encoding": charset_name,
- "confidence": confidence,
- "language": max_prober.language,
- }
-
- # Log all prober confidences if none met MINIMUM_THRESHOLD
- if self.logger.getEffectiveLevel() <= logging.DEBUG:
- if self.result["encoding"] is None:
- self.logger.debug("no probers hit minimum threshold")
- for group_prober in self._charset_probers:
- if not group_prober:
- continue
- if isinstance(group_prober, CharSetGroupProber):
- for prober in group_prober.probers:
- self.logger.debug(
- "%s %s confidence = %s",
- prober.charset_name,
- prober.language,
- prober.get_confidence(),
- )
- else:
- self.logger.debug(
- "%s %s confidence = %s",
- group_prober.charset_name,
- group_prober.language,
- group_prober.get_confidence(),
- )
- return self.result
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py
deleted file mode 100644
index 6bdec63d..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py
+++ /dev/null
@@ -1,225 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-#
-# Contributor(s):
-# Jason Zavaglia
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-from typing import List, Union
-
-from .charsetprober import CharSetProber
-from .enums import ProbingState
-
-
-class UTF1632Prober(CharSetProber):
- """
- This class simply looks for occurrences of zero bytes, and infers
- whether the file is UTF16 or UTF32 (low-endian or big-endian)
- For instance, files looking like ( \0 \0 \0 [nonzero] )+
- have a good probability to be UTF32BE. Files looking like ( \0 [nonzero] )+
- may be guessed to be UTF16BE, and inversely for little-endian varieties.
- """
-
- # how many logical characters to scan before feeling confident of prediction
- MIN_CHARS_FOR_DETECTION = 20
- # a fixed constant ratio of expected zeros or non-zeros in modulo-position.
- EXPECTED_RATIO = 0.94
-
- def __init__(self) -> None:
- super().__init__()
- self.position = 0
- self.zeros_at_mod = [0] * 4
- self.nonzeros_at_mod = [0] * 4
- self._state = ProbingState.DETECTING
- self.quad = [0, 0, 0, 0]
- self.invalid_utf16be = False
- self.invalid_utf16le = False
- self.invalid_utf32be = False
- self.invalid_utf32le = False
- self.first_half_surrogate_pair_detected_16be = False
- self.first_half_surrogate_pair_detected_16le = False
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.position = 0
- self.zeros_at_mod = [0] * 4
- self.nonzeros_at_mod = [0] * 4
- self._state = ProbingState.DETECTING
- self.invalid_utf16be = False
- self.invalid_utf16le = False
- self.invalid_utf32be = False
- self.invalid_utf32le = False
- self.first_half_surrogate_pair_detected_16be = False
- self.first_half_surrogate_pair_detected_16le = False
- self.quad = [0, 0, 0, 0]
-
- @property
- def charset_name(self) -> str:
- if self.is_likely_utf32be():
- return "utf-32be"
- if self.is_likely_utf32le():
- return "utf-32le"
- if self.is_likely_utf16be():
- return "utf-16be"
- if self.is_likely_utf16le():
- return "utf-16le"
- # default to something valid
- return "utf-16"
-
- @property
- def language(self) -> str:
- return ""
-
- def approx_32bit_chars(self) -> float:
- return max(1.0, self.position / 4.0)
-
- def approx_16bit_chars(self) -> float:
- return max(1.0, self.position / 2.0)
-
- def is_likely_utf32be(self) -> bool:
- approx_chars = self.approx_32bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- self.zeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO
- and self.nonzeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO
- and not self.invalid_utf32be
- )
-
- def is_likely_utf32le(self) -> bool:
- approx_chars = self.approx_32bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- self.nonzeros_at_mod[0] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[1] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[2] / approx_chars > self.EXPECTED_RATIO
- and self.zeros_at_mod[3] / approx_chars > self.EXPECTED_RATIO
- and not self.invalid_utf32le
- )
-
- def is_likely_utf16be(self) -> bool:
- approx_chars = self.approx_16bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- (self.nonzeros_at_mod[1] + self.nonzeros_at_mod[3]) / approx_chars
- > self.EXPECTED_RATIO
- and (self.zeros_at_mod[0] + self.zeros_at_mod[2]) / approx_chars
- > self.EXPECTED_RATIO
- and not self.invalid_utf16be
- )
-
- def is_likely_utf16le(self) -> bool:
- approx_chars = self.approx_16bit_chars()
- return approx_chars >= self.MIN_CHARS_FOR_DETECTION and (
- (self.nonzeros_at_mod[0] + self.nonzeros_at_mod[2]) / approx_chars
- > self.EXPECTED_RATIO
- and (self.zeros_at_mod[1] + self.zeros_at_mod[3]) / approx_chars
- > self.EXPECTED_RATIO
- and not self.invalid_utf16le
- )
-
- def validate_utf32_characters(self, quad: List[int]) -> None:
- """
- Validate if the quad of bytes is valid UTF-32.
-
- UTF-32 is valid in the range 0x00000000 - 0x0010FFFF
- excluding 0x0000D800 - 0x0000DFFF
-
- https://en.wikipedia.org/wiki/UTF-32
- """
- if (
- quad[0] != 0
- or quad[1] > 0x10
- or (quad[0] == 0 and quad[1] == 0 and 0xD8 <= quad[2] <= 0xDF)
- ):
- self.invalid_utf32be = True
- if (
- quad[3] != 0
- or quad[2] > 0x10
- or (quad[3] == 0 and quad[2] == 0 and 0xD8 <= quad[1] <= 0xDF)
- ):
- self.invalid_utf32le = True
-
- def validate_utf16_characters(self, pair: List[int]) -> None:
- """
- Validate if the pair of bytes is valid UTF-16.
-
- UTF-16 is valid in the range 0x0000 - 0xFFFF excluding 0xD800 - 0xFFFF
- with an exception for surrogate pairs, which must be in the range
- 0xD800-0xDBFF followed by 0xDC00-0xDFFF
-
- https://en.wikipedia.org/wiki/UTF-16
- """
- if not self.first_half_surrogate_pair_detected_16be:
- if 0xD8 <= pair[0] <= 0xDB:
- self.first_half_surrogate_pair_detected_16be = True
- elif 0xDC <= pair[0] <= 0xDF:
- self.invalid_utf16be = True
- else:
- if 0xDC <= pair[0] <= 0xDF:
- self.first_half_surrogate_pair_detected_16be = False
- else:
- self.invalid_utf16be = True
-
- if not self.first_half_surrogate_pair_detected_16le:
- if 0xD8 <= pair[1] <= 0xDB:
- self.first_half_surrogate_pair_detected_16le = True
- elif 0xDC <= pair[1] <= 0xDF:
- self.invalid_utf16le = True
- else:
- if 0xDC <= pair[1] <= 0xDF:
- self.first_half_surrogate_pair_detected_16le = False
- else:
- self.invalid_utf16le = True
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- mod4 = self.position % 4
- self.quad[mod4] = c
- if mod4 == 3:
- self.validate_utf32_characters(self.quad)
- self.validate_utf16_characters(self.quad[0:2])
- self.validate_utf16_characters(self.quad[2:4])
- if c == 0:
- self.zeros_at_mod[mod4] += 1
- else:
- self.nonzeros_at_mod[mod4] += 1
- self.position += 1
- return self.state
-
- @property
- def state(self) -> ProbingState:
- if self._state in {ProbingState.NOT_ME, ProbingState.FOUND_IT}:
- # terminal, decided states
- return self._state
- if self.get_confidence() > 0.80:
- self._state = ProbingState.FOUND_IT
- elif self.position > 4 * 1024:
- # if we get to 4kb into the file, and we can't conclude it's UTF,
- # let's give up
- self._state = ProbingState.NOT_ME
- return self._state
-
- def get_confidence(self) -> float:
- return (
- 0.85
- if (
- self.is_likely_utf16le()
- or self.is_likely_utf16be()
- or self.is_likely_utf32le()
- or self.is_likely_utf32be()
- )
- else 0.00
- )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py
deleted file mode 100644
index d96354d9..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py
+++ /dev/null
@@ -1,82 +0,0 @@
-######################## BEGIN LICENSE BLOCK ########################
-# The Original Code is mozilla.org code.
-#
-# The Initial Developer of the Original Code is
-# Netscape Communications Corporation.
-# Portions created by the Initial Developer are Copyright (C) 1998
-# the Initial Developer. All Rights Reserved.
-#
-# Contributor(s):
-# Mark Pilgrim - port to Python
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
-# 02110-1301 USA
-######################### END LICENSE BLOCK #########################
-
-from typing import Union
-
-from .charsetprober import CharSetProber
-from .codingstatemachine import CodingStateMachine
-from .enums import MachineState, ProbingState
-from .mbcssm import UTF8_SM_MODEL
-
-
-class UTF8Prober(CharSetProber):
- ONE_CHAR_PROB = 0.5
-
- def __init__(self) -> None:
- super().__init__()
- self.coding_sm = CodingStateMachine(UTF8_SM_MODEL)
- self._num_mb_chars = 0
- self.reset()
-
- def reset(self) -> None:
- super().reset()
- self.coding_sm.reset()
- self._num_mb_chars = 0
-
- @property
- def charset_name(self) -> str:
- return "utf-8"
-
- @property
- def language(self) -> str:
- return ""
-
- def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
- for c in byte_str:
- coding_state = self.coding_sm.next_state(c)
- if coding_state == MachineState.ERROR:
- self._state = ProbingState.NOT_ME
- break
- if coding_state == MachineState.ITS_ME:
- self._state = ProbingState.FOUND_IT
- break
- if coding_state == MachineState.START:
- if self.coding_sm.get_current_charlen() >= 2:
- self._num_mb_chars += 1
-
- if self.state == ProbingState.DETECTING:
- if self.get_confidence() > self.SHORTCUT_THRESHOLD:
- self._state = ProbingState.FOUND_IT
-
- return self.state
-
- def get_confidence(self) -> float:
- unlike = 0.99
- if self._num_mb_chars < 6:
- unlike *= self.ONE_CHAR_PROB**self._num_mb_chars
- return 1.0 - unlike
- return unlike
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py
deleted file mode 100644
index c5e9d85c..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py
+++ /dev/null
@@ -1,9 +0,0 @@
-"""
-This module exists only to simplify retrieving the version number of chardet
-from within setuptools and from chardet subpackages.
-
-:author: Dan Blanchard (dan.blanchard@gmail.com)
-"""
-
-__version__ = "5.1.0"
-VERSION = __version__.split(".")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py
deleted file mode 100644
index 383101cd..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from .initialise import init, deinit, reinit, colorama_text, just_fix_windows_console
-from .ansi import Fore, Back, Style, Cursor
-from .ansitowin32 import AnsiToWin32
-
-__version__ = '0.4.6'
-
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index df9b8517..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc
deleted file mode 100644
index 55cc116b..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc
deleted file mode 100644
index dccc9a8f..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc
deleted file mode 100644
index 5f2dd866..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc
deleted file mode 100644
index 6f9e8135..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc
deleted file mode 100644
index 2f8c13c1..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py
deleted file mode 100644
index 11ec695f..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-'''
-This module generates ANSI character codes to printing colors to terminals.
-See: http://en.wikipedia.org/wiki/ANSI_escape_code
-'''
-
-CSI = '\033['
-OSC = '\033]'
-BEL = '\a'
-
-
-def code_to_chars(code):
- return CSI + str(code) + 'm'
-
-def set_title(title):
- return OSC + '2;' + title + BEL
-
-def clear_screen(mode=2):
- return CSI + str(mode) + 'J'
-
-def clear_line(mode=2):
- return CSI + str(mode) + 'K'
-
-
-class AnsiCodes(object):
- def __init__(self):
- # the subclasses declare class attributes which are numbers.
- # Upon instantiation we define instance attributes, which are the same
- # as the class attributes but wrapped with the ANSI escape sequence
- for name in dir(self):
- if not name.startswith('_'):
- value = getattr(self, name)
- setattr(self, name, code_to_chars(value))
-
-
-class AnsiCursor(object):
- def UP(self, n=1):
- return CSI + str(n) + 'A'
- def DOWN(self, n=1):
- return CSI + str(n) + 'B'
- def FORWARD(self, n=1):
- return CSI + str(n) + 'C'
- def BACK(self, n=1):
- return CSI + str(n) + 'D'
- def POS(self, x=1, y=1):
- return CSI + str(y) + ';' + str(x) + 'H'
-
-
-class AnsiFore(AnsiCodes):
- BLACK = 30
- RED = 31
- GREEN = 32
- YELLOW = 33
- BLUE = 34
- MAGENTA = 35
- CYAN = 36
- WHITE = 37
- RESET = 39
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 90
- LIGHTRED_EX = 91
- LIGHTGREEN_EX = 92
- LIGHTYELLOW_EX = 93
- LIGHTBLUE_EX = 94
- LIGHTMAGENTA_EX = 95
- LIGHTCYAN_EX = 96
- LIGHTWHITE_EX = 97
-
-
-class AnsiBack(AnsiCodes):
- BLACK = 40
- RED = 41
- GREEN = 42
- YELLOW = 43
- BLUE = 44
- MAGENTA = 45
- CYAN = 46
- WHITE = 47
- RESET = 49
-
- # These are fairly well supported, but not part of the standard.
- LIGHTBLACK_EX = 100
- LIGHTRED_EX = 101
- LIGHTGREEN_EX = 102
- LIGHTYELLOW_EX = 103
- LIGHTBLUE_EX = 104
- LIGHTMAGENTA_EX = 105
- LIGHTCYAN_EX = 106
- LIGHTWHITE_EX = 107
-
-
-class AnsiStyle(AnsiCodes):
- BRIGHT = 1
- DIM = 2
- NORMAL = 22
- RESET_ALL = 0
-
-Fore = AnsiFore()
-Back = AnsiBack()
-Style = AnsiStyle()
-Cursor = AnsiCursor()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py
deleted file mode 100644
index abf209e6..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py
+++ /dev/null
@@ -1,277 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import re
-import sys
-import os
-
-from .ansi import AnsiFore, AnsiBack, AnsiStyle, Style, BEL
-from .winterm import enable_vt_processing, WinTerm, WinColor, WinStyle
-from .win32 import windll, winapi_test
-
-
-winterm = None
-if windll is not None:
- winterm = WinTerm()
-
-
-class StreamWrapper(object):
- '''
- Wraps a stream (such as stdout), acting as a transparent proxy for all
- attribute access apart from method 'write()', which is delegated to our
- Converter instance.
- '''
- def __init__(self, wrapped, converter):
- # double-underscore everything to prevent clashes with names of
- # attributes on the wrapped stream object.
- self.__wrapped = wrapped
- self.__convertor = converter
-
- def __getattr__(self, name):
- return getattr(self.__wrapped, name)
-
- def __enter__(self, *args, **kwargs):
- # special method lookup bypasses __getattr__/__getattribute__, see
- # https://stackoverflow.com/questions/12632894/why-doesnt-getattr-work-with-exit
- # thus, contextlib magic methods are not proxied via __getattr__
- return self.__wrapped.__enter__(*args, **kwargs)
-
- def __exit__(self, *args, **kwargs):
- return self.__wrapped.__exit__(*args, **kwargs)
-
- def __setstate__(self, state):
- self.__dict__ = state
-
- def __getstate__(self):
- return self.__dict__
-
- def write(self, text):
- self.__convertor.write(text)
-
- def isatty(self):
- stream = self.__wrapped
- if 'PYCHARM_HOSTED' in os.environ:
- if stream is not None and (stream is sys.__stdout__ or stream is sys.__stderr__):
- return True
- try:
- stream_isatty = stream.isatty
- except AttributeError:
- return False
- else:
- return stream_isatty()
-
- @property
- def closed(self):
- stream = self.__wrapped
- try:
- return stream.closed
- # AttributeError in the case that the stream doesn't support being closed
- # ValueError for the case that the stream has already been detached when atexit runs
- except (AttributeError, ValueError):
- return True
-
-
-class AnsiToWin32(object):
- '''
- Implements a 'write()' method which, on Windows, will strip ANSI character
- sequences from the text, and if outputting to a tty, will convert them into
- win32 function calls.
- '''
- ANSI_CSI_RE = re.compile('\001?\033\\[((?:\\d|;)*)([a-zA-Z])\002?') # Control Sequence Introducer
- ANSI_OSC_RE = re.compile('\001?\033\\]([^\a]*)(\a)\002?') # Operating System Command
-
- def __init__(self, wrapped, convert=None, strip=None, autoreset=False):
- # The wrapped stream (normally sys.stdout or sys.stderr)
- self.wrapped = wrapped
-
- # should we reset colors to defaults after every .write()
- self.autoreset = autoreset
-
- # create the proxy wrapping our output stream
- self.stream = StreamWrapper(wrapped, self)
-
- on_windows = os.name == 'nt'
- # We test if the WinAPI works, because even if we are on Windows
- # we may be using a terminal that doesn't support the WinAPI
- # (e.g. Cygwin Terminal). In this case it's up to the terminal
- # to support the ANSI codes.
- conversion_supported = on_windows and winapi_test()
- try:
- fd = wrapped.fileno()
- except Exception:
- fd = -1
- system_has_native_ansi = not on_windows or enable_vt_processing(fd)
- have_tty = not self.stream.closed and self.stream.isatty()
- need_conversion = conversion_supported and not system_has_native_ansi
-
- # should we strip ANSI sequences from our output?
- if strip is None:
- strip = need_conversion or not have_tty
- self.strip = strip
-
- # should we should convert ANSI sequences into win32 calls?
- if convert is None:
- convert = need_conversion and have_tty
- self.convert = convert
-
- # dict of ansi codes to win32 functions and parameters
- self.win32_calls = self.get_win32_calls()
-
- # are we wrapping stderr?
- self.on_stderr = self.wrapped is sys.stderr
-
- def should_wrap(self):
- '''
- True if this class is actually needed. If false, then the output
- stream will not be affected, nor will win32 calls be issued, so
- wrapping stdout is not actually required. This will generally be
- False on non-Windows platforms, unless optional functionality like
- autoreset has been requested using kwargs to init()
- '''
- return self.convert or self.strip or self.autoreset
-
- def get_win32_calls(self):
- if self.convert and winterm:
- return {
- AnsiStyle.RESET_ALL: (winterm.reset_all, ),
- AnsiStyle.BRIGHT: (winterm.style, WinStyle.BRIGHT),
- AnsiStyle.DIM: (winterm.style, WinStyle.NORMAL),
- AnsiStyle.NORMAL: (winterm.style, WinStyle.NORMAL),
- AnsiFore.BLACK: (winterm.fore, WinColor.BLACK),
- AnsiFore.RED: (winterm.fore, WinColor.RED),
- AnsiFore.GREEN: (winterm.fore, WinColor.GREEN),
- AnsiFore.YELLOW: (winterm.fore, WinColor.YELLOW),
- AnsiFore.BLUE: (winterm.fore, WinColor.BLUE),
- AnsiFore.MAGENTA: (winterm.fore, WinColor.MAGENTA),
- AnsiFore.CYAN: (winterm.fore, WinColor.CYAN),
- AnsiFore.WHITE: (winterm.fore, WinColor.GREY),
- AnsiFore.RESET: (winterm.fore, ),
- AnsiFore.LIGHTBLACK_EX: (winterm.fore, WinColor.BLACK, True),
- AnsiFore.LIGHTRED_EX: (winterm.fore, WinColor.RED, True),
- AnsiFore.LIGHTGREEN_EX: (winterm.fore, WinColor.GREEN, True),
- AnsiFore.LIGHTYELLOW_EX: (winterm.fore, WinColor.YELLOW, True),
- AnsiFore.LIGHTBLUE_EX: (winterm.fore, WinColor.BLUE, True),
- AnsiFore.LIGHTMAGENTA_EX: (winterm.fore, WinColor.MAGENTA, True),
- AnsiFore.LIGHTCYAN_EX: (winterm.fore, WinColor.CYAN, True),
- AnsiFore.LIGHTWHITE_EX: (winterm.fore, WinColor.GREY, True),
- AnsiBack.BLACK: (winterm.back, WinColor.BLACK),
- AnsiBack.RED: (winterm.back, WinColor.RED),
- AnsiBack.GREEN: (winterm.back, WinColor.GREEN),
- AnsiBack.YELLOW: (winterm.back, WinColor.YELLOW),
- AnsiBack.BLUE: (winterm.back, WinColor.BLUE),
- AnsiBack.MAGENTA: (winterm.back, WinColor.MAGENTA),
- AnsiBack.CYAN: (winterm.back, WinColor.CYAN),
- AnsiBack.WHITE: (winterm.back, WinColor.GREY),
- AnsiBack.RESET: (winterm.back, ),
- AnsiBack.LIGHTBLACK_EX: (winterm.back, WinColor.BLACK, True),
- AnsiBack.LIGHTRED_EX: (winterm.back, WinColor.RED, True),
- AnsiBack.LIGHTGREEN_EX: (winterm.back, WinColor.GREEN, True),
- AnsiBack.LIGHTYELLOW_EX: (winterm.back, WinColor.YELLOW, True),
- AnsiBack.LIGHTBLUE_EX: (winterm.back, WinColor.BLUE, True),
- AnsiBack.LIGHTMAGENTA_EX: (winterm.back, WinColor.MAGENTA, True),
- AnsiBack.LIGHTCYAN_EX: (winterm.back, WinColor.CYAN, True),
- AnsiBack.LIGHTWHITE_EX: (winterm.back, WinColor.GREY, True),
- }
- return dict()
-
- def write(self, text):
- if self.strip or self.convert:
- self.write_and_convert(text)
- else:
- self.wrapped.write(text)
- self.wrapped.flush()
- if self.autoreset:
- self.reset_all()
-
-
- def reset_all(self):
- if self.convert:
- self.call_win32('m', (0,))
- elif not self.strip and not self.stream.closed:
- self.wrapped.write(Style.RESET_ALL)
-
-
- def write_and_convert(self, text):
- '''
- Write the given text to our wrapped stream, stripping any ANSI
- sequences from the text, and optionally converting them into win32
- calls.
- '''
- cursor = 0
- text = self.convert_osc(text)
- for match in self.ANSI_CSI_RE.finditer(text):
- start, end = match.span()
- self.write_plain_text(text, cursor, start)
- self.convert_ansi(*match.groups())
- cursor = end
- self.write_plain_text(text, cursor, len(text))
-
-
- def write_plain_text(self, text, start, end):
- if start < end:
- self.wrapped.write(text[start:end])
- self.wrapped.flush()
-
-
- def convert_ansi(self, paramstring, command):
- if self.convert:
- params = self.extract_params(command, paramstring)
- self.call_win32(command, params)
-
-
- def extract_params(self, command, paramstring):
- if command in 'Hf':
- params = tuple(int(p) if len(p) != 0 else 1 for p in paramstring.split(';'))
- while len(params) < 2:
- # defaults:
- params = params + (1,)
- else:
- params = tuple(int(p) for p in paramstring.split(';') if len(p) != 0)
- if len(params) == 0:
- # defaults:
- if command in 'JKm':
- params = (0,)
- elif command in 'ABCD':
- params = (1,)
-
- return params
-
-
- def call_win32(self, command, params):
- if command == 'm':
- for param in params:
- if param in self.win32_calls:
- func_args = self.win32_calls[param]
- func = func_args[0]
- args = func_args[1:]
- kwargs = dict(on_stderr=self.on_stderr)
- func(*args, **kwargs)
- elif command in 'J':
- winterm.erase_screen(params[0], on_stderr=self.on_stderr)
- elif command in 'K':
- winterm.erase_line(params[0], on_stderr=self.on_stderr)
- elif command in 'Hf': # cursor position - absolute
- winterm.set_cursor_position(params, on_stderr=self.on_stderr)
- elif command in 'ABCD': # cursor position - relative
- n = params[0]
- # A - up, B - down, C - forward, D - back
- x, y = {'A': (0, -n), 'B': (0, n), 'C': (n, 0), 'D': (-n, 0)}[command]
- winterm.cursor_adjust(x, y, on_stderr=self.on_stderr)
-
-
- def convert_osc(self, text):
- for match in self.ANSI_OSC_RE.finditer(text):
- start, end = match.span()
- text = text[:start] + text[end:]
- paramstring, command = match.groups()
- if command == BEL:
- if paramstring.count(";") == 1:
- params = paramstring.split(";")
- # 0 - change title and icon (we will only change title)
- # 1 - change icon (we don't support this)
- # 2 - change title
- if params[0] in '02':
- winterm.set_title(params[1])
- return text
-
-
- def flush(self):
- self.wrapped.flush()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py
deleted file mode 100644
index d5fd4b71..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py
+++ /dev/null
@@ -1,121 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import atexit
-import contextlib
-import sys
-
-from .ansitowin32 import AnsiToWin32
-
-
-def _wipe_internal_state_for_tests():
- global orig_stdout, orig_stderr
- orig_stdout = None
- orig_stderr = None
-
- global wrapped_stdout, wrapped_stderr
- wrapped_stdout = None
- wrapped_stderr = None
-
- global atexit_done
- atexit_done = False
-
- global fixed_windows_console
- fixed_windows_console = False
-
- try:
- # no-op if it wasn't registered
- atexit.unregister(reset_all)
- except AttributeError:
- # python 2: no atexit.unregister. Oh well, we did our best.
- pass
-
-
-def reset_all():
- if AnsiToWin32 is not None: # Issue #74: objects might become None at exit
- AnsiToWin32(orig_stdout).reset_all()
-
-
-def init(autoreset=False, convert=None, strip=None, wrap=True):
-
- if not wrap and any([autoreset, convert, strip]):
- raise ValueError('wrap=False conflicts with any other arg=True')
-
- global wrapped_stdout, wrapped_stderr
- global orig_stdout, orig_stderr
-
- orig_stdout = sys.stdout
- orig_stderr = sys.stderr
-
- if sys.stdout is None:
- wrapped_stdout = None
- else:
- sys.stdout = wrapped_stdout = \
- wrap_stream(orig_stdout, convert, strip, autoreset, wrap)
- if sys.stderr is None:
- wrapped_stderr = None
- else:
- sys.stderr = wrapped_stderr = \
- wrap_stream(orig_stderr, convert, strip, autoreset, wrap)
-
- global atexit_done
- if not atexit_done:
- atexit.register(reset_all)
- atexit_done = True
-
-
-def deinit():
- if orig_stdout is not None:
- sys.stdout = orig_stdout
- if orig_stderr is not None:
- sys.stderr = orig_stderr
-
-
-def just_fix_windows_console():
- global fixed_windows_console
-
- if sys.platform != "win32":
- return
- if fixed_windows_console:
- return
- if wrapped_stdout is not None or wrapped_stderr is not None:
- # Someone already ran init() and it did stuff, so we won't second-guess them
- return
-
- # On newer versions of Windows, AnsiToWin32.__init__ will implicitly enable the
- # native ANSI support in the console as a side-effect. We only need to actually
- # replace sys.stdout/stderr if we're in the old-style conversion mode.
- new_stdout = AnsiToWin32(sys.stdout, convert=None, strip=None, autoreset=False)
- if new_stdout.convert:
- sys.stdout = new_stdout
- new_stderr = AnsiToWin32(sys.stderr, convert=None, strip=None, autoreset=False)
- if new_stderr.convert:
- sys.stderr = new_stderr
-
- fixed_windows_console = True
-
-@contextlib.contextmanager
-def colorama_text(*args, **kwargs):
- init(*args, **kwargs)
- try:
- yield
- finally:
- deinit()
-
-
-def reinit():
- if wrapped_stdout is not None:
- sys.stdout = wrapped_stdout
- if wrapped_stderr is not None:
- sys.stderr = wrapped_stderr
-
-
-def wrap_stream(stream, convert, strip, autoreset, wrap):
- if wrap:
- wrapper = AnsiToWin32(stream,
- convert=convert, strip=strip, autoreset=autoreset)
- if wrapper.should_wrap():
- stream = wrapper.stream
- return stream
-
-
-# Use this for initial setup as well, to reduce code duplication
-_wipe_internal_state_for_tests()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py
deleted file mode 100644
index 8c5661e9..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc
deleted file mode 100644
index 5ceaafbf..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc
deleted file mode 100644
index 0e471df9..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc
deleted file mode 100644
index 20972a74..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc
deleted file mode 100644
index 2b36b89b..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc
deleted file mode 100644
index b43a6e07..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc
deleted file mode 100644
index e2941371..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc
deleted file mode 100644
index 5f8928fb..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py
deleted file mode 100644
index 0a20c80f..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import sys
-from unittest import TestCase, main
-
-from ..ansi import Back, Fore, Style
-from ..ansitowin32 import AnsiToWin32
-
-stdout_orig = sys.stdout
-stderr_orig = sys.stderr
-
-
-class AnsiTest(TestCase):
-
- def setUp(self):
- # sanity check: stdout should be a file or StringIO object.
- # It will only be AnsiToWin32 if init() has previously wrapped it
- self.assertNotEqual(type(sys.stdout), AnsiToWin32)
- self.assertNotEqual(type(sys.stderr), AnsiToWin32)
-
- def tearDown(self):
- sys.stdout = stdout_orig
- sys.stderr = stderr_orig
-
-
- def testForeAttributes(self):
- self.assertEqual(Fore.BLACK, '\033[30m')
- self.assertEqual(Fore.RED, '\033[31m')
- self.assertEqual(Fore.GREEN, '\033[32m')
- self.assertEqual(Fore.YELLOW, '\033[33m')
- self.assertEqual(Fore.BLUE, '\033[34m')
- self.assertEqual(Fore.MAGENTA, '\033[35m')
- self.assertEqual(Fore.CYAN, '\033[36m')
- self.assertEqual(Fore.WHITE, '\033[37m')
- self.assertEqual(Fore.RESET, '\033[39m')
-
- # Check the light, extended versions.
- self.assertEqual(Fore.LIGHTBLACK_EX, '\033[90m')
- self.assertEqual(Fore.LIGHTRED_EX, '\033[91m')
- self.assertEqual(Fore.LIGHTGREEN_EX, '\033[92m')
- self.assertEqual(Fore.LIGHTYELLOW_EX, '\033[93m')
- self.assertEqual(Fore.LIGHTBLUE_EX, '\033[94m')
- self.assertEqual(Fore.LIGHTMAGENTA_EX, '\033[95m')
- self.assertEqual(Fore.LIGHTCYAN_EX, '\033[96m')
- self.assertEqual(Fore.LIGHTWHITE_EX, '\033[97m')
-
-
- def testBackAttributes(self):
- self.assertEqual(Back.BLACK, '\033[40m')
- self.assertEqual(Back.RED, '\033[41m')
- self.assertEqual(Back.GREEN, '\033[42m')
- self.assertEqual(Back.YELLOW, '\033[43m')
- self.assertEqual(Back.BLUE, '\033[44m')
- self.assertEqual(Back.MAGENTA, '\033[45m')
- self.assertEqual(Back.CYAN, '\033[46m')
- self.assertEqual(Back.WHITE, '\033[47m')
- self.assertEqual(Back.RESET, '\033[49m')
-
- # Check the light, extended versions.
- self.assertEqual(Back.LIGHTBLACK_EX, '\033[100m')
- self.assertEqual(Back.LIGHTRED_EX, '\033[101m')
- self.assertEqual(Back.LIGHTGREEN_EX, '\033[102m')
- self.assertEqual(Back.LIGHTYELLOW_EX, '\033[103m')
- self.assertEqual(Back.LIGHTBLUE_EX, '\033[104m')
- self.assertEqual(Back.LIGHTMAGENTA_EX, '\033[105m')
- self.assertEqual(Back.LIGHTCYAN_EX, '\033[106m')
- self.assertEqual(Back.LIGHTWHITE_EX, '\033[107m')
-
-
- def testStyleAttributes(self):
- self.assertEqual(Style.DIM, '\033[2m')
- self.assertEqual(Style.NORMAL, '\033[22m')
- self.assertEqual(Style.BRIGHT, '\033[1m')
-
-
-if __name__ == '__main__':
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py
deleted file mode 100644
index 91ca551f..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py
+++ /dev/null
@@ -1,294 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from io import StringIO, TextIOWrapper
-from unittest import TestCase, main
-try:
- from contextlib import ExitStack
-except ImportError:
- # python 2
- from contextlib2 import ExitStack
-
-try:
- from unittest.mock import MagicMock, Mock, patch
-except ImportError:
- from mock import MagicMock, Mock, patch
-
-from ..ansitowin32 import AnsiToWin32, StreamWrapper
-from ..win32 import ENABLE_VIRTUAL_TERMINAL_PROCESSING
-from .utils import osname
-
-
-class StreamWrapperTest(TestCase):
-
- def testIsAProxy(self):
- mockStream = Mock()
- wrapper = StreamWrapper(mockStream, None)
- self.assertTrue( wrapper.random_attr is mockStream.random_attr )
-
- def testDelegatesWrite(self):
- mockStream = Mock()
- mockConverter = Mock()
- wrapper = StreamWrapper(mockStream, mockConverter)
- wrapper.write('hello')
- self.assertTrue(mockConverter.write.call_args, (('hello',), {}))
-
- def testDelegatesContext(self):
- mockConverter = Mock()
- s = StringIO()
- with StreamWrapper(s, mockConverter) as fp:
- fp.write(u'hello')
- self.assertTrue(s.closed)
-
- def testProxyNoContextManager(self):
- mockStream = MagicMock()
- mockStream.__enter__.side_effect = AttributeError()
- mockConverter = Mock()
- with self.assertRaises(AttributeError) as excinfo:
- with StreamWrapper(mockStream, mockConverter) as wrapper:
- wrapper.write('hello')
-
- def test_closed_shouldnt_raise_on_closed_stream(self):
- stream = StringIO()
- stream.close()
- wrapper = StreamWrapper(stream, None)
- self.assertEqual(wrapper.closed, True)
-
- def test_closed_shouldnt_raise_on_detached_stream(self):
- stream = TextIOWrapper(StringIO())
- stream.detach()
- wrapper = StreamWrapper(stream, None)
- self.assertEqual(wrapper.closed, True)
-
-class AnsiToWin32Test(TestCase):
-
- def testInit(self):
- mockStdout = Mock()
- auto = Mock()
- stream = AnsiToWin32(mockStdout, autoreset=auto)
- self.assertEqual(stream.wrapped, mockStdout)
- self.assertEqual(stream.autoreset, auto)
-
- @patch('colorama.ansitowin32.winterm', None)
- @patch('colorama.ansitowin32.winapi_test', lambda *_: True)
- def testStripIsTrueOnWindows(self):
- with osname('nt'):
- mockStdout = Mock()
- stream = AnsiToWin32(mockStdout)
- self.assertTrue(stream.strip)
-
- def testStripIsFalseOffWindows(self):
- with osname('posix'):
- mockStdout = Mock(closed=False)
- stream = AnsiToWin32(mockStdout)
- self.assertFalse(stream.strip)
-
- def testWriteStripsAnsi(self):
- mockStdout = Mock()
- stream = AnsiToWin32(mockStdout)
- stream.wrapped = Mock()
- stream.write_and_convert = Mock()
- stream.strip = True
-
- stream.write('abc')
-
- self.assertFalse(stream.wrapped.write.called)
- self.assertEqual(stream.write_and_convert.call_args, (('abc',), {}))
-
- def testWriteDoesNotStripAnsi(self):
- mockStdout = Mock()
- stream = AnsiToWin32(mockStdout)
- stream.wrapped = Mock()
- stream.write_and_convert = Mock()
- stream.strip = False
- stream.convert = False
-
- stream.write('abc')
-
- self.assertFalse(stream.write_and_convert.called)
- self.assertEqual(stream.wrapped.write.call_args, (('abc',), {}))
-
- def assert_autoresets(self, convert, autoreset=True):
- stream = AnsiToWin32(Mock())
- stream.convert = convert
- stream.reset_all = Mock()
- stream.autoreset = autoreset
- stream.winterm = Mock()
-
- stream.write('abc')
-
- self.assertEqual(stream.reset_all.called, autoreset)
-
- def testWriteAutoresets(self):
- self.assert_autoresets(convert=True)
- self.assert_autoresets(convert=False)
- self.assert_autoresets(convert=True, autoreset=False)
- self.assert_autoresets(convert=False, autoreset=False)
-
- def testWriteAndConvertWritesPlainText(self):
- stream = AnsiToWin32(Mock())
- stream.write_and_convert( 'abc' )
- self.assertEqual( stream.wrapped.write.call_args, (('abc',), {}) )
-
- def testWriteAndConvertStripsAllValidAnsi(self):
- stream = AnsiToWin32(Mock())
- stream.call_win32 = Mock()
- data = [
- 'abc\033[mdef',
- 'abc\033[0mdef',
- 'abc\033[2mdef',
- 'abc\033[02mdef',
- 'abc\033[002mdef',
- 'abc\033[40mdef',
- 'abc\033[040mdef',
- 'abc\033[0;1mdef',
- 'abc\033[40;50mdef',
- 'abc\033[50;30;40mdef',
- 'abc\033[Adef',
- 'abc\033[0Gdef',
- 'abc\033[1;20;128Hdef',
- ]
- for datum in data:
- stream.wrapped.write.reset_mock()
- stream.write_and_convert( datum )
- self.assertEqual(
- [args[0] for args in stream.wrapped.write.call_args_list],
- [ ('abc',), ('def',) ]
- )
-
- def testWriteAndConvertSkipsEmptySnippets(self):
- stream = AnsiToWin32(Mock())
- stream.call_win32 = Mock()
- stream.write_and_convert( '\033[40m\033[41m' )
- self.assertFalse( stream.wrapped.write.called )
-
- def testWriteAndConvertCallsWin32WithParamsAndCommand(self):
- stream = AnsiToWin32(Mock())
- stream.convert = True
- stream.call_win32 = Mock()
- stream.extract_params = Mock(return_value='params')
- data = {
- 'abc\033[adef': ('a', 'params'),
- 'abc\033[;;bdef': ('b', 'params'),
- 'abc\033[0cdef': ('c', 'params'),
- 'abc\033[;;0;;Gdef': ('G', 'params'),
- 'abc\033[1;20;128Hdef': ('H', 'params'),
- }
- for datum, expected in data.items():
- stream.call_win32.reset_mock()
- stream.write_and_convert( datum )
- self.assertEqual( stream.call_win32.call_args[0], expected )
-
- def test_reset_all_shouldnt_raise_on_closed_orig_stdout(self):
- stream = StringIO()
- converter = AnsiToWin32(stream)
- stream.close()
-
- converter.reset_all()
-
- def test_wrap_shouldnt_raise_on_closed_orig_stdout(self):
- stream = StringIO()
- stream.close()
- with \
- patch("colorama.ansitowin32.os.name", "nt"), \
- patch("colorama.ansitowin32.winapi_test", lambda: True):
- converter = AnsiToWin32(stream)
- self.assertTrue(converter.strip)
- self.assertFalse(converter.convert)
-
- def test_wrap_shouldnt_raise_on_missing_closed_attr(self):
- with \
- patch("colorama.ansitowin32.os.name", "nt"), \
- patch("colorama.ansitowin32.winapi_test", lambda: True):
- converter = AnsiToWin32(object())
- self.assertTrue(converter.strip)
- self.assertFalse(converter.convert)
-
- def testExtractParams(self):
- stream = AnsiToWin32(Mock())
- data = {
- '': (0,),
- ';;': (0,),
- '2': (2,),
- ';;002;;': (2,),
- '0;1': (0, 1),
- ';;003;;456;;': (3, 456),
- '11;22;33;44;55': (11, 22, 33, 44, 55),
- }
- for datum, expected in data.items():
- self.assertEqual(stream.extract_params('m', datum), expected)
-
- def testCallWin32UsesLookup(self):
- listener = Mock()
- stream = AnsiToWin32(listener)
- stream.win32_calls = {
- 1: (lambda *_, **__: listener(11),),
- 2: (lambda *_, **__: listener(22),),
- 3: (lambda *_, **__: listener(33),),
- }
- stream.call_win32('m', (3, 1, 99, 2))
- self.assertEqual(
- [a[0][0] for a in listener.call_args_list],
- [33, 11, 22] )
-
- def test_osc_codes(self):
- mockStdout = Mock()
- stream = AnsiToWin32(mockStdout, convert=True)
- with patch('colorama.ansitowin32.winterm') as winterm:
- data = [
- '\033]0\x07', # missing arguments
- '\033]0;foo\x08', # wrong OSC command
- '\033]0;colorama_test_title\x07', # should work
- '\033]1;colorama_test_title\x07', # wrong set command
- '\033]2;colorama_test_title\x07', # should work
- '\033]' + ';' * 64 + '\x08', # see issue #247
- ]
- for code in data:
- stream.write(code)
- self.assertEqual(winterm.set_title.call_count, 2)
-
- def test_native_windows_ansi(self):
- with ExitStack() as stack:
- def p(a, b):
- stack.enter_context(patch(a, b, create=True))
- # Pretend to be on Windows
- p("colorama.ansitowin32.os.name", "nt")
- p("colorama.ansitowin32.winapi_test", lambda: True)
- p("colorama.win32.winapi_test", lambda: True)
- p("colorama.winterm.win32.windll", "non-None")
- p("colorama.winterm.get_osfhandle", lambda _: 1234)
-
- # Pretend that our mock stream has native ANSI support
- p(
- "colorama.winterm.win32.GetConsoleMode",
- lambda _: ENABLE_VIRTUAL_TERMINAL_PROCESSING,
- )
- SetConsoleMode = Mock()
- p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode)
-
- stdout = Mock()
- stdout.closed = False
- stdout.isatty.return_value = True
- stdout.fileno.return_value = 1
-
- # Our fake console says it has native vt support, so AnsiToWin32 should
- # enable that support and do nothing else.
- stream = AnsiToWin32(stdout)
- SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING)
- self.assertFalse(stream.strip)
- self.assertFalse(stream.convert)
- self.assertFalse(stream.should_wrap())
-
- # Now let's pretend we're on an old Windows console, that doesn't have
- # native ANSI support.
- p("colorama.winterm.win32.GetConsoleMode", lambda _: 0)
- SetConsoleMode = Mock()
- p("colorama.winterm.win32.SetConsoleMode", SetConsoleMode)
-
- stream = AnsiToWin32(stdout)
- SetConsoleMode.assert_called_with(1234, ENABLE_VIRTUAL_TERMINAL_PROCESSING)
- self.assertTrue(stream.strip)
- self.assertTrue(stream.convert)
- self.assertTrue(stream.should_wrap())
-
-
-if __name__ == '__main__':
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py
deleted file mode 100644
index 89f9b075..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py
+++ /dev/null
@@ -1,189 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import sys
-from unittest import TestCase, main, skipUnless
-
-try:
- from unittest.mock import patch, Mock
-except ImportError:
- from mock import patch, Mock
-
-from ..ansitowin32 import StreamWrapper
-from ..initialise import init, just_fix_windows_console, _wipe_internal_state_for_tests
-from .utils import osname, replace_by
-
-orig_stdout = sys.stdout
-orig_stderr = sys.stderr
-
-
-class InitTest(TestCase):
-
- @skipUnless(sys.stdout.isatty(), "sys.stdout is not a tty")
- def setUp(self):
- # sanity check
- self.assertNotWrapped()
-
- def tearDown(self):
- _wipe_internal_state_for_tests()
- sys.stdout = orig_stdout
- sys.stderr = orig_stderr
-
- def assertWrapped(self):
- self.assertIsNot(sys.stdout, orig_stdout, 'stdout should be wrapped')
- self.assertIsNot(sys.stderr, orig_stderr, 'stderr should be wrapped')
- self.assertTrue(isinstance(sys.stdout, StreamWrapper),
- 'bad stdout wrapper')
- self.assertTrue(isinstance(sys.stderr, StreamWrapper),
- 'bad stderr wrapper')
-
- def assertNotWrapped(self):
- self.assertIs(sys.stdout, orig_stdout, 'stdout should not be wrapped')
- self.assertIs(sys.stderr, orig_stderr, 'stderr should not be wrapped')
-
- @patch('colorama.initialise.reset_all')
- @patch('colorama.ansitowin32.winapi_test', lambda *_: True)
- @patch('colorama.ansitowin32.enable_vt_processing', lambda *_: False)
- def testInitWrapsOnWindows(self, _):
- with osname("nt"):
- init()
- self.assertWrapped()
-
- @patch('colorama.initialise.reset_all')
- @patch('colorama.ansitowin32.winapi_test', lambda *_: False)
- def testInitDoesntWrapOnEmulatedWindows(self, _):
- with osname("nt"):
- init()
- self.assertNotWrapped()
-
- def testInitDoesntWrapOnNonWindows(self):
- with osname("posix"):
- init()
- self.assertNotWrapped()
-
- def testInitDoesntWrapIfNone(self):
- with replace_by(None):
- init()
- # We can't use assertNotWrapped here because replace_by(None)
- # changes stdout/stderr already.
- self.assertIsNone(sys.stdout)
- self.assertIsNone(sys.stderr)
-
- def testInitAutoresetOnWrapsOnAllPlatforms(self):
- with osname("posix"):
- init(autoreset=True)
- self.assertWrapped()
-
- def testInitWrapOffDoesntWrapOnWindows(self):
- with osname("nt"):
- init(wrap=False)
- self.assertNotWrapped()
-
- def testInitWrapOffIncompatibleWithAutoresetOn(self):
- self.assertRaises(ValueError, lambda: init(autoreset=True, wrap=False))
-
- @patch('colorama.win32.SetConsoleTextAttribute')
- @patch('colorama.initialise.AnsiToWin32')
- def testAutoResetPassedOn(self, mockATW32, _):
- with osname("nt"):
- init(autoreset=True)
- self.assertEqual(len(mockATW32.call_args_list), 2)
- self.assertEqual(mockATW32.call_args_list[1][1]['autoreset'], True)
- self.assertEqual(mockATW32.call_args_list[0][1]['autoreset'], True)
-
- @patch('colorama.initialise.AnsiToWin32')
- def testAutoResetChangeable(self, mockATW32):
- with osname("nt"):
- init()
-
- init(autoreset=True)
- self.assertEqual(len(mockATW32.call_args_list), 4)
- self.assertEqual(mockATW32.call_args_list[2][1]['autoreset'], True)
- self.assertEqual(mockATW32.call_args_list[3][1]['autoreset'], True)
-
- init()
- self.assertEqual(len(mockATW32.call_args_list), 6)
- self.assertEqual(
- mockATW32.call_args_list[4][1]['autoreset'], False)
- self.assertEqual(
- mockATW32.call_args_list[5][1]['autoreset'], False)
-
-
- @patch('colorama.initialise.atexit.register')
- def testAtexitRegisteredOnlyOnce(self, mockRegister):
- init()
- self.assertTrue(mockRegister.called)
- mockRegister.reset_mock()
- init()
- self.assertFalse(mockRegister.called)
-
-
-class JustFixWindowsConsoleTest(TestCase):
- def _reset(self):
- _wipe_internal_state_for_tests()
- sys.stdout = orig_stdout
- sys.stderr = orig_stderr
-
- def tearDown(self):
- self._reset()
-
- @patch("colorama.ansitowin32.winapi_test", lambda: True)
- def testJustFixWindowsConsole(self):
- if sys.platform != "win32":
- # just_fix_windows_console should be a no-op
- just_fix_windows_console()
- self.assertIs(sys.stdout, orig_stdout)
- self.assertIs(sys.stderr, orig_stderr)
- else:
- def fake_std():
- # Emulate stdout=not a tty, stderr=tty
- # to check that we handle both cases correctly
- stdout = Mock()
- stdout.closed = False
- stdout.isatty.return_value = False
- stdout.fileno.return_value = 1
- sys.stdout = stdout
-
- stderr = Mock()
- stderr.closed = False
- stderr.isatty.return_value = True
- stderr.fileno.return_value = 2
- sys.stderr = stderr
-
- for native_ansi in [False, True]:
- with patch(
- 'colorama.ansitowin32.enable_vt_processing',
- lambda *_: native_ansi
- ):
- self._reset()
- fake_std()
-
- # Regular single-call test
- prev_stdout = sys.stdout
- prev_stderr = sys.stderr
- just_fix_windows_console()
- self.assertIs(sys.stdout, prev_stdout)
- if native_ansi:
- self.assertIs(sys.stderr, prev_stderr)
- else:
- self.assertIsNot(sys.stderr, prev_stderr)
-
- # second call without resetting is always a no-op
- prev_stdout = sys.stdout
- prev_stderr = sys.stderr
- just_fix_windows_console()
- self.assertIs(sys.stdout, prev_stdout)
- self.assertIs(sys.stderr, prev_stderr)
-
- self._reset()
- fake_std()
-
- # If init() runs first, just_fix_windows_console should be a no-op
- init()
- prev_stdout = sys.stdout
- prev_stderr = sys.stderr
- just_fix_windows_console()
- self.assertIs(prev_stdout, sys.stdout)
- self.assertIs(prev_stderr, sys.stderr)
-
-
-if __name__ == '__main__':
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py
deleted file mode 100644
index 0f84e4be..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import sys
-from unittest import TestCase, main
-
-from ..ansitowin32 import StreamWrapper, AnsiToWin32
-from .utils import pycharm, replace_by, replace_original_by, StreamTTY, StreamNonTTY
-
-
-def is_a_tty(stream):
- return StreamWrapper(stream, None).isatty()
-
-class IsattyTest(TestCase):
-
- def test_TTY(self):
- tty = StreamTTY()
- self.assertTrue(is_a_tty(tty))
- with pycharm():
- self.assertTrue(is_a_tty(tty))
-
- def test_nonTTY(self):
- non_tty = StreamNonTTY()
- self.assertFalse(is_a_tty(non_tty))
- with pycharm():
- self.assertFalse(is_a_tty(non_tty))
-
- def test_withPycharm(self):
- with pycharm():
- self.assertTrue(is_a_tty(sys.stderr))
- self.assertTrue(is_a_tty(sys.stdout))
-
- def test_withPycharmTTYOverride(self):
- tty = StreamTTY()
- with pycharm(), replace_by(tty):
- self.assertTrue(is_a_tty(tty))
-
- def test_withPycharmNonTTYOverride(self):
- non_tty = StreamNonTTY()
- with pycharm(), replace_by(non_tty):
- self.assertFalse(is_a_tty(non_tty))
-
- def test_withPycharmNoneOverride(self):
- with pycharm():
- with replace_by(None), replace_original_by(None):
- self.assertFalse(is_a_tty(None))
- self.assertFalse(is_a_tty(StreamNonTTY()))
- self.assertTrue(is_a_tty(StreamTTY()))
-
- def test_withPycharmStreamWrapped(self):
- with pycharm():
- self.assertTrue(AnsiToWin32(StreamTTY()).stream.isatty())
- self.assertFalse(AnsiToWin32(StreamNonTTY()).stream.isatty())
- self.assertTrue(AnsiToWin32(sys.stdout).stream.isatty())
- self.assertTrue(AnsiToWin32(sys.stderr).stream.isatty())
-
-
-if __name__ == '__main__':
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py
deleted file mode 100644
index 472fafb4..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py
+++ /dev/null
@@ -1,49 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-from contextlib import contextmanager
-from io import StringIO
-import sys
-import os
-
-
-class StreamTTY(StringIO):
- def isatty(self):
- return True
-
-class StreamNonTTY(StringIO):
- def isatty(self):
- return False
-
-@contextmanager
-def osname(name):
- orig = os.name
- os.name = name
- yield
- os.name = orig
-
-@contextmanager
-def replace_by(stream):
- orig_stdout = sys.stdout
- orig_stderr = sys.stderr
- sys.stdout = stream
- sys.stderr = stream
- yield
- sys.stdout = orig_stdout
- sys.stderr = orig_stderr
-
-@contextmanager
-def replace_original_by(stream):
- orig_stdout = sys.__stdout__
- orig_stderr = sys.__stderr__
- sys.__stdout__ = stream
- sys.__stderr__ = stream
- yield
- sys.__stdout__ = orig_stdout
- sys.__stderr__ = orig_stderr
-
-@contextmanager
-def pycharm():
- os.environ["PYCHARM_HOSTED"] = "1"
- non_tty = StreamNonTTY()
- with replace_by(non_tty), replace_original_by(non_tty):
- yield
- del os.environ["PYCHARM_HOSTED"]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py
deleted file mode 100644
index d0955f9e..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-import sys
-from unittest import TestCase, main, skipUnless
-
-try:
- from unittest.mock import Mock, patch
-except ImportError:
- from mock import Mock, patch
-
-from ..winterm import WinColor, WinStyle, WinTerm
-
-
-class WinTermTest(TestCase):
-
- @patch('colorama.winterm.win32')
- def testInit(self, mockWin32):
- mockAttr = Mock()
- mockAttr.wAttributes = 7 + 6 * 16 + 8
- mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr
- term = WinTerm()
- self.assertEqual(term._fore, 7)
- self.assertEqual(term._back, 6)
- self.assertEqual(term._style, 8)
-
- @skipUnless(sys.platform.startswith("win"), "requires Windows")
- def testGetAttrs(self):
- term = WinTerm()
-
- term._fore = 0
- term._back = 0
- term._style = 0
- self.assertEqual(term.get_attrs(), 0)
-
- term._fore = WinColor.YELLOW
- self.assertEqual(term.get_attrs(), WinColor.YELLOW)
-
- term._back = WinColor.MAGENTA
- self.assertEqual(
- term.get_attrs(),
- WinColor.YELLOW + WinColor.MAGENTA * 16)
-
- term._style = WinStyle.BRIGHT
- self.assertEqual(
- term.get_attrs(),
- WinColor.YELLOW + WinColor.MAGENTA * 16 + WinStyle.BRIGHT)
-
- @patch('colorama.winterm.win32')
- def testResetAll(self, mockWin32):
- mockAttr = Mock()
- mockAttr.wAttributes = 1 + 2 * 16 + 8
- mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr
- term = WinTerm()
-
- term.set_console = Mock()
- term._fore = -1
- term._back = -1
- term._style = -1
-
- term.reset_all()
-
- self.assertEqual(term._fore, 1)
- self.assertEqual(term._back, 2)
- self.assertEqual(term._style, 8)
- self.assertEqual(term.set_console.called, True)
-
- @skipUnless(sys.platform.startswith("win"), "requires Windows")
- def testFore(self):
- term = WinTerm()
- term.set_console = Mock()
- term._fore = 0
-
- term.fore(5)
-
- self.assertEqual(term._fore, 5)
- self.assertEqual(term.set_console.called, True)
-
- @skipUnless(sys.platform.startswith("win"), "requires Windows")
- def testBack(self):
- term = WinTerm()
- term.set_console = Mock()
- term._back = 0
-
- term.back(5)
-
- self.assertEqual(term._back, 5)
- self.assertEqual(term.set_console.called, True)
-
- @skipUnless(sys.platform.startswith("win"), "requires Windows")
- def testStyle(self):
- term = WinTerm()
- term.set_console = Mock()
- term._style = 0
-
- term.style(22)
-
- self.assertEqual(term._style, 22)
- self.assertEqual(term.set_console.called, True)
-
- @patch('colorama.winterm.win32')
- def testSetConsole(self, mockWin32):
- mockAttr = Mock()
- mockAttr.wAttributes = 0
- mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr
- term = WinTerm()
- term.windll = Mock()
-
- term.set_console()
-
- self.assertEqual(
- mockWin32.SetConsoleTextAttribute.call_args,
- ((mockWin32.STDOUT, term.get_attrs()), {})
- )
-
- @patch('colorama.winterm.win32')
- def testSetConsoleOnStderr(self, mockWin32):
- mockAttr = Mock()
- mockAttr.wAttributes = 0
- mockWin32.GetConsoleScreenBufferInfo.return_value = mockAttr
- term = WinTerm()
- term.windll = Mock()
-
- term.set_console(on_stderr=True)
-
- self.assertEqual(
- mockWin32.SetConsoleTextAttribute.call_args,
- ((mockWin32.STDERR, term.get_attrs()), {})
- )
-
-
-if __name__ == '__main__':
- main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py
deleted file mode 100644
index 841b0e27..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py
+++ /dev/null
@@ -1,180 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-
-# from winbase.h
-STDOUT = -11
-STDERR = -12
-
-ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004
-
-try:
- import ctypes
- from ctypes import LibraryLoader
- windll = LibraryLoader(ctypes.WinDLL)
- from ctypes import wintypes
-except (AttributeError, ImportError):
- windll = None
- SetConsoleTextAttribute = lambda *_: None
- winapi_test = lambda *_: None
-else:
- from ctypes import byref, Structure, c_char, POINTER
-
- COORD = wintypes._COORD
-
- class CONSOLE_SCREEN_BUFFER_INFO(Structure):
- """struct in wincon.h."""
- _fields_ = [
- ("dwSize", COORD),
- ("dwCursorPosition", COORD),
- ("wAttributes", wintypes.WORD),
- ("srWindow", wintypes.SMALL_RECT),
- ("dwMaximumWindowSize", COORD),
- ]
- def __str__(self):
- return '(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)' % (
- self.dwSize.Y, self.dwSize.X
- , self.dwCursorPosition.Y, self.dwCursorPosition.X
- , self.wAttributes
- , self.srWindow.Top, self.srWindow.Left, self.srWindow.Bottom, self.srWindow.Right
- , self.dwMaximumWindowSize.Y, self.dwMaximumWindowSize.X
- )
-
- _GetStdHandle = windll.kernel32.GetStdHandle
- _GetStdHandle.argtypes = [
- wintypes.DWORD,
- ]
- _GetStdHandle.restype = wintypes.HANDLE
-
- _GetConsoleScreenBufferInfo = windll.kernel32.GetConsoleScreenBufferInfo
- _GetConsoleScreenBufferInfo.argtypes = [
- wintypes.HANDLE,
- POINTER(CONSOLE_SCREEN_BUFFER_INFO),
- ]
- _GetConsoleScreenBufferInfo.restype = wintypes.BOOL
-
- _SetConsoleTextAttribute = windll.kernel32.SetConsoleTextAttribute
- _SetConsoleTextAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- ]
- _SetConsoleTextAttribute.restype = wintypes.BOOL
-
- _SetConsoleCursorPosition = windll.kernel32.SetConsoleCursorPosition
- _SetConsoleCursorPosition.argtypes = [
- wintypes.HANDLE,
- COORD,
- ]
- _SetConsoleCursorPosition.restype = wintypes.BOOL
-
- _FillConsoleOutputCharacterA = windll.kernel32.FillConsoleOutputCharacterA
- _FillConsoleOutputCharacterA.argtypes = [
- wintypes.HANDLE,
- c_char,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputCharacterA.restype = wintypes.BOOL
-
- _FillConsoleOutputAttribute = windll.kernel32.FillConsoleOutputAttribute
- _FillConsoleOutputAttribute.argtypes = [
- wintypes.HANDLE,
- wintypes.WORD,
- wintypes.DWORD,
- COORD,
- POINTER(wintypes.DWORD),
- ]
- _FillConsoleOutputAttribute.restype = wintypes.BOOL
-
- _SetConsoleTitleW = windll.kernel32.SetConsoleTitleW
- _SetConsoleTitleW.argtypes = [
- wintypes.LPCWSTR
- ]
- _SetConsoleTitleW.restype = wintypes.BOOL
-
- _GetConsoleMode = windll.kernel32.GetConsoleMode
- _GetConsoleMode.argtypes = [
- wintypes.HANDLE,
- POINTER(wintypes.DWORD)
- ]
- _GetConsoleMode.restype = wintypes.BOOL
-
- _SetConsoleMode = windll.kernel32.SetConsoleMode
- _SetConsoleMode.argtypes = [
- wintypes.HANDLE,
- wintypes.DWORD
- ]
- _SetConsoleMode.restype = wintypes.BOOL
-
- def _winapi_test(handle):
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return bool(success)
-
- def winapi_test():
- return any(_winapi_test(h) for h in
- (_GetStdHandle(STDOUT), _GetStdHandle(STDERR)))
-
- def GetConsoleScreenBufferInfo(stream_id=STDOUT):
- handle = _GetStdHandle(stream_id)
- csbi = CONSOLE_SCREEN_BUFFER_INFO()
- success = _GetConsoleScreenBufferInfo(
- handle, byref(csbi))
- return csbi
-
- def SetConsoleTextAttribute(stream_id, attrs):
- handle = _GetStdHandle(stream_id)
- return _SetConsoleTextAttribute(handle, attrs)
-
- def SetConsoleCursorPosition(stream_id, position, adjust=True):
- position = COORD(*position)
- # If the position is out of range, do nothing.
- if position.Y <= 0 or position.X <= 0:
- return
- # Adjust for Windows' SetConsoleCursorPosition:
- # 1. being 0-based, while ANSI is 1-based.
- # 2. expecting (x,y), while ANSI uses (y,x).
- adjusted_position = COORD(position.Y - 1, position.X - 1)
- if adjust:
- # Adjust for viewport's scroll position
- sr = GetConsoleScreenBufferInfo(STDOUT).srWindow
- adjusted_position.Y += sr.Top
- adjusted_position.X += sr.Left
- # Resume normal processing
- handle = _GetStdHandle(stream_id)
- return _SetConsoleCursorPosition(handle, adjusted_position)
-
- def FillConsoleOutputCharacter(stream_id, char, length, start):
- handle = _GetStdHandle(stream_id)
- char = c_char(char.encode())
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- success = _FillConsoleOutputCharacterA(
- handle, char, length, start, byref(num_written))
- return num_written.value
-
- def FillConsoleOutputAttribute(stream_id, attr, length, start):
- ''' FillConsoleOutputAttribute( hConsole, csbi.wAttributes, dwConSize, coordScreen, &cCharsWritten )'''
- handle = _GetStdHandle(stream_id)
- attribute = wintypes.WORD(attr)
- length = wintypes.DWORD(length)
- num_written = wintypes.DWORD(0)
- # Note that this is hard-coded for ANSI (vs wide) bytes.
- return _FillConsoleOutputAttribute(
- handle, attribute, length, start, byref(num_written))
-
- def SetConsoleTitle(title):
- return _SetConsoleTitleW(title)
-
- def GetConsoleMode(handle):
- mode = wintypes.DWORD()
- success = _GetConsoleMode(handle, byref(mode))
- if not success:
- raise ctypes.WinError()
- return mode.value
-
- def SetConsoleMode(handle, mode):
- success = _SetConsoleMode(handle, mode)
- if not success:
- raise ctypes.WinError()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py
deleted file mode 100644
index aad867e8..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py
+++ /dev/null
@@ -1,195 +0,0 @@
-# Copyright Jonathan Hartley 2013. BSD 3-Clause license, see LICENSE file.
-try:
- from msvcrt import get_osfhandle
-except ImportError:
- def get_osfhandle(_):
- raise OSError("This isn't windows!")
-
-
-from . import win32
-
-# from wincon.h
-class WinColor(object):
- BLACK = 0
- BLUE = 1
- GREEN = 2
- CYAN = 3
- RED = 4
- MAGENTA = 5
- YELLOW = 6
- GREY = 7
-
-# from wincon.h
-class WinStyle(object):
- NORMAL = 0x00 # dim text, dim background
- BRIGHT = 0x08 # bright text, dim background
- BRIGHT_BACKGROUND = 0x80 # dim text, bright background
-
-class WinTerm(object):
-
- def __init__(self):
- self._default = win32.GetConsoleScreenBufferInfo(win32.STDOUT).wAttributes
- self.set_attrs(self._default)
- self._default_fore = self._fore
- self._default_back = self._back
- self._default_style = self._style
- # In order to emulate LIGHT_EX in windows, we borrow the BRIGHT style.
- # So that LIGHT_EX colors and BRIGHT style do not clobber each other,
- # we track them separately, since LIGHT_EX is overwritten by Fore/Back
- # and BRIGHT is overwritten by Style codes.
- self._light = 0
-
- def get_attrs(self):
- return self._fore + self._back * 16 + (self._style | self._light)
-
- def set_attrs(self, value):
- self._fore = value & 7
- self._back = (value >> 4) & 7
- self._style = value & (WinStyle.BRIGHT | WinStyle.BRIGHT_BACKGROUND)
-
- def reset_all(self, on_stderr=None):
- self.set_attrs(self._default)
- self.set_console(attrs=self._default)
- self._light = 0
-
- def fore(self, fore=None, light=False, on_stderr=False):
- if fore is None:
- fore = self._default_fore
- self._fore = fore
- # Emulate LIGHT_EX with BRIGHT Style
- if light:
- self._light |= WinStyle.BRIGHT
- else:
- self._light &= ~WinStyle.BRIGHT
- self.set_console(on_stderr=on_stderr)
-
- def back(self, back=None, light=False, on_stderr=False):
- if back is None:
- back = self._default_back
- self._back = back
- # Emulate LIGHT_EX with BRIGHT_BACKGROUND Style
- if light:
- self._light |= WinStyle.BRIGHT_BACKGROUND
- else:
- self._light &= ~WinStyle.BRIGHT_BACKGROUND
- self.set_console(on_stderr=on_stderr)
-
- def style(self, style=None, on_stderr=False):
- if style is None:
- style = self._default_style
- self._style = style
- self.set_console(on_stderr=on_stderr)
-
- def set_console(self, attrs=None, on_stderr=False):
- if attrs is None:
- attrs = self.get_attrs()
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleTextAttribute(handle, attrs)
-
- def get_position(self, handle):
- position = win32.GetConsoleScreenBufferInfo(handle).dwCursorPosition
- # Because Windows coordinates are 0-based,
- # and win32.SetConsoleCursorPosition expects 1-based.
- position.X += 1
- position.Y += 1
- return position
-
- def set_cursor_position(self, position=None, on_stderr=False):
- if position is None:
- # I'm not currently tracking the position, so there is no default.
- # position = self.get_position()
- return
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- win32.SetConsoleCursorPosition(handle, position)
-
- def cursor_adjust(self, x, y, on_stderr=False):
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- position = self.get_position(handle)
- adjusted_position = (position.Y + y, position.X + x)
- win32.SetConsoleCursorPosition(handle, adjusted_position, adjust=False)
-
- def erase_screen(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the screen.
- # 1 should clear from the cursor to the beginning of the screen.
- # 2 should clear the entire screen, and move cursor to (1,1)
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- # get the number of character cells in the current buffer
- cells_in_screen = csbi.dwSize.X * csbi.dwSize.Y
- # get number of character cells before current cursor position
- cells_before_cursor = csbi.dwSize.X * csbi.dwCursorPosition.Y + csbi.dwCursorPosition.X
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = cells_in_screen - cells_before_cursor
- elif mode == 1:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_before_cursor
- elif mode == 2:
- from_coord = win32.COORD(0, 0)
- cells_to_erase = cells_in_screen
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
- if mode == 2:
- # put the cursor where needed
- win32.SetConsoleCursorPosition(handle, (1, 1))
-
- def erase_line(self, mode=0, on_stderr=False):
- # 0 should clear from the cursor to the end of the line.
- # 1 should clear from the cursor to the beginning of the line.
- # 2 should clear the entire line.
- handle = win32.STDOUT
- if on_stderr:
- handle = win32.STDERR
- csbi = win32.GetConsoleScreenBufferInfo(handle)
- if mode == 0:
- from_coord = csbi.dwCursorPosition
- cells_to_erase = csbi.dwSize.X - csbi.dwCursorPosition.X
- elif mode == 1:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwCursorPosition.X
- elif mode == 2:
- from_coord = win32.COORD(0, csbi.dwCursorPosition.Y)
- cells_to_erase = csbi.dwSize.X
- else:
- # invalid mode
- return
- # fill the entire screen with blanks
- win32.FillConsoleOutputCharacter(handle, ' ', cells_to_erase, from_coord)
- # now set the buffer's attributes accordingly
- win32.FillConsoleOutputAttribute(handle, self.get_attrs(), cells_to_erase, from_coord)
-
- def set_title(self, title):
- win32.SetConsoleTitle(title)
-
-
-def enable_vt_processing(fd):
- if win32.windll is None or not win32.winapi_test():
- return False
-
- try:
- handle = get_osfhandle(fd)
- mode = win32.GetConsoleMode(handle)
- win32.SetConsoleMode(
- handle,
- mode | win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING,
- )
-
- mode = win32.GetConsoleMode(handle)
- if mode & win32.ENABLE_VIRTUAL_TERMINAL_PROCESSING:
- return True
- # Can get TypeError in testsuite where 'fd' is a Mock()
- except (OSError, TypeError):
- return False
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__init__.py
new file mode 100644
index 00000000..9fec2029
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__init__.py
@@ -0,0 +1,13 @@
+from ._implementation import (
+ CyclicDependencyError,
+ DependencyGroupInclude,
+ DependencyGroupResolver,
+ resolve,
+)
+
+__all__ = (
+ "CyclicDependencyError",
+ "DependencyGroupInclude",
+ "DependencyGroupResolver",
+ "resolve",
+)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__main__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__main__.py
new file mode 100644
index 00000000..48ebb0d4
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__main__.py
@@ -0,0 +1,65 @@
+import argparse
+import sys
+
+from ._implementation import resolve
+from ._toml_compat import tomllib
+
+
+def main() -> None:
+ if tomllib is None:
+ print(
+ "Usage error: dependency-groups CLI requires tomli or Python 3.11+",
+ file=sys.stderr,
+ )
+ raise SystemExit(2)
+
+ parser = argparse.ArgumentParser(
+ description=(
+ "A dependency-groups CLI. Prints out a resolved group, newline-delimited."
+ )
+ )
+ parser.add_argument(
+ "GROUP_NAME", nargs="*", help="The dependency group(s) to resolve."
+ )
+ parser.add_argument(
+ "-f",
+ "--pyproject-file",
+ default="pyproject.toml",
+ help="The pyproject.toml file. Defaults to trying in the current directory.",
+ )
+ parser.add_argument(
+ "-o",
+ "--output",
+ help="An output file. Defaults to stdout.",
+ )
+ parser.add_argument(
+ "-l",
+ "--list",
+ action="store_true",
+ help="List the available dependency groups",
+ )
+ args = parser.parse_args()
+
+ with open(args.pyproject_file, "rb") as fp:
+ pyproject = tomllib.load(fp)
+
+ dependency_groups_raw = pyproject.get("dependency-groups", {})
+
+ if args.list:
+ print(*dependency_groups_raw.keys())
+ return
+ if not args.GROUP_NAME:
+ print("A GROUP_NAME is required", file=sys.stderr)
+ raise SystemExit(3)
+
+ content = "\n".join(resolve(dependency_groups_raw, *args.GROUP_NAME))
+
+ if args.output is None or args.output == "-":
+ print(content)
+ else:
+ with open(args.output, "w", encoding="utf-8") as fp:
+ print(content, file=fp)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..fe30e7da
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-312.pyc
new file mode 100644
index 00000000..bacf3a2a
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc
new file mode 100644
index 00000000..3f9d5a47
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_implementation.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-312.pyc
new file mode 100644
index 00000000..37a37034
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_lint_dependency_groups.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-312.pyc
new file mode 100644
index 00000000..432f241c
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_pip_wrapper.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-312.pyc
new file mode 100644
index 00000000..86a435cb
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/__pycache__/_toml_compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_implementation.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_implementation.py
new file mode 100644
index 00000000..64e314a6
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_implementation.py
@@ -0,0 +1,209 @@
+from __future__ import annotations
+
+import dataclasses
+import re
+from collections.abc import Mapping
+
+from pip._vendor.packaging.requirements import Requirement
+
+
+def _normalize_name(name: str) -> str:
+ return re.sub(r"[-_.]+", "-", name).lower()
+
+
+def _normalize_group_names(
+ dependency_groups: Mapping[str, str | Mapping[str, str]],
+) -> Mapping[str, str | Mapping[str, str]]:
+ original_names: dict[str, list[str]] = {}
+ normalized_groups = {}
+
+ for group_name, value in dependency_groups.items():
+ normed_group_name = _normalize_name(group_name)
+ original_names.setdefault(normed_group_name, []).append(group_name)
+ normalized_groups[normed_group_name] = value
+
+ errors = []
+ for normed_name, names in original_names.items():
+ if len(names) > 1:
+ errors.append(f"{normed_name} ({', '.join(names)})")
+ if errors:
+ raise ValueError(f"Duplicate dependency group names: {', '.join(errors)}")
+
+ return normalized_groups
+
+
+@dataclasses.dataclass
+class DependencyGroupInclude:
+ include_group: str
+
+
+class CyclicDependencyError(ValueError):
+ """
+ An error representing the detection of a cycle.
+ """
+
+ def __init__(self, requested_group: str, group: str, include_group: str) -> None:
+ self.requested_group = requested_group
+ self.group = group
+ self.include_group = include_group
+
+ if include_group == group:
+ reason = f"{group} includes itself"
+ else:
+ reason = f"{include_group} -> {group}, {group} -> {include_group}"
+ super().__init__(
+ "Cyclic dependency group include while resolving "
+ f"{requested_group}: {reason}"
+ )
+
+
+class DependencyGroupResolver:
+ """
+ A resolver for Dependency Group data.
+
+ This class handles caching, name normalization, cycle detection, and other
+ parsing requirements. There are only two public methods for exploring the data:
+ ``lookup()`` and ``resolve()``.
+
+ :param dependency_groups: A mapping, as provided via pyproject
+ ``[dependency-groups]``.
+ """
+
+ def __init__(
+ self,
+ dependency_groups: Mapping[str, str | Mapping[str, str]],
+ ) -> None:
+ if not isinstance(dependency_groups, Mapping):
+ raise TypeError("Dependency Groups table is not a mapping")
+ self.dependency_groups = _normalize_group_names(dependency_groups)
+ # a map of group names to parsed data
+ self._parsed_groups: dict[
+ str, tuple[Requirement | DependencyGroupInclude, ...]
+ ] = {}
+ # a map of group names to their ancestors, used for cycle detection
+ self._include_graph_ancestors: dict[str, tuple[str, ...]] = {}
+ # a cache of completed resolutions to Requirement lists
+ self._resolve_cache: dict[str, tuple[Requirement, ...]] = {}
+
+ def lookup(self, group: str) -> tuple[Requirement | DependencyGroupInclude, ...]:
+ """
+ Lookup a group name, returning the parsed dependency data for that group.
+ This will not resolve includes.
+
+ :param group: the name of the group to lookup
+
+ :raises ValueError: if the data does not appear to be valid dependency group
+ data
+ :raises TypeError: if the data is not a string
+ :raises LookupError: if group name is absent
+ :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
+ """
+ if not isinstance(group, str):
+ raise TypeError("Dependency group name is not a str")
+ group = _normalize_name(group)
+ return self._parse_group(group)
+
+ def resolve(self, group: str) -> tuple[Requirement, ...]:
+ """
+ Resolve a dependency group to a list of requirements.
+
+ :param group: the name of the group to resolve
+
+ :raises TypeError: if the inputs appear to be the wrong types
+ :raises ValueError: if the data does not appear to be valid dependency group
+ data
+ :raises LookupError: if group name is absent
+ :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
+ """
+ if not isinstance(group, str):
+ raise TypeError("Dependency group name is not a str")
+ group = _normalize_name(group)
+ return self._resolve(group, group)
+
+ def _parse_group(
+ self, group: str
+ ) -> tuple[Requirement | DependencyGroupInclude, ...]:
+ # short circuit -- never do the work twice
+ if group in self._parsed_groups:
+ return self._parsed_groups[group]
+
+ if group not in self.dependency_groups:
+ raise LookupError(f"Dependency group '{group}' not found")
+
+ raw_group = self.dependency_groups[group]
+ if not isinstance(raw_group, list):
+ raise TypeError(f"Dependency group '{group}' is not a list")
+
+ elements: list[Requirement | DependencyGroupInclude] = []
+ for item in raw_group:
+ if isinstance(item, str):
+ # packaging.requirements.Requirement parsing ensures that this is a
+ # valid PEP 508 Dependency Specifier
+ # raises InvalidRequirement on failure
+ elements.append(Requirement(item))
+ elif isinstance(item, dict):
+ if tuple(item.keys()) != ("include-group",):
+ raise ValueError(f"Invalid dependency group item: {item}")
+
+ include_group = next(iter(item.values()))
+ elements.append(DependencyGroupInclude(include_group=include_group))
+ else:
+ raise ValueError(f"Invalid dependency group item: {item}")
+
+ self._parsed_groups[group] = tuple(elements)
+ return self._parsed_groups[group]
+
+ def _resolve(self, group: str, requested_group: str) -> tuple[Requirement, ...]:
+ """
+ This is a helper for cached resolution to strings.
+
+ :param group: The name of the group to resolve.
+ :param requested_group: The group which was used in the original, user-facing
+ request.
+ """
+ if group in self._resolve_cache:
+ return self._resolve_cache[group]
+
+ parsed = self._parse_group(group)
+
+ resolved_group = []
+ for item in parsed:
+ if isinstance(item, Requirement):
+ resolved_group.append(item)
+ elif isinstance(item, DependencyGroupInclude):
+ include_group = _normalize_name(item.include_group)
+ if include_group in self._include_graph_ancestors.get(group, ()):
+ raise CyclicDependencyError(
+ requested_group, group, item.include_group
+ )
+ self._include_graph_ancestors[include_group] = (
+ *self._include_graph_ancestors.get(group, ()),
+ group,
+ )
+ resolved_group.extend(self._resolve(include_group, requested_group))
+ else: # unreachable
+ raise NotImplementedError(
+ f"Invalid dependency group item after parse: {item}"
+ )
+
+ self._resolve_cache[group] = tuple(resolved_group)
+ return self._resolve_cache[group]
+
+
+def resolve(
+ dependency_groups: Mapping[str, str | Mapping[str, str]], /, *groups: str
+) -> tuple[str, ...]:
+ """
+ Resolve a dependency group to a tuple of requirements, as strings.
+
+ :param dependency_groups: the parsed contents of the ``[dependency-groups]`` table
+ from ``pyproject.toml``
+ :param groups: the name of the group(s) to resolve
+
+ :raises TypeError: if the inputs appear to be the wrong types
+ :raises ValueError: if the data does not appear to be valid dependency group data
+ :raises LookupError: if group name is absent
+ :raises packaging.requirements.InvalidRequirement: if a specifier is not valid
+ """
+ resolver = DependencyGroupResolver(dependency_groups)
+ return tuple(str(r) for group in groups for r in resolver.resolve(group))
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py
new file mode 100644
index 00000000..09454bdc
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_lint_dependency_groups.py
@@ -0,0 +1,59 @@
+from __future__ import annotations
+
+import argparse
+import sys
+
+from ._implementation import DependencyGroupResolver
+from ._toml_compat import tomllib
+
+
+def main(*, argv: list[str] | None = None) -> None:
+ if tomllib is None:
+ print(
+ "Usage error: dependency-groups CLI requires tomli or Python 3.11+",
+ file=sys.stderr,
+ )
+ raise SystemExit(2)
+
+ parser = argparse.ArgumentParser(
+ description=(
+ "Lint Dependency Groups for validity. "
+ "This will eagerly load and check all of your Dependency Groups."
+ )
+ )
+ parser.add_argument(
+ "-f",
+ "--pyproject-file",
+ default="pyproject.toml",
+ help="The pyproject.toml file. Defaults to trying in the current directory.",
+ )
+ args = parser.parse_args(argv if argv is not None else sys.argv[1:])
+
+ with open(args.pyproject_file, "rb") as fp:
+ pyproject = tomllib.load(fp)
+ dependency_groups_raw = pyproject.get("dependency-groups", {})
+
+ errors: list[str] = []
+ try:
+ resolver = DependencyGroupResolver(dependency_groups_raw)
+ except (ValueError, TypeError) as e:
+ errors.append(f"{type(e).__name__}: {e}")
+ else:
+ for groupname in resolver.dependency_groups:
+ try:
+ resolver.resolve(groupname)
+ except (LookupError, ValueError, TypeError) as e:
+ errors.append(f"{type(e).__name__}: {e}")
+
+ if errors:
+ print("errors encountered while examining dependency groups:")
+ for msg in errors:
+ print(f" {msg}")
+ sys.exit(1)
+ else:
+ print("ok")
+ sys.exit(0)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py
new file mode 100644
index 00000000..f86d8961
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_pip_wrapper.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+import argparse
+import subprocess
+import sys
+
+from ._implementation import DependencyGroupResolver
+from ._toml_compat import tomllib
+
+
+def _invoke_pip(deps: list[str]) -> None:
+ subprocess.check_call([sys.executable, "-m", "pip", "install", *deps])
+
+
+def main(*, argv: list[str] | None = None) -> None:
+ if tomllib is None:
+ print(
+ "Usage error: dependency-groups CLI requires tomli or Python 3.11+",
+ file=sys.stderr,
+ )
+ raise SystemExit(2)
+
+ parser = argparse.ArgumentParser(description="Install Dependency Groups.")
+ parser.add_argument(
+ "DEPENDENCY_GROUP", nargs="+", help="The dependency groups to install."
+ )
+ parser.add_argument(
+ "-f",
+ "--pyproject-file",
+ default="pyproject.toml",
+ help="The pyproject.toml file. Defaults to trying in the current directory.",
+ )
+ args = parser.parse_args(argv if argv is not None else sys.argv[1:])
+
+ with open(args.pyproject_file, "rb") as fp:
+ pyproject = tomllib.load(fp)
+ dependency_groups_raw = pyproject.get("dependency-groups", {})
+
+ errors: list[str] = []
+ resolved: list[str] = []
+ try:
+ resolver = DependencyGroupResolver(dependency_groups_raw)
+ except (ValueError, TypeError) as e:
+ errors.append(f"{type(e).__name__}: {e}")
+ else:
+ for groupname in args.DEPENDENCY_GROUP:
+ try:
+ resolved.extend(str(r) for r in resolver.resolve(groupname))
+ except (LookupError, ValueError, TypeError) as e:
+ errors.append(f"{type(e).__name__}: {e}")
+
+ if errors:
+ print("errors encountered while examining dependency groups:")
+ for msg in errors:
+ print(f" {msg}")
+ sys.exit(1)
+
+ _invoke_pip(resolved)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_toml_compat.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_toml_compat.py
new file mode 100644
index 00000000..8d6f921c
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/_toml_compat.py
@@ -0,0 +1,9 @@
+try:
+ import tomllib
+except ImportError:
+ try:
+ from pip._vendor import tomli as tomllib # type: ignore[no-redef, unused-ignore]
+ except ModuleNotFoundError: # pragma: no cover
+ tomllib = None # type: ignore[assignment, unused-ignore]
+
+__all__ = ("tomllib",)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/dependency_groups/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py
index e999438f..4e82943e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py
@@ -1,12 +1,12 @@
# -*- coding: utf-8 -*-
#
-# Copyright (C) 2012-2023 Vinay Sajip.
+# Copyright (C) 2012-2024 Vinay Sajip.
# Licensed to the Python Software Foundation under a contributor agreement.
# See LICENSE.txt and CONTRIBUTORS.txt.
#
import logging
-__version__ = '0.3.8'
+__version__ = '0.4.0'
class DistlibException(Exception):
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc
index 3d61ed33..e5e088a0 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc
index 34e0793c..ecf31d7e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc
deleted file mode 100644
index b4c154c1..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc
deleted file mode 100644
index b5820751..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc
deleted file mode 100644
index f8563af4..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc
deleted file mode 100644
index 64147b81..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc
deleted file mode 100644
index 2db9a530..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc
deleted file mode 100644
index 53a15df7..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc
index b1e1f338..e89b7e9e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc
index 911c1974..e2398a32 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc
index 5046eae0..4ffdcedb 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc
deleted file mode 100644
index bf85df79..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc
deleted file mode 100644
index 692db56f..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
index e93dc27a..ca561dd2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
@@ -217,8 +217,7 @@ except ImportError: # pragma: no cover
# Additionally check that `file` is not a directory, as on Windows
# directories pass the os.access check.
def _access_check(fn, mode):
- return (os.path.exists(fn) and os.access(fn, mode)
- and not os.path.isdir(fn))
+ return (os.path.exists(fn) and os.access(fn, mode) and not os.path.isdir(fn))
# If we're given a path with a directory part, look it up directly rather
# than referring to PATH directories. This includes checking relative to the
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py
deleted file mode 100644
index eb3765f1..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py
+++ /dev/null
@@ -1,1359 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2023 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""PEP 376 implementation."""
-
-from __future__ import unicode_literals
-
-import base64
-import codecs
-import contextlib
-import hashlib
-import logging
-import os
-import posixpath
-import sys
-import zipimport
-
-from . import DistlibException, resources
-from .compat import StringIO
-from .version import get_scheme, UnsupportedVersionError
-from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME,
- LEGACY_METADATA_FILENAME)
-from .util import (parse_requirement, cached_property, parse_name_and_version,
- read_exports, write_exports, CSVReader, CSVWriter)
-
-__all__ = [
- 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution',
- 'EggInfoDistribution', 'DistributionPath'
-]
-
-logger = logging.getLogger(__name__)
-
-EXPORTS_FILENAME = 'pydist-exports.json'
-COMMANDS_FILENAME = 'pydist-commands.json'
-
-DIST_FILES = ('INSTALLER', METADATA_FILENAME, 'RECORD', 'REQUESTED',
- 'RESOURCES', EXPORTS_FILENAME, 'SHARED')
-
-DISTINFO_EXT = '.dist-info'
-
-
-class _Cache(object):
- """
- A simple cache mapping names and .dist-info paths to distributions
- """
-
- def __init__(self):
- """
- Initialise an instance. There is normally one for each DistributionPath.
- """
- self.name = {}
- self.path = {}
- self.generated = False
-
- def clear(self):
- """
- Clear the cache, setting it to its initial state.
- """
- self.name.clear()
- self.path.clear()
- self.generated = False
-
- def add(self, dist):
- """
- Add a distribution to the cache.
- :param dist: The distribution to add.
- """
- if dist.path not in self.path:
- self.path[dist.path] = dist
- self.name.setdefault(dist.key, []).append(dist)
-
-
-class DistributionPath(object):
- """
- Represents a set of distributions installed on a path (typically sys.path).
- """
-
- def __init__(self, path=None, include_egg=False):
- """
- Create an instance from a path, optionally including legacy (distutils/
- setuptools/distribute) distributions.
- :param path: The path to use, as a list of directories. If not specified,
- sys.path is used.
- :param include_egg: If True, this instance will look for and return legacy
- distributions as well as those based on PEP 376.
- """
- if path is None:
- path = sys.path
- self.path = path
- self._include_dist = True
- self._include_egg = include_egg
-
- self._cache = _Cache()
- self._cache_egg = _Cache()
- self._cache_enabled = True
- self._scheme = get_scheme('default')
-
- def _get_cache_enabled(self):
- return self._cache_enabled
-
- def _set_cache_enabled(self, value):
- self._cache_enabled = value
-
- cache_enabled = property(_get_cache_enabled, _set_cache_enabled)
-
- def clear_cache(self):
- """
- Clears the internal cache.
- """
- self._cache.clear()
- self._cache_egg.clear()
-
- def _yield_distributions(self):
- """
- Yield .dist-info and/or .egg(-info) distributions.
- """
- # We need to check if we've seen some resources already, because on
- # some Linux systems (e.g. some Debian/Ubuntu variants) there are
- # symlinks which alias other files in the environment.
- seen = set()
- for path in self.path:
- finder = resources.finder_for_path(path)
- if finder is None:
- continue
- r = finder.find('')
- if not r or not r.is_container:
- continue
- rset = sorted(r.resources)
- for entry in rset:
- r = finder.find(entry)
- if not r or r.path in seen:
- continue
- try:
- if self._include_dist and entry.endswith(DISTINFO_EXT):
- possible_filenames = [
- METADATA_FILENAME, WHEEL_METADATA_FILENAME,
- LEGACY_METADATA_FILENAME
- ]
- for metadata_filename in possible_filenames:
- metadata_path = posixpath.join(
- entry, metadata_filename)
- pydist = finder.find(metadata_path)
- if pydist:
- break
- else:
- continue
-
- with contextlib.closing(pydist.as_stream()) as stream:
- metadata = Metadata(fileobj=stream,
- scheme='legacy')
- logger.debug('Found %s', r.path)
- seen.add(r.path)
- yield new_dist_class(r.path,
- metadata=metadata,
- env=self)
- elif self._include_egg and entry.endswith(
- ('.egg-info', '.egg')):
- logger.debug('Found %s', r.path)
- seen.add(r.path)
- yield old_dist_class(r.path, self)
- except Exception as e:
- msg = 'Unable to read distribution at %s, perhaps due to bad metadata: %s'
- logger.warning(msg, r.path, e)
- import warnings
- warnings.warn(msg % (r.path, e), stacklevel=2)
-
- def _generate_cache(self):
- """
- Scan the path for distributions and populate the cache with
- those that are found.
- """
- gen_dist = not self._cache.generated
- gen_egg = self._include_egg and not self._cache_egg.generated
- if gen_dist or gen_egg:
- for dist in self._yield_distributions():
- if isinstance(dist, InstalledDistribution):
- self._cache.add(dist)
- else:
- self._cache_egg.add(dist)
-
- if gen_dist:
- self._cache.generated = True
- if gen_egg:
- self._cache_egg.generated = True
-
- @classmethod
- def distinfo_dirname(cls, name, version):
- """
- The *name* and *version* parameters are converted into their
- filename-escaped form, i.e. any ``'-'`` characters are replaced
- with ``'_'`` other than the one in ``'dist-info'`` and the one
- separating the name from the version number.
-
- :parameter name: is converted to a standard distribution name by replacing
- any runs of non- alphanumeric characters with a single
- ``'-'``.
- :type name: string
- :parameter version: is converted to a standard version string. Spaces
- become dots, and all other non-alphanumeric characters
- (except dots) become dashes, with runs of multiple
- dashes condensed to a single dash.
- :type version: string
- :returns: directory name
- :rtype: string"""
- name = name.replace('-', '_')
- return '-'.join([name, version]) + DISTINFO_EXT
-
- def get_distributions(self):
- """
- Provides an iterator that looks for distributions and returns
- :class:`InstalledDistribution` or
- :class:`EggInfoDistribution` instances for each one of them.
-
- :rtype: iterator of :class:`InstalledDistribution` and
- :class:`EggInfoDistribution` instances
- """
- if not self._cache_enabled:
- for dist in self._yield_distributions():
- yield dist
- else:
- self._generate_cache()
-
- for dist in self._cache.path.values():
- yield dist
-
- if self._include_egg:
- for dist in self._cache_egg.path.values():
- yield dist
-
- def get_distribution(self, name):
- """
- Looks for a named distribution on the path.
-
- This function only returns the first result found, as no more than one
- value is expected. If nothing is found, ``None`` is returned.
-
- :rtype: :class:`InstalledDistribution`, :class:`EggInfoDistribution`
- or ``None``
- """
- result = None
- name = name.lower()
- if not self._cache_enabled:
- for dist in self._yield_distributions():
- if dist.key == name:
- result = dist
- break
- else:
- self._generate_cache()
-
- if name in self._cache.name:
- result = self._cache.name[name][0]
- elif self._include_egg and name in self._cache_egg.name:
- result = self._cache_egg.name[name][0]
- return result
-
- def provides_distribution(self, name, version=None):
- """
- Iterates over all distributions to find which distributions provide *name*.
- If a *version* is provided, it will be used to filter the results.
-
- This function only returns the first result found, since no more than
- one values are expected. If the directory is not found, returns ``None``.
-
- :parameter version: a version specifier that indicates the version
- required, conforming to the format in ``PEP-345``
-
- :type name: string
- :type version: string
- """
- matcher = None
- if version is not None:
- try:
- matcher = self._scheme.matcher('%s (%s)' % (name, version))
- except ValueError:
- raise DistlibException('invalid name or version: %r, %r' %
- (name, version))
-
- for dist in self.get_distributions():
- # We hit a problem on Travis where enum34 was installed and doesn't
- # have a provides attribute ...
- if not hasattr(dist, 'provides'):
- logger.debug('No "provides": %s', dist)
- else:
- provided = dist.provides
-
- for p in provided:
- p_name, p_ver = parse_name_and_version(p)
- if matcher is None:
- if p_name == name:
- yield dist
- break
- else:
- if p_name == name and matcher.match(p_ver):
- yield dist
- break
-
- def get_file_path(self, name, relative_path):
- """
- Return the path to a resource file.
- """
- dist = self.get_distribution(name)
- if dist is None:
- raise LookupError('no distribution named %r found' % name)
- return dist.get_resource_path(relative_path)
-
- def get_exported_entries(self, category, name=None):
- """
- Return all of the exported entries in a particular category.
-
- :param category: The category to search for entries.
- :param name: If specified, only entries with that name are returned.
- """
- for dist in self.get_distributions():
- r = dist.exports
- if category in r:
- d = r[category]
- if name is not None:
- if name in d:
- yield d[name]
- else:
- for v in d.values():
- yield v
-
-
-class Distribution(object):
- """
- A base class for distributions, whether installed or from indexes.
- Either way, it must have some metadata, so that's all that's needed
- for construction.
- """
-
- build_time_dependency = False
- """
- Set to True if it's known to be only a build-time dependency (i.e.
- not needed after installation).
- """
-
- requested = False
- """A boolean that indicates whether the ``REQUESTED`` metadata file is
- present (in other words, whether the package was installed by user
- request or it was installed as a dependency)."""
-
- def __init__(self, metadata):
- """
- Initialise an instance.
- :param metadata: The instance of :class:`Metadata` describing this
- distribution.
- """
- self.metadata = metadata
- self.name = metadata.name
- self.key = self.name.lower() # for case-insensitive comparisons
- self.version = metadata.version
- self.locator = None
- self.digest = None
- self.extras = None # additional features requested
- self.context = None # environment marker overrides
- self.download_urls = set()
- self.digests = {}
-
- @property
- def source_url(self):
- """
- The source archive download URL for this distribution.
- """
- return self.metadata.source_url
-
- download_url = source_url # Backward compatibility
-
- @property
- def name_and_version(self):
- """
- A utility property which displays the name and version in parentheses.
- """
- return '%s (%s)' % (self.name, self.version)
-
- @property
- def provides(self):
- """
- A set of distribution names and versions provided by this distribution.
- :return: A set of "name (version)" strings.
- """
- plist = self.metadata.provides
- s = '%s (%s)' % (self.name, self.version)
- if s not in plist:
- plist.append(s)
- return plist
-
- def _get_requirements(self, req_attr):
- md = self.metadata
- reqts = getattr(md, req_attr)
- logger.debug('%s: got requirements %r from metadata: %r', self.name,
- req_attr, reqts)
- return set(
- md.get_requirements(reqts, extras=self.extras, env=self.context))
-
- @property
- def run_requires(self):
- return self._get_requirements('run_requires')
-
- @property
- def meta_requires(self):
- return self._get_requirements('meta_requires')
-
- @property
- def build_requires(self):
- return self._get_requirements('build_requires')
-
- @property
- def test_requires(self):
- return self._get_requirements('test_requires')
-
- @property
- def dev_requires(self):
- return self._get_requirements('dev_requires')
-
- def matches_requirement(self, req):
- """
- Say if this instance matches (fulfills) a requirement.
- :param req: The requirement to match.
- :rtype req: str
- :return: True if it matches, else False.
- """
- # Requirement may contain extras - parse to lose those
- # from what's passed to the matcher
- r = parse_requirement(req)
- scheme = get_scheme(self.metadata.scheme)
- try:
- matcher = scheme.matcher(r.requirement)
- except UnsupportedVersionError:
- # XXX compat-mode if cannot read the version
- logger.warning('could not read version %r - using name only', req)
- name = req.split()[0]
- matcher = scheme.matcher(name)
-
- name = matcher.key # case-insensitive
-
- result = False
- for p in self.provides:
- p_name, p_ver = parse_name_and_version(p)
- if p_name != name:
- continue
- try:
- result = matcher.match(p_ver)
- break
- except UnsupportedVersionError:
- pass
- return result
-
- def __repr__(self):
- """
- Return a textual representation of this instance,
- """
- if self.source_url:
- suffix = ' [%s]' % self.source_url
- else:
- suffix = ''
- return '' % (self.name, self.version, suffix)
-
- def __eq__(self, other):
- """
- See if this distribution is the same as another.
- :param other: The distribution to compare with. To be equal to one
- another. distributions must have the same type, name,
- version and source_url.
- :return: True if it is the same, else False.
- """
- if type(other) is not type(self):
- result = False
- else:
- result = (self.name == other.name and self.version == other.version
- and self.source_url == other.source_url)
- return result
-
- def __hash__(self):
- """
- Compute hash in a way which matches the equality test.
- """
- return hash(self.name) + hash(self.version) + hash(self.source_url)
-
-
-class BaseInstalledDistribution(Distribution):
- """
- This is the base class for installed distributions (whether PEP 376 or
- legacy).
- """
-
- hasher = None
-
- def __init__(self, metadata, path, env=None):
- """
- Initialise an instance.
- :param metadata: An instance of :class:`Metadata` which describes the
- distribution. This will normally have been initialised
- from a metadata file in the ``path``.
- :param path: The path of the ``.dist-info`` or ``.egg-info``
- directory for the distribution.
- :param env: This is normally the :class:`DistributionPath`
- instance where this distribution was found.
- """
- super(BaseInstalledDistribution, self).__init__(metadata)
- self.path = path
- self.dist_path = env
-
- def get_hash(self, data, hasher=None):
- """
- Get the hash of some data, using a particular hash algorithm, if
- specified.
-
- :param data: The data to be hashed.
- :type data: bytes
- :param hasher: The name of a hash implementation, supported by hashlib,
- or ``None``. Examples of valid values are ``'sha1'``,
- ``'sha224'``, ``'sha384'``, '``sha256'``, ``'md5'`` and
- ``'sha512'``. If no hasher is specified, the ``hasher``
- attribute of the :class:`InstalledDistribution` instance
- is used. If the hasher is determined to be ``None``, MD5
- is used as the hashing algorithm.
- :returns: The hash of the data. If a hasher was explicitly specified,
- the returned hash will be prefixed with the specified hasher
- followed by '='.
- :rtype: str
- """
- if hasher is None:
- hasher = self.hasher
- if hasher is None:
- hasher = hashlib.md5
- prefix = ''
- else:
- hasher = getattr(hashlib, hasher)
- prefix = '%s=' % self.hasher
- digest = hasher(data).digest()
- digest = base64.urlsafe_b64encode(digest).rstrip(b'=').decode('ascii')
- return '%s%s' % (prefix, digest)
-
-
-class InstalledDistribution(BaseInstalledDistribution):
- """
- Created with the *path* of the ``.dist-info`` directory provided to the
- constructor. It reads the metadata contained in ``pydist.json`` when it is
- instantiated., or uses a passed in Metadata instance (useful for when
- dry-run mode is being used).
- """
-
- hasher = 'sha256'
-
- def __init__(self, path, metadata=None, env=None):
- self.modules = []
- self.finder = finder = resources.finder_for_path(path)
- if finder is None:
- raise ValueError('finder unavailable for %s' % path)
- if env and env._cache_enabled and path in env._cache.path:
- metadata = env._cache.path[path].metadata
- elif metadata is None:
- r = finder.find(METADATA_FILENAME)
- # Temporary - for Wheel 0.23 support
- if r is None:
- r = finder.find(WHEEL_METADATA_FILENAME)
- # Temporary - for legacy support
- if r is None:
- r = finder.find(LEGACY_METADATA_FILENAME)
- if r is None:
- raise ValueError('no %s found in %s' %
- (METADATA_FILENAME, path))
- with contextlib.closing(r.as_stream()) as stream:
- metadata = Metadata(fileobj=stream, scheme='legacy')
-
- super(InstalledDistribution, self).__init__(metadata, path, env)
-
- if env and env._cache_enabled:
- env._cache.add(self)
-
- r = finder.find('REQUESTED')
- self.requested = r is not None
- p = os.path.join(path, 'top_level.txt')
- if os.path.exists(p):
- with open(p, 'rb') as f:
- data = f.read().decode('utf-8')
- self.modules = data.splitlines()
-
- def __repr__(self):
- return '' % (
- self.name, self.version, self.path)
-
- def __str__(self):
- return "%s %s" % (self.name, self.version)
-
- def _get_records(self):
- """
- Get the list of installed files for the distribution
- :return: A list of tuples of path, hash and size. Note that hash and
- size might be ``None`` for some entries. The path is exactly
- as stored in the file (which is as in PEP 376).
- """
- results = []
- r = self.get_distinfo_resource('RECORD')
- with contextlib.closing(r.as_stream()) as stream:
- with CSVReader(stream=stream) as record_reader:
- # Base location is parent dir of .dist-info dir
- # base_location = os.path.dirname(self.path)
- # base_location = os.path.abspath(base_location)
- for row in record_reader:
- missing = [None for i in range(len(row), 3)]
- path, checksum, size = row + missing
- # if not os.path.isabs(path):
- # path = path.replace('/', os.sep)
- # path = os.path.join(base_location, path)
- results.append((path, checksum, size))
- return results
-
- @cached_property
- def exports(self):
- """
- Return the information exported by this distribution.
- :return: A dictionary of exports, mapping an export category to a dict
- of :class:`ExportEntry` instances describing the individual
- export entries, and keyed by name.
- """
- result = {}
- r = self.get_distinfo_resource(EXPORTS_FILENAME)
- if r:
- result = self.read_exports()
- return result
-
- def read_exports(self):
- """
- Read exports data from a file in .ini format.
-
- :return: A dictionary of exports, mapping an export category to a list
- of :class:`ExportEntry` instances describing the individual
- export entries.
- """
- result = {}
- r = self.get_distinfo_resource(EXPORTS_FILENAME)
- if r:
- with contextlib.closing(r.as_stream()) as stream:
- result = read_exports(stream)
- return result
-
- def write_exports(self, exports):
- """
- Write a dictionary of exports to a file in .ini format.
- :param exports: A dictionary of exports, mapping an export category to
- a list of :class:`ExportEntry` instances describing the
- individual export entries.
- """
- rf = self.get_distinfo_file(EXPORTS_FILENAME)
- with open(rf, 'w') as f:
- write_exports(exports, f)
-
- def get_resource_path(self, relative_path):
- """
- NOTE: This API may change in the future.
-
- Return the absolute path to a resource file with the given relative
- path.
-
- :param relative_path: The path, relative to .dist-info, of the resource
- of interest.
- :return: The absolute path where the resource is to be found.
- """
- r = self.get_distinfo_resource('RESOURCES')
- with contextlib.closing(r.as_stream()) as stream:
- with CSVReader(stream=stream) as resources_reader:
- for relative, destination in resources_reader:
- if relative == relative_path:
- return destination
- raise KeyError('no resource file with relative path %r '
- 'is installed' % relative_path)
-
- def list_installed_files(self):
- """
- Iterates over the ``RECORD`` entries and returns a tuple
- ``(path, hash, size)`` for each line.
-
- :returns: iterator of (path, hash, size)
- """
- for result in self._get_records():
- yield result
-
- def write_installed_files(self, paths, prefix, dry_run=False):
- """
- Writes the ``RECORD`` file, using the ``paths`` iterable passed in. Any
- existing ``RECORD`` file is silently overwritten.
-
- prefix is used to determine when to write absolute paths.
- """
- prefix = os.path.join(prefix, '')
- base = os.path.dirname(self.path)
- base_under_prefix = base.startswith(prefix)
- base = os.path.join(base, '')
- record_path = self.get_distinfo_file('RECORD')
- logger.info('creating %s', record_path)
- if dry_run:
- return None
- with CSVWriter(record_path) as writer:
- for path in paths:
- if os.path.isdir(path) or path.endswith(('.pyc', '.pyo')):
- # do not put size and hash, as in PEP-376
- hash_value = size = ''
- else:
- size = '%d' % os.path.getsize(path)
- with open(path, 'rb') as fp:
- hash_value = self.get_hash(fp.read())
- if path.startswith(base) or (base_under_prefix
- and path.startswith(prefix)):
- path = os.path.relpath(path, base)
- writer.writerow((path, hash_value, size))
-
- # add the RECORD file itself
- if record_path.startswith(base):
- record_path = os.path.relpath(record_path, base)
- writer.writerow((record_path, '', ''))
- return record_path
-
- def check_installed_files(self):
- """
- Checks that the hashes and sizes of the files in ``RECORD`` are
- matched by the files themselves. Returns a (possibly empty) list of
- mismatches. Each entry in the mismatch list will be a tuple consisting
- of the path, 'exists', 'size' or 'hash' according to what didn't match
- (existence is checked first, then size, then hash), the expected
- value and the actual value.
- """
- mismatches = []
- base = os.path.dirname(self.path)
- record_path = self.get_distinfo_file('RECORD')
- for path, hash_value, size in self.list_installed_files():
- if not os.path.isabs(path):
- path = os.path.join(base, path)
- if path == record_path:
- continue
- if not os.path.exists(path):
- mismatches.append((path, 'exists', True, False))
- elif os.path.isfile(path):
- actual_size = str(os.path.getsize(path))
- if size and actual_size != size:
- mismatches.append((path, 'size', size, actual_size))
- elif hash_value:
- if '=' in hash_value:
- hasher = hash_value.split('=', 1)[0]
- else:
- hasher = None
-
- with open(path, 'rb') as f:
- actual_hash = self.get_hash(f.read(), hasher)
- if actual_hash != hash_value:
- mismatches.append(
- (path, 'hash', hash_value, actual_hash))
- return mismatches
-
- @cached_property
- def shared_locations(self):
- """
- A dictionary of shared locations whose keys are in the set 'prefix',
- 'purelib', 'platlib', 'scripts', 'headers', 'data' and 'namespace'.
- The corresponding value is the absolute path of that category for
- this distribution, and takes into account any paths selected by the
- user at installation time (e.g. via command-line arguments). In the
- case of the 'namespace' key, this would be a list of absolute paths
- for the roots of namespace packages in this distribution.
-
- The first time this property is accessed, the relevant information is
- read from the SHARED file in the .dist-info directory.
- """
- result = {}
- shared_path = os.path.join(self.path, 'SHARED')
- if os.path.isfile(shared_path):
- with codecs.open(shared_path, 'r', encoding='utf-8') as f:
- lines = f.read().splitlines()
- for line in lines:
- key, value = line.split('=', 1)
- if key == 'namespace':
- result.setdefault(key, []).append(value)
- else:
- result[key] = value
- return result
-
- def write_shared_locations(self, paths, dry_run=False):
- """
- Write shared location information to the SHARED file in .dist-info.
- :param paths: A dictionary as described in the documentation for
- :meth:`shared_locations`.
- :param dry_run: If True, the action is logged but no file is actually
- written.
- :return: The path of the file written to.
- """
- shared_path = os.path.join(self.path, 'SHARED')
- logger.info('creating %s', shared_path)
- if dry_run:
- return None
- lines = []
- for key in ('prefix', 'lib', 'headers', 'scripts', 'data'):
- path = paths[key]
- if os.path.isdir(paths[key]):
- lines.append('%s=%s' % (key, path))
- for ns in paths.get('namespace', ()):
- lines.append('namespace=%s' % ns)
-
- with codecs.open(shared_path, 'w', encoding='utf-8') as f:
- f.write('\n'.join(lines))
- return shared_path
-
- def get_distinfo_resource(self, path):
- if path not in DIST_FILES:
- raise DistlibException('invalid path for a dist-info file: '
- '%r at %r' % (path, self.path))
- finder = resources.finder_for_path(self.path)
- if finder is None:
- raise DistlibException('Unable to get a finder for %s' % self.path)
- return finder.find(path)
-
- def get_distinfo_file(self, path):
- """
- Returns a path located under the ``.dist-info`` directory. Returns a
- string representing the path.
-
- :parameter path: a ``'/'``-separated path relative to the
- ``.dist-info`` directory or an absolute path;
- If *path* is an absolute path and doesn't start
- with the ``.dist-info`` directory path,
- a :class:`DistlibException` is raised
- :type path: str
- :rtype: str
- """
- # Check if it is an absolute path # XXX use relpath, add tests
- if path.find(os.sep) >= 0:
- # it's an absolute path?
- distinfo_dirname, path = path.split(os.sep)[-2:]
- if distinfo_dirname != self.path.split(os.sep)[-1]:
- raise DistlibException(
- 'dist-info file %r does not belong to the %r %s '
- 'distribution' % (path, self.name, self.version))
-
- # The file must be relative
- if path not in DIST_FILES:
- raise DistlibException('invalid path for a dist-info file: '
- '%r at %r' % (path, self.path))
-
- return os.path.join(self.path, path)
-
- def list_distinfo_files(self):
- """
- Iterates over the ``RECORD`` entries and returns paths for each line if
- the path is pointing to a file located in the ``.dist-info`` directory
- or one of its subdirectories.
-
- :returns: iterator of paths
- """
- base = os.path.dirname(self.path)
- for path, checksum, size in self._get_records():
- # XXX add separator or use real relpath algo
- if not os.path.isabs(path):
- path = os.path.join(base, path)
- if path.startswith(self.path):
- yield path
-
- def __eq__(self, other):
- return (isinstance(other, InstalledDistribution)
- and self.path == other.path)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- __hash__ = object.__hash__
-
-
-class EggInfoDistribution(BaseInstalledDistribution):
- """Created with the *path* of the ``.egg-info`` directory or file provided
- to the constructor. It reads the metadata contained in the file itself, or
- if the given path happens to be a directory, the metadata is read from the
- file ``PKG-INFO`` under that directory."""
-
- requested = True # as we have no way of knowing, assume it was
- shared_locations = {}
-
- def __init__(self, path, env=None):
-
- def set_name_and_version(s, n, v):
- s.name = n
- s.key = n.lower() # for case-insensitive comparisons
- s.version = v
-
- self.path = path
- self.dist_path = env
- if env and env._cache_enabled and path in env._cache_egg.path:
- metadata = env._cache_egg.path[path].metadata
- set_name_and_version(self, metadata.name, metadata.version)
- else:
- metadata = self._get_metadata(path)
-
- # Need to be set before caching
- set_name_and_version(self, metadata.name, metadata.version)
-
- if env and env._cache_enabled:
- env._cache_egg.add(self)
- super(EggInfoDistribution, self).__init__(metadata, path, env)
-
- def _get_metadata(self, path):
- requires = None
-
- def parse_requires_data(data):
- """Create a list of dependencies from a requires.txt file.
-
- *data*: the contents of a setuptools-produced requires.txt file.
- """
- reqs = []
- lines = data.splitlines()
- for line in lines:
- line = line.strip()
- # sectioned files have bare newlines (separating sections)
- if not line: # pragma: no cover
- continue
- if line.startswith('['): # pragma: no cover
- logger.warning(
- 'Unexpected line: quitting requirement scan: %r', line)
- break
- r = parse_requirement(line)
- if not r: # pragma: no cover
- logger.warning('Not recognised as a requirement: %r', line)
- continue
- if r.extras: # pragma: no cover
- logger.warning('extra requirements in requires.txt are '
- 'not supported')
- if not r.constraints:
- reqs.append(r.name)
- else:
- cons = ', '.join('%s%s' % c for c in r.constraints)
- reqs.append('%s (%s)' % (r.name, cons))
- return reqs
-
- def parse_requires_path(req_path):
- """Create a list of dependencies from a requires.txt file.
-
- *req_path*: the path to a setuptools-produced requires.txt file.
- """
-
- reqs = []
- try:
- with codecs.open(req_path, 'r', 'utf-8') as fp:
- reqs = parse_requires_data(fp.read())
- except IOError:
- pass
- return reqs
-
- tl_path = tl_data = None
- if path.endswith('.egg'):
- if os.path.isdir(path):
- p = os.path.join(path, 'EGG-INFO')
- meta_path = os.path.join(p, 'PKG-INFO')
- metadata = Metadata(path=meta_path, scheme='legacy')
- req_path = os.path.join(p, 'requires.txt')
- tl_path = os.path.join(p, 'top_level.txt')
- requires = parse_requires_path(req_path)
- else:
- # FIXME handle the case where zipfile is not available
- zipf = zipimport.zipimporter(path)
- fileobj = StringIO(
- zipf.get_data('EGG-INFO/PKG-INFO').decode('utf8'))
- metadata = Metadata(fileobj=fileobj, scheme='legacy')
- try:
- data = zipf.get_data('EGG-INFO/requires.txt')
- tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode(
- 'utf-8')
- requires = parse_requires_data(data.decode('utf-8'))
- except IOError:
- requires = None
- elif path.endswith('.egg-info'):
- if os.path.isdir(path):
- req_path = os.path.join(path, 'requires.txt')
- requires = parse_requires_path(req_path)
- path = os.path.join(path, 'PKG-INFO')
- tl_path = os.path.join(path, 'top_level.txt')
- metadata = Metadata(path=path, scheme='legacy')
- else:
- raise DistlibException('path must end with .egg-info or .egg, '
- 'got %r' % path)
-
- if requires:
- metadata.add_requirements(requires)
- # look for top-level modules in top_level.txt, if present
- if tl_data is None:
- if tl_path is not None and os.path.exists(tl_path):
- with open(tl_path, 'rb') as f:
- tl_data = f.read().decode('utf-8')
- if not tl_data:
- tl_data = []
- else:
- tl_data = tl_data.splitlines()
- self.modules = tl_data
- return metadata
-
- def __repr__(self):
- return '' % (self.name, self.version,
- self.path)
-
- def __str__(self):
- return "%s %s" % (self.name, self.version)
-
- def check_installed_files(self):
- """
- Checks that the hashes and sizes of the files in ``RECORD`` are
- matched by the files themselves. Returns a (possibly empty) list of
- mismatches. Each entry in the mismatch list will be a tuple consisting
- of the path, 'exists', 'size' or 'hash' according to what didn't match
- (existence is checked first, then size, then hash), the expected
- value and the actual value.
- """
- mismatches = []
- record_path = os.path.join(self.path, 'installed-files.txt')
- if os.path.exists(record_path):
- for path, _, _ in self.list_installed_files():
- if path == record_path:
- continue
- if not os.path.exists(path):
- mismatches.append((path, 'exists', True, False))
- return mismatches
-
- def list_installed_files(self):
- """
- Iterates over the ``installed-files.txt`` entries and returns a tuple
- ``(path, hash, size)`` for each line.
-
- :returns: a list of (path, hash, size)
- """
-
- def _md5(path):
- f = open(path, 'rb')
- try:
- content = f.read()
- finally:
- f.close()
- return hashlib.md5(content).hexdigest()
-
- def _size(path):
- return os.stat(path).st_size
-
- record_path = os.path.join(self.path, 'installed-files.txt')
- result = []
- if os.path.exists(record_path):
- with codecs.open(record_path, 'r', encoding='utf-8') as f:
- for line in f:
- line = line.strip()
- p = os.path.normpath(os.path.join(self.path, line))
- # "./" is present as a marker between installed files
- # and installation metadata files
- if not os.path.exists(p):
- logger.warning('Non-existent file: %s', p)
- if p.endswith(('.pyc', '.pyo')):
- continue
- # otherwise fall through and fail
- if not os.path.isdir(p):
- result.append((p, _md5(p), _size(p)))
- result.append((record_path, None, None))
- return result
-
- def list_distinfo_files(self, absolute=False):
- """
- Iterates over the ``installed-files.txt`` entries and returns paths for
- each line if the path is pointing to a file located in the
- ``.egg-info`` directory or one of its subdirectories.
-
- :parameter absolute: If *absolute* is ``True``, each returned path is
- transformed into a local absolute path. Otherwise the
- raw value from ``installed-files.txt`` is returned.
- :type absolute: boolean
- :returns: iterator of paths
- """
- record_path = os.path.join(self.path, 'installed-files.txt')
- if os.path.exists(record_path):
- skip = True
- with codecs.open(record_path, 'r', encoding='utf-8') as f:
- for line in f:
- line = line.strip()
- if line == './':
- skip = False
- continue
- if not skip:
- p = os.path.normpath(os.path.join(self.path, line))
- if p.startswith(self.path):
- if absolute:
- yield p
- else:
- yield line
-
- def __eq__(self, other):
- return (isinstance(other, EggInfoDistribution)
- and self.path == other.path)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- __hash__ = object.__hash__
-
-
-new_dist_class = InstalledDistribution
-old_dist_class = EggInfoDistribution
-
-
-class DependencyGraph(object):
- """
- Represents a dependency graph between distributions.
-
- The dependency relationships are stored in an ``adjacency_list`` that maps
- distributions to a list of ``(other, label)`` tuples where ``other``
- is a distribution and the edge is labeled with ``label`` (i.e. the version
- specifier, if such was provided). Also, for more efficient traversal, for
- every distribution ``x``, a list of predecessors is kept in
- ``reverse_list[x]``. An edge from distribution ``a`` to
- distribution ``b`` means that ``a`` depends on ``b``. If any missing
- dependencies are found, they are stored in ``missing``, which is a
- dictionary that maps distributions to a list of requirements that were not
- provided by any other distributions.
- """
-
- def __init__(self):
- self.adjacency_list = {}
- self.reverse_list = {}
- self.missing = {}
-
- def add_distribution(self, distribution):
- """Add the *distribution* to the graph.
-
- :type distribution: :class:`distutils2.database.InstalledDistribution`
- or :class:`distutils2.database.EggInfoDistribution`
- """
- self.adjacency_list[distribution] = []
- self.reverse_list[distribution] = []
- # self.missing[distribution] = []
-
- def add_edge(self, x, y, label=None):
- """Add an edge from distribution *x* to distribution *y* with the given
- *label*.
-
- :type x: :class:`distutils2.database.InstalledDistribution` or
- :class:`distutils2.database.EggInfoDistribution`
- :type y: :class:`distutils2.database.InstalledDistribution` or
- :class:`distutils2.database.EggInfoDistribution`
- :type label: ``str`` or ``None``
- """
- self.adjacency_list[x].append((y, label))
- # multiple edges are allowed, so be careful
- if x not in self.reverse_list[y]:
- self.reverse_list[y].append(x)
-
- def add_missing(self, distribution, requirement):
- """
- Add a missing *requirement* for the given *distribution*.
-
- :type distribution: :class:`distutils2.database.InstalledDistribution`
- or :class:`distutils2.database.EggInfoDistribution`
- :type requirement: ``str``
- """
- logger.debug('%s missing %r', distribution, requirement)
- self.missing.setdefault(distribution, []).append(requirement)
-
- def _repr_dist(self, dist):
- return '%s %s' % (dist.name, dist.version)
-
- def repr_node(self, dist, level=1):
- """Prints only a subgraph"""
- output = [self._repr_dist(dist)]
- for other, label in self.adjacency_list[dist]:
- dist = self._repr_dist(other)
- if label is not None:
- dist = '%s [%s]' % (dist, label)
- output.append(' ' * level + str(dist))
- suboutput = self.repr_node(other, level + 1)
- subs = suboutput.split('\n')
- output.extend(subs[1:])
- return '\n'.join(output)
-
- def to_dot(self, f, skip_disconnected=True):
- """Writes a DOT output for the graph to the provided file *f*.
-
- If *skip_disconnected* is set to ``True``, then all distributions
- that are not dependent on any other distribution are skipped.
-
- :type f: has to support ``file``-like operations
- :type skip_disconnected: ``bool``
- """
- disconnected = []
-
- f.write("digraph dependencies {\n")
- for dist, adjs in self.adjacency_list.items():
- if len(adjs) == 0 and not skip_disconnected:
- disconnected.append(dist)
- for other, label in adjs:
- if label is not None:
- f.write('"%s" -> "%s" [label="%s"]\n' %
- (dist.name, other.name, label))
- else:
- f.write('"%s" -> "%s"\n' % (dist.name, other.name))
- if not skip_disconnected and len(disconnected) > 0:
- f.write('subgraph disconnected {\n')
- f.write('label = "Disconnected"\n')
- f.write('bgcolor = red\n')
-
- for dist in disconnected:
- f.write('"%s"' % dist.name)
- f.write('\n')
- f.write('}\n')
- f.write('}\n')
-
- def topological_sort(self):
- """
- Perform a topological sort of the graph.
- :return: A tuple, the first element of which is a topologically sorted
- list of distributions, and the second element of which is a
- list of distributions that cannot be sorted because they have
- circular dependencies and so form a cycle.
- """
- result = []
- # Make a shallow copy of the adjacency list
- alist = {}
- for k, v in self.adjacency_list.items():
- alist[k] = v[:]
- while True:
- # See what we can remove in this run
- to_remove = []
- for k, v in list(alist.items())[:]:
- if not v:
- to_remove.append(k)
- del alist[k]
- if not to_remove:
- # What's left in alist (if anything) is a cycle.
- break
- # Remove from the adjacency list of others
- for k, v in alist.items():
- alist[k] = [(d, r) for d, r in v if d not in to_remove]
- logger.debug('Moving to result: %s',
- ['%s (%s)' % (d.name, d.version) for d in to_remove])
- result.extend(to_remove)
- return result, list(alist.keys())
-
- def __repr__(self):
- """Representation of the graph"""
- output = []
- for dist, adjs in self.adjacency_list.items():
- output.append(self.repr_node(dist))
- return '\n'.join(output)
-
-
-def make_graph(dists, scheme='default'):
- """Makes a dependency graph from the given distributions.
-
- :parameter dists: a list of distributions
- :type dists: list of :class:`distutils2.database.InstalledDistribution` and
- :class:`distutils2.database.EggInfoDistribution` instances
- :rtype: a :class:`DependencyGraph` instance
- """
- scheme = get_scheme(scheme)
- graph = DependencyGraph()
- provided = {} # maps names to lists of (version, dist) tuples
-
- # first, build the graph and find out what's provided
- for dist in dists:
- graph.add_distribution(dist)
-
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Add to provided: %s, %s, %s', name, version, dist)
- provided.setdefault(name, []).append((version, dist))
-
- # now make the edges
- for dist in dists:
- requires = (dist.run_requires | dist.meta_requires
- | dist.build_requires | dist.dev_requires)
- for req in requires:
- try:
- matcher = scheme.matcher(req)
- except UnsupportedVersionError:
- # XXX compat-mode if cannot read the version
- logger.warning('could not read version %r - using name only',
- req)
- name = req.split()[0]
- matcher = scheme.matcher(name)
-
- name = matcher.key # case-insensitive
-
- matched = False
- if name in provided:
- for version, provider in provided[name]:
- try:
- match = matcher.match(version)
- except UnsupportedVersionError:
- match = False
-
- if match:
- graph.add_edge(dist, provider, req)
- matched = True
- break
- if not matched:
- graph.add_missing(dist, req)
- return graph
-
-
-def get_dependent_dists(dists, dist):
- """Recursively generate a list of distributions from *dists* that are
- dependent on *dist*.
-
- :param dists: a list of distributions
- :param dist: a distribution, member of *dists* for which we are interested
- """
- if dist not in dists:
- raise DistlibException('given distribution %r is not a member '
- 'of the list' % dist.name)
- graph = make_graph(dists)
-
- dep = [dist] # dependent distributions
- todo = graph.reverse_list[dist] # list of nodes we should inspect
-
- while todo:
- d = todo.pop()
- dep.append(d)
- for succ in graph.reverse_list[d]:
- if succ not in dep:
- todo.append(succ)
-
- dep.pop(0) # remove dist from dep, was there to prevent infinite loops
- return dep
-
-
-def get_required_dists(dists, dist):
- """Recursively generate a list of distributions from *dists* that are
- required by *dist*.
-
- :param dists: a list of distributions
- :param dist: a distribution, member of *dists* for which we are interested
- in finding the dependencies.
- """
- if dist not in dists:
- raise DistlibException('given distribution %r is not a member '
- 'of the list' % dist.name)
- graph = make_graph(dists)
-
- req = set() # required distributions
- todo = graph.adjacency_list[dist] # list of nodes we should inspect
- seen = set(t[0] for t in todo) # already added to todo
-
- while todo:
- d = todo.pop()[0]
- req.add(d)
- pred_list = graph.adjacency_list[d]
- for pred in pred_list:
- d = pred[0]
- if d not in req and d not in seen:
- seen.add(d)
- todo.append(pred)
- return req
-
-
-def make_dist(name, version, **kwargs):
- """
- A convenience method for making a dist given just a name and version.
- """
- summary = kwargs.pop('summary', 'Placeholder for summary')
- md = Metadata(**kwargs)
- md.name = name
- md.version = version
- md.summary = summary or 'Placeholder for summary'
- return Distribution(md)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
deleted file mode 100644
index 56cd2867..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+++ /dev/null
@@ -1,508 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2023 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-import hashlib
-import logging
-import os
-import shutil
-import subprocess
-import tempfile
-try:
- from threading import Thread
-except ImportError: # pragma: no cover
- from dummy_threading import Thread
-
-from . import DistlibException
-from .compat import (HTTPBasicAuthHandler, Request, HTTPPasswordMgr,
- urlparse, build_opener, string_types)
-from .util import zip_dir, ServerProxy
-
-logger = logging.getLogger(__name__)
-
-DEFAULT_INDEX = 'https://pypi.org/pypi'
-DEFAULT_REALM = 'pypi'
-
-
-class PackageIndex(object):
- """
- This class represents a package index compatible with PyPI, the Python
- Package Index.
- """
-
- boundary = b'----------ThIs_Is_tHe_distlib_index_bouNdaRY_$'
-
- def __init__(self, url=None):
- """
- Initialise an instance.
-
- :param url: The URL of the index. If not specified, the URL for PyPI is
- used.
- """
- self.url = url or DEFAULT_INDEX
- self.read_configuration()
- scheme, netloc, path, params, query, frag = urlparse(self.url)
- if params or query or frag or scheme not in ('http', 'https'):
- raise DistlibException('invalid repository: %s' % self.url)
- self.password_handler = None
- self.ssl_verifier = None
- self.gpg = None
- self.gpg_home = None
- with open(os.devnull, 'w') as sink:
- # Use gpg by default rather than gpg2, as gpg2 insists on
- # prompting for passwords
- for s in ('gpg', 'gpg2'):
- try:
- rc = subprocess.check_call([s, '--version'], stdout=sink,
- stderr=sink)
- if rc == 0:
- self.gpg = s
- break
- except OSError:
- pass
-
- def _get_pypirc_command(self):
- """
- Get the distutils command for interacting with PyPI configurations.
- :return: the command.
- """
- from .util import _get_pypirc_command as cmd
- return cmd()
-
- def read_configuration(self):
- """
- Read the PyPI access configuration as supported by distutils. This populates
- ``username``, ``password``, ``realm`` and ``url`` attributes from the
- configuration.
- """
- from .util import _load_pypirc
- cfg = _load_pypirc(self)
- self.username = cfg.get('username')
- self.password = cfg.get('password')
- self.realm = cfg.get('realm', 'pypi')
- self.url = cfg.get('repository', self.url)
-
- def save_configuration(self):
- """
- Save the PyPI access configuration. You must have set ``username`` and
- ``password`` attributes before calling this method.
- """
- self.check_credentials()
- from .util import _store_pypirc
- _store_pypirc(self)
-
- def check_credentials(self):
- """
- Check that ``username`` and ``password`` have been set, and raise an
- exception if not.
- """
- if self.username is None or self.password is None:
- raise DistlibException('username and password must be set')
- pm = HTTPPasswordMgr()
- _, netloc, _, _, _, _ = urlparse(self.url)
- pm.add_password(self.realm, netloc, self.username, self.password)
- self.password_handler = HTTPBasicAuthHandler(pm)
-
- def register(self, metadata): # pragma: no cover
- """
- Register a distribution on PyPI, using the provided metadata.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the distribution to be
- registered.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- metadata.validate()
- d = metadata.todict()
- d[':action'] = 'verify'
- request = self.encode_request(d.items(), [])
- self.send_request(request)
- d[':action'] = 'submit'
- request = self.encode_request(d.items(), [])
- return self.send_request(request)
-
- def _reader(self, name, stream, outbuf):
- """
- Thread runner for reading lines of from a subprocess into a buffer.
-
- :param name: The logical name of the stream (used for logging only).
- :param stream: The stream to read from. This will typically a pipe
- connected to the output stream of a subprocess.
- :param outbuf: The list to append the read lines to.
- """
- while True:
- s = stream.readline()
- if not s:
- break
- s = s.decode('utf-8').rstrip()
- outbuf.append(s)
- logger.debug('%s: %s' % (name, s))
- stream.close()
-
- def get_sign_command(self, filename, signer, sign_password, keystore=None): # pragma: no cover
- """
- Return a suitable command for signing a file.
-
- :param filename: The pathname to the file to be signed.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: The signing command as a list suitable to be
- passed to :class:`subprocess.Popen`.
- """
- cmd = [self.gpg, '--status-fd', '2', '--no-tty']
- if keystore is None:
- keystore = self.gpg_home
- if keystore:
- cmd.extend(['--homedir', keystore])
- if sign_password is not None:
- cmd.extend(['--batch', '--passphrase-fd', '0'])
- td = tempfile.mkdtemp()
- sf = os.path.join(td, os.path.basename(filename) + '.asc')
- cmd.extend(['--detach-sign', '--armor', '--local-user',
- signer, '--output', sf, filename])
- logger.debug('invoking: %s', ' '.join(cmd))
- return cmd, sf
-
- def run_command(self, cmd, input_data=None):
- """
- Run a command in a child process , passing it any input data specified.
-
- :param cmd: The command to run.
- :param input_data: If specified, this must be a byte string containing
- data to be sent to the child process.
- :return: A tuple consisting of the subprocess' exit code, a list of
- lines read from the subprocess' ``stdout``, and a list of
- lines read from the subprocess' ``stderr``.
- """
- kwargs = {
- 'stdout': subprocess.PIPE,
- 'stderr': subprocess.PIPE,
- }
- if input_data is not None:
- kwargs['stdin'] = subprocess.PIPE
- stdout = []
- stderr = []
- p = subprocess.Popen(cmd, **kwargs)
- # We don't use communicate() here because we may need to
- # get clever with interacting with the command
- t1 = Thread(target=self._reader, args=('stdout', p.stdout, stdout))
- t1.start()
- t2 = Thread(target=self._reader, args=('stderr', p.stderr, stderr))
- t2.start()
- if input_data is not None:
- p.stdin.write(input_data)
- p.stdin.close()
-
- p.wait()
- t1.join()
- t2.join()
- return p.returncode, stdout, stderr
-
- def sign_file(self, filename, signer, sign_password, keystore=None): # pragma: no cover
- """
- Sign a file.
-
- :param filename: The pathname to the file to be signed.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param keystore: The path to a directory which contains the keys
- used in signing. If not specified, the instance's
- ``gpg_home`` attribute is used instead.
- :return: The absolute pathname of the file where the signature is
- stored.
- """
- cmd, sig_file = self.get_sign_command(filename, signer, sign_password,
- keystore)
- rc, stdout, stderr = self.run_command(cmd,
- sign_password.encode('utf-8'))
- if rc != 0:
- raise DistlibException('sign command failed with error '
- 'code %s' % rc)
- return sig_file
-
- def upload_file(self, metadata, filename, signer=None, sign_password=None,
- filetype='sdist', pyversion='source', keystore=None):
- """
- Upload a release file to the index.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the file to be uploaded.
- :param filename: The pathname of the file to be uploaded.
- :param signer: The identifier of the signer of the file.
- :param sign_password: The passphrase for the signer's
- private key used for signing.
- :param filetype: The type of the file being uploaded. This is the
- distutils command which produced that file, e.g.
- ``sdist`` or ``bdist_wheel``.
- :param pyversion: The version of Python which the release relates
- to. For code compatible with any Python, this would
- be ``source``, otherwise it would be e.g. ``3.2``.
- :param keystore: The path to a directory which contains the keys
- used in signing. If not specified, the instance's
- ``gpg_home`` attribute is used instead.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- if not os.path.exists(filename):
- raise DistlibException('not found: %s' % filename)
- metadata.validate()
- d = metadata.todict()
- sig_file = None
- if signer:
- if not self.gpg:
- logger.warning('no signing program available - not signed')
- else:
- sig_file = self.sign_file(filename, signer, sign_password,
- keystore)
- with open(filename, 'rb') as f:
- file_data = f.read()
- md5_digest = hashlib.md5(file_data).hexdigest()
- sha256_digest = hashlib.sha256(file_data).hexdigest()
- d.update({
- ':action': 'file_upload',
- 'protocol_version': '1',
- 'filetype': filetype,
- 'pyversion': pyversion,
- 'md5_digest': md5_digest,
- 'sha256_digest': sha256_digest,
- })
- files = [('content', os.path.basename(filename), file_data)]
- if sig_file:
- with open(sig_file, 'rb') as f:
- sig_data = f.read()
- files.append(('gpg_signature', os.path.basename(sig_file),
- sig_data))
- shutil.rmtree(os.path.dirname(sig_file))
- request = self.encode_request(d.items(), files)
- return self.send_request(request)
-
- def upload_documentation(self, metadata, doc_dir): # pragma: no cover
- """
- Upload documentation to the index.
-
- :param metadata: A :class:`Metadata` instance defining at least a name
- and version number for the documentation to be
- uploaded.
- :param doc_dir: The pathname of the directory which contains the
- documentation. This should be the directory that
- contains the ``index.html`` for the documentation.
- :return: The HTTP response received from PyPI upon submission of the
- request.
- """
- self.check_credentials()
- if not os.path.isdir(doc_dir):
- raise DistlibException('not a directory: %r' % doc_dir)
- fn = os.path.join(doc_dir, 'index.html')
- if not os.path.exists(fn):
- raise DistlibException('not found: %r' % fn)
- metadata.validate()
- name, version = metadata.name, metadata.version
- zip_data = zip_dir(doc_dir).getvalue()
- fields = [(':action', 'doc_upload'),
- ('name', name), ('version', version)]
- files = [('content', name, zip_data)]
- request = self.encode_request(fields, files)
- return self.send_request(request)
-
- def get_verify_command(self, signature_filename, data_filename,
- keystore=None):
- """
- Return a suitable command for verifying a file.
-
- :param signature_filename: The pathname to the file containing the
- signature.
- :param data_filename: The pathname to the file containing the
- signed data.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: The verifying command as a list suitable to be
- passed to :class:`subprocess.Popen`.
- """
- cmd = [self.gpg, '--status-fd', '2', '--no-tty']
- if keystore is None:
- keystore = self.gpg_home
- if keystore:
- cmd.extend(['--homedir', keystore])
- cmd.extend(['--verify', signature_filename, data_filename])
- logger.debug('invoking: %s', ' '.join(cmd))
- return cmd
-
- def verify_signature(self, signature_filename, data_filename,
- keystore=None):
- """
- Verify a signature for a file.
-
- :param signature_filename: The pathname to the file containing the
- signature.
- :param data_filename: The pathname to the file containing the
- signed data.
- :param keystore: The path to a directory which contains the keys
- used in verification. If not specified, the
- instance's ``gpg_home`` attribute is used instead.
- :return: True if the signature was verified, else False.
- """
- if not self.gpg:
- raise DistlibException('verification unavailable because gpg '
- 'unavailable')
- cmd = self.get_verify_command(signature_filename, data_filename,
- keystore)
- rc, stdout, stderr = self.run_command(cmd)
- if rc not in (0, 1):
- raise DistlibException('verify command failed with error code %s' % rc)
- return rc == 0
-
- def download_file(self, url, destfile, digest=None, reporthook=None):
- """
- This is a convenience method for downloading a file from an URL.
- Normally, this will be a file from the index, though currently
- no check is made for this (i.e. a file can be downloaded from
- anywhere).
-
- The method is just like the :func:`urlretrieve` function in the
- standard library, except that it allows digest computation to be
- done during download and checking that the downloaded data
- matched any expected value.
-
- :param url: The URL of the file to be downloaded (assumed to be
- available via an HTTP GET request).
- :param destfile: The pathname where the downloaded file is to be
- saved.
- :param digest: If specified, this must be a (hasher, value)
- tuple, where hasher is the algorithm used (e.g.
- ``'md5'``) and ``value`` is the expected value.
- :param reporthook: The same as for :func:`urlretrieve` in the
- standard library.
- """
- if digest is None:
- digester = None
- logger.debug('No digest specified')
- else:
- if isinstance(digest, (list, tuple)):
- hasher, digest = digest
- else:
- hasher = 'md5'
- digester = getattr(hashlib, hasher)()
- logger.debug('Digest specified: %s' % digest)
- # The following code is equivalent to urlretrieve.
- # We need to do it this way so that we can compute the
- # digest of the file as we go.
- with open(destfile, 'wb') as dfp:
- # addinfourl is not a context manager on 2.x
- # so we have to use try/finally
- sfp = self.send_request(Request(url))
- try:
- headers = sfp.info()
- blocksize = 8192
- size = -1
- read = 0
- blocknum = 0
- if "content-length" in headers:
- size = int(headers["Content-Length"])
- if reporthook:
- reporthook(blocknum, blocksize, size)
- while True:
- block = sfp.read(blocksize)
- if not block:
- break
- read += len(block)
- dfp.write(block)
- if digester:
- digester.update(block)
- blocknum += 1
- if reporthook:
- reporthook(blocknum, blocksize, size)
- finally:
- sfp.close()
-
- # check that we got the whole file, if we can
- if size >= 0 and read < size:
- raise DistlibException(
- 'retrieval incomplete: got only %d out of %d bytes'
- % (read, size))
- # if we have a digest, it must match.
- if digester:
- actual = digester.hexdigest()
- if digest != actual:
- raise DistlibException('%s digest mismatch for %s: expected '
- '%s, got %s' % (hasher, destfile,
- digest, actual))
- logger.debug('Digest verified: %s', digest)
-
- def send_request(self, req):
- """
- Send a standard library :class:`Request` to PyPI and return its
- response.
-
- :param req: The request to send.
- :return: The HTTP response from PyPI (a standard library HTTPResponse).
- """
- handlers = []
- if self.password_handler:
- handlers.append(self.password_handler)
- if self.ssl_verifier:
- handlers.append(self.ssl_verifier)
- opener = build_opener(*handlers)
- return opener.open(req)
-
- def encode_request(self, fields, files):
- """
- Encode fields and files for posting to an HTTP server.
-
- :param fields: The fields to send as a list of (fieldname, value)
- tuples.
- :param files: The files to send as a list of (fieldname, filename,
- file_bytes) tuple.
- """
- # Adapted from packaging, which in turn was adapted from
- # http://code.activestate.com/recipes/146306
-
- parts = []
- boundary = self.boundary
- for k, values in fields:
- if not isinstance(values, (list, tuple)):
- values = [values]
-
- for v in values:
- parts.extend((
- b'--' + boundary,
- ('Content-Disposition: form-data; name="%s"' %
- k).encode('utf-8'),
- b'',
- v.encode('utf-8')))
- for key, filename, value in files:
- parts.extend((
- b'--' + boundary,
- ('Content-Disposition: form-data; name="%s"; filename="%s"' %
- (key, filename)).encode('utf-8'),
- b'',
- value))
-
- parts.extend((b'--' + boundary + b'--', b''))
-
- body = b'\r\n'.join(parts)
- ct = b'multipart/form-data; boundary=' + boundary
- headers = {
- 'Content-type': ct,
- 'Content-length': str(len(body))
- }
- return Request(self.url, body, headers)
-
- def search(self, terms, operator=None): # pragma: no cover
- if isinstance(terms, string_types):
- terms = {'name': terms}
- rpc_proxy = ServerProxy(self.url, timeout=3.0)
- try:
- return rpc_proxy.search(terms, operator or 'and')
- finally:
- rpc_proxy('close')()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py
deleted file mode 100644
index f9f0788f..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py
+++ /dev/null
@@ -1,1303 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2023 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-
-import gzip
-from io import BytesIO
-import json
-import logging
-import os
-import posixpath
-import re
-try:
- import threading
-except ImportError: # pragma: no cover
- import dummy_threading as threading
-import zlib
-
-from . import DistlibException
-from .compat import (urljoin, urlparse, urlunparse, url2pathname, pathname2url,
- queue, quote, unescape, build_opener,
- HTTPRedirectHandler as BaseRedirectHandler, text_type,
- Request, HTTPError, URLError)
-from .database import Distribution, DistributionPath, make_dist
-from .metadata import Metadata, MetadataInvalidError
-from .util import (cached_property, ensure_slash, split_filename, get_project_data,
- parse_requirement, parse_name_and_version, ServerProxy,
- normalize_name)
-from .version import get_scheme, UnsupportedVersionError
-from .wheel import Wheel, is_compatible
-
-logger = logging.getLogger(__name__)
-
-HASHER_HASH = re.compile(r'^(\w+)=([a-f0-9]+)')
-CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
-HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
-DEFAULT_INDEX = 'https://pypi.org/pypi'
-
-
-def get_all_distribution_names(url=None):
- """
- Return all distribution names known by an index.
- :param url: The URL of the index.
- :return: A list of all known distribution names.
- """
- if url is None:
- url = DEFAULT_INDEX
- client = ServerProxy(url, timeout=3.0)
- try:
- return client.list_packages()
- finally:
- client('close')()
-
-
-class RedirectHandler(BaseRedirectHandler):
- """
- A class to work around a bug in some Python 3.2.x releases.
- """
- # There's a bug in the base version for some 3.2.x
- # (e.g. 3.2.2 on Ubuntu Oneiric). If a Location header
- # returns e.g. /abc, it bails because it says the scheme ''
- # is bogus, when actually it should use the request's
- # URL for the scheme. See Python issue #13696.
- def http_error_302(self, req, fp, code, msg, headers):
- # Some servers (incorrectly) return multiple Location headers
- # (so probably same goes for URI). Use first header.
- newurl = None
- for key in ('location', 'uri'):
- if key in headers:
- newurl = headers[key]
- break
- if newurl is None: # pragma: no cover
- return
- urlparts = urlparse(newurl)
- if urlparts.scheme == '':
- newurl = urljoin(req.get_full_url(), newurl)
- if hasattr(headers, 'replace_header'):
- headers.replace_header(key, newurl)
- else:
- headers[key] = newurl
- return BaseRedirectHandler.http_error_302(self, req, fp, code, msg,
- headers)
-
- http_error_301 = http_error_303 = http_error_307 = http_error_302
-
-
-class Locator(object):
- """
- A base class for locators - things that locate distributions.
- """
- source_extensions = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz')
- binary_extensions = ('.egg', '.exe', '.whl')
- excluded_extensions = ('.pdf',)
-
- # A list of tags indicating which wheels you want to match. The default
- # value of None matches against the tags compatible with the running
- # Python. If you want to match other values, set wheel_tags on a locator
- # instance to a list of tuples (pyver, abi, arch) which you want to match.
- wheel_tags = None
-
- downloadable_extensions = source_extensions + ('.whl',)
-
- def __init__(self, scheme='default'):
- """
- Initialise an instance.
- :param scheme: Because locators look for most recent versions, they
- need to know the version scheme to use. This specifies
- the current PEP-recommended scheme - use ``'legacy'``
- if you need to support existing distributions on PyPI.
- """
- self._cache = {}
- self.scheme = scheme
- # Because of bugs in some of the handlers on some of the platforms,
- # we use our own opener rather than just using urlopen.
- self.opener = build_opener(RedirectHandler())
- # If get_project() is called from locate(), the matcher instance
- # is set from the requirement passed to locate(). See issue #18 for
- # why this can be useful to know.
- self.matcher = None
- self.errors = queue.Queue()
-
- def get_errors(self):
- """
- Return any errors which have occurred.
- """
- result = []
- while not self.errors.empty(): # pragma: no cover
- try:
- e = self.errors.get(False)
- result.append(e)
- except self.errors.Empty:
- continue
- self.errors.task_done()
- return result
-
- def clear_errors(self):
- """
- Clear any errors which may have been logged.
- """
- # Just get the errors and throw them away
- self.get_errors()
-
- def clear_cache(self):
- self._cache.clear()
-
- def _get_scheme(self):
- return self._scheme
-
- def _set_scheme(self, value):
- self._scheme = value
-
- scheme = property(_get_scheme, _set_scheme)
-
- def _get_project(self, name):
- """
- For a given project, get a dictionary mapping available versions to Distribution
- instances.
-
- This should be implemented in subclasses.
-
- If called from a locate() request, self.matcher will be set to a
- matcher for the requirement to satisfy, otherwise it will be None.
- """
- raise NotImplementedError('Please implement in the subclass')
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Please implement in the subclass')
-
- def get_project(self, name):
- """
- For a given project, get a dictionary mapping available versions to Distribution
- instances.
-
- This calls _get_project to do all the work, and just implements a caching layer on top.
- """
- if self._cache is None: # pragma: no cover
- result = self._get_project(name)
- elif name in self._cache:
- result = self._cache[name]
- else:
- self.clear_errors()
- result = self._get_project(name)
- self._cache[name] = result
- return result
-
- def score_url(self, url):
- """
- Give an url a score which can be used to choose preferred URLs
- for a given project release.
- """
- t = urlparse(url)
- basename = posixpath.basename(t.path)
- compatible = True
- is_wheel = basename.endswith('.whl')
- is_downloadable = basename.endswith(self.downloadable_extensions)
- if is_wheel:
- compatible = is_compatible(Wheel(basename), self.wheel_tags)
- return (t.scheme == 'https', 'pypi.org' in t.netloc,
- is_downloadable, is_wheel, compatible, basename)
-
- def prefer_url(self, url1, url2):
- """
- Choose one of two URLs where both are candidates for distribution
- archives for the same version of a distribution (for example,
- .tar.gz vs. zip).
-
- The current implementation favours https:// URLs over http://, archives
- from PyPI over those from other locations, wheel compatibility (if a
- wheel) and then the archive name.
- """
- result = url2
- if url1:
- s1 = self.score_url(url1)
- s2 = self.score_url(url2)
- if s1 > s2:
- result = url1
- if result != url2:
- logger.debug('Not replacing %r with %r', url1, url2)
- else:
- logger.debug('Replacing %r with %r', url1, url2)
- return result
-
- def split_filename(self, filename, project_name):
- """
- Attempt to split a filename in project name, version and Python version.
- """
- return split_filename(filename, project_name)
-
- def convert_url_to_download_info(self, url, project_name):
- """
- See if a URL is a candidate for a download URL for a project (the URL
- has typically been scraped from an HTML page).
-
- If it is, a dictionary is returned with keys "name", "version",
- "filename" and "url"; otherwise, None is returned.
- """
- def same_project(name1, name2):
- return normalize_name(name1) == normalize_name(name2)
-
- result = None
- scheme, netloc, path, params, query, frag = urlparse(url)
- if frag.lower().startswith('egg='): # pragma: no cover
- logger.debug('%s: version hint in fragment: %r',
- project_name, frag)
- m = HASHER_HASH.match(frag)
- if m:
- algo, digest = m.groups()
- else:
- algo, digest = None, None
- origpath = path
- if path and path[-1] == '/': # pragma: no cover
- path = path[:-1]
- if path.endswith('.whl'):
- try:
- wheel = Wheel(path)
- if not is_compatible(wheel, self.wheel_tags):
- logger.debug('Wheel not compatible: %s', path)
- else:
- if project_name is None:
- include = True
- else:
- include = same_project(wheel.name, project_name)
- if include:
- result = {
- 'name': wheel.name,
- 'version': wheel.version,
- 'filename': wheel.filename,
- 'url': urlunparse((scheme, netloc, origpath,
- params, query, '')),
- 'python-version': ', '.join(
- ['.'.join(list(v[2:])) for v in wheel.pyver]),
- }
- except Exception: # pragma: no cover
- logger.warning('invalid path for wheel: %s', path)
- elif not path.endswith(self.downloadable_extensions): # pragma: no cover
- logger.debug('Not downloadable: %s', path)
- else: # downloadable extension
- path = filename = posixpath.basename(path)
- for ext in self.downloadable_extensions:
- if path.endswith(ext):
- path = path[:-len(ext)]
- t = self.split_filename(path, project_name)
- if not t: # pragma: no cover
- logger.debug('No match for project/version: %s', path)
- else:
- name, version, pyver = t
- if not project_name or same_project(project_name, name):
- result = {
- 'name': name,
- 'version': version,
- 'filename': filename,
- 'url': urlunparse((scheme, netloc, origpath,
- params, query, '')),
- }
- if pyver: # pragma: no cover
- result['python-version'] = pyver
- break
- if result and algo:
- result['%s_digest' % algo] = digest
- return result
-
- def _get_digest(self, info):
- """
- Get a digest from a dictionary by looking at a "digests" dictionary
- or keys of the form 'algo_digest'.
-
- Returns a 2-tuple (algo, digest) if found, else None. Currently
- looks only for SHA256, then MD5.
- """
- result = None
- if 'digests' in info:
- digests = info['digests']
- for algo in ('sha256', 'md5'):
- if algo in digests:
- result = (algo, digests[algo])
- break
- if not result:
- for algo in ('sha256', 'md5'):
- key = '%s_digest' % algo
- if key in info:
- result = (algo, info[key])
- break
- return result
-
- def _update_version_data(self, result, info):
- """
- Update a result dictionary (the final result from _get_project) with a
- dictionary for a specific version, which typically holds information
- gleaned from a filename or URL for an archive for the distribution.
- """
- name = info.pop('name')
- version = info.pop('version')
- if version in result:
- dist = result[version]
- md = dist.metadata
- else:
- dist = make_dist(name, version, scheme=self.scheme)
- md = dist.metadata
- dist.digest = digest = self._get_digest(info)
- url = info['url']
- result['digests'][url] = digest
- if md.source_url != info['url']:
- md.source_url = self.prefer_url(md.source_url, url)
- result['urls'].setdefault(version, set()).add(url)
- dist.locator = self
- result[version] = dist
-
- def locate(self, requirement, prereleases=False):
- """
- Find the most recent distribution which matches the given
- requirement.
-
- :param requirement: A requirement of the form 'foo (1.0)' or perhaps
- 'foo (>= 1.0, < 2.0, != 1.3)'
- :param prereleases: If ``True``, allow pre-release versions
- to be located. Otherwise, pre-release versions
- are not returned.
- :return: A :class:`Distribution` instance, or ``None`` if no such
- distribution could be located.
- """
- result = None
- r = parse_requirement(requirement)
- if r is None: # pragma: no cover
- raise DistlibException('Not a valid requirement: %r' % requirement)
- scheme = get_scheme(self.scheme)
- self.matcher = matcher = scheme.matcher(r.requirement)
- logger.debug('matcher: %s (%s)', matcher, type(matcher).__name__)
- versions = self.get_project(r.name)
- if len(versions) > 2: # urls and digests keys are present
- # sometimes, versions are invalid
- slist = []
- vcls = matcher.version_class
- for k in versions:
- if k in ('urls', 'digests'):
- continue
- try:
- if not matcher.match(k):
- pass # logger.debug('%s did not match %r', matcher, k)
- else:
- if prereleases or not vcls(k).is_prerelease:
- slist.append(k)
- except Exception: # pragma: no cover
- logger.warning('error matching %s with %r', matcher, k)
- pass # slist.append(k)
- if len(slist) > 1:
- slist = sorted(slist, key=scheme.key)
- if slist:
- logger.debug('sorted list: %s', slist)
- version = slist[-1]
- result = versions[version]
- if result:
- if r.extras:
- result.extras = r.extras
- result.download_urls = versions.get('urls', {}).get(version, set())
- d = {}
- sd = versions.get('digests', {})
- for url in result.download_urls:
- if url in sd: # pragma: no cover
- d[url] = sd[url]
- result.digests = d
- self.matcher = None
- return result
-
-
-class PyPIRPCLocator(Locator):
- """
- This locator uses XML-RPC to locate distributions. It therefore
- cannot be used with simple mirrors (that only mirror file content).
- """
- def __init__(self, url, **kwargs):
- """
- Initialise an instance.
-
- :param url: The URL to use for XML-RPC.
- :param kwargs: Passed to the superclass constructor.
- """
- super(PyPIRPCLocator, self).__init__(**kwargs)
- self.base_url = url
- self.client = ServerProxy(url, timeout=3.0)
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- return set(self.client.list_packages())
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- versions = self.client.package_releases(name, True)
- for v in versions:
- urls = self.client.release_urls(name, v)
- data = self.client.release_data(name, v)
- metadata = Metadata(scheme=self.scheme)
- metadata.name = data['name']
- metadata.version = data['version']
- metadata.license = data.get('license')
- metadata.keywords = data.get('keywords', [])
- metadata.summary = data.get('summary')
- dist = Distribution(metadata)
- if urls:
- info = urls[0]
- metadata.source_url = info['url']
- dist.digest = self._get_digest(info)
- dist.locator = self
- result[v] = dist
- for info in urls:
- url = info['url']
- digest = self._get_digest(info)
- result['urls'].setdefault(v, set()).add(url)
- result['digests'][url] = digest
- return result
-
-
-class PyPIJSONLocator(Locator):
- """
- This locator uses PyPI's JSON interface. It's very limited in functionality
- and probably not worth using.
- """
- def __init__(self, url, **kwargs):
- super(PyPIJSONLocator, self).__init__(**kwargs)
- self.base_url = ensure_slash(url)
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Not available from this locator')
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- url = urljoin(self.base_url, '%s/json' % quote(name))
- try:
- resp = self.opener.open(url)
- data = resp.read().decode() # for now
- d = json.loads(data)
- md = Metadata(scheme=self.scheme)
- data = d['info']
- md.name = data['name']
- md.version = data['version']
- md.license = data.get('license')
- md.keywords = data.get('keywords', [])
- md.summary = data.get('summary')
- dist = Distribution(md)
- dist.locator = self
- # urls = d['urls']
- result[md.version] = dist
- for info in d['urls']:
- url = info['url']
- dist.download_urls.add(url)
- dist.digests[url] = self._get_digest(info)
- result['urls'].setdefault(md.version, set()).add(url)
- result['digests'][url] = self._get_digest(info)
- # Now get other releases
- for version, infos in d['releases'].items():
- if version == md.version:
- continue # already done
- omd = Metadata(scheme=self.scheme)
- omd.name = md.name
- omd.version = version
- odist = Distribution(omd)
- odist.locator = self
- result[version] = odist
- for info in infos:
- url = info['url']
- odist.download_urls.add(url)
- odist.digests[url] = self._get_digest(info)
- result['urls'].setdefault(version, set()).add(url)
- result['digests'][url] = self._get_digest(info)
-# for info in urls:
-# md.source_url = info['url']
-# dist.digest = self._get_digest(info)
-# dist.locator = self
-# for info in urls:
-# url = info['url']
-# result['urls'].setdefault(md.version, set()).add(url)
-# result['digests'][url] = self._get_digest(info)
- except Exception as e:
- self.errors.put(text_type(e))
- logger.exception('JSON fetch failed: %s', e)
- return result
-
-
-class Page(object):
- """
- This class represents a scraped HTML page.
- """
- # The following slightly hairy-looking regex just looks for the contents of
- # an anchor link, which has an attribute "href" either immediately preceded
- # or immediately followed by a "rel" attribute. The attribute values can be
- # declared with double quotes, single quotes or no quotes - which leads to
- # the length of the expression.
- _href = re.compile("""
-(rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))\\s+)?
-href\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*))
-(\\s+rel\\s*=\\s*(?:"(?P[^"]*)"|'(?P[^']*)'|(?P[^>\\s\n]*)))?
-""", re.I | re.S | re.X)
- _base = re.compile(r""" ]+)""", re.I | re.S)
-
- def __init__(self, data, url):
- """
- Initialise an instance with the Unicode page contents and the URL they
- came from.
- """
- self.data = data
- self.base_url = self.url = url
- m = self._base.search(self.data)
- if m:
- self.base_url = m.group(1)
-
- _clean_re = re.compile(r'[^a-z0-9$&+,/:;=?@.#%_\\|-]', re.I)
-
- @cached_property
- def links(self):
- """
- Return the URLs of all the links on a page together with information
- about their "rel" attribute, for determining which ones to treat as
- downloads and which ones to queue for further scraping.
- """
- def clean(url):
- "Tidy up an URL."
- scheme, netloc, path, params, query, frag = urlparse(url)
- return urlunparse((scheme, netloc, quote(path),
- params, query, frag))
-
- result = set()
- for match in self._href.finditer(self.data):
- d = match.groupdict('')
- rel = (d['rel1'] or d['rel2'] or d['rel3'] or
- d['rel4'] or d['rel5'] or d['rel6'])
- url = d['url1'] or d['url2'] or d['url3']
- url = urljoin(self.base_url, url)
- url = unescape(url)
- url = self._clean_re.sub(lambda m: '%%%2x' % ord(m.group(0)), url)
- result.add((url, rel))
- # We sort the result, hoping to bring the most recent versions
- # to the front
- result = sorted(result, key=lambda t: t[0], reverse=True)
- return result
-
-
-class SimpleScrapingLocator(Locator):
- """
- A locator which scrapes HTML pages to locate downloads for a distribution.
- This runs multiple threads to do the I/O; performance is at least as good
- as pip's PackageFinder, which works in an analogous fashion.
- """
-
- # These are used to deal with various Content-Encoding schemes.
- decoders = {
- 'deflate': zlib.decompress,
- 'gzip': lambda b: gzip.GzipFile(fileobj=BytesIO(b)).read(),
- 'none': lambda b: b,
- }
-
- def __init__(self, url, timeout=None, num_workers=10, **kwargs):
- """
- Initialise an instance.
- :param url: The root URL to use for scraping.
- :param timeout: The timeout, in seconds, to be applied to requests.
- This defaults to ``None`` (no timeout specified).
- :param num_workers: The number of worker threads you want to do I/O,
- This defaults to 10.
- :param kwargs: Passed to the superclass.
- """
- super(SimpleScrapingLocator, self).__init__(**kwargs)
- self.base_url = ensure_slash(url)
- self.timeout = timeout
- self._page_cache = {}
- self._seen = set()
- self._to_fetch = queue.Queue()
- self._bad_hosts = set()
- self.skip_externals = False
- self.num_workers = num_workers
- self._lock = threading.RLock()
- # See issue #45: we need to be resilient when the locator is used
- # in a thread, e.g. with concurrent.futures. We can't use self._lock
- # as it is for coordinating our internal threads - the ones created
- # in _prepare_threads.
- self._gplock = threading.RLock()
- self.platform_check = False # See issue #112
-
- def _prepare_threads(self):
- """
- Threads are created only when get_project is called, and terminate
- before it returns. They are there primarily to parallelise I/O (i.e.
- fetching web pages).
- """
- self._threads = []
- for i in range(self.num_workers):
- t = threading.Thread(target=self._fetch)
- t.daemon = True
- t.start()
- self._threads.append(t)
-
- def _wait_threads(self):
- """
- Tell all the threads to terminate (by sending a sentinel value) and
- wait for them to do so.
- """
- # Note that you need two loops, since you can't say which
- # thread will get each sentinel
- for t in self._threads:
- self._to_fetch.put(None) # sentinel
- for t in self._threads:
- t.join()
- self._threads = []
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- with self._gplock:
- self.result = result
- self.project_name = name
- url = urljoin(self.base_url, '%s/' % quote(name))
- self._seen.clear()
- self._page_cache.clear()
- self._prepare_threads()
- try:
- logger.debug('Queueing %s', url)
- self._to_fetch.put(url)
- self._to_fetch.join()
- finally:
- self._wait_threads()
- del self.result
- return result
-
- platform_dependent = re.compile(r'\b(linux_(i\d86|x86_64|arm\w+)|'
- r'win(32|_amd64)|macosx_?\d+)\b', re.I)
-
- def _is_platform_dependent(self, url):
- """
- Does an URL refer to a platform-specific download?
- """
- return self.platform_dependent.search(url)
-
- def _process_download(self, url):
- """
- See if an URL is a suitable download for a project.
-
- If it is, register information in the result dictionary (for
- _get_project) about the specific version it's for.
-
- Note that the return value isn't actually used other than as a boolean
- value.
- """
- if self.platform_check and self._is_platform_dependent(url):
- info = None
- else:
- info = self.convert_url_to_download_info(url, self.project_name)
- logger.debug('process_download: %s -> %s', url, info)
- if info:
- with self._lock: # needed because self.result is shared
- self._update_version_data(self.result, info)
- return info
-
- def _should_queue(self, link, referrer, rel):
- """
- Determine whether a link URL from a referring page and with a
- particular "rel" attribute should be queued for scraping.
- """
- scheme, netloc, path, _, _, _ = urlparse(link)
- if path.endswith(self.source_extensions + self.binary_extensions +
- self.excluded_extensions):
- result = False
- elif self.skip_externals and not link.startswith(self.base_url):
- result = False
- elif not referrer.startswith(self.base_url):
- result = False
- elif rel not in ('homepage', 'download'):
- result = False
- elif scheme not in ('http', 'https', 'ftp'):
- result = False
- elif self._is_platform_dependent(link):
- result = False
- else:
- host = netloc.split(':', 1)[0]
- if host.lower() == 'localhost':
- result = False
- else:
- result = True
- logger.debug('should_queue: %s (%s) from %s -> %s', link, rel,
- referrer, result)
- return result
-
- def _fetch(self):
- """
- Get a URL to fetch from the work queue, get the HTML page, examine its
- links for download candidates and candidates for further scraping.
-
- This is a handy method to run in a thread.
- """
- while True:
- url = self._to_fetch.get()
- try:
- if url:
- page = self.get_page(url)
- if page is None: # e.g. after an error
- continue
- for link, rel in page.links:
- if link not in self._seen:
- try:
- self._seen.add(link)
- if (not self._process_download(link) and
- self._should_queue(link, url, rel)):
- logger.debug('Queueing %s from %s', link, url)
- self._to_fetch.put(link)
- except MetadataInvalidError: # e.g. invalid versions
- pass
- except Exception as e: # pragma: no cover
- self.errors.put(text_type(e))
- finally:
- # always do this, to avoid hangs :-)
- self._to_fetch.task_done()
- if not url:
- # logger.debug('Sentinel seen, quitting.')
- break
-
- def get_page(self, url):
- """
- Get the HTML for an URL, possibly from an in-memory cache.
-
- XXX TODO Note: this cache is never actually cleared. It's assumed that
- the data won't get stale over the lifetime of a locator instance (not
- necessarily true for the default_locator).
- """
- # http://peak.telecommunity.com/DevCenter/EasyInstall#package-index-api
- scheme, netloc, path, _, _, _ = urlparse(url)
- if scheme == 'file' and os.path.isdir(url2pathname(path)):
- url = urljoin(ensure_slash(url), 'index.html')
-
- if url in self._page_cache:
- result = self._page_cache[url]
- logger.debug('Returning %s from cache: %s', url, result)
- else:
- host = netloc.split(':', 1)[0]
- result = None
- if host in self._bad_hosts:
- logger.debug('Skipping %s due to bad host %s', url, host)
- else:
- req = Request(url, headers={'Accept-encoding': 'identity'})
- try:
- logger.debug('Fetching %s', url)
- resp = self.opener.open(req, timeout=self.timeout)
- logger.debug('Fetched %s', url)
- headers = resp.info()
- content_type = headers.get('Content-Type', '')
- if HTML_CONTENT_TYPE.match(content_type):
- final_url = resp.geturl()
- data = resp.read()
- encoding = headers.get('Content-Encoding')
- if encoding:
- decoder = self.decoders[encoding] # fail if not found
- data = decoder(data)
- encoding = 'utf-8'
- m = CHARSET.search(content_type)
- if m:
- encoding = m.group(1)
- try:
- data = data.decode(encoding)
- except UnicodeError: # pragma: no cover
- data = data.decode('latin-1') # fallback
- result = Page(data, final_url)
- self._page_cache[final_url] = result
- except HTTPError as e:
- if e.code != 404:
- logger.exception('Fetch failed: %s: %s', url, e)
- except URLError as e: # pragma: no cover
- logger.exception('Fetch failed: %s: %s', url, e)
- with self._lock:
- self._bad_hosts.add(host)
- except Exception as e: # pragma: no cover
- logger.exception('Fetch failed: %s: %s', url, e)
- finally:
- self._page_cache[url] = result # even if None (failure)
- return result
-
- _distname_re = re.compile(']*>([^<]+)<')
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- page = self.get_page(self.base_url)
- if not page:
- raise DistlibException('Unable to get %s' % self.base_url)
- for match in self._distname_re.finditer(page.data):
- result.add(match.group(1))
- return result
-
-
-class DirectoryLocator(Locator):
- """
- This class locates distributions in a directory tree.
- """
-
- def __init__(self, path, **kwargs):
- """
- Initialise an instance.
- :param path: The root of the directory tree to search.
- :param kwargs: Passed to the superclass constructor,
- except for:
- * recursive - if True (the default), subdirectories are
- recursed into. If False, only the top-level directory
- is searched,
- """
- self.recursive = kwargs.pop('recursive', True)
- super(DirectoryLocator, self).__init__(**kwargs)
- path = os.path.abspath(path)
- if not os.path.isdir(path): # pragma: no cover
- raise DistlibException('Not a directory: %r' % path)
- self.base_dir = path
-
- def should_include(self, filename, parent):
- """
- Should a filename be considered as a candidate for a distribution
- archive? As well as the filename, the directory which contains it
- is provided, though not used by the current implementation.
- """
- return filename.endswith(self.downloadable_extensions)
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- for root, dirs, files in os.walk(self.base_dir):
- for fn in files:
- if self.should_include(fn, root):
- fn = os.path.join(root, fn)
- url = urlunparse(('file', '',
- pathname2url(os.path.abspath(fn)),
- '', '', ''))
- info = self.convert_url_to_download_info(url, name)
- if info:
- self._update_version_data(result, info)
- if not self.recursive:
- break
- return result
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- for root, dirs, files in os.walk(self.base_dir):
- for fn in files:
- if self.should_include(fn, root):
- fn = os.path.join(root, fn)
- url = urlunparse(('file', '',
- pathname2url(os.path.abspath(fn)),
- '', '', ''))
- info = self.convert_url_to_download_info(url, None)
- if info:
- result.add(info['name'])
- if not self.recursive:
- break
- return result
-
-
-class JSONLocator(Locator):
- """
- This locator uses special extended metadata (not available on PyPI) and is
- the basis of performant dependency resolution in distlib. Other locators
- require archive downloads before dependencies can be determined! As you
- might imagine, that can be slow.
- """
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- raise NotImplementedError('Not available from this locator')
-
- def _get_project(self, name):
- result = {'urls': {}, 'digests': {}}
- data = get_project_data(name)
- if data:
- for info in data.get('files', []):
- if info['ptype'] != 'sdist' or info['pyversion'] != 'source':
- continue
- # We don't store summary in project metadata as it makes
- # the data bigger for no benefit during dependency
- # resolution
- dist = make_dist(data['name'], info['version'],
- summary=data.get('summary',
- 'Placeholder for summary'),
- scheme=self.scheme)
- md = dist.metadata
- md.source_url = info['url']
- # TODO SHA256 digest
- if 'digest' in info and info['digest']:
- dist.digest = ('md5', info['digest'])
- md.dependencies = info.get('requirements', {})
- dist.exports = info.get('exports', {})
- result[dist.version] = dist
- result['urls'].setdefault(dist.version, set()).add(info['url'])
- return result
-
-
-class DistPathLocator(Locator):
- """
- This locator finds installed distributions in a path. It can be useful for
- adding to an :class:`AggregatingLocator`.
- """
- def __init__(self, distpath, **kwargs):
- """
- Initialise an instance.
-
- :param distpath: A :class:`DistributionPath` instance to search.
- """
- super(DistPathLocator, self).__init__(**kwargs)
- assert isinstance(distpath, DistributionPath)
- self.distpath = distpath
-
- def _get_project(self, name):
- dist = self.distpath.get_distribution(name)
- if dist is None:
- result = {'urls': {}, 'digests': {}}
- else:
- result = {
- dist.version: dist,
- 'urls': {dist.version: set([dist.source_url])},
- 'digests': {dist.version: set([None])}
- }
- return result
-
-
-class AggregatingLocator(Locator):
- """
- This class allows you to chain and/or merge a list of locators.
- """
- def __init__(self, *locators, **kwargs):
- """
- Initialise an instance.
-
- :param locators: The list of locators to search.
- :param kwargs: Passed to the superclass constructor,
- except for:
- * merge - if False (the default), the first successful
- search from any of the locators is returned. If True,
- the results from all locators are merged (this can be
- slow).
- """
- self.merge = kwargs.pop('merge', False)
- self.locators = locators
- super(AggregatingLocator, self).__init__(**kwargs)
-
- def clear_cache(self):
- super(AggregatingLocator, self).clear_cache()
- for locator in self.locators:
- locator.clear_cache()
-
- def _set_scheme(self, value):
- self._scheme = value
- for locator in self.locators:
- locator.scheme = value
-
- scheme = property(Locator.scheme.fget, _set_scheme)
-
- def _get_project(self, name):
- result = {}
- for locator in self.locators:
- d = locator.get_project(name)
- if d:
- if self.merge:
- files = result.get('urls', {})
- digests = result.get('digests', {})
- # next line could overwrite result['urls'], result['digests']
- result.update(d)
- df = result.get('urls')
- if files and df:
- for k, v in files.items():
- if k in df:
- df[k] |= v
- else:
- df[k] = v
- dd = result.get('digests')
- if digests and dd:
- dd.update(digests)
- else:
- # See issue #18. If any dists are found and we're looking
- # for specific constraints, we only return something if
- # a match is found. For example, if a DirectoryLocator
- # returns just foo (1.0) while we're looking for
- # foo (>= 2.0), we'll pretend there was nothing there so
- # that subsequent locators can be queried. Otherwise we
- # would just return foo (1.0) which would then lead to a
- # failure to find foo (>= 2.0), because other locators
- # weren't searched. Note that this only matters when
- # merge=False.
- if self.matcher is None:
- found = True
- else:
- found = False
- for k in d:
- if self.matcher.match(k):
- found = True
- break
- if found:
- result = d
- break
- return result
-
- def get_distribution_names(self):
- """
- Return all the distribution names known to this locator.
- """
- result = set()
- for locator in self.locators:
- try:
- result |= locator.get_distribution_names()
- except NotImplementedError:
- pass
- return result
-
-
-# We use a legacy scheme simply because most of the dists on PyPI use legacy
-# versions which don't conform to PEP 440.
-default_locator = AggregatingLocator(
- # JSONLocator(), # don't use as PEP 426 is withdrawn
- SimpleScrapingLocator('https://pypi.org/simple/',
- timeout=3.0),
- scheme='legacy')
-
-locate = default_locator.locate
-
-
-class DependencyFinder(object):
- """
- Locate dependencies for distributions.
- """
-
- def __init__(self, locator=None):
- """
- Initialise an instance, using the specified locator
- to locate distributions.
- """
- self.locator = locator or default_locator
- self.scheme = get_scheme(self.locator.scheme)
-
- def add_distribution(self, dist):
- """
- Add a distribution to the finder. This will update internal information
- about who provides what.
- :param dist: The distribution to add.
- """
- logger.debug('adding distribution %s', dist)
- name = dist.key
- self.dists_by_name[name] = dist
- self.dists[(name, dist.version)] = dist
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Add to provided: %s, %s, %s', name, version, dist)
- self.provided.setdefault(name, set()).add((version, dist))
-
- def remove_distribution(self, dist):
- """
- Remove a distribution from the finder. This will update internal
- information about who provides what.
- :param dist: The distribution to remove.
- """
- logger.debug('removing distribution %s', dist)
- name = dist.key
- del self.dists_by_name[name]
- del self.dists[(name, dist.version)]
- for p in dist.provides:
- name, version = parse_name_and_version(p)
- logger.debug('Remove from provided: %s, %s, %s', name, version, dist)
- s = self.provided[name]
- s.remove((version, dist))
- if not s:
- del self.provided[name]
-
- def get_matcher(self, reqt):
- """
- Get a version matcher for a requirement.
- :param reqt: The requirement
- :type reqt: str
- :return: A version matcher (an instance of
- :class:`distlib.version.Matcher`).
- """
- try:
- matcher = self.scheme.matcher(reqt)
- except UnsupportedVersionError: # pragma: no cover
- # XXX compat-mode if cannot read the version
- name = reqt.split()[0]
- matcher = self.scheme.matcher(name)
- return matcher
-
- def find_providers(self, reqt):
- """
- Find the distributions which can fulfill a requirement.
-
- :param reqt: The requirement.
- :type reqt: str
- :return: A set of distribution which can fulfill the requirement.
- """
- matcher = self.get_matcher(reqt)
- name = matcher.key # case-insensitive
- result = set()
- provided = self.provided
- if name in provided:
- for version, provider in provided[name]:
- try:
- match = matcher.match(version)
- except UnsupportedVersionError:
- match = False
-
- if match:
- result.add(provider)
- break
- return result
-
- def try_to_replace(self, provider, other, problems):
- """
- Attempt to replace one provider with another. This is typically used
- when resolving dependencies from multiple sources, e.g. A requires
- (B >= 1.0) while C requires (B >= 1.1).
-
- For successful replacement, ``provider`` must meet all the requirements
- which ``other`` fulfills.
-
- :param provider: The provider we are trying to replace with.
- :param other: The provider we're trying to replace.
- :param problems: If False is returned, this will contain what
- problems prevented replacement. This is currently
- a tuple of the literal string 'cantreplace',
- ``provider``, ``other`` and the set of requirements
- that ``provider`` couldn't fulfill.
- :return: True if we can replace ``other`` with ``provider``, else
- False.
- """
- rlist = self.reqts[other]
- unmatched = set()
- for s in rlist:
- matcher = self.get_matcher(s)
- if not matcher.match(provider.version):
- unmatched.add(s)
- if unmatched:
- # can't replace other with provider
- problems.add(('cantreplace', provider, other,
- frozenset(unmatched)))
- result = False
- else:
- # can replace other with provider
- self.remove_distribution(other)
- del self.reqts[other]
- for s in rlist:
- self.reqts.setdefault(provider, set()).add(s)
- self.add_distribution(provider)
- result = True
- return result
-
- def find(self, requirement, meta_extras=None, prereleases=False):
- """
- Find a distribution and all distributions it depends on.
-
- :param requirement: The requirement specifying the distribution to
- find, or a Distribution instance.
- :param meta_extras: A list of meta extras such as :test:, :build: and
- so on.
- :param prereleases: If ``True``, allow pre-release versions to be
- returned - otherwise, don't return prereleases
- unless they're all that's available.
-
- Return a set of :class:`Distribution` instances and a set of
- problems.
-
- The distributions returned should be such that they have the
- :attr:`required` attribute set to ``True`` if they were
- from the ``requirement`` passed to ``find()``, and they have the
- :attr:`build_time_dependency` attribute set to ``True`` unless they
- are post-installation dependencies of the ``requirement``.
-
- The problems should be a tuple consisting of the string
- ``'unsatisfied'`` and the requirement which couldn't be satisfied
- by any distribution known to the locator.
- """
-
- self.provided = {}
- self.dists = {}
- self.dists_by_name = {}
- self.reqts = {}
-
- meta_extras = set(meta_extras or [])
- if ':*:' in meta_extras:
- meta_extras.remove(':*:')
- # :meta: and :run: are implicitly included
- meta_extras |= set([':test:', ':build:', ':dev:'])
-
- if isinstance(requirement, Distribution):
- dist = odist = requirement
- logger.debug('passed %s as requirement', odist)
- else:
- dist = odist = self.locator.locate(requirement,
- prereleases=prereleases)
- if dist is None:
- raise DistlibException('Unable to locate %r' % requirement)
- logger.debug('located %s', odist)
- dist.requested = True
- problems = set()
- todo = set([dist])
- install_dists = set([odist])
- while todo:
- dist = todo.pop()
- name = dist.key # case-insensitive
- if name not in self.dists_by_name:
- self.add_distribution(dist)
- else:
- # import pdb; pdb.set_trace()
- other = self.dists_by_name[name]
- if other != dist:
- self.try_to_replace(dist, other, problems)
-
- ireqts = dist.run_requires | dist.meta_requires
- sreqts = dist.build_requires
- ereqts = set()
- if meta_extras and dist in install_dists:
- for key in ('test', 'build', 'dev'):
- e = ':%s:' % key
- if e in meta_extras:
- ereqts |= getattr(dist, '%s_requires' % key)
- all_reqts = ireqts | sreqts | ereqts
- for r in all_reqts:
- providers = self.find_providers(r)
- if not providers:
- logger.debug('No providers found for %r', r)
- provider = self.locator.locate(r, prereleases=prereleases)
- # If no provider is found and we didn't consider
- # prereleases, consider them now.
- if provider is None and not prereleases:
- provider = self.locator.locate(r, prereleases=True)
- if provider is None:
- logger.debug('Cannot satisfy %r', r)
- problems.add(('unsatisfied', r))
- else:
- n, v = provider.key, provider.version
- if (n, v) not in self.dists:
- todo.add(provider)
- providers.add(provider)
- if r in ireqts and dist in install_dists:
- install_dists.add(provider)
- logger.debug('Adding %s to install_dists',
- provider.name_and_version)
- for p in providers:
- name = p.key
- if name not in self.dists_by_name:
- self.reqts.setdefault(p, set()).add(r)
- else:
- other = self.dists_by_name[name]
- if other != p:
- # see if other can be replaced by p
- self.try_to_replace(p, other, problems)
-
- dists = set(self.dists.values())
- for dist in dists:
- dist.build_time_dependency = dist not in install_dists
- if dist.build_time_dependency:
- logger.debug('%s is a build-time dependency only.',
- dist.name_and_version)
- logger.debug('find done for %s', odist)
- return dists, problems
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
deleted file mode 100644
index 420dcf12..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+++ /dev/null
@@ -1,384 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2023 Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""
-Class representing the list of files in a distribution.
-
-Equivalent to distutils.filelist, but fixes some problems.
-"""
-import fnmatch
-import logging
-import os
-import re
-import sys
-
-from . import DistlibException
-from .compat import fsdecode
-from .util import convert_path
-
-
-__all__ = ['Manifest']
-
-logger = logging.getLogger(__name__)
-
-# a \ followed by some spaces + EOL
-_COLLAPSE_PATTERN = re.compile('\\\\w*\n', re.M)
-_COMMENTED_LINE = re.compile('#.*?(?=\n)|\n(?=$)', re.M | re.S)
-
-#
-# Due to the different results returned by fnmatch.translate, we need
-# to do slightly different processing for Python 2.7 and 3.2 ... this needed
-# to be brought in for Python 3.6 onwards.
-#
-_PYTHON_VERSION = sys.version_info[:2]
-
-
-class Manifest(object):
- """
- A list of files built by exploring the filesystem and filtered by applying various
- patterns to what we find there.
- """
-
- def __init__(self, base=None):
- """
- Initialise an instance.
-
- :param base: The base directory to explore under.
- """
- self.base = os.path.abspath(os.path.normpath(base or os.getcwd()))
- self.prefix = self.base + os.sep
- self.allfiles = None
- self.files = set()
-
- #
- # Public API
- #
-
- def findall(self):
- """Find all files under the base and set ``allfiles`` to the absolute
- pathnames of files found.
- """
- from stat import S_ISREG, S_ISDIR, S_ISLNK
-
- self.allfiles = allfiles = []
- root = self.base
- stack = [root]
- pop = stack.pop
- push = stack.append
-
- while stack:
- root = pop()
- names = os.listdir(root)
-
- for name in names:
- fullname = os.path.join(root, name)
-
- # Avoid excess stat calls -- just one will do, thank you!
- stat = os.stat(fullname)
- mode = stat.st_mode
- if S_ISREG(mode):
- allfiles.append(fsdecode(fullname))
- elif S_ISDIR(mode) and not S_ISLNK(mode):
- push(fullname)
-
- def add(self, item):
- """
- Add a file to the manifest.
-
- :param item: The pathname to add. This can be relative to the base.
- """
- if not item.startswith(self.prefix):
- item = os.path.join(self.base, item)
- self.files.add(os.path.normpath(item))
-
- def add_many(self, items):
- """
- Add a list of files to the manifest.
-
- :param items: The pathnames to add. These can be relative to the base.
- """
- for item in items:
- self.add(item)
-
- def sorted(self, wantdirs=False):
- """
- Return sorted files in directory order
- """
-
- def add_dir(dirs, d):
- dirs.add(d)
- logger.debug('add_dir added %s', d)
- if d != self.base:
- parent, _ = os.path.split(d)
- assert parent not in ('', '/')
- add_dir(dirs, parent)
-
- result = set(self.files) # make a copy!
- if wantdirs:
- dirs = set()
- for f in result:
- add_dir(dirs, os.path.dirname(f))
- result |= dirs
- return [os.path.join(*path_tuple) for path_tuple in
- sorted(os.path.split(path) for path in result)]
-
- def clear(self):
- """Clear all collected files."""
- self.files = set()
- self.allfiles = []
-
- def process_directive(self, directive):
- """
- Process a directive which either adds some files from ``allfiles`` to
- ``files``, or removes some files from ``files``.
-
- :param directive: The directive to process. This should be in a format
- compatible with distutils ``MANIFEST.in`` files:
-
- http://docs.python.org/distutils/sourcedist.html#commands
- """
- # Parse the line: split it up, make sure the right number of words
- # is there, and return the relevant words. 'action' is always
- # defined: it's the first word of the line. Which of the other
- # three are defined depends on the action; it'll be either
- # patterns, (dir and patterns), or (dirpattern).
- action, patterns, thedir, dirpattern = self._parse_directive(directive)
-
- # OK, now we know that the action is valid and we have the
- # right number of words on the line for that action -- so we
- # can proceed with minimal error-checking.
- if action == 'include':
- for pattern in patterns:
- if not self._include_pattern(pattern, anchor=True):
- logger.warning('no files found matching %r', pattern)
-
- elif action == 'exclude':
- for pattern in patterns:
- self._exclude_pattern(pattern, anchor=True)
-
- elif action == 'global-include':
- for pattern in patterns:
- if not self._include_pattern(pattern, anchor=False):
- logger.warning('no files found matching %r '
- 'anywhere in distribution', pattern)
-
- elif action == 'global-exclude':
- for pattern in patterns:
- self._exclude_pattern(pattern, anchor=False)
-
- elif action == 'recursive-include':
- for pattern in patterns:
- if not self._include_pattern(pattern, prefix=thedir):
- logger.warning('no files found matching %r '
- 'under directory %r', pattern, thedir)
-
- elif action == 'recursive-exclude':
- for pattern in patterns:
- self._exclude_pattern(pattern, prefix=thedir)
-
- elif action == 'graft':
- if not self._include_pattern(None, prefix=dirpattern):
- logger.warning('no directories found matching %r',
- dirpattern)
-
- elif action == 'prune':
- if not self._exclude_pattern(None, prefix=dirpattern):
- logger.warning('no previously-included directories found '
- 'matching %r', dirpattern)
- else: # pragma: no cover
- # This should never happen, as it should be caught in
- # _parse_template_line
- raise DistlibException(
- 'invalid action %r' % action)
-
- #
- # Private API
- #
-
- def _parse_directive(self, directive):
- """
- Validate a directive.
- :param directive: The directive to validate.
- :return: A tuple of action, patterns, thedir, dir_patterns
- """
- words = directive.split()
- if len(words) == 1 and words[0] not in ('include', 'exclude',
- 'global-include',
- 'global-exclude',
- 'recursive-include',
- 'recursive-exclude',
- 'graft', 'prune'):
- # no action given, let's use the default 'include'
- words.insert(0, 'include')
-
- action = words[0]
- patterns = thedir = dir_pattern = None
-
- if action in ('include', 'exclude',
- 'global-include', 'global-exclude'):
- if len(words) < 2:
- raise DistlibException(
- '%r expects ...' % action)
-
- patterns = [convert_path(word) for word in words[1:]]
-
- elif action in ('recursive-include', 'recursive-exclude'):
- if len(words) < 3:
- raise DistlibException(
- '%r expects ...' % action)
-
- thedir = convert_path(words[1])
- patterns = [convert_path(word) for word in words[2:]]
-
- elif action in ('graft', 'prune'):
- if len(words) != 2:
- raise DistlibException(
- '%r expects a single ' % action)
-
- dir_pattern = convert_path(words[1])
-
- else:
- raise DistlibException('unknown action %r' % action)
-
- return action, patterns, thedir, dir_pattern
-
- def _include_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Select strings (presumably filenames) from 'self.files' that
- match 'pattern', a Unix-style wildcard (glob) pattern.
-
- Patterns are not quite the same as implemented by the 'fnmatch'
- module: '*' and '?' match non-special characters, where "special"
- is platform-dependent: slash on Unix; colon, slash, and backslash on
- DOS/Windows; and colon on Mac OS.
-
- If 'anchor' is true (the default), then the pattern match is more
- stringent: "*.py" will match "foo.py" but not "foo/bar.py". If
- 'anchor' is false, both of these will match.
-
- If 'prefix' is supplied, then only filenames starting with 'prefix'
- (itself a pattern) and ending with 'pattern', with anything in between
- them, will match. 'anchor' is ignored in this case.
-
- If 'is_regex' is true, 'anchor' and 'prefix' are ignored, and
- 'pattern' is assumed to be either a string containing a regex or a
- regex object -- no translation is done, the regex is just compiled
- and used as-is.
-
- Selected strings will be added to self.files.
-
- Return True if files are found.
- """
- # XXX docstring lying about what the special chars are?
- found = False
- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
-
- # delayed loading of allfiles list
- if self.allfiles is None:
- self.findall()
-
- for name in self.allfiles:
- if pattern_re.search(name):
- self.files.add(name)
- found = True
- return found
-
- def _exclude_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Remove strings (presumably filenames) from 'files' that match
- 'pattern'.
-
- Other parameters are the same as for 'include_pattern()', above.
- The list 'self.files' is modified in place. Return True if files are
- found.
-
- This API is public to allow e.g. exclusion of SCM subdirs, e.g. when
- packaging source distributions
- """
- found = False
- pattern_re = self._translate_pattern(pattern, anchor, prefix, is_regex)
- for f in list(self.files):
- if pattern_re.search(f):
- self.files.remove(f)
- found = True
- return found
-
- def _translate_pattern(self, pattern, anchor=True, prefix=None,
- is_regex=False):
- """Translate a shell-like wildcard pattern to a compiled regular
- expression.
-
- Return the compiled regex. If 'is_regex' true,
- then 'pattern' is directly compiled to a regex (if it's a string)
- or just returned as-is (assumes it's a regex object).
- """
- if is_regex:
- if isinstance(pattern, str):
- return re.compile(pattern)
- else:
- return pattern
-
- if _PYTHON_VERSION > (3, 2):
- # ditch start and end characters
- start, _, end = self._glob_to_re('_').partition('_')
-
- if pattern:
- pattern_re = self._glob_to_re(pattern)
- if _PYTHON_VERSION > (3, 2):
- assert pattern_re.startswith(start) and pattern_re.endswith(end)
- else:
- pattern_re = ''
-
- base = re.escape(os.path.join(self.base, ''))
- if prefix is not None:
- # ditch end of pattern character
- if _PYTHON_VERSION <= (3, 2):
- empty_pattern = self._glob_to_re('')
- prefix_re = self._glob_to_re(prefix)[:-len(empty_pattern)]
- else:
- prefix_re = self._glob_to_re(prefix)
- assert prefix_re.startswith(start) and prefix_re.endswith(end)
- prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
- sep = os.sep
- if os.sep == '\\':
- sep = r'\\'
- if _PYTHON_VERSION <= (3, 2):
- pattern_re = '^' + base + sep.join((prefix_re,
- '.*' + pattern_re))
- else:
- pattern_re = pattern_re[len(start): len(pattern_re) - len(end)]
- pattern_re = r'%s%s%s%s.*%s%s' % (start, base, prefix_re, sep,
- pattern_re, end)
- else: # no prefix -- respect anchor flag
- if anchor:
- if _PYTHON_VERSION <= (3, 2):
- pattern_re = '^' + base + pattern_re
- else:
- pattern_re = r'%s%s%s' % (start, base, pattern_re[len(start):])
-
- return re.compile(pattern_re)
-
- def _glob_to_re(self, pattern):
- """Translate a shell-like glob pattern to a regular expression.
-
- Return a string containing the regex. Differs from
- 'fnmatch.translate()' in that '*' does not match "special characters"
- (which are platform-specific).
- """
- pattern_re = fnmatch.translate(pattern)
-
- # '?' and '*' in the glob pattern become '.' and '.*' in the RE, which
- # IMHO is wrong -- '?' and '*' aren't supposed to match slash in Unix,
- # and by extension they shouldn't match such "special characters" under
- # any OS. So change all non-escaped dots in the RE to match any
- # character except the special characters (currently: just os.sep).
- sep = os.sep
- if os.sep == '\\':
- # we're using a regex to manipulate a regex, so we need
- # to escape the backslash twice
- sep = r'\\\\'
- escaped = r'\1[^%s]' % sep
- pattern_re = re.sub(r'((? y,
- '!=': lambda x, y: x != y,
- '<': lambda x, y: x < y,
- '<=': lambda x, y: x == y or x < y,
- '>': lambda x, y: x > y,
- '>=': lambda x, y: x == y or x > y,
- 'and': lambda x, y: x and y,
- 'or': lambda x, y: x or y,
- 'in': lambda x, y: x in y,
- 'not in': lambda x, y: x not in y,
- }
-
- def evaluate(self, expr, context):
- """
- Evaluate a marker expression returned by the :func:`parse_requirement`
- function in the specified context.
- """
- if isinstance(expr, string_types):
- if expr[0] in '\'"':
- result = expr[1:-1]
- else:
- if expr not in context:
- raise SyntaxError('unknown variable: %s' % expr)
- result = context[expr]
- else:
- assert isinstance(expr, dict)
- op = expr['op']
- if op not in self.operations:
- raise NotImplementedError('op not implemented: %s' % op)
- elhs = expr['lhs']
- erhs = expr['rhs']
- if _is_literal(expr['lhs']) and _is_literal(expr['rhs']):
- raise SyntaxError('invalid comparison: %s %s %s' %
- (elhs, op, erhs))
-
- lhs = self.evaluate(elhs, context)
- rhs = self.evaluate(erhs, context)
- if ((_is_version_marker(elhs) or _is_version_marker(erhs))
- and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')):
- lhs = LV(lhs)
- rhs = LV(rhs)
- elif _is_version_marker(elhs) and op in ('in', 'not in'):
- lhs = LV(lhs)
- rhs = _get_versions(rhs)
- result = self.operations[op](lhs, rhs)
- return result
-
-
-_DIGITS = re.compile(r'\d+\.\d+')
-
-
-def default_context():
-
- def format_full_version(info):
- version = '%s.%s.%s' % (info.major, info.minor, info.micro)
- kind = info.releaselevel
- if kind != 'final':
- version += kind[0] + str(info.serial)
- return version
-
- if hasattr(sys, 'implementation'):
- implementation_version = format_full_version(
- sys.implementation.version)
- implementation_name = sys.implementation.name
- else:
- implementation_version = '0'
- implementation_name = ''
-
- ppv = platform.python_version()
- m = _DIGITS.match(ppv)
- pv = m.group(0)
- result = {
- 'implementation_name': implementation_name,
- 'implementation_version': implementation_version,
- 'os_name': os.name,
- 'platform_machine': platform.machine(),
- 'platform_python_implementation': platform.python_implementation(),
- 'platform_release': platform.release(),
- 'platform_system': platform.system(),
- 'platform_version': platform.version(),
- 'platform_in_venv': str(in_venv()),
- 'python_full_version': ppv,
- 'python_version': pv,
- 'sys_platform': sys.platform,
- }
- return result
-
-
-DEFAULT_CONTEXT = default_context()
-del default_context
-
-evaluator = Evaluator()
-
-
-def interpret(marker, execution_context=None):
- """
- Interpret a marker and return a result depending on environment.
-
- :param marker: The marker to interpret.
- :type marker: str
- :param execution_context: The context used for name lookup.
- :type execution_context: mapping
- """
- try:
- expr, rest = parse_marker(marker)
- except Exception as e:
- raise SyntaxError('Unable to interpret marker syntax: %s: %s' %
- (marker, e))
- if rest and rest[0] != '#':
- raise SyntaxError('unexpected trailing data in marker: %s: %s' %
- (marker, rest))
- context = dict(DEFAULT_CONTEXT)
- if execution_context:
- context.update(execution_context)
- return evaluator.evaluate(expr, context)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
deleted file mode 100644
index 7189aeef..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
+++ /dev/null
@@ -1,1068 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""Implementation of the Metadata for Python packages PEPs.
-
-Supports all metadata formats (1.0, 1.1, 1.2, 1.3/2.1 and 2.2).
-"""
-from __future__ import unicode_literals
-
-import codecs
-from email import message_from_file
-import json
-import logging
-import re
-
-
-from . import DistlibException, __version__
-from .compat import StringIO, string_types, text_type
-from .markers import interpret
-from .util import extract_by_key, get_extras
-from .version import get_scheme, PEP440_VERSION_RE
-
-logger = logging.getLogger(__name__)
-
-
-class MetadataMissingError(DistlibException):
- """A required metadata is missing"""
-
-
-class MetadataConflictError(DistlibException):
- """Attempt to read or write metadata fields that are conflictual."""
-
-
-class MetadataUnrecognizedVersionError(DistlibException):
- """Unknown metadata version number."""
-
-
-class MetadataInvalidError(DistlibException):
- """A metadata value is invalid"""
-
-# public API of this module
-__all__ = ['Metadata', 'PKG_INFO_ENCODING', 'PKG_INFO_PREFERRED_VERSION']
-
-# Encoding used for the PKG-INFO files
-PKG_INFO_ENCODING = 'utf-8'
-
-# preferred version. Hopefully will be changed
-# to 1.2 once PEP 345 is supported everywhere
-PKG_INFO_PREFERRED_VERSION = '1.1'
-
-_LINE_PREFIX_1_2 = re.compile('\n \\|')
-_LINE_PREFIX_PRE_1_2 = re.compile('\n ')
-_241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'License')
-
-_314_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'License', 'Classifier', 'Download-URL', 'Obsoletes',
- 'Provides', 'Requires')
-
-_314_MARKERS = ('Obsoletes', 'Provides', 'Requires', 'Classifier',
- 'Download-URL')
-
-_345_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'Maintainer', 'Maintainer-email', 'License',
- 'Classifier', 'Download-URL', 'Obsoletes-Dist',
- 'Project-URL', 'Provides-Dist', 'Requires-Dist',
- 'Requires-Python', 'Requires-External')
-
-_345_MARKERS = ('Provides-Dist', 'Requires-Dist', 'Requires-Python',
- 'Obsoletes-Dist', 'Requires-External', 'Maintainer',
- 'Maintainer-email', 'Project-URL')
-
-_426_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
- 'Supported-Platform', 'Summary', 'Description',
- 'Keywords', 'Home-page', 'Author', 'Author-email',
- 'Maintainer', 'Maintainer-email', 'License',
- 'Classifier', 'Download-URL', 'Obsoletes-Dist',
- 'Project-URL', 'Provides-Dist', 'Requires-Dist',
- 'Requires-Python', 'Requires-External', 'Private-Version',
- 'Obsoleted-By', 'Setup-Requires-Dist', 'Extension',
- 'Provides-Extra')
-
-_426_MARKERS = ('Private-Version', 'Provides-Extra', 'Obsoleted-By',
- 'Setup-Requires-Dist', 'Extension')
-
-# See issue #106: Sometimes 'Requires' and 'Provides' occur wrongly in
-# the metadata. Include them in the tuple literal below to allow them
-# (for now).
-# Ditto for Obsoletes - see issue #140.
-_566_FIELDS = _426_FIELDS + ('Description-Content-Type',
- 'Requires', 'Provides', 'Obsoletes')
-
-_566_MARKERS = ('Description-Content-Type',)
-
-_643_MARKERS = ('Dynamic', 'License-File')
-
-_643_FIELDS = _566_FIELDS + _643_MARKERS
-
-_ALL_FIELDS = set()
-_ALL_FIELDS.update(_241_FIELDS)
-_ALL_FIELDS.update(_314_FIELDS)
-_ALL_FIELDS.update(_345_FIELDS)
-_ALL_FIELDS.update(_426_FIELDS)
-_ALL_FIELDS.update(_566_FIELDS)
-_ALL_FIELDS.update(_643_FIELDS)
-
-EXTRA_RE = re.compile(r'''extra\s*==\s*("([^"]+)"|'([^']+)')''')
-
-
-def _version2fieldlist(version):
- if version == '1.0':
- return _241_FIELDS
- elif version == '1.1':
- return _314_FIELDS
- elif version == '1.2':
- return _345_FIELDS
- elif version in ('1.3', '2.1'):
- # avoid adding field names if already there
- return _345_FIELDS + tuple(f for f in _566_FIELDS if f not in _345_FIELDS)
- elif version == '2.0':
- raise ValueError('Metadata 2.0 is withdrawn and not supported')
- # return _426_FIELDS
- elif version == '2.2':
- return _643_FIELDS
- raise MetadataUnrecognizedVersionError(version)
-
-
-def _best_version(fields):
- """Detect the best version depending on the fields used."""
- def _has_marker(keys, markers):
- return any(marker in keys for marker in markers)
-
- keys = [key for key, value in fields.items() if value not in ([], 'UNKNOWN', None)]
- possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed
-
- # first let's try to see if a field is not part of one of the version
- for key in keys:
- if key not in _241_FIELDS and '1.0' in possible_versions:
- possible_versions.remove('1.0')
- logger.debug('Removed 1.0 due to %s', key)
- if key not in _314_FIELDS and '1.1' in possible_versions:
- possible_versions.remove('1.1')
- logger.debug('Removed 1.1 due to %s', key)
- if key not in _345_FIELDS and '1.2' in possible_versions:
- possible_versions.remove('1.2')
- logger.debug('Removed 1.2 due to %s', key)
- if key not in _566_FIELDS and '1.3' in possible_versions:
- possible_versions.remove('1.3')
- logger.debug('Removed 1.3 due to %s', key)
- if key not in _566_FIELDS and '2.1' in possible_versions:
- if key != 'Description': # In 2.1, description allowed after headers
- possible_versions.remove('2.1')
- logger.debug('Removed 2.1 due to %s', key)
- if key not in _643_FIELDS and '2.2' in possible_versions:
- possible_versions.remove('2.2')
- logger.debug('Removed 2.2 due to %s', key)
- # if key not in _426_FIELDS and '2.0' in possible_versions:
- # possible_versions.remove('2.0')
- # logger.debug('Removed 2.0 due to %s', key)
-
- # possible_version contains qualified versions
- if len(possible_versions) == 1:
- return possible_versions[0] # found !
- elif len(possible_versions) == 0:
- logger.debug('Out of options - unknown metadata set: %s', fields)
- raise MetadataConflictError('Unknown metadata set')
-
- # let's see if one unique marker is found
- is_1_1 = '1.1' in possible_versions and _has_marker(keys, _314_MARKERS)
- is_1_2 = '1.2' in possible_versions and _has_marker(keys, _345_MARKERS)
- is_2_1 = '2.1' in possible_versions and _has_marker(keys, _566_MARKERS)
- # is_2_0 = '2.0' in possible_versions and _has_marker(keys, _426_MARKERS)
- is_2_2 = '2.2' in possible_versions and _has_marker(keys, _643_MARKERS)
- if int(is_1_1) + int(is_1_2) + int(is_2_1) + int(is_2_2) > 1:
- raise MetadataConflictError('You used incompatible 1.1/1.2/2.1/2.2 fields')
-
- # we have the choice, 1.0, or 1.2, 2.1 or 2.2
- # - 1.0 has a broken Summary field but works with all tools
- # - 1.1 is to avoid
- # - 1.2 fixes Summary but has little adoption
- # - 2.1 adds more features
- # - 2.2 is the latest
- if not is_1_1 and not is_1_2 and not is_2_1 and not is_2_2:
- # we couldn't find any specific marker
- if PKG_INFO_PREFERRED_VERSION in possible_versions:
- return PKG_INFO_PREFERRED_VERSION
- if is_1_1:
- return '1.1'
- if is_1_2:
- return '1.2'
- if is_2_1:
- return '2.1'
- # if is_2_2:
- # return '2.2'
-
- return '2.2'
-
-# This follows the rules about transforming keys as described in
-# https://www.python.org/dev/peps/pep-0566/#id17
-_ATTR2FIELD = {
- name.lower().replace("-", "_"): name for name in _ALL_FIELDS
-}
-_FIELD2ATTR = {field: attr for attr, field in _ATTR2FIELD.items()}
-
-_PREDICATE_FIELDS = ('Requires-Dist', 'Obsoletes-Dist', 'Provides-Dist')
-_VERSIONS_FIELDS = ('Requires-Python',)
-_VERSION_FIELDS = ('Version',)
-_LISTFIELDS = ('Platform', 'Classifier', 'Obsoletes',
- 'Requires', 'Provides', 'Obsoletes-Dist',
- 'Provides-Dist', 'Requires-Dist', 'Requires-External',
- 'Project-URL', 'Supported-Platform', 'Setup-Requires-Dist',
- 'Provides-Extra', 'Extension', 'License-File')
-_LISTTUPLEFIELDS = ('Project-URL',)
-
-_ELEMENTSFIELD = ('Keywords',)
-
-_UNICODEFIELDS = ('Author', 'Maintainer', 'Summary', 'Description')
-
-_MISSING = object()
-
-_FILESAFE = re.compile('[^A-Za-z0-9.]+')
-
-
-def _get_name_and_version(name, version, for_filename=False):
- """Return the distribution name with version.
-
- If for_filename is true, return a filename-escaped form."""
- if for_filename:
- # For both name and version any runs of non-alphanumeric or '.'
- # characters are replaced with a single '-'. Additionally any
- # spaces in the version string become '.'
- name = _FILESAFE.sub('-', name)
- version = _FILESAFE.sub('-', version.replace(' ', '.'))
- return '%s-%s' % (name, version)
-
-
-class LegacyMetadata(object):
- """The legacy metadata of a release.
-
- Supports versions 1.0, 1.1, 1.2, 2.0 and 1.3/2.1 (auto-detected). You can
- instantiate the class with one of these arguments (or none):
- - *path*, the path to a metadata file
- - *fileobj* give a file-like object with metadata as content
- - *mapping* is a dict-like object
- - *scheme* is a version scheme name
- """
- # TODO document the mapping API and UNKNOWN default key
-
- def __init__(self, path=None, fileobj=None, mapping=None,
- scheme='default'):
- if [path, fileobj, mapping].count(None) < 2:
- raise TypeError('path, fileobj and mapping are exclusive')
- self._fields = {}
- self.requires_files = []
- self._dependencies = None
- self.scheme = scheme
- if path is not None:
- self.read(path)
- elif fileobj is not None:
- self.read_file(fileobj)
- elif mapping is not None:
- self.update(mapping)
- self.set_metadata_version()
-
- def set_metadata_version(self):
- self._fields['Metadata-Version'] = _best_version(self._fields)
-
- def _write_field(self, fileobj, name, value):
- fileobj.write('%s: %s\n' % (name, value))
-
- def __getitem__(self, name):
- return self.get(name)
-
- def __setitem__(self, name, value):
- return self.set(name, value)
-
- def __delitem__(self, name):
- field_name = self._convert_name(name)
- try:
- del self._fields[field_name]
- except KeyError:
- raise KeyError(name)
-
- def __contains__(self, name):
- return (name in self._fields or
- self._convert_name(name) in self._fields)
-
- def _convert_name(self, name):
- if name in _ALL_FIELDS:
- return name
- name = name.replace('-', '_').lower()
- return _ATTR2FIELD.get(name, name)
-
- def _default_value(self, name):
- if name in _LISTFIELDS or name in _ELEMENTSFIELD:
- return []
- return 'UNKNOWN'
-
- def _remove_line_prefix(self, value):
- if self.metadata_version in ('1.0', '1.1'):
- return _LINE_PREFIX_PRE_1_2.sub('\n', value)
- else:
- return _LINE_PREFIX_1_2.sub('\n', value)
-
- def __getattr__(self, name):
- if name in _ATTR2FIELD:
- return self[name]
- raise AttributeError(name)
-
- #
- # Public API
- #
-
-# dependencies = property(_get_dependencies, _set_dependencies)
-
- def get_fullname(self, filesafe=False):
- """Return the distribution name with version.
-
- If filesafe is true, return a filename-escaped form."""
- return _get_name_and_version(self['Name'], self['Version'], filesafe)
-
- def is_field(self, name):
- """return True if name is a valid metadata key"""
- name = self._convert_name(name)
- return name in _ALL_FIELDS
-
- def is_multi_field(self, name):
- name = self._convert_name(name)
- return name in _LISTFIELDS
-
- def read(self, filepath):
- """Read the metadata values from a file path."""
- fp = codecs.open(filepath, 'r', encoding='utf-8')
- try:
- self.read_file(fp)
- finally:
- fp.close()
-
- def read_file(self, fileob):
- """Read the metadata values from a file object."""
- msg = message_from_file(fileob)
- self._fields['Metadata-Version'] = msg['metadata-version']
-
- # When reading, get all the fields we can
- for field in _ALL_FIELDS:
- if field not in msg:
- continue
- if field in _LISTFIELDS:
- # we can have multiple lines
- values = msg.get_all(field)
- if field in _LISTTUPLEFIELDS and values is not None:
- values = [tuple(value.split(',')) for value in values]
- self.set(field, values)
- else:
- # single line
- value = msg[field]
- if value is not None and value != 'UNKNOWN':
- self.set(field, value)
-
- # PEP 566 specifies that the body be used for the description, if
- # available
- body = msg.get_payload()
- self["Description"] = body if body else self["Description"]
- # logger.debug('Attempting to set metadata for %s', self)
- # self.set_metadata_version()
-
- def write(self, filepath, skip_unknown=False):
- """Write the metadata fields to filepath."""
- fp = codecs.open(filepath, 'w', encoding='utf-8')
- try:
- self.write_file(fp, skip_unknown)
- finally:
- fp.close()
-
- def write_file(self, fileobject, skip_unknown=False):
- """Write the PKG-INFO format data to a file object."""
- self.set_metadata_version()
-
- for field in _version2fieldlist(self['Metadata-Version']):
- values = self.get(field)
- if skip_unknown and values in ('UNKNOWN', [], ['UNKNOWN']):
- continue
- if field in _ELEMENTSFIELD:
- self._write_field(fileobject, field, ','.join(values))
- continue
- if field not in _LISTFIELDS:
- if field == 'Description':
- if self.metadata_version in ('1.0', '1.1'):
- values = values.replace('\n', '\n ')
- else:
- values = values.replace('\n', '\n |')
- values = [values]
-
- if field in _LISTTUPLEFIELDS:
- values = [','.join(value) for value in values]
-
- for value in values:
- self._write_field(fileobject, field, value)
-
- def update(self, other=None, **kwargs):
- """Set metadata values from the given iterable `other` and kwargs.
-
- Behavior is like `dict.update`: If `other` has a ``keys`` method,
- they are looped over and ``self[key]`` is assigned ``other[key]``.
- Else, ``other`` is an iterable of ``(key, value)`` iterables.
-
- Keys that don't match a metadata field or that have an empty value are
- dropped.
- """
- def _set(key, value):
- if key in _ATTR2FIELD and value:
- self.set(self._convert_name(key), value)
-
- if not other:
- # other is None or empty container
- pass
- elif hasattr(other, 'keys'):
- for k in other.keys():
- _set(k, other[k])
- else:
- for k, v in other:
- _set(k, v)
-
- if kwargs:
- for k, v in kwargs.items():
- _set(k, v)
-
- def set(self, name, value):
- """Control then set a metadata field."""
- name = self._convert_name(name)
-
- if ((name in _ELEMENTSFIELD or name == 'Platform') and
- not isinstance(value, (list, tuple))):
- if isinstance(value, string_types):
- value = [v.strip() for v in value.split(',')]
- else:
- value = []
- elif (name in _LISTFIELDS and
- not isinstance(value, (list, tuple))):
- if isinstance(value, string_types):
- value = [value]
- else:
- value = []
-
- if logger.isEnabledFor(logging.WARNING):
- project_name = self['Name']
-
- scheme = get_scheme(self.scheme)
- if name in _PREDICATE_FIELDS and value is not None:
- for v in value:
- # check that the values are valid
- if not scheme.is_valid_matcher(v.split(';')[0]):
- logger.warning(
- "'%s': '%s' is not valid (field '%s')",
- project_name, v, name)
- # FIXME this rejects UNKNOWN, is that right?
- elif name in _VERSIONS_FIELDS and value is not None:
- if not scheme.is_valid_constraint_list(value):
- logger.warning("'%s': '%s' is not a valid version (field '%s')",
- project_name, value, name)
- elif name in _VERSION_FIELDS and value is not None:
- if not scheme.is_valid_version(value):
- logger.warning("'%s': '%s' is not a valid version (field '%s')",
- project_name, value, name)
-
- if name in _UNICODEFIELDS:
- if name == 'Description':
- value = self._remove_line_prefix(value)
-
- self._fields[name] = value
-
- def get(self, name, default=_MISSING):
- """Get a metadata field."""
- name = self._convert_name(name)
- if name not in self._fields:
- if default is _MISSING:
- default = self._default_value(name)
- return default
- if name in _UNICODEFIELDS:
- value = self._fields[name]
- return value
- elif name in _LISTFIELDS:
- value = self._fields[name]
- if value is None:
- return []
- res = []
- for val in value:
- if name not in _LISTTUPLEFIELDS:
- res.append(val)
- else:
- # That's for Project-URL
- res.append((val[0], val[1]))
- return res
-
- elif name in _ELEMENTSFIELD:
- value = self._fields[name]
- if isinstance(value, string_types):
- return value.split(',')
- return self._fields[name]
-
- def check(self, strict=False):
- """Check if the metadata is compliant. If strict is True then raise if
- no Name or Version are provided"""
- self.set_metadata_version()
-
- # XXX should check the versions (if the file was loaded)
- missing, warnings = [], []
-
- for attr in ('Name', 'Version'): # required by PEP 345
- if attr not in self:
- missing.append(attr)
-
- if strict and missing != []:
- msg = 'missing required metadata: %s' % ', '.join(missing)
- raise MetadataMissingError(msg)
-
- for attr in ('Home-page', 'Author'):
- if attr not in self:
- missing.append(attr)
-
- # checking metadata 1.2 (XXX needs to check 1.1, 1.0)
- if self['Metadata-Version'] != '1.2':
- return missing, warnings
-
- scheme = get_scheme(self.scheme)
-
- def are_valid_constraints(value):
- for v in value:
- if not scheme.is_valid_matcher(v.split(';')[0]):
- return False
- return True
-
- for fields, controller in ((_PREDICATE_FIELDS, are_valid_constraints),
- (_VERSIONS_FIELDS,
- scheme.is_valid_constraint_list),
- (_VERSION_FIELDS,
- scheme.is_valid_version)):
- for field in fields:
- value = self.get(field, None)
- if value is not None and not controller(value):
- warnings.append("Wrong value for '%s': %s" % (field, value))
-
- return missing, warnings
-
- def todict(self, skip_missing=False):
- """Return fields as a dict.
-
- Field names will be converted to use the underscore-lowercase style
- instead of hyphen-mixed case (i.e. home_page instead of Home-page).
- This is as per https://www.python.org/dev/peps/pep-0566/#id17.
- """
- self.set_metadata_version()
-
- fields = _version2fieldlist(self['Metadata-Version'])
-
- data = {}
-
- for field_name in fields:
- if not skip_missing or field_name in self._fields:
- key = _FIELD2ATTR[field_name]
- if key != 'project_url':
- data[key] = self[field_name]
- else:
- data[key] = [','.join(u) for u in self[field_name]]
-
- return data
-
- def add_requirements(self, requirements):
- if self['Metadata-Version'] == '1.1':
- # we can't have 1.1 metadata *and* Setuptools requires
- for field in ('Obsoletes', 'Requires', 'Provides'):
- if field in self:
- del self[field]
- self['Requires-Dist'] += requirements
-
- # Mapping API
- # TODO could add iter* variants
-
- def keys(self):
- return list(_version2fieldlist(self['Metadata-Version']))
-
- def __iter__(self):
- for key in self.keys():
- yield key
-
- def values(self):
- return [self[key] for key in self.keys()]
-
- def items(self):
- return [(key, self[key]) for key in self.keys()]
-
- def __repr__(self):
- return '<%s %s %s>' % (self.__class__.__name__, self.name,
- self.version)
-
-
-METADATA_FILENAME = 'pydist.json'
-WHEEL_METADATA_FILENAME = 'metadata.json'
-LEGACY_METADATA_FILENAME = 'METADATA'
-
-
-class Metadata(object):
- """
- The metadata of a release. This implementation uses 2.1
- metadata where possible. If not possible, it wraps a LegacyMetadata
- instance which handles the key-value metadata format.
- """
-
- METADATA_VERSION_MATCHER = re.compile(r'^\d+(\.\d+)*$')
-
- NAME_MATCHER = re.compile('^[0-9A-Z]([0-9A-Z_.-]*[0-9A-Z])?$', re.I)
-
- FIELDNAME_MATCHER = re.compile('^[A-Z]([0-9A-Z-]*[0-9A-Z])?$', re.I)
-
- VERSION_MATCHER = PEP440_VERSION_RE
-
- SUMMARY_MATCHER = re.compile('.{1,2047}')
-
- METADATA_VERSION = '2.0'
-
- GENERATOR = 'distlib (%s)' % __version__
-
- MANDATORY_KEYS = {
- 'name': (),
- 'version': (),
- 'summary': ('legacy',),
- }
-
- INDEX_KEYS = ('name version license summary description author '
- 'author_email keywords platform home_page classifiers '
- 'download_url')
-
- DEPENDENCY_KEYS = ('extras run_requires test_requires build_requires '
- 'dev_requires provides meta_requires obsoleted_by '
- 'supports_environments')
-
- SYNTAX_VALIDATORS = {
- 'metadata_version': (METADATA_VERSION_MATCHER, ()),
- 'name': (NAME_MATCHER, ('legacy',)),
- 'version': (VERSION_MATCHER, ('legacy',)),
- 'summary': (SUMMARY_MATCHER, ('legacy',)),
- 'dynamic': (FIELDNAME_MATCHER, ('legacy',)),
- }
-
- __slots__ = ('_legacy', '_data', 'scheme')
-
- def __init__(self, path=None, fileobj=None, mapping=None,
- scheme='default'):
- if [path, fileobj, mapping].count(None) < 2:
- raise TypeError('path, fileobj and mapping are exclusive')
- self._legacy = None
- self._data = None
- self.scheme = scheme
- #import pdb; pdb.set_trace()
- if mapping is not None:
- try:
- self._validate_mapping(mapping, scheme)
- self._data = mapping
- except MetadataUnrecognizedVersionError:
- self._legacy = LegacyMetadata(mapping=mapping, scheme=scheme)
- self.validate()
- else:
- data = None
- if path:
- with open(path, 'rb') as f:
- data = f.read()
- elif fileobj:
- data = fileobj.read()
- if data is None:
- # Initialised with no args - to be added
- self._data = {
- 'metadata_version': self.METADATA_VERSION,
- 'generator': self.GENERATOR,
- }
- else:
- if not isinstance(data, text_type):
- data = data.decode('utf-8')
- try:
- self._data = json.loads(data)
- self._validate_mapping(self._data, scheme)
- except ValueError:
- # Note: MetadataUnrecognizedVersionError does not
- # inherit from ValueError (it's a DistlibException,
- # which should not inherit from ValueError).
- # The ValueError comes from the json.load - if that
- # succeeds and we get a validation error, we want
- # that to propagate
- self._legacy = LegacyMetadata(fileobj=StringIO(data),
- scheme=scheme)
- self.validate()
-
- common_keys = set(('name', 'version', 'license', 'keywords', 'summary'))
-
- none_list = (None, list)
- none_dict = (None, dict)
-
- mapped_keys = {
- 'run_requires': ('Requires-Dist', list),
- 'build_requires': ('Setup-Requires-Dist', list),
- 'dev_requires': none_list,
- 'test_requires': none_list,
- 'meta_requires': none_list,
- 'extras': ('Provides-Extra', list),
- 'modules': none_list,
- 'namespaces': none_list,
- 'exports': none_dict,
- 'commands': none_dict,
- 'classifiers': ('Classifier', list),
- 'source_url': ('Download-URL', None),
- 'metadata_version': ('Metadata-Version', None),
- }
-
- del none_list, none_dict
-
- def __getattribute__(self, key):
- common = object.__getattribute__(self, 'common_keys')
- mapped = object.__getattribute__(self, 'mapped_keys')
- if key in mapped:
- lk, maker = mapped[key]
- if self._legacy:
- if lk is None:
- result = None if maker is None else maker()
- else:
- result = self._legacy.get(lk)
- else:
- value = None if maker is None else maker()
- if key not in ('commands', 'exports', 'modules', 'namespaces',
- 'classifiers'):
- result = self._data.get(key, value)
- else:
- # special cases for PEP 459
- sentinel = object()
- result = sentinel
- d = self._data.get('extensions')
- if d:
- if key == 'commands':
- result = d.get('python.commands', value)
- elif key == 'classifiers':
- d = d.get('python.details')
- if d:
- result = d.get(key, value)
- else:
- d = d.get('python.exports')
- if not d:
- d = self._data.get('python.exports')
- if d:
- result = d.get(key, value)
- if result is sentinel:
- result = value
- elif key not in common:
- result = object.__getattribute__(self, key)
- elif self._legacy:
- result = self._legacy.get(key)
- else:
- result = self._data.get(key)
- return result
-
- def _validate_value(self, key, value, scheme=None):
- if key in self.SYNTAX_VALIDATORS:
- pattern, exclusions = self.SYNTAX_VALIDATORS[key]
- if (scheme or self.scheme) not in exclusions:
- m = pattern.match(value)
- if not m:
- raise MetadataInvalidError("'%s' is an invalid value for "
- "the '%s' property" % (value,
- key))
-
- def __setattr__(self, key, value):
- self._validate_value(key, value)
- common = object.__getattribute__(self, 'common_keys')
- mapped = object.__getattribute__(self, 'mapped_keys')
- if key in mapped:
- lk, _ = mapped[key]
- if self._legacy:
- if lk is None:
- raise NotImplementedError
- self._legacy[lk] = value
- elif key not in ('commands', 'exports', 'modules', 'namespaces',
- 'classifiers'):
- self._data[key] = value
- else:
- # special cases for PEP 459
- d = self._data.setdefault('extensions', {})
- if key == 'commands':
- d['python.commands'] = value
- elif key == 'classifiers':
- d = d.setdefault('python.details', {})
- d[key] = value
- else:
- d = d.setdefault('python.exports', {})
- d[key] = value
- elif key not in common:
- object.__setattr__(self, key, value)
- else:
- if key == 'keywords':
- if isinstance(value, string_types):
- value = value.strip()
- if value:
- value = value.split()
- else:
- value = []
- if self._legacy:
- self._legacy[key] = value
- else:
- self._data[key] = value
-
- @property
- def name_and_version(self):
- return _get_name_and_version(self.name, self.version, True)
-
- @property
- def provides(self):
- if self._legacy:
- result = self._legacy['Provides-Dist']
- else:
- result = self._data.setdefault('provides', [])
- s = '%s (%s)' % (self.name, self.version)
- if s not in result:
- result.append(s)
- return result
-
- @provides.setter
- def provides(self, value):
- if self._legacy:
- self._legacy['Provides-Dist'] = value
- else:
- self._data['provides'] = value
-
- def get_requirements(self, reqts, extras=None, env=None):
- """
- Base method to get dependencies, given a set of extras
- to satisfy and an optional environment context.
- :param reqts: A list of sometimes-wanted dependencies,
- perhaps dependent on extras and environment.
- :param extras: A list of optional components being requested.
- :param env: An optional environment for marker evaluation.
- """
- if self._legacy:
- result = reqts
- else:
- result = []
- extras = get_extras(extras or [], self.extras)
- for d in reqts:
- if 'extra' not in d and 'environment' not in d:
- # unconditional
- include = True
- else:
- if 'extra' not in d:
- # Not extra-dependent - only environment-dependent
- include = True
- else:
- include = d.get('extra') in extras
- if include:
- # Not excluded because of extras, check environment
- marker = d.get('environment')
- if marker:
- include = interpret(marker, env)
- if include:
- result.extend(d['requires'])
- for key in ('build', 'dev', 'test'):
- e = ':%s:' % key
- if e in extras:
- extras.remove(e)
- # A recursive call, but it should terminate since 'test'
- # has been removed from the extras
- reqts = self._data.get('%s_requires' % key, [])
- result.extend(self.get_requirements(reqts, extras=extras,
- env=env))
- return result
-
- @property
- def dictionary(self):
- if self._legacy:
- return self._from_legacy()
- return self._data
-
- @property
- def dependencies(self):
- if self._legacy:
- raise NotImplementedError
- else:
- return extract_by_key(self._data, self.DEPENDENCY_KEYS)
-
- @dependencies.setter
- def dependencies(self, value):
- if self._legacy:
- raise NotImplementedError
- else:
- self._data.update(value)
-
- def _validate_mapping(self, mapping, scheme):
- if mapping.get('metadata_version') != self.METADATA_VERSION:
- raise MetadataUnrecognizedVersionError()
- missing = []
- for key, exclusions in self.MANDATORY_KEYS.items():
- if key not in mapping:
- if scheme not in exclusions:
- missing.append(key)
- if missing:
- msg = 'Missing metadata items: %s' % ', '.join(missing)
- raise MetadataMissingError(msg)
- for k, v in mapping.items():
- self._validate_value(k, v, scheme)
-
- def validate(self):
- if self._legacy:
- missing, warnings = self._legacy.check(True)
- if missing or warnings:
- logger.warning('Metadata: missing: %s, warnings: %s',
- missing, warnings)
- else:
- self._validate_mapping(self._data, self.scheme)
-
- def todict(self):
- if self._legacy:
- return self._legacy.todict(True)
- else:
- result = extract_by_key(self._data, self.INDEX_KEYS)
- return result
-
- def _from_legacy(self):
- assert self._legacy and not self._data
- result = {
- 'metadata_version': self.METADATA_VERSION,
- 'generator': self.GENERATOR,
- }
- lmd = self._legacy.todict(True) # skip missing ones
- for k in ('name', 'version', 'license', 'summary', 'description',
- 'classifier'):
- if k in lmd:
- if k == 'classifier':
- nk = 'classifiers'
- else:
- nk = k
- result[nk] = lmd[k]
- kw = lmd.get('Keywords', [])
- if kw == ['']:
- kw = []
- result['keywords'] = kw
- keys = (('requires_dist', 'run_requires'),
- ('setup_requires_dist', 'build_requires'))
- for ok, nk in keys:
- if ok in lmd and lmd[ok]:
- result[nk] = [{'requires': lmd[ok]}]
- result['provides'] = self.provides
- author = {}
- maintainer = {}
- return result
-
- LEGACY_MAPPING = {
- 'name': 'Name',
- 'version': 'Version',
- ('extensions', 'python.details', 'license'): 'License',
- 'summary': 'Summary',
- 'description': 'Description',
- ('extensions', 'python.project', 'project_urls', 'Home'): 'Home-page',
- ('extensions', 'python.project', 'contacts', 0, 'name'): 'Author',
- ('extensions', 'python.project', 'contacts', 0, 'email'): 'Author-email',
- 'source_url': 'Download-URL',
- ('extensions', 'python.details', 'classifiers'): 'Classifier',
- }
-
- def _to_legacy(self):
- def process_entries(entries):
- reqts = set()
- for e in entries:
- extra = e.get('extra')
- env = e.get('environment')
- rlist = e['requires']
- for r in rlist:
- if not env and not extra:
- reqts.add(r)
- else:
- marker = ''
- if extra:
- marker = 'extra == "%s"' % extra
- if env:
- if marker:
- marker = '(%s) and %s' % (env, marker)
- else:
- marker = env
- reqts.add(';'.join((r, marker)))
- return reqts
-
- assert self._data and not self._legacy
- result = LegacyMetadata()
- nmd = self._data
- # import pdb; pdb.set_trace()
- for nk, ok in self.LEGACY_MAPPING.items():
- if not isinstance(nk, tuple):
- if nk in nmd:
- result[ok] = nmd[nk]
- else:
- d = nmd
- found = True
- for k in nk:
- try:
- d = d[k]
- except (KeyError, IndexError):
- found = False
- break
- if found:
- result[ok] = d
- r1 = process_entries(self.run_requires + self.meta_requires)
- r2 = process_entries(self.build_requires + self.dev_requires)
- if self.extras:
- result['Provides-Extra'] = sorted(self.extras)
- result['Requires-Dist'] = sorted(r1)
- result['Setup-Requires-Dist'] = sorted(r2)
- # TODO: any other fields wanted
- return result
-
- def write(self, path=None, fileobj=None, legacy=False, skip_unknown=True):
- if [path, fileobj].count(None) != 1:
- raise ValueError('Exactly one of path and fileobj is needed')
- self.validate()
- if legacy:
- if self._legacy:
- legacy_md = self._legacy
- else:
- legacy_md = self._to_legacy()
- if path:
- legacy_md.write(path, skip_unknown=skip_unknown)
- else:
- legacy_md.write_file(fileobj, skip_unknown=skip_unknown)
- else:
- if self._legacy:
- d = self._from_legacy()
- else:
- d = self._data
- if fileobj:
- json.dump(d, fileobj, ensure_ascii=True, indent=2,
- sort_keys=True)
- else:
- with codecs.open(path, 'w', 'utf-8') as f:
- json.dump(d, f, ensure_ascii=True, indent=2,
- sort_keys=True)
-
- def add_requirements(self, requirements):
- if self._legacy:
- self._legacy.add_requirements(requirements)
- else:
- run_requires = self._data.setdefault('run_requires', [])
- always = None
- for entry in run_requires:
- if 'environment' not in entry and 'extra' not in entry:
- always = entry
- break
- if always is None:
- always = { 'requires': requirements }
- run_requires.insert(0, always)
- else:
- rset = set(always['requires']) | set(requirements)
- always['requires'] = sorted(rset)
-
- def __repr__(self):
- name = self.name or '(no name)'
- version = self.version or 'no version'
- return '<%s %s %s (%s)>' % (self.__class__.__name__,
- self.metadata_version, name, version)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py
index cfa45d2a..195dc3f8 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py
@@ -15,8 +15,7 @@ from zipfile import ZipInfo
from .compat import sysconfig, detect_encoding, ZipFile
from .resources import finder
-from .util import (FileOperator, get_export_entry, convert_path,
- get_executable, get_platform, in_venv)
+from .util import (FileOperator, get_export_entry, convert_path, get_executable, get_platform, in_venv)
logger = logging.getLogger(__name__)
@@ -43,12 +42,31 @@ FIRST_LINE_RE = re.compile(b'^#!.*pythonw?[0-9.]*([ \t].*)?$')
SCRIPT_TEMPLATE = r'''# -*- coding: utf-8 -*-
import re
import sys
-from %(module)s import %(import_name)s
if __name__ == '__main__':
+ from %(module)s import %(import_name)s
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(%(func)s())
'''
+# Pre-fetch the contents of all executable wrapper stubs.
+# This is to address https://github.com/pypa/pip/issues/12666.
+# When updating pip, we rename the old pip in place before installing the
+# new version. If we try to fetch a wrapper *after* that rename, the finder
+# machinery will be confused as the package is no longer available at the
+# location where it was imported from. So we load everything into memory in
+# advance.
+
+if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'):
+ # Issue 31: don't hardcode an absolute package name, but
+ # determine it relative to the current package
+ DISTLIB_PACKAGE = __name__.rsplit('.', 1)[0]
+
+ WRAPPERS = {
+ r.name: r.bytes
+ for r in finder(DISTLIB_PACKAGE).iterator("")
+ if r.name.endswith(".exe")
+ }
+
def enquote_executable(executable):
if ' ' in executable:
@@ -79,25 +97,18 @@ class ScriptMaker(object):
executable = None # for shebangs
- def __init__(self,
- source_dir,
- target_dir,
- add_launchers=True,
- dry_run=False,
- fileop=None):
+ def __init__(self, source_dir, target_dir, add_launchers=True, dry_run=False, fileop=None):
self.source_dir = source_dir
self.target_dir = target_dir
self.add_launchers = add_launchers
self.force = False
self.clobber = False
# It only makes sense to set mode bits on POSIX.
- self.set_mode = (os.name == 'posix') or (os.name == 'java'
- and os._name == 'posix')
+ self.set_mode = (os.name == 'posix') or (os.name == 'java' and os._name == 'posix')
self.variants = set(('', 'X.Y'))
self._fileop = fileop or FileOperator(dry_run)
- self._is_nt = os.name == 'nt' or (os.name == 'java'
- and os._name == 'nt')
+ self._is_nt = os.name == 'nt' or (os.name == 'java' and os._name == 'nt')
self.version_info = sys.version_info
def _get_alternate_executable(self, executable, options):
@@ -146,6 +157,12 @@ class ScriptMaker(object):
"""
if os.name != 'posix':
simple_shebang = True
+ elif getattr(sys, "cross_compiling", False):
+ # In a cross-compiling environment, the shebang will likely be a
+ # script; this *must* be invoked with the "safe" version of the
+ # shebang, or else using os.exec() to run the entry script will
+ # fail, raising "OSError 8 [Errno 8] Exec format error".
+ simple_shebang = False
else:
# Add 3 for '#!' prefix and newline suffix.
shebang_length = len(executable) + len(post_interp) + 3
@@ -153,15 +170,14 @@ class ScriptMaker(object):
max_shebang_length = 512
else:
max_shebang_length = 127
- simple_shebang = ((b' ' not in executable)
- and (shebang_length <= max_shebang_length))
+ simple_shebang = ((b' ' not in executable) and (shebang_length <= max_shebang_length))
if simple_shebang:
result = b'#!' + executable + post_interp + b'\n'
else:
result = b'#!/bin/sh\n'
result += b"'''exec' " + executable + post_interp + b' "$0" "$@"\n'
- result += b"' '''"
+ result += b"' '''\n"
return result
def _get_shebang(self, encoding, post_interp=b'', options=None):
@@ -172,21 +188,17 @@ class ScriptMaker(object):
elif not sysconfig.is_python_build():
executable = get_executable()
elif in_venv(): # pragma: no cover
- executable = os.path.join(
- sysconfig.get_path('scripts'),
- 'python%s' % sysconfig.get_config_var('EXE'))
+ executable = os.path.join(sysconfig.get_path('scripts'), 'python%s' % sysconfig.get_config_var('EXE'))
else: # pragma: no cover
if os.name == 'nt':
# for Python builds from source on Windows, no Python executables with
# a version suffix are created, so we use python.exe
- executable = os.path.join(
- sysconfig.get_config_var('BINDIR'),
- 'python%s' % (sysconfig.get_config_var('EXE')))
+ executable = os.path.join(sysconfig.get_config_var('BINDIR'),
+ 'python%s' % (sysconfig.get_config_var('EXE')))
else:
executable = os.path.join(
sysconfig.get_config_var('BINDIR'),
- 'python%s%s' % (sysconfig.get_config_var('VERSION'),
- sysconfig.get_config_var('EXE')))
+ 'python%s%s' % (sysconfig.get_config_var('VERSION'), sysconfig.get_config_var('EXE')))
if options:
executable = self._get_alternate_executable(executable, options)
@@ -210,8 +222,8 @@ class ScriptMaker(object):
# check that the shebang is decodable using utf-8.
executable = executable.encode('utf-8')
# in case of IronPython, play safe and enable frames support
- if (sys.platform == 'cli' and '-X:Frames' not in post_interp
- and '-X:FullFrames' not in post_interp): # pragma: no cover
+ if (sys.platform == 'cli' and '-X:Frames' not in post_interp and
+ '-X:FullFrames' not in post_interp): # pragma: no cover
post_interp += b' -X:Frames'
shebang = self._build_shebang(executable, post_interp)
# Python parser starts to read a script using UTF-8 until
@@ -222,8 +234,7 @@ class ScriptMaker(object):
try:
shebang.decode('utf-8')
except UnicodeDecodeError: # pragma: no cover
- raise ValueError('The shebang (%r) is not decodable from utf-8' %
- shebang)
+ raise ValueError('The shebang (%r) is not decodable from utf-8' % shebang)
# If the script is encoded to a custom encoding (use a
# #coding:xxx cookie), the shebang has to be decodable from
# the script encoding too.
@@ -232,15 +243,12 @@ class ScriptMaker(object):
shebang.decode(encoding)
except UnicodeDecodeError: # pragma: no cover
raise ValueError('The shebang (%r) is not decodable '
- 'from the script encoding (%r)' %
- (shebang, encoding))
+ 'from the script encoding (%r)' % (shebang, encoding))
return shebang
def _get_script_text(self, entry):
return self.script_template % dict(
- module=entry.prefix,
- import_name=entry.suffix.split('.')[0],
- func=entry.suffix)
+ module=entry.prefix, import_name=entry.suffix.split('.')[0], func=entry.suffix)
manifest = _DEFAULT_MANIFEST
@@ -250,9 +258,6 @@ class ScriptMaker(object):
def _write_script(self, names, shebang, script_bytes, filenames, ext):
use_launcher = self.add_launchers and self._is_nt
- linesep = os.linesep.encode('utf-8')
- if not shebang.endswith(linesep):
- shebang += linesep
if not use_launcher:
script_bytes = shebang + script_bytes
else: # pragma: no cover
@@ -265,8 +270,7 @@ class ScriptMaker(object):
source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH')
if source_date_epoch:
date_time = time.gmtime(int(source_date_epoch))[:6]
- zinfo = ZipInfo(filename='__main__.py',
- date_time=date_time)
+ zinfo = ZipInfo(filename='__main__.py', date_time=date_time)
zf.writestr(zinfo, script_bytes)
else:
zf.writestr('__main__.py', script_bytes)
@@ -297,8 +301,7 @@ class ScriptMaker(object):
except Exception:
pass # still in use - ignore error
else:
- if self._is_nt and not outname.endswith(
- '.' + ext): # pragma: no cover
+ if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover
outname = '%s.%s' % (outname, ext)
if os.path.exists(outname) and not self.clobber:
logger.warning('Skipping existing file %s', outname)
@@ -317,9 +320,7 @@ class ScriptMaker(object):
if 'X' in self.variants:
result.add('%s%s' % (name, self.version_info[0]))
if 'X.Y' in self.variants:
- result.add('%s%s%s.%s' %
- (name, self.variant_separator, self.version_info[0],
- self.version_info[1]))
+ result.add('%s%s%s.%s' % (name, self.variant_separator, self.version_info[0], self.version_info[1]))
return result
def _make_script(self, entry, filenames, options=None):
@@ -374,8 +375,7 @@ class ScriptMaker(object):
self._fileop.set_executable_mode([outname])
filenames.append(outname)
else:
- logger.info('copying and adjusting %s -> %s', script,
- self.target_dir)
+ logger.info('copying and adjusting %s -> %s', script, self.target_dir)
if not self._fileop.dry_run:
encoding, lines = detect_encoding(f.readline)
f.seek(0)
@@ -397,8 +397,7 @@ class ScriptMaker(object):
def dry_run(self, value):
self._fileop.dry_run = value
- if os.name == 'nt' or (os.name == 'java'
- and os._name == 'nt'): # pragma: no cover
+ if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover
# Executable launcher support.
# Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
@@ -409,15 +408,11 @@ class ScriptMaker(object):
bits = '32'
platform_suffix = '-arm' if get_platform() == 'win-arm64' else ''
name = '%s%s%s.exe' % (kind, bits, platform_suffix)
- # Issue 31: don't hardcode an absolute package name, but
- # determine it relative to the current package
- distlib_package = __name__.rsplit('.', 1)[0]
- resource = finder(distlib_package).find(name)
- if not resource:
+ if name not in WRAPPERS:
msg = ('Unable to find resource %s in package %s' %
- (name, distlib_package))
+ (name, DISTLIB_PACKAGE))
raise ValueError(msg)
- return resource.bytes
+ return WRAPPERS[name]
# Public API follows
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe
new file mode 100644
index 00000000..52154f0b
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t32.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe
new file mode 100644
index 00000000..e1ab8f8f
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64-arm.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe
new file mode 100644
index 00000000..e8bebdba
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/t64.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
index ba58858d..0d5bd7a8 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
@@ -31,11 +31,9 @@ except ImportError: # pragma: no cover
import time
from . import DistlibException
-from .compat import (string_types, text_type, shutil, raw_input, StringIO,
- cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
- HTTPHandler, BaseConfigurator, valid_ident,
- Container, configparser, URLError, ZipFile, fsdecode,
- unquote, urlparse)
+from .compat import (string_types, text_type, shutil, raw_input, StringIO, cache_from_source, urlopen, urljoin, httplib,
+ xmlrpclib, HTTPHandler, BaseConfigurator, valid_ident, Container, configparser, URLError, ZipFile,
+ fsdecode, unquote, urlparse)
logger = logging.getLogger(__name__)
@@ -88,8 +86,7 @@ def parse_marker(marker_string):
else:
m = STRING_CHUNK.match(remaining)
if not m:
- raise SyntaxError('error in string literal: %s' %
- remaining)
+ raise SyntaxError('error in string literal: %s' % remaining)
parts.append(m.groups()[0])
remaining = remaining[m.end():]
else:
@@ -210,8 +207,7 @@ def parse_requirement(req):
ver_remaining = ver_remaining[m.end():]
m = VERSION_IDENTIFIER.match(ver_remaining)
if not m:
- raise SyntaxError('invalid version: %s' %
- ver_remaining)
+ raise SyntaxError('invalid version: %s' % ver_remaining)
v = m.groups()[0]
versions.append((op, v))
ver_remaining = ver_remaining[m.end():]
@@ -224,8 +220,7 @@ def parse_requirement(req):
break
m = COMPARE_OP.match(ver_remaining)
if not m:
- raise SyntaxError('invalid constraint: %s' %
- ver_remaining)
+ raise SyntaxError('invalid constraint: %s' % ver_remaining)
if not versions:
versions = None
return versions, ver_remaining
@@ -235,8 +230,7 @@ def parse_requirement(req):
else:
i = remaining.find(')', 1)
if i < 0:
- raise SyntaxError('unterminated parenthesis: %s' %
- remaining)
+ raise SyntaxError('unterminated parenthesis: %s' % remaining)
s = remaining[1:i]
remaining = remaining[i + 1:].lstrip()
# As a special diversion from PEP 508, allow a version number
@@ -267,14 +261,8 @@ def parse_requirement(req):
if not versions:
rs = distname
else:
- rs = '%s %s' % (distname, ', '.join(
- ['%s %s' % con for con in versions]))
- return Container(name=distname,
- extras=extras,
- constraints=versions,
- marker=mark_expr,
- url=uri,
- requirement=rs)
+ rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions]))
+ return Container(name=distname, extras=extras, constraints=versions, marker=mark_expr, url=uri, requirement=rs)
def get_resources_dests(resources_root, rules):
@@ -524,8 +512,7 @@ class FileOperator(object):
second will have the same "age".
"""
if not os.path.exists(source):
- raise DistlibException("file '%r' does not exist" %
- os.path.abspath(source))
+ raise DistlibException("file '%r' does not exist" % os.path.abspath(source))
if not os.path.exists(target):
return True
@@ -601,12 +588,7 @@ class FileOperator(object):
if self.record:
self.dirs_created.add(path)
- def byte_compile(self,
- path,
- optimize=False,
- force=False,
- prefix=None,
- hashed_invalidation=False):
+ def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False):
dpath = cache_from_source(path, not optimize)
logger.info('Byte-compiling %s to %s', path, dpath)
if not self.dry_run:
@@ -617,12 +599,11 @@ class FileOperator(object):
assert path.startswith(prefix)
diagpath = path[len(prefix):]
compile_kwargs = {}
- if hashed_invalidation and hasattr(py_compile,
- 'PycInvalidationMode'):
- compile_kwargs[
- 'invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH
- py_compile.compile(path, dpath, diagpath, True,
- **compile_kwargs) # raise error
+ if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'):
+ if not isinstance(hashed_invalidation, py_compile.PycInvalidationMode):
+ hashed_invalidation = py_compile.PycInvalidationMode.CHECKED_HASH
+ compile_kwargs['invalidation_mode'] = hashed_invalidation
+ py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error
self.record_as_written(dpath)
return dpath
@@ -716,16 +697,14 @@ class ExportEntry(object):
return resolve(self.prefix, self.suffix)
def __repr__(self): # pragma: no cover
- return '' % (self.name, self.prefix,
- self.suffix, self.flags)
+ return '' % (self.name, self.prefix, self.suffix, self.flags)
def __eq__(self, other):
if not isinstance(other, ExportEntry):
result = False
else:
- result = (self.name == other.name and self.prefix == other.prefix
- and self.suffix == other.suffix
- and self.flags == other.flags)
+ result = (self.name == other.name and self.prefix == other.prefix and self.suffix == other.suffix and
+ self.flags == other.flags)
return result
__hash__ = object.__hash__
@@ -810,7 +789,7 @@ def get_cache_base(suffix=None):
return os.path.join(result, suffix)
-def path_to_cache_dir(path):
+def path_to_cache_dir(path, use_abspath=True):
"""
Convert an absolute path to a directory name for use in a cache.
@@ -820,7 +799,7 @@ def path_to_cache_dir(path):
#. Any occurrence of ``os.sep`` is replaced with ``'--'``.
#. ``'.cache'`` is appended.
"""
- d, p = os.path.splitdrive(os.path.abspath(path))
+ d, p = os.path.splitdrive(os.path.abspath(path) if use_abspath else path)
if d:
d = d.replace(':', '---')
p = p.replace(os.sep, '--')
@@ -865,9 +844,8 @@ def is_string_sequence(seq):
return result
-PROJECT_NAME_AND_VERSION = re.compile(
- '([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
- '([a-z0-9_.+-]+)', re.I)
+PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-'
+ '([a-z0-9_.+-]+)', re.I)
PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)')
@@ -1003,11 +981,11 @@ class Cache(object):
logger.warning('Directory \'%s\' is not private', base)
self.base = os.path.abspath(os.path.normpath(base))
- def prefix_to_dir(self, prefix):
+ def prefix_to_dir(self, prefix, use_abspath=True):
"""
Converts a resource prefix to a directory name in the cache.
"""
- return path_to_cache_dir(prefix)
+ return path_to_cache_dir(prefix, use_abspath=use_abspath)
def clear(self):
"""
@@ -1092,8 +1070,7 @@ class EventMixin(object):
logger.exception('Exception during event publication')
value = None
result.append(value)
- logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event,
- args, kwargs, result)
+ logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, args, kwargs, result)
return result
@@ -1145,8 +1122,7 @@ class Sequencer(object):
raise ValueError('%r not a successor of %r' % (succ, pred))
def is_step(self, step):
- return (step in self._preds or step in self._succs
- or step in self._nodes)
+ return (step in self._preds or step in self._succs or step in self._nodes)
def get_steps(self, final):
if not self.is_step(final):
@@ -1242,8 +1218,7 @@ class Sequencer(object):
# Unarchiving functionality for zip, tar, tgz, tbz, whl
#
-ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz',
- '.whl')
+ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', '.whl')
def unarchive(archive_filename, dest_dir, format=None, check=True):
@@ -1474,8 +1449,7 @@ def _iglob(path_glob):
if ssl:
- from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname,
- CertificateError)
+ from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, CertificateError)
#
# HTTPSConnection which verifies certificates/matches domains
@@ -1487,8 +1461,7 @@ if ssl:
# noinspection PyPropertyAccess
def connect(self):
- sock = socket.create_connection((self.host, self.port),
- self.timeout)
+ sock = socket.create_connection((self.host, self.port), self.timeout)
if getattr(self, '_tunnel_host', False):
self.sock = sock
self._tunnel()
@@ -1543,9 +1516,8 @@ if ssl:
return self.do_open(self._conn_maker, req)
except URLError as e:
if 'certificate verify failed' in str(e.reason):
- raise CertificateError(
- 'Unable to verify server certificate '
- 'for %s' % req.host)
+ raise CertificateError('Unable to verify server certificate '
+ 'for %s' % req.host)
else:
raise
@@ -1561,9 +1533,8 @@ if ssl:
class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler):
def http_open(self, req):
- raise URLError(
- 'Unexpected HTTP request on what should be a secure '
- 'connection: %s' % req)
+ raise URLError('Unexpected HTTP request on what should be a secure '
+ 'connection: %s' % req)
#
@@ -1598,8 +1569,7 @@ if ssl:
kwargs['timeout'] = self.timeout
if not self._connection or host != self._connection[0]:
self._extra_headers = eh
- self._connection = host, httplib.HTTPSConnection(
- h, None, **kwargs)
+ self._connection = host, httplib.HTTPSConnection(h, None, **kwargs)
return self._connection[1]
@@ -1789,10 +1759,7 @@ class SubprocessMixin(object):
stream.close()
def run_command(self, cmd, **kwargs):
- p = subprocess.Popen(cmd,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- **kwargs)
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs)
t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
t1.start()
t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr'))
@@ -1847,10 +1814,7 @@ class PyPIRCFile(object):
if 'distutils' in sections:
# let's get the list of servers
index_servers = config.get('distutils', 'index-servers')
- _servers = [
- server.strip() for server in index_servers.split('\n')
- if server.strip() != ''
- ]
+ _servers = [server.strip() for server in index_servers.split('\n') if server.strip() != '']
if _servers == []:
# nothing set, let's try to get the default pypi
if 'pypi' in sections:
@@ -1861,9 +1825,7 @@ class PyPIRCFile(object):
result['username'] = config.get(server, 'username')
# optional params
- for key, default in (('repository',
- self.DEFAULT_REPOSITORY),
- ('realm', self.DEFAULT_REALM),
+ for key, default in (('repository', self.DEFAULT_REPOSITORY), ('realm', self.DEFAULT_REALM),
('password', None)):
if config.has_option(server, key):
result[key] = config.get(server, key)
@@ -1873,11 +1835,9 @@ class PyPIRCFile(object):
# work around people having "repository" for the "pypi"
# section of their config set to the HTTP (rather than
# HTTPS) URL
- if (server == 'pypi' and repository
- in (self.DEFAULT_REPOSITORY, 'pypi')):
+ if (server == 'pypi' and repository in (self.DEFAULT_REPOSITORY, 'pypi')):
result['repository'] = self.DEFAULT_REPOSITORY
- elif (result['server'] != repository
- and result['repository'] != repository):
+ elif (result['server'] != repository and result['repository'] != repository):
result = {}
elif 'server-login' in sections:
# old format
@@ -2003,8 +1963,7 @@ def get_host_platform():
from distutils import sysconfig
except ImportError:
import sysconfig
- osname, release, machine = _osx_support.get_platform_osx(
- sysconfig.get_config_vars(), osname, release, machine)
+ osname, release, machine = _osx_support.get_platform_osx(sysconfig.get_config_vars(), osname, release, machine)
return '%s-%s-%s' % (osname, release, machine)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
deleted file mode 100644
index 14171ac9..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
+++ /dev/null
@@ -1,751 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2012-2023 The Python Software Foundation.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-"""
-Implementation of a flexible versioning scheme providing support for PEP-440,
-setuptools-compatible and semantic versioning.
-"""
-
-import logging
-import re
-
-from .compat import string_types
-from .util import parse_requirement
-
-__all__ = ['NormalizedVersion', 'NormalizedMatcher',
- 'LegacyVersion', 'LegacyMatcher',
- 'SemanticVersion', 'SemanticMatcher',
- 'UnsupportedVersionError', 'get_scheme']
-
-logger = logging.getLogger(__name__)
-
-
-class UnsupportedVersionError(ValueError):
- """This is an unsupported version."""
- pass
-
-
-class Version(object):
- def __init__(self, s):
- self._string = s = s.strip()
- self._parts = parts = self.parse(s)
- assert isinstance(parts, tuple)
- assert len(parts) > 0
-
- def parse(self, s):
- raise NotImplementedError('please implement in a subclass')
-
- def _check_compatible(self, other):
- if type(self) != type(other):
- raise TypeError('cannot compare %r and %r' % (self, other))
-
- def __eq__(self, other):
- self._check_compatible(other)
- return self._parts == other._parts
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- def __lt__(self, other):
- self._check_compatible(other)
- return self._parts < other._parts
-
- def __gt__(self, other):
- return not (self.__lt__(other) or self.__eq__(other))
-
- def __le__(self, other):
- return self.__lt__(other) or self.__eq__(other)
-
- def __ge__(self, other):
- return self.__gt__(other) or self.__eq__(other)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- def __hash__(self):
- return hash(self._parts)
-
- def __repr__(self):
- return "%s('%s')" % (self.__class__.__name__, self._string)
-
- def __str__(self):
- return self._string
-
- @property
- def is_prerelease(self):
- raise NotImplementedError('Please implement in subclasses.')
-
-
-class Matcher(object):
- version_class = None
-
- # value is either a callable or the name of a method
- _operators = {
- '<': lambda v, c, p: v < c,
- '>': lambda v, c, p: v > c,
- '<=': lambda v, c, p: v == c or v < c,
- '>=': lambda v, c, p: v == c or v > c,
- '==': lambda v, c, p: v == c,
- '===': lambda v, c, p: v == c,
- # by default, compatible => >=.
- '~=': lambda v, c, p: v == c or v > c,
- '!=': lambda v, c, p: v != c,
- }
-
- # this is a method only to support alternative implementations
- # via overriding
- def parse_requirement(self, s):
- return parse_requirement(s)
-
- def __init__(self, s):
- if self.version_class is None:
- raise ValueError('Please specify a version class')
- self._string = s = s.strip()
- r = self.parse_requirement(s)
- if not r:
- raise ValueError('Not valid: %r' % s)
- self.name = r.name
- self.key = self.name.lower() # for case-insensitive comparisons
- clist = []
- if r.constraints:
- # import pdb; pdb.set_trace()
- for op, s in r.constraints:
- if s.endswith('.*'):
- if op not in ('==', '!='):
- raise ValueError('\'.*\' not allowed for '
- '%r constraints' % op)
- # Could be a partial version (e.g. for '2.*') which
- # won't parse as a version, so keep it as a string
- vn, prefix = s[:-2], True
- # Just to check that vn is a valid version
- self.version_class(vn)
- else:
- # Should parse as a version, so we can create an
- # instance for the comparison
- vn, prefix = self.version_class(s), False
- clist.append((op, vn, prefix))
- self._parts = tuple(clist)
-
- def match(self, version):
- """
- Check if the provided version matches the constraints.
-
- :param version: The version to match against this instance.
- :type version: String or :class:`Version` instance.
- """
- if isinstance(version, string_types):
- version = self.version_class(version)
- for operator, constraint, prefix in self._parts:
- f = self._operators.get(operator)
- if isinstance(f, string_types):
- f = getattr(self, f)
- if not f:
- msg = ('%r not implemented '
- 'for %s' % (operator, self.__class__.__name__))
- raise NotImplementedError(msg)
- if not f(version, constraint, prefix):
- return False
- return True
-
- @property
- def exact_version(self):
- result = None
- if len(self._parts) == 1 and self._parts[0][0] in ('==', '==='):
- result = self._parts[0][1]
- return result
-
- def _check_compatible(self, other):
- if type(self) != type(other) or self.name != other.name:
- raise TypeError('cannot compare %s and %s' % (self, other))
-
- def __eq__(self, other):
- self._check_compatible(other)
- return self.key == other.key and self._parts == other._parts
-
- def __ne__(self, other):
- return not self.__eq__(other)
-
- # See http://docs.python.org/reference/datamodel#object.__hash__
- def __hash__(self):
- return hash(self.key) + hash(self._parts)
-
- def __repr__(self):
- return "%s(%r)" % (self.__class__.__name__, self._string)
-
- def __str__(self):
- return self._string
-
-
-PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|alpha|b|beta|c|rc|pre|preview)(\d+)?)?'
- r'(\.(post|r|rev)(\d+)?)?([._-]?(dev)(\d+)?)?'
- r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$', re.I)
-
-
-def _pep_440_key(s):
- s = s.strip()
- m = PEP440_VERSION_RE.match(s)
- if not m:
- raise UnsupportedVersionError('Not a valid version: %s' % s)
- groups = m.groups()
- nums = tuple(int(v) for v in groups[1].split('.'))
- while len(nums) > 1 and nums[-1] == 0:
- nums = nums[:-1]
-
- if not groups[0]:
- epoch = 0
- else:
- epoch = int(groups[0][:-1])
- pre = groups[4:6]
- post = groups[7:9]
- dev = groups[10:12]
- local = groups[13]
- if pre == (None, None):
- pre = ()
- else:
- if pre[1] is None:
- pre = pre[0], 0
- else:
- pre = pre[0], int(pre[1])
- if post == (None, None):
- post = ()
- else:
- if post[1] is None:
- post = post[0], 0
- else:
- post = post[0], int(post[1])
- if dev == (None, None):
- dev = ()
- else:
- if dev[1] is None:
- dev = dev[0], 0
- else:
- dev = dev[0], int(dev[1])
- if local is None:
- local = ()
- else:
- parts = []
- for part in local.split('.'):
- # to ensure that numeric compares as > lexicographic, avoid
- # comparing them directly, but encode a tuple which ensures
- # correct sorting
- if part.isdigit():
- part = (1, int(part))
- else:
- part = (0, part)
- parts.append(part)
- local = tuple(parts)
- if not pre:
- # either before pre-release, or final release and after
- if not post and dev:
- # before pre-release
- pre = ('a', -1) # to sort before a0
- else:
- pre = ('z',) # to sort after all pre-releases
- # now look at the state of post and dev.
- if not post:
- post = ('_',) # sort before 'a'
- if not dev:
- dev = ('final',)
-
- return epoch, nums, pre, post, dev, local
-
-
-_normalized_key = _pep_440_key
-
-
-class NormalizedVersion(Version):
- """A rational version.
-
- Good:
- 1.2 # equivalent to "1.2.0"
- 1.2.0
- 1.2a1
- 1.2.3a2
- 1.2.3b1
- 1.2.3c1
- 1.2.3.4
- TODO: fill this out
-
- Bad:
- 1 # minimum two numbers
- 1.2a # release level must have a release serial
- 1.2.3b
- """
- def parse(self, s):
- result = _normalized_key(s)
- # _normalized_key loses trailing zeroes in the release
- # clause, since that's needed to ensure that X.Y == X.Y.0 == X.Y.0.0
- # However, PEP 440 prefix matching needs it: for example,
- # (~= 1.4.5.0) matches differently to (~= 1.4.5.0.0).
- m = PEP440_VERSION_RE.match(s) # must succeed
- groups = m.groups()
- self._release_clause = tuple(int(v) for v in groups[1].split('.'))
- return result
-
- PREREL_TAGS = set(['a', 'b', 'c', 'rc', 'dev'])
-
- @property
- def is_prerelease(self):
- return any(t[0] in self.PREREL_TAGS for t in self._parts if t)
-
-
-def _match_prefix(x, y):
- x = str(x)
- y = str(y)
- if x == y:
- return True
- if not x.startswith(y):
- return False
- n = len(y)
- return x[n] == '.'
-
-
-class NormalizedMatcher(Matcher):
- version_class = NormalizedVersion
-
- # value is either a callable or the name of a method
- _operators = {
- '~=': '_match_compatible',
- '<': '_match_lt',
- '>': '_match_gt',
- '<=': '_match_le',
- '>=': '_match_ge',
- '==': '_match_eq',
- '===': '_match_arbitrary',
- '!=': '_match_ne',
- }
-
- def _adjust_local(self, version, constraint, prefix):
- if prefix:
- strip_local = '+' not in constraint and version._parts[-1]
- else:
- # both constraint and version are
- # NormalizedVersion instances.
- # If constraint does not have a local component,
- # ensure the version doesn't, either.
- strip_local = not constraint._parts[-1] and version._parts[-1]
- if strip_local:
- s = version._string.split('+', 1)[0]
- version = self.version_class(s)
- return version, constraint
-
- def _match_lt(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version >= constraint:
- return False
- release_clause = constraint._release_clause
- pfx = '.'.join([str(i) for i in release_clause])
- return not _match_prefix(version, pfx)
-
- def _match_gt(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version <= constraint:
- return False
- release_clause = constraint._release_clause
- pfx = '.'.join([str(i) for i in release_clause])
- return not _match_prefix(version, pfx)
-
- def _match_le(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- return version <= constraint
-
- def _match_ge(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- return version >= constraint
-
- def _match_eq(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if not prefix:
- result = (version == constraint)
- else:
- result = _match_prefix(version, constraint)
- return result
-
- def _match_arbitrary(self, version, constraint, prefix):
- return str(version) == str(constraint)
-
- def _match_ne(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if not prefix:
- result = (version != constraint)
- else:
- result = not _match_prefix(version, constraint)
- return result
-
- def _match_compatible(self, version, constraint, prefix):
- version, constraint = self._adjust_local(version, constraint, prefix)
- if version == constraint:
- return True
- if version < constraint:
- return False
-# if not prefix:
-# return True
- release_clause = constraint._release_clause
- if len(release_clause) > 1:
- release_clause = release_clause[:-1]
- pfx = '.'.join([str(i) for i in release_clause])
- return _match_prefix(version, pfx)
-
-
-_REPLACEMENTS = (
- (re.compile('[.+-]$'), ''), # remove trailing puncts
- (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start
- (re.compile('^[.-]'), ''), # remove leading puncts
- (re.compile(r'^\((.*)\)$'), r'\1'), # remove parentheses
- (re.compile(r'^v(ersion)?\s*(\d+)'), r'\2'), # remove leading v(ersion)
- (re.compile(r'^r(ev)?\s*(\d+)'), r'\2'), # remove leading v(ersion)
- (re.compile('[.]{2,}'), '.'), # multiple runs of '.'
- (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha
- (re.compile(r'\b(pre-alpha|prealpha)\b'),
- 'pre.alpha'), # standardise
- (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses
-)
-
-_SUFFIX_REPLACEMENTS = (
- (re.compile('^[:~._+-]+'), ''), # remove leading puncts
- (re.compile('[,*")([\\]]'), ''), # remove unwanted chars
- (re.compile('[~:+_ -]'), '.'), # replace illegal chars
- (re.compile('[.]{2,}'), '.'), # multiple runs of '.'
- (re.compile(r'\.$'), ''), # trailing '.'
-)
-
-_NUMERIC_PREFIX = re.compile(r'(\d+(\.\d+)*)')
-
-
-def _suggest_semantic_version(s):
- """
- Try to suggest a semantic form for a version for which
- _suggest_normalized_version couldn't come up with anything.
- """
- result = s.strip().lower()
- for pat, repl in _REPLACEMENTS:
- result = pat.sub(repl, result)
- if not result:
- result = '0.0.0'
-
- # Now look for numeric prefix, and separate it out from
- # the rest.
- # import pdb; pdb.set_trace()
- m = _NUMERIC_PREFIX.match(result)
- if not m:
- prefix = '0.0.0'
- suffix = result
- else:
- prefix = m.groups()[0].split('.')
- prefix = [int(i) for i in prefix]
- while len(prefix) < 3:
- prefix.append(0)
- if len(prefix) == 3:
- suffix = result[m.end():]
- else:
- suffix = '.'.join([str(i) for i in prefix[3:]]) + result[m.end():]
- prefix = prefix[:3]
- prefix = '.'.join([str(i) for i in prefix])
- suffix = suffix.strip()
- if suffix:
- # import pdb; pdb.set_trace()
- # massage the suffix.
- for pat, repl in _SUFFIX_REPLACEMENTS:
- suffix = pat.sub(repl, suffix)
-
- if not suffix:
- result = prefix
- else:
- sep = '-' if 'dev' in suffix else '+'
- result = prefix + sep + suffix
- if not is_semver(result):
- result = None
- return result
-
-
-def _suggest_normalized_version(s):
- """Suggest a normalized version close to the given version string.
-
- If you have a version string that isn't rational (i.e. NormalizedVersion
- doesn't like it) then you might be able to get an equivalent (or close)
- rational version from this function.
-
- This does a number of simple normalizations to the given string, based
- on observation of versions currently in use on PyPI. Given a dump of
- those version during PyCon 2009, 4287 of them:
- - 2312 (53.93%) match NormalizedVersion without change
- with the automatic suggestion
- - 3474 (81.04%) match when using this suggestion method
-
- @param s {str} An irrational version string.
- @returns A rational version string, or None, if couldn't determine one.
- """
- try:
- _normalized_key(s)
- return s # already rational
- except UnsupportedVersionError:
- pass
-
- rs = s.lower()
-
- # part of this could use maketrans
- for orig, repl in (('-alpha', 'a'), ('-beta', 'b'), ('alpha', 'a'),
- ('beta', 'b'), ('rc', 'c'), ('-final', ''),
- ('-pre', 'c'),
- ('-release', ''), ('.release', ''), ('-stable', ''),
- ('+', '.'), ('_', '.'), (' ', ''), ('.final', ''),
- ('final', '')):
- rs = rs.replace(orig, repl)
-
- # if something ends with dev or pre, we add a 0
- rs = re.sub(r"pre$", r"pre0", rs)
- rs = re.sub(r"dev$", r"dev0", rs)
-
- # if we have something like "b-2" or "a.2" at the end of the
- # version, that is probably beta, alpha, etc
- # let's remove the dash or dot
- rs = re.sub(r"([abc]|rc)[\-\.](\d+)$", r"\1\2", rs)
-
- # 1.0-dev-r371 -> 1.0.dev371
- # 0.1-dev-r79 -> 0.1.dev79
- rs = re.sub(r"[\-\.](dev)[\-\.]?r?(\d+)$", r".\1\2", rs)
-
- # Clean: 2.0.a.3, 2.0.b1, 0.9.0~c1
- rs = re.sub(r"[.~]?([abc])\.?", r"\1", rs)
-
- # Clean: v0.3, v1.0
- if rs.startswith('v'):
- rs = rs[1:]
-
- # Clean leading '0's on numbers.
- # TODO: unintended side-effect on, e.g., "2003.05.09"
- # PyPI stats: 77 (~2%) better
- rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs)
-
- # Clean a/b/c with no version. E.g. "1.0a" -> "1.0a0". Setuptools infers
- # zero.
- # PyPI stats: 245 (7.56%) better
- rs = re.sub(r"(\d+[abc])$", r"\g<1>0", rs)
-
- # the 'dev-rNNN' tag is a dev tag
- rs = re.sub(r"\.?(dev-r|dev\.r)\.?(\d+)$", r".dev\2", rs)
-
- # clean the - when used as a pre delimiter
- rs = re.sub(r"-(a|b|c)(\d+)$", r"\1\2", rs)
-
- # a terminal "dev" or "devel" can be changed into ".dev0"
- rs = re.sub(r"[\.\-](dev|devel)$", r".dev0", rs)
-
- # a terminal "dev" can be changed into ".dev0"
- rs = re.sub(r"(?![\.\-])dev$", r".dev0", rs)
-
- # a terminal "final" or "stable" can be removed
- rs = re.sub(r"(final|stable)$", "", rs)
-
- # The 'r' and the '-' tags are post release tags
- # 0.4a1.r10 -> 0.4a1.post10
- # 0.9.33-17222 -> 0.9.33.post17222
- # 0.9.33-r17222 -> 0.9.33.post17222
- rs = re.sub(r"\.?(r|-|-r)\.?(\d+)$", r".post\2", rs)
-
- # Clean 'r' instead of 'dev' usage:
- # 0.9.33+r17222 -> 0.9.33.dev17222
- # 1.0dev123 -> 1.0.dev123
- # 1.0.git123 -> 1.0.dev123
- # 1.0.bzr123 -> 1.0.dev123
- # 0.1a0dev.123 -> 0.1a0.dev123
- # PyPI stats: ~150 (~4%) better
- rs = re.sub(r"\.?(dev|git|bzr)\.?(\d+)$", r".dev\2", rs)
-
- # Clean '.pre' (normalized from '-pre' above) instead of 'c' usage:
- # 0.2.pre1 -> 0.2c1
- # 0.2-c1 -> 0.2c1
- # 1.0preview123 -> 1.0c123
- # PyPI stats: ~21 (0.62%) better
- rs = re.sub(r"\.?(pre|preview|-c)(\d+)$", r"c\g<2>", rs)
-
- # Tcl/Tk uses "px" for their post release markers
- rs = re.sub(r"p(\d+)$", r".post\1", rs)
-
- try:
- _normalized_key(rs)
- except UnsupportedVersionError:
- rs = None
- return rs
-
-#
-# Legacy version processing (distribute-compatible)
-#
-
-
-_VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I)
-_VERSION_REPLACE = {
- 'pre': 'c',
- 'preview': 'c',
- '-': 'final-',
- 'rc': 'c',
- 'dev': '@',
- '': None,
- '.': None,
-}
-
-
-def _legacy_key(s):
- def get_parts(s):
- result = []
- for p in _VERSION_PART.split(s.lower()):
- p = _VERSION_REPLACE.get(p, p)
- if p:
- if '0' <= p[:1] <= '9':
- p = p.zfill(8)
- else:
- p = '*' + p
- result.append(p)
- result.append('*final')
- return result
-
- result = []
- for p in get_parts(s):
- if p.startswith('*'):
- if p < '*final':
- while result and result[-1] == '*final-':
- result.pop()
- while result and result[-1] == '00000000':
- result.pop()
- result.append(p)
- return tuple(result)
-
-
-class LegacyVersion(Version):
- def parse(self, s):
- return _legacy_key(s)
-
- @property
- def is_prerelease(self):
- result = False
- for x in self._parts:
- if (isinstance(x, string_types) and x.startswith('*') and
- x < '*final'):
- result = True
- break
- return result
-
-
-class LegacyMatcher(Matcher):
- version_class = LegacyVersion
-
- _operators = dict(Matcher._operators)
- _operators['~='] = '_match_compatible'
-
- numeric_re = re.compile(r'^(\d+(\.\d+)*)')
-
- def _match_compatible(self, version, constraint, prefix):
- if version < constraint:
- return False
- m = self.numeric_re.match(str(constraint))
- if not m:
- logger.warning('Cannot compute compatible match for version %s '
- ' and constraint %s', version, constraint)
- return True
- s = m.groups()[0]
- if '.' in s:
- s = s.rsplit('.', 1)[0]
- return _match_prefix(version, s)
-
-#
-# Semantic versioning
-#
-
-
-_SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)'
- r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?'
- r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I)
-
-
-def is_semver(s):
- return _SEMVER_RE.match(s)
-
-
-def _semantic_key(s):
- def make_tuple(s, absent):
- if s is None:
- result = (absent,)
- else:
- parts = s[1:].split('.')
- # We can't compare ints and strings on Python 3, so fudge it
- # by zero-filling numeric values so simulate a numeric comparison
- result = tuple([p.zfill(8) if p.isdigit() else p for p in parts])
- return result
-
- m = is_semver(s)
- if not m:
- raise UnsupportedVersionError(s)
- groups = m.groups()
- major, minor, patch = [int(i) for i in groups[:3]]
- # choose the '|' and '*' so that versions sort correctly
- pre, build = make_tuple(groups[3], '|'), make_tuple(groups[5], '*')
- return (major, minor, patch), pre, build
-
-
-class SemanticVersion(Version):
- def parse(self, s):
- return _semantic_key(s)
-
- @property
- def is_prerelease(self):
- return self._parts[1][0] != '|'
-
-
-class SemanticMatcher(Matcher):
- version_class = SemanticVersion
-
-
-class VersionScheme(object):
- def __init__(self, key, matcher, suggester=None):
- self.key = key
- self.matcher = matcher
- self.suggester = suggester
-
- def is_valid_version(self, s):
- try:
- self.matcher.version_class(s)
- result = True
- except UnsupportedVersionError:
- result = False
- return result
-
- def is_valid_matcher(self, s):
- try:
- self.matcher(s)
- result = True
- except UnsupportedVersionError:
- result = False
- return result
-
- def is_valid_constraint_list(self, s):
- """
- Used for processing some metadata fields
- """
- # See issue #140. Be tolerant of a single trailing comma.
- if s.endswith(','):
- s = s[:-1]
- return self.is_valid_matcher('dummy_name (%s)' % s)
-
- def suggest(self, s):
- if self.suggester is None:
- result = None
- else:
- result = self.suggester(s)
- return result
-
-
-_SCHEMES = {
- 'normalized': VersionScheme(_normalized_key, NormalizedMatcher,
- _suggest_normalized_version),
- 'legacy': VersionScheme(_legacy_key, LegacyMatcher, lambda self, s: s),
- 'semantic': VersionScheme(_semantic_key, SemanticMatcher,
- _suggest_semantic_version),
-}
-
-_SCHEMES['default'] = _SCHEMES['normalized']
-
-
-def get_scheme(name):
- if name not in _SCHEMES:
- raise ValueError('unknown scheme name: %r' % name)
- return _SCHEMES[name]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe
new file mode 100644
index 00000000..4ee2d3a3
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w32.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe
new file mode 100644
index 00000000..951d5817
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64-arm.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe
new file mode 100644
index 00000000..5763076d
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/w64.exe differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py
deleted file mode 100644
index 4a5a30e1..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py
+++ /dev/null
@@ -1,1099 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2013-2023 Vinay Sajip.
-# Licensed to the Python Software Foundation under a contributor agreement.
-# See LICENSE.txt and CONTRIBUTORS.txt.
-#
-from __future__ import unicode_literals
-
-import base64
-import codecs
-import datetime
-from email import message_from_file
-import hashlib
-import json
-import logging
-import os
-import posixpath
-import re
-import shutil
-import sys
-import tempfile
-import zipfile
-
-from . import __version__, DistlibException
-from .compat import sysconfig, ZipFile, fsdecode, text_type, filter
-from .database import InstalledDistribution
-from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME
-from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache,
- cached_property, get_cache_base, read_exports, tempdir,
- get_platform)
-from .version import NormalizedVersion, UnsupportedVersionError
-
-logger = logging.getLogger(__name__)
-
-cache = None # created when needed
-
-if hasattr(sys, 'pypy_version_info'): # pragma: no cover
- IMP_PREFIX = 'pp'
-elif sys.platform.startswith('java'): # pragma: no cover
- IMP_PREFIX = 'jy'
-elif sys.platform == 'cli': # pragma: no cover
- IMP_PREFIX = 'ip'
-else:
- IMP_PREFIX = 'cp'
-
-VER_SUFFIX = sysconfig.get_config_var('py_version_nodot')
-if not VER_SUFFIX: # pragma: no cover
- VER_SUFFIX = '%s%s' % sys.version_info[:2]
-PYVER = 'py' + VER_SUFFIX
-IMPVER = IMP_PREFIX + VER_SUFFIX
-
-ARCH = get_platform().replace('-', '_').replace('.', '_')
-
-ABI = sysconfig.get_config_var('SOABI')
-if ABI and ABI.startswith('cpython-'):
- ABI = ABI.replace('cpython-', 'cp').split('-')[0]
-else:
-
- def _derive_abi():
- parts = ['cp', VER_SUFFIX]
- if sysconfig.get_config_var('Py_DEBUG'):
- parts.append('d')
- if IMP_PREFIX == 'cp':
- vi = sys.version_info[:2]
- if vi < (3, 8):
- wpm = sysconfig.get_config_var('WITH_PYMALLOC')
- if wpm is None:
- wpm = True
- if wpm:
- parts.append('m')
- if vi < (3, 3):
- us = sysconfig.get_config_var('Py_UNICODE_SIZE')
- if us == 4 or (us is None and sys.maxunicode == 0x10FFFF):
- parts.append('u')
- return ''.join(parts)
-
- ABI = _derive_abi()
- del _derive_abi
-
-FILENAME_RE = re.compile(
- r'''
-(?P[^-]+)
--(?P\d+[^-]*)
-(-(?P\d+[^-]*))?
--(?P\w+\d+(\.\w+\d+)*)
--(?P\w+)
--(?P\w+(\.\w+)*)
-\.whl$
-''', re.IGNORECASE | re.VERBOSE)
-
-NAME_VERSION_RE = re.compile(
- r'''
-(?P[^-]+)
--(?P\d+[^-]*)
-(-(?P\d+[^-]*))?$
-''', re.IGNORECASE | re.VERBOSE)
-
-SHEBANG_RE = re.compile(br'\s*#![^\r\n]*')
-SHEBANG_DETAIL_RE = re.compile(br'^(\s*#!("[^"]+"|\S+))\s+(.*)$')
-SHEBANG_PYTHON = b'#!python'
-SHEBANG_PYTHONW = b'#!pythonw'
-
-if os.sep == '/':
- to_posix = lambda o: o
-else:
- to_posix = lambda o: o.replace(os.sep, '/')
-
-if sys.version_info[0] < 3:
- import imp
-else:
- imp = None
- import importlib.machinery
- import importlib.util
-
-
-def _get_suffixes():
- if imp:
- return [s[0] for s in imp.get_suffixes()]
- else:
- return importlib.machinery.EXTENSION_SUFFIXES
-
-
-def _load_dynamic(name, path):
- # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly
- if imp:
- return imp.load_dynamic(name, path)
- else:
- spec = importlib.util.spec_from_file_location(name, path)
- module = importlib.util.module_from_spec(spec)
- sys.modules[name] = module
- spec.loader.exec_module(module)
- return module
-
-
-class Mounter(object):
-
- def __init__(self):
- self.impure_wheels = {}
- self.libs = {}
-
- def add(self, pathname, extensions):
- self.impure_wheels[pathname] = extensions
- self.libs.update(extensions)
-
- def remove(self, pathname):
- extensions = self.impure_wheels.pop(pathname)
- for k, v in extensions:
- if k in self.libs:
- del self.libs[k]
-
- def find_module(self, fullname, path=None):
- if fullname in self.libs:
- result = self
- else:
- result = None
- return result
-
- def load_module(self, fullname):
- if fullname in sys.modules:
- result = sys.modules[fullname]
- else:
- if fullname not in self.libs:
- raise ImportError('unable to find extension for %s' % fullname)
- result = _load_dynamic(fullname, self.libs[fullname])
- result.__loader__ = self
- parts = fullname.rsplit('.', 1)
- if len(parts) > 1:
- result.__package__ = parts[0]
- return result
-
-
-_hook = Mounter()
-
-
-class Wheel(object):
- """
- Class to build and install from Wheel files (PEP 427).
- """
-
- wheel_version = (1, 1)
- hash_kind = 'sha256'
-
- def __init__(self, filename=None, sign=False, verify=False):
- """
- Initialise an instance using a (valid) filename.
- """
- self.sign = sign
- self.should_verify = verify
- self.buildver = ''
- self.pyver = [PYVER]
- self.abi = ['none']
- self.arch = ['any']
- self.dirname = os.getcwd()
- if filename is None:
- self.name = 'dummy'
- self.version = '0.1'
- self._filename = self.filename
- else:
- m = NAME_VERSION_RE.match(filename)
- if m:
- info = m.groupdict('')
- self.name = info['nm']
- # Reinstate the local version separator
- self.version = info['vn'].replace('_', '-')
- self.buildver = info['bn']
- self._filename = self.filename
- else:
- dirname, filename = os.path.split(filename)
- m = FILENAME_RE.match(filename)
- if not m:
- raise DistlibException('Invalid name or '
- 'filename: %r' % filename)
- if dirname:
- self.dirname = os.path.abspath(dirname)
- self._filename = filename
- info = m.groupdict('')
- self.name = info['nm']
- self.version = info['vn']
- self.buildver = info['bn']
- self.pyver = info['py'].split('.')
- self.abi = info['bi'].split('.')
- self.arch = info['ar'].split('.')
-
- @property
- def filename(self):
- """
- Build and return a filename from the various components.
- """
- if self.buildver:
- buildver = '-' + self.buildver
- else:
- buildver = ''
- pyver = '.'.join(self.pyver)
- abi = '.'.join(self.abi)
- arch = '.'.join(self.arch)
- # replace - with _ as a local version separator
- version = self.version.replace('-', '_')
- return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver,
- abi, arch)
-
- @property
- def exists(self):
- path = os.path.join(self.dirname, self.filename)
- return os.path.isfile(path)
-
- @property
- def tags(self):
- for pyver in self.pyver:
- for abi in self.abi:
- for arch in self.arch:
- yield pyver, abi, arch
-
- @cached_property
- def metadata(self):
- pathname = os.path.join(self.dirname, self.filename)
- name_ver = '%s-%s' % (self.name, self.version)
- info_dir = '%s.dist-info' % name_ver
- wrapper = codecs.getreader('utf-8')
- with ZipFile(pathname, 'r') as zf:
- self.get_wheel_metadata(zf)
- # wv = wheel_metadata['Wheel-Version'].split('.', 1)
- # file_version = tuple([int(i) for i in wv])
- # if file_version < (1, 1):
- # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME,
- # LEGACY_METADATA_FILENAME]
- # else:
- # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME]
- fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME]
- result = None
- for fn in fns:
- try:
- metadata_filename = posixpath.join(info_dir, fn)
- with zf.open(metadata_filename) as bf:
- wf = wrapper(bf)
- result = Metadata(fileobj=wf)
- if result:
- break
- except KeyError:
- pass
- if not result:
- raise ValueError('Invalid wheel, because metadata is '
- 'missing: looked in %s' % ', '.join(fns))
- return result
-
- def get_wheel_metadata(self, zf):
- name_ver = '%s-%s' % (self.name, self.version)
- info_dir = '%s.dist-info' % name_ver
- metadata_filename = posixpath.join(info_dir, 'WHEEL')
- with zf.open(metadata_filename) as bf:
- wf = codecs.getreader('utf-8')(bf)
- message = message_from_file(wf)
- return dict(message)
-
- @cached_property
- def info(self):
- pathname = os.path.join(self.dirname, self.filename)
- with ZipFile(pathname, 'r') as zf:
- result = self.get_wheel_metadata(zf)
- return result
-
- def process_shebang(self, data):
- m = SHEBANG_RE.match(data)
- if m:
- end = m.end()
- shebang, data_after_shebang = data[:end], data[end:]
- # Preserve any arguments after the interpreter
- if b'pythonw' in shebang.lower():
- shebang_python = SHEBANG_PYTHONW
- else:
- shebang_python = SHEBANG_PYTHON
- m = SHEBANG_DETAIL_RE.match(shebang)
- if m:
- args = b' ' + m.groups()[-1]
- else:
- args = b''
- shebang = shebang_python + args
- data = shebang + data_after_shebang
- else:
- cr = data.find(b'\r')
- lf = data.find(b'\n')
- if cr < 0 or cr > lf:
- term = b'\n'
- else:
- if data[cr:cr + 2] == b'\r\n':
- term = b'\r\n'
- else:
- term = b'\r'
- data = SHEBANG_PYTHON + term + data
- return data
-
- def get_hash(self, data, hash_kind=None):
- if hash_kind is None:
- hash_kind = self.hash_kind
- try:
- hasher = getattr(hashlib, hash_kind)
- except AttributeError:
- raise DistlibException('Unsupported hash algorithm: %r' %
- hash_kind)
- result = hasher(data).digest()
- result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii')
- return hash_kind, result
-
- def write_record(self, records, record_path, archive_record_path):
- records = list(records) # make a copy, as mutated
- records.append((archive_record_path, '', ''))
- with CSVWriter(record_path) as writer:
- for row in records:
- writer.writerow(row)
-
- def write_records(self, info, libdir, archive_paths):
- records = []
- distinfo, info_dir = info
- # hasher = getattr(hashlib, self.hash_kind)
- for ap, p in archive_paths:
- with open(p, 'rb') as f:
- data = f.read()
- digest = '%s=%s' % self.get_hash(data)
- size = os.path.getsize(p)
- records.append((ap, digest, size))
-
- p = os.path.join(distinfo, 'RECORD')
- ap = to_posix(os.path.join(info_dir, 'RECORD'))
- self.write_record(records, p, ap)
- archive_paths.append((ap, p))
-
- def build_zip(self, pathname, archive_paths):
- with ZipFile(pathname, 'w', zipfile.ZIP_DEFLATED) as zf:
- for ap, p in archive_paths:
- logger.debug('Wrote %s to %s in wheel', p, ap)
- zf.write(p, ap)
-
- def build(self, paths, tags=None, wheel_version=None):
- """
- Build a wheel from files in specified paths, and use any specified tags
- when determining the name of the wheel.
- """
- if tags is None:
- tags = {}
-
- libkey = list(filter(lambda o: o in paths, ('purelib', 'platlib')))[0]
- if libkey == 'platlib':
- is_pure = 'false'
- default_pyver = [IMPVER]
- default_abi = [ABI]
- default_arch = [ARCH]
- else:
- is_pure = 'true'
- default_pyver = [PYVER]
- default_abi = ['none']
- default_arch = ['any']
-
- self.pyver = tags.get('pyver', default_pyver)
- self.abi = tags.get('abi', default_abi)
- self.arch = tags.get('arch', default_arch)
-
- libdir = paths[libkey]
-
- name_ver = '%s-%s' % (self.name, self.version)
- data_dir = '%s.data' % name_ver
- info_dir = '%s.dist-info' % name_ver
-
- archive_paths = []
-
- # First, stuff which is not in site-packages
- for key in ('data', 'headers', 'scripts'):
- if key not in paths:
- continue
- path = paths[key]
- if os.path.isdir(path):
- for root, dirs, files in os.walk(path):
- for fn in files:
- p = fsdecode(os.path.join(root, fn))
- rp = os.path.relpath(p, path)
- ap = to_posix(os.path.join(data_dir, key, rp))
- archive_paths.append((ap, p))
- if key == 'scripts' and not p.endswith('.exe'):
- with open(p, 'rb') as f:
- data = f.read()
- data = self.process_shebang(data)
- with open(p, 'wb') as f:
- f.write(data)
-
- # Now, stuff which is in site-packages, other than the
- # distinfo stuff.
- path = libdir
- distinfo = None
- for root, dirs, files in os.walk(path):
- if root == path:
- # At the top level only, save distinfo for later
- # and skip it for now
- for i, dn in enumerate(dirs):
- dn = fsdecode(dn)
- if dn.endswith('.dist-info'):
- distinfo = os.path.join(root, dn)
- del dirs[i]
- break
- assert distinfo, '.dist-info directory expected, not found'
-
- for fn in files:
- # comment out next suite to leave .pyc files in
- if fsdecode(fn).endswith(('.pyc', '.pyo')):
- continue
- p = os.path.join(root, fn)
- rp = to_posix(os.path.relpath(p, path))
- archive_paths.append((rp, p))
-
- # Now distinfo. Assumed to be flat, i.e. os.listdir is enough.
- files = os.listdir(distinfo)
- for fn in files:
- if fn not in ('RECORD', 'INSTALLER', 'SHARED', 'WHEEL'):
- p = fsdecode(os.path.join(distinfo, fn))
- ap = to_posix(os.path.join(info_dir, fn))
- archive_paths.append((ap, p))
-
- wheel_metadata = [
- 'Wheel-Version: %d.%d' % (wheel_version or self.wheel_version),
- 'Generator: distlib %s' % __version__,
- 'Root-Is-Purelib: %s' % is_pure,
- ]
- for pyver, abi, arch in self.tags:
- wheel_metadata.append('Tag: %s-%s-%s' % (pyver, abi, arch))
- p = os.path.join(distinfo, 'WHEEL')
- with open(p, 'w') as f:
- f.write('\n'.join(wheel_metadata))
- ap = to_posix(os.path.join(info_dir, 'WHEEL'))
- archive_paths.append((ap, p))
-
- # sort the entries by archive path. Not needed by any spec, but it
- # keeps the archive listing and RECORD tidier than they would otherwise
- # be. Use the number of path segments to keep directory entries together,
- # and keep the dist-info stuff at the end.
- def sorter(t):
- ap = t[0]
- n = ap.count('/')
- if '.dist-info' in ap:
- n += 10000
- return (n, ap)
-
- archive_paths = sorted(archive_paths, key=sorter)
-
- # Now, at last, RECORD.
- # Paths in here are archive paths - nothing else makes sense.
- self.write_records((distinfo, info_dir), libdir, archive_paths)
- # Now, ready to build the zip file
- pathname = os.path.join(self.dirname, self.filename)
- self.build_zip(pathname, archive_paths)
- return pathname
-
- def skip_entry(self, arcname):
- """
- Determine whether an archive entry should be skipped when verifying
- or installing.
- """
- # The signature file won't be in RECORD,
- # and we don't currently don't do anything with it
- # We also skip directories, as they won't be in RECORD
- # either. See:
- #
- # https://github.com/pypa/wheel/issues/294
- # https://github.com/pypa/wheel/issues/287
- # https://github.com/pypa/wheel/pull/289
- #
- return arcname.endswith(('/', '/RECORD.jws'))
-
- def install(self, paths, maker, **kwargs):
- """
- Install a wheel to the specified paths. If kwarg ``warner`` is
- specified, it should be a callable, which will be called with two
- tuples indicating the wheel version of this software and the wheel
- version in the file, if there is a discrepancy in the versions.
- This can be used to issue any warnings to raise any exceptions.
- If kwarg ``lib_only`` is True, only the purelib/platlib files are
- installed, and the headers, scripts, data and dist-info metadata are
- not written. If kwarg ``bytecode_hashed_invalidation`` is True, written
- bytecode will try to use file-hash based invalidation (PEP-552) on
- supported interpreter versions (CPython 2.7+).
-
- The return value is a :class:`InstalledDistribution` instance unless
- ``options.lib_only`` is True, in which case the return value is ``None``.
- """
-
- dry_run = maker.dry_run
- warner = kwargs.get('warner')
- lib_only = kwargs.get('lib_only', False)
- bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation',
- False)
-
- pathname = os.path.join(self.dirname, self.filename)
- name_ver = '%s-%s' % (self.name, self.version)
- data_dir = '%s.data' % name_ver
- info_dir = '%s.dist-info' % name_ver
-
- metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
- wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
- record_name = posixpath.join(info_dir, 'RECORD')
-
- wrapper = codecs.getreader('utf-8')
-
- with ZipFile(pathname, 'r') as zf:
- with zf.open(wheel_metadata_name) as bwf:
- wf = wrapper(bwf)
- message = message_from_file(wf)
- wv = message['Wheel-Version'].split('.', 1)
- file_version = tuple([int(i) for i in wv])
- if (file_version != self.wheel_version) and warner:
- warner(self.wheel_version, file_version)
-
- if message['Root-Is-Purelib'] == 'true':
- libdir = paths['purelib']
- else:
- libdir = paths['platlib']
-
- records = {}
- with zf.open(record_name) as bf:
- with CSVReader(stream=bf) as reader:
- for row in reader:
- p = row[0]
- records[p] = row
-
- data_pfx = posixpath.join(data_dir, '')
- info_pfx = posixpath.join(info_dir, '')
- script_pfx = posixpath.join(data_dir, 'scripts', '')
-
- # make a new instance rather than a copy of maker's,
- # as we mutate it
- fileop = FileOperator(dry_run=dry_run)
- fileop.record = True # so we can rollback if needed
-
- bc = not sys.dont_write_bytecode # Double negatives. Lovely!
-
- outfiles = [] # for RECORD writing
-
- # for script copying/shebang processing
- workdir = tempfile.mkdtemp()
- # set target dir later
- # we default add_launchers to False, as the
- # Python Launcher should be used instead
- maker.source_dir = workdir
- maker.target_dir = None
- try:
- for zinfo in zf.infolist():
- arcname = zinfo.filename
- if isinstance(arcname, text_type):
- u_arcname = arcname
- else:
- u_arcname = arcname.decode('utf-8')
- if self.skip_entry(u_arcname):
- continue
- row = records[u_arcname]
- if row[2] and str(zinfo.file_size) != row[2]:
- raise DistlibException('size mismatch for '
- '%s' % u_arcname)
- if row[1]:
- kind, value = row[1].split('=', 1)
- with zf.open(arcname) as bf:
- data = bf.read()
- _, digest = self.get_hash(data, kind)
- if digest != value:
- raise DistlibException('digest mismatch for '
- '%s' % arcname)
-
- if lib_only and u_arcname.startswith((info_pfx, data_pfx)):
- logger.debug('lib_only: skipping %s', u_arcname)
- continue
- is_script = (u_arcname.startswith(script_pfx)
- and not u_arcname.endswith('.exe'))
-
- if u_arcname.startswith(data_pfx):
- _, where, rp = u_arcname.split('/', 2)
- outfile = os.path.join(paths[where], convert_path(rp))
- else:
- # meant for site-packages.
- if u_arcname in (wheel_metadata_name, record_name):
- continue
- outfile = os.path.join(libdir, convert_path(u_arcname))
- if not is_script:
- with zf.open(arcname) as bf:
- fileop.copy_stream(bf, outfile)
- # Issue #147: permission bits aren't preserved. Using
- # zf.extract(zinfo, libdir) should have worked, but didn't,
- # see https://www.thetopsites.net/article/53834422.shtml
- # So ... manually preserve permission bits as given in zinfo
- if os.name == 'posix':
- # just set the normal permission bits
- os.chmod(outfile,
- (zinfo.external_attr >> 16) & 0x1FF)
- outfiles.append(outfile)
- # Double check the digest of the written file
- if not dry_run and row[1]:
- with open(outfile, 'rb') as bf:
- data = bf.read()
- _, newdigest = self.get_hash(data, kind)
- if newdigest != digest:
- raise DistlibException('digest mismatch '
- 'on write for '
- '%s' % outfile)
- if bc and outfile.endswith('.py'):
- try:
- pyc = fileop.byte_compile(
- outfile,
- hashed_invalidation=bc_hashed_invalidation)
- outfiles.append(pyc)
- except Exception:
- # Don't give up if byte-compilation fails,
- # but log it and perhaps warn the user
- logger.warning('Byte-compilation failed',
- exc_info=True)
- else:
- fn = os.path.basename(convert_path(arcname))
- workname = os.path.join(workdir, fn)
- with zf.open(arcname) as bf:
- fileop.copy_stream(bf, workname)
-
- dn, fn = os.path.split(outfile)
- maker.target_dir = dn
- filenames = maker.make(fn)
- fileop.set_executable_mode(filenames)
- outfiles.extend(filenames)
-
- if lib_only:
- logger.debug('lib_only: returning None')
- dist = None
- else:
- # Generate scripts
-
- # Try to get pydist.json so we can see if there are
- # any commands to generate. If this fails (e.g. because
- # of a legacy wheel), log a warning but don't give up.
- commands = None
- file_version = self.info['Wheel-Version']
- if file_version == '1.0':
- # Use legacy info
- ep = posixpath.join(info_dir, 'entry_points.txt')
- try:
- with zf.open(ep) as bwf:
- epdata = read_exports(bwf)
- commands = {}
- for key in ('console', 'gui'):
- k = '%s_scripts' % key
- if k in epdata:
- commands['wrap_%s' % key] = d = {}
- for v in epdata[k].values():
- s = '%s:%s' % (v.prefix, v.suffix)
- if v.flags:
- s += ' [%s]' % ','.join(v.flags)
- d[v.name] = s
- except Exception:
- logger.warning('Unable to read legacy script '
- 'metadata, so cannot generate '
- 'scripts')
- else:
- try:
- with zf.open(metadata_name) as bwf:
- wf = wrapper(bwf)
- commands = json.load(wf).get('extensions')
- if commands:
- commands = commands.get('python.commands')
- except Exception:
- logger.warning('Unable to read JSON metadata, so '
- 'cannot generate scripts')
- if commands:
- console_scripts = commands.get('wrap_console', {})
- gui_scripts = commands.get('wrap_gui', {})
- if console_scripts or gui_scripts:
- script_dir = paths.get('scripts', '')
- if not os.path.isdir(script_dir):
- raise ValueError('Valid script path not '
- 'specified')
- maker.target_dir = script_dir
- for k, v in console_scripts.items():
- script = '%s = %s' % (k, v)
- filenames = maker.make(script)
- fileop.set_executable_mode(filenames)
-
- if gui_scripts:
- options = {'gui': True}
- for k, v in gui_scripts.items():
- script = '%s = %s' % (k, v)
- filenames = maker.make(script, options)
- fileop.set_executable_mode(filenames)
-
- p = os.path.join(libdir, info_dir)
- dist = InstalledDistribution(p)
-
- # Write SHARED
- paths = dict(paths) # don't change passed in dict
- del paths['purelib']
- del paths['platlib']
- paths['lib'] = libdir
- p = dist.write_shared_locations(paths, dry_run)
- if p:
- outfiles.append(p)
-
- # Write RECORD
- dist.write_installed_files(outfiles, paths['prefix'],
- dry_run)
- return dist
- except Exception: # pragma: no cover
- logger.exception('installation failed.')
- fileop.rollback()
- raise
- finally:
- shutil.rmtree(workdir)
-
- def _get_dylib_cache(self):
- global cache
- if cache is None:
- # Use native string to avoid issues on 2.x: see Python #20140.
- base = os.path.join(get_cache_base(), str('dylib-cache'),
- '%s.%s' % sys.version_info[:2])
- cache = Cache(base)
- return cache
-
- def _get_extensions(self):
- pathname = os.path.join(self.dirname, self.filename)
- name_ver = '%s-%s' % (self.name, self.version)
- info_dir = '%s.dist-info' % name_ver
- arcname = posixpath.join(info_dir, 'EXTENSIONS')
- wrapper = codecs.getreader('utf-8')
- result = []
- with ZipFile(pathname, 'r') as zf:
- try:
- with zf.open(arcname) as bf:
- wf = wrapper(bf)
- extensions = json.load(wf)
- cache = self._get_dylib_cache()
- prefix = cache.prefix_to_dir(pathname)
- cache_base = os.path.join(cache.base, prefix)
- if not os.path.isdir(cache_base):
- os.makedirs(cache_base)
- for name, relpath in extensions.items():
- dest = os.path.join(cache_base, convert_path(relpath))
- if not os.path.exists(dest):
- extract = True
- else:
- file_time = os.stat(dest).st_mtime
- file_time = datetime.datetime.fromtimestamp(
- file_time)
- info = zf.getinfo(relpath)
- wheel_time = datetime.datetime(*info.date_time)
- extract = wheel_time > file_time
- if extract:
- zf.extract(relpath, cache_base)
- result.append((name, dest))
- except KeyError:
- pass
- return result
-
- def is_compatible(self):
- """
- Determine if a wheel is compatible with the running system.
- """
- return is_compatible(self)
-
- def is_mountable(self):
- """
- Determine if a wheel is asserted as mountable by its metadata.
- """
- return True # for now - metadata details TBD
-
- def mount(self, append=False):
- pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
- if not self.is_compatible():
- msg = 'Wheel %s not compatible with this Python.' % pathname
- raise DistlibException(msg)
- if not self.is_mountable():
- msg = 'Wheel %s is marked as not mountable.' % pathname
- raise DistlibException(msg)
- if pathname in sys.path:
- logger.debug('%s already in path', pathname)
- else:
- if append:
- sys.path.append(pathname)
- else:
- sys.path.insert(0, pathname)
- extensions = self._get_extensions()
- if extensions:
- if _hook not in sys.meta_path:
- sys.meta_path.append(_hook)
- _hook.add(pathname, extensions)
-
- def unmount(self):
- pathname = os.path.abspath(os.path.join(self.dirname, self.filename))
- if pathname not in sys.path:
- logger.debug('%s not in path', pathname)
- else:
- sys.path.remove(pathname)
- if pathname in _hook.impure_wheels:
- _hook.remove(pathname)
- if not _hook.impure_wheels:
- if _hook in sys.meta_path:
- sys.meta_path.remove(_hook)
-
- def verify(self):
- pathname = os.path.join(self.dirname, self.filename)
- name_ver = '%s-%s' % (self.name, self.version)
- # data_dir = '%s.data' % name_ver
- info_dir = '%s.dist-info' % name_ver
-
- # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME)
- wheel_metadata_name = posixpath.join(info_dir, 'WHEEL')
- record_name = posixpath.join(info_dir, 'RECORD')
-
- wrapper = codecs.getreader('utf-8')
-
- with ZipFile(pathname, 'r') as zf:
- with zf.open(wheel_metadata_name) as bwf:
- wf = wrapper(bwf)
- message_from_file(wf)
- # wv = message['Wheel-Version'].split('.', 1)
- # file_version = tuple([int(i) for i in wv])
- # TODO version verification
-
- records = {}
- with zf.open(record_name) as bf:
- with CSVReader(stream=bf) as reader:
- for row in reader:
- p = row[0]
- records[p] = row
-
- for zinfo in zf.infolist():
- arcname = zinfo.filename
- if isinstance(arcname, text_type):
- u_arcname = arcname
- else:
- u_arcname = arcname.decode('utf-8')
- # See issue #115: some wheels have .. in their entries, but
- # in the filename ... e.g. __main__..py ! So the check is
- # updated to look for .. in the directory portions
- p = u_arcname.split('/')
- if '..' in p:
- raise DistlibException('invalid entry in '
- 'wheel: %r' % u_arcname)
-
- if self.skip_entry(u_arcname):
- continue
- row = records[u_arcname]
- if row[2] and str(zinfo.file_size) != row[2]:
- raise DistlibException('size mismatch for '
- '%s' % u_arcname)
- if row[1]:
- kind, value = row[1].split('=', 1)
- with zf.open(arcname) as bf:
- data = bf.read()
- _, digest = self.get_hash(data, kind)
- if digest != value:
- raise DistlibException('digest mismatch for '
- '%s' % arcname)
-
- def update(self, modifier, dest_dir=None, **kwargs):
- """
- Update the contents of a wheel in a generic way. The modifier should
- be a callable which expects a dictionary argument: its keys are
- archive-entry paths, and its values are absolute filesystem paths
- where the contents the corresponding archive entries can be found. The
- modifier is free to change the contents of the files pointed to, add
- new entries and remove entries, before returning. This method will
- extract the entire contents of the wheel to a temporary location, call
- the modifier, and then use the passed (and possibly updated)
- dictionary to write a new wheel. If ``dest_dir`` is specified, the new
- wheel is written there -- otherwise, the original wheel is overwritten.
-
- The modifier should return True if it updated the wheel, else False.
- This method returns the same value the modifier returns.
- """
-
- def get_version(path_map, info_dir):
- version = path = None
- key = '%s/%s' % (info_dir, LEGACY_METADATA_FILENAME)
- if key not in path_map:
- key = '%s/PKG-INFO' % info_dir
- if key in path_map:
- path = path_map[key]
- version = Metadata(path=path).version
- return version, path
-
- def update_version(version, path):
- updated = None
- try:
- NormalizedVersion(version)
- i = version.find('-')
- if i < 0:
- updated = '%s+1' % version
- else:
- parts = [int(s) for s in version[i + 1:].split('.')]
- parts[-1] += 1
- updated = '%s+%s' % (version[:i], '.'.join(
- str(i) for i in parts))
- except UnsupportedVersionError:
- logger.debug(
- 'Cannot update non-compliant (PEP-440) '
- 'version %r', version)
- if updated:
- md = Metadata(path=path)
- md.version = updated
- legacy = path.endswith(LEGACY_METADATA_FILENAME)
- md.write(path=path, legacy=legacy)
- logger.debug('Version updated from %r to %r', version, updated)
-
- pathname = os.path.join(self.dirname, self.filename)
- name_ver = '%s-%s' % (self.name, self.version)
- info_dir = '%s.dist-info' % name_ver
- record_name = posixpath.join(info_dir, 'RECORD')
- with tempdir() as workdir:
- with ZipFile(pathname, 'r') as zf:
- path_map = {}
- for zinfo in zf.infolist():
- arcname = zinfo.filename
- if isinstance(arcname, text_type):
- u_arcname = arcname
- else:
- u_arcname = arcname.decode('utf-8')
- if u_arcname == record_name:
- continue
- if '..' in u_arcname:
- raise DistlibException('invalid entry in '
- 'wheel: %r' % u_arcname)
- zf.extract(zinfo, workdir)
- path = os.path.join(workdir, convert_path(u_arcname))
- path_map[u_arcname] = path
-
- # Remember the version.
- original_version, _ = get_version(path_map, info_dir)
- # Files extracted. Call the modifier.
- modified = modifier(path_map, **kwargs)
- if modified:
- # Something changed - need to build a new wheel.
- current_version, path = get_version(path_map, info_dir)
- if current_version and (current_version == original_version):
- # Add or update local version to signify changes.
- update_version(current_version, path)
- # Decide where the new wheel goes.
- if dest_dir is None:
- fd, newpath = tempfile.mkstemp(suffix='.whl',
- prefix='wheel-update-',
- dir=workdir)
- os.close(fd)
- else:
- if not os.path.isdir(dest_dir):
- raise DistlibException('Not a directory: %r' %
- dest_dir)
- newpath = os.path.join(dest_dir, self.filename)
- archive_paths = list(path_map.items())
- distinfo = os.path.join(workdir, info_dir)
- info = distinfo, info_dir
- self.write_records(info, workdir, archive_paths)
- self.build_zip(newpath, archive_paths)
- if dest_dir is None:
- shutil.copyfile(newpath, pathname)
- return modified
-
-
-def _get_glibc_version():
- import platform
- ver = platform.libc_ver()
- result = []
- if ver[0] == 'glibc':
- for s in ver[1].split('.'):
- result.append(int(s) if s.isdigit() else 0)
- result = tuple(result)
- return result
-
-
-def compatible_tags():
- """
- Return (pyver, abi, arch) tuples compatible with this Python.
- """
- versions = [VER_SUFFIX]
- major = VER_SUFFIX[0]
- for minor in range(sys.version_info[1] - 1, -1, -1):
- versions.append(''.join([major, str(minor)]))
-
- abis = []
- for suffix in _get_suffixes():
- if suffix.startswith('.abi'):
- abis.append(suffix.split('.', 2)[1])
- abis.sort()
- if ABI != 'none':
- abis.insert(0, ABI)
- abis.append('none')
- result = []
-
- arches = [ARCH]
- if sys.platform == 'darwin':
- m = re.match(r'(\w+)_(\d+)_(\d+)_(\w+)$', ARCH)
- if m:
- name, major, minor, arch = m.groups()
- minor = int(minor)
- matches = [arch]
- if arch in ('i386', 'ppc'):
- matches.append('fat')
- if arch in ('i386', 'ppc', 'x86_64'):
- matches.append('fat3')
- if arch in ('ppc64', 'x86_64'):
- matches.append('fat64')
- if arch in ('i386', 'x86_64'):
- matches.append('intel')
- if arch in ('i386', 'x86_64', 'intel', 'ppc', 'ppc64'):
- matches.append('universal')
- while minor >= 0:
- for match in matches:
- s = '%s_%s_%s_%s' % (name, major, minor, match)
- if s != ARCH: # already there
- arches.append(s)
- minor -= 1
-
- # Most specific - our Python version, ABI and arch
- for abi in abis:
- for arch in arches:
- result.append((''.join((IMP_PREFIX, versions[0])), abi, arch))
- # manylinux
- if abi != 'none' and sys.platform.startswith('linux'):
- arch = arch.replace('linux_', '')
- parts = _get_glibc_version()
- if len(parts) == 2:
- if parts >= (2, 5):
- result.append((''.join((IMP_PREFIX, versions[0])), abi,
- 'manylinux1_%s' % arch))
- if parts >= (2, 12):
- result.append((''.join((IMP_PREFIX, versions[0])), abi,
- 'manylinux2010_%s' % arch))
- if parts >= (2, 17):
- result.append((''.join((IMP_PREFIX, versions[0])), abi,
- 'manylinux2014_%s' % arch))
- result.append(
- (''.join((IMP_PREFIX, versions[0])), abi,
- 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch)))
-
- # where no ABI / arch dependency, but IMP_PREFIX dependency
- for i, version in enumerate(versions):
- result.append((''.join((IMP_PREFIX, version)), 'none', 'any'))
- if i == 0:
- result.append((''.join((IMP_PREFIX, version[0])), 'none', 'any'))
-
- # no IMP_PREFIX, ABI or arch dependency
- for i, version in enumerate(versions):
- result.append((''.join(('py', version)), 'none', 'any'))
- if i == 0:
- result.append((''.join(('py', version[0])), 'none', 'any'))
-
- return set(result)
-
-
-COMPATIBLE_TAGS = compatible_tags()
-
-del compatible_tags
-
-
-def is_compatible(wheel, tags=None):
- if not isinstance(wheel, Wheel):
- wheel = Wheel(wheel) # assume it's a filename
- result = False
- if tags is None:
- tags = COMPATIBLE_TAGS
- for ver, abi, arch in tags:
- if ver in wheel.pyver and abi in wheel.abi and arch in wheel.arch:
- result = True
- break
- return result
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc
index 1c1a30bb..7eb90930 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc
index 0f1ee889..0775a68c 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc
index dc5c6a10..07005f65 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
index 89e18680..78ccdfa4 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python
-# Copyright 2015,2016,2017 Nir Cohen
+# Copyright 2015-2021 Nir Cohen
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -55,7 +55,7 @@ except ImportError:
# Python 3.7
TypedDict = dict
-__version__ = "1.8.0"
+__version__ = "1.9.0"
class VersionDict(TypedDict):
@@ -125,6 +125,7 @@ _DISTRO_RELEASE_BASENAME_PATTERN = re.compile(r"(\w+)[-_](release|version)$")
# Base file names to be looked up for if _UNIXCONFDIR is not readable.
_DISTRO_RELEASE_BASENAMES = [
"SuSE-release",
+ "altlinux-release",
"arch-release",
"base-release",
"centos-release",
@@ -151,6 +152,8 @@ _DISTRO_RELEASE_IGNORE_BASENAMES = (
"system-release",
"plesk-release",
"iredmail-release",
+ "board-release",
+ "ec2_version",
)
@@ -243,6 +246,7 @@ def id() -> str:
"rocky" Rocky Linux
"aix" AIX
"guix" Guix System
+ "altlinux" ALT Linux
============== =========================================
If you have a need to get distros for reliable IDs added into this set,
@@ -991,10 +995,10 @@ class LinuxDistribution:
For details, see :func:`distro.info`.
"""
- return dict(
+ return InfoDict(
id=self.id(),
version=self.version(pretty, best),
- version_parts=dict(
+ version_parts=VersionDict(
major=self.major_version(best),
minor=self.minor_version(best),
build_number=self.build_number(best),
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/distro/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py
index a40eeafc..cfdc030a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py
@@ -1,4 +1,3 @@
-from .package_data import __version__
from .core import (
IDNABidiError,
IDNAError,
@@ -20,8 +19,10 @@ from .core import (
valid_string_length,
)
from .intranges import intranges_contain
+from .package_data import __version__
__all__ = [
+ "__version__",
"IDNABidiError",
"IDNAError",
"InvalidCodepoint",
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc
index 43d544e7..6bd4ac63 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc
index 73fbf355..88c106cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc
index c0de70a0..6e858c4f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc
index 319452a7..24c34a38 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/core.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc
index 7232d3cd..08bacead 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc
index 80484fff..ad48e267 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc
index 6602fe36..25b0fa0d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc
index 00e3044d..5d32b2f4 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py
index 1ca9ba62..913abfd6 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py
@@ -1,49 +1,51 @@
-from .core import encode, decode, alabel, ulabel, IDNAError
import codecs
import re
-from typing import Tuple, Optional
+from typing import Any, Optional, Tuple
+
+from .core import IDNAError, alabel, decode, encode, ulabel
+
+_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]")
-_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
class Codec(codecs.Codec):
-
- def encode(self, data: str, errors: str = 'strict') -> Tuple[bytes, int]:
- if errors != 'strict':
- raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
+ def encode(self, data: str, errors: str = "strict") -> Tuple[bytes, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
return b"", 0
return encode(data), len(data)
- def decode(self, data: bytes, errors: str = 'strict') -> Tuple[str, int]:
- if errors != 'strict':
- raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
-
- if not data:
- return '', 0
-
- return decode(data), len(data)
-
-class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
- def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
- if errors != 'strict':
- raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
+ def decode(self, data: bytes, errors: str = "strict") -> Tuple[str, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
return "", 0
+ return decode(data), len(data)
+
+
+class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
+ def _buffer_encode(self, data: str, errors: str, final: bool) -> Tuple[bytes, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
+
+ if not data:
+ return b"", 0
+
labels = _unicode_dots_re.split(data)
- trailing_dot = ''
+ trailing_dot = b""
if labels:
if not labels[-1]:
- trailing_dot = '.'
+ trailing_dot = b"."
del labels[-1]
elif not final:
# Keep potentially unfinished label until the next call
del labels[-1]
if labels:
- trailing_dot = '.'
+ trailing_dot = b"."
result = []
size = 0
@@ -54,29 +56,33 @@ class IncrementalEncoder(codecs.BufferedIncrementalEncoder):
size += len(label)
# Join with U+002E
- result_str = '.'.join(result) + trailing_dot # type: ignore
+ result_bytes = b".".join(result) + trailing_dot
size += len(trailing_dot)
- return result_str, size
+ return result_bytes, size
+
class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
- def _buffer_decode(self, data: str, errors: str, final: bool) -> Tuple[str, int]: # type: ignore
- if errors != 'strict':
- raise IDNAError('Unsupported error handling \"{}\"'.format(errors))
+ def _buffer_decode(self, data: Any, errors: str, final: bool) -> Tuple[str, int]:
+ if errors != "strict":
+ raise IDNAError('Unsupported error handling "{}"'.format(errors))
if not data:
- return ('', 0)
+ return ("", 0)
+
+ if not isinstance(data, str):
+ data = str(data, "ascii")
labels = _unicode_dots_re.split(data)
- trailing_dot = ''
+ trailing_dot = ""
if labels:
if not labels[-1]:
- trailing_dot = '.'
+ trailing_dot = "."
del labels[-1]
elif not final:
# Keep potentially unfinished label until the next call
del labels[-1]
if labels:
- trailing_dot = '.'
+ trailing_dot = "."
result = []
size = 0
@@ -86,7 +92,7 @@ class IncrementalDecoder(codecs.BufferedIncrementalDecoder):
size += 1
size += len(label)
- result_str = '.'.join(result) + trailing_dot
+ result_str = ".".join(result) + trailing_dot
size += len(trailing_dot)
return (result_str, size)
@@ -99,14 +105,18 @@ class StreamReader(Codec, codecs.StreamReader):
pass
-def getregentry() -> codecs.CodecInfo:
- # Compatibility as a search_function for codecs.register()
+def search_function(name: str) -> Optional[codecs.CodecInfo]:
+ if name != "idna2008":
+ return None
return codecs.CodecInfo(
- name='idna',
- encode=Codec().encode, # type: ignore
- decode=Codec().decode, # type: ignore
+ name=name,
+ encode=Codec().encode,
+ decode=Codec().decode,
incrementalencoder=IncrementalEncoder,
incrementaldecoder=IncrementalDecoder,
streamwriter=StreamWriter,
streamreader=StreamReader,
)
+
+
+codecs.register(search_function)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py
index 786e6bda..1df9f2a7 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py
@@ -1,13 +1,15 @@
-from .core import *
-from .codec import *
from typing import Any, Union
+from .core import decode, encode
+
+
def ToASCII(label: str) -> bytes:
return encode(label)
+
def ToUnicode(label: Union[bytes, bytearray]) -> str:
return decode(label)
-def nameprep(s: Any) -> None:
- raise NotImplementedError('IDNA 2008 does not utilise nameprep protocol')
+def nameprep(s: Any) -> None:
+ raise NotImplementedError("IDNA 2008 does not utilise nameprep protocol")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py
index aea17acf..9115f123 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py
@@ -1,31 +1,37 @@
-from . import idnadata
import bisect
-import unicodedata
import re
-from typing import Union, Optional
+import unicodedata
+from typing import Optional, Union
+
+from . import idnadata
from .intranges import intranges_contain
_virama_combining_class = 9
-_alabel_prefix = b'xn--'
-_unicode_dots_re = re.compile('[\u002e\u3002\uff0e\uff61]')
+_alabel_prefix = b"xn--"
+_unicode_dots_re = re.compile("[\u002e\u3002\uff0e\uff61]")
+
class IDNAError(UnicodeError):
- """ Base exception for all IDNA-encoding related problems """
+ """Base exception for all IDNA-encoding related problems"""
+
pass
class IDNABidiError(IDNAError):
- """ Exception when bidirectional requirements are not satisfied """
+ """Exception when bidirectional requirements are not satisfied"""
+
pass
class InvalidCodepoint(IDNAError):
- """ Exception when a disallowed or unallocated codepoint is used """
+ """Exception when a disallowed or unallocated codepoint is used"""
+
pass
class InvalidCodepointContext(IDNAError):
- """ Exception when the codepoint is not valid in the context it is used """
+ """Exception when the codepoint is not valid in the context it is used"""
+
pass
@@ -33,17 +39,20 @@ def _combining_class(cp: int) -> int:
v = unicodedata.combining(chr(cp))
if v == 0:
if not unicodedata.name(chr(cp)):
- raise ValueError('Unknown character in unicodedata')
+ raise ValueError("Unknown character in unicodedata")
return v
+
def _is_script(cp: str, script: str) -> bool:
return intranges_contain(ord(cp), idnadata.scripts[script])
+
def _punycode(s: str) -> bytes:
- return s.encode('punycode')
+ return s.encode("punycode")
+
def _unot(s: int) -> str:
- return 'U+{:04X}'.format(s)
+ return "U+{:04X}".format(s)
def valid_label_length(label: Union[bytes, str]) -> bool:
@@ -61,96 +70,106 @@ def valid_string_length(label: Union[bytes, str], trailing_dot: bool) -> bool:
def check_bidi(label: str, check_ltr: bool = False) -> bool:
# Bidi rules should only be applied if string contains RTL characters
bidi_label = False
- for (idx, cp) in enumerate(label, 1):
+ for idx, cp in enumerate(label, 1):
direction = unicodedata.bidirectional(cp)
- if direction == '':
+ if direction == "":
# String likely comes from a newer version of Unicode
- raise IDNABidiError('Unknown directionality in label {} at position {}'.format(repr(label), idx))
- if direction in ['R', 'AL', 'AN']:
+ raise IDNABidiError("Unknown directionality in label {} at position {}".format(repr(label), idx))
+ if direction in ["R", "AL", "AN"]:
bidi_label = True
if not bidi_label and not check_ltr:
return True
# Bidi rule 1
direction = unicodedata.bidirectional(label[0])
- if direction in ['R', 'AL']:
+ if direction in ["R", "AL"]:
rtl = True
- elif direction == 'L':
+ elif direction == "L":
rtl = False
else:
- raise IDNABidiError('First codepoint in label {} must be directionality L, R or AL'.format(repr(label)))
+ raise IDNABidiError("First codepoint in label {} must be directionality L, R or AL".format(repr(label)))
valid_ending = False
- number_type = None # type: Optional[str]
- for (idx, cp) in enumerate(label, 1):
+ number_type: Optional[str] = None
+ for idx, cp in enumerate(label, 1):
direction = unicodedata.bidirectional(cp)
if rtl:
# Bidi rule 2
- if not direction in ['R', 'AL', 'AN', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {} in a right-to-left label'.format(idx))
+ if direction not in [
+ "R",
+ "AL",
+ "AN",
+ "EN",
+ "ES",
+ "CS",
+ "ET",
+ "ON",
+ "BN",
+ "NSM",
+ ]:
+ raise IDNABidiError("Invalid direction for codepoint at position {} in a right-to-left label".format(idx))
# Bidi rule 3
- if direction in ['R', 'AL', 'EN', 'AN']:
+ if direction in ["R", "AL", "EN", "AN"]:
valid_ending = True
- elif direction != 'NSM':
+ elif direction != "NSM":
valid_ending = False
# Bidi rule 4
- if direction in ['AN', 'EN']:
+ if direction in ["AN", "EN"]:
if not number_type:
number_type = direction
else:
if number_type != direction:
- raise IDNABidiError('Can not mix numeral types in a right-to-left label')
+ raise IDNABidiError("Can not mix numeral types in a right-to-left label")
else:
# Bidi rule 5
- if not direction in ['L', 'EN', 'ES', 'CS', 'ET', 'ON', 'BN', 'NSM']:
- raise IDNABidiError('Invalid direction for codepoint at position {} in a left-to-right label'.format(idx))
+ if direction not in ["L", "EN", "ES", "CS", "ET", "ON", "BN", "NSM"]:
+ raise IDNABidiError("Invalid direction for codepoint at position {} in a left-to-right label".format(idx))
# Bidi rule 6
- if direction in ['L', 'EN']:
+ if direction in ["L", "EN"]:
valid_ending = True
- elif direction != 'NSM':
+ elif direction != "NSM":
valid_ending = False
if not valid_ending:
- raise IDNABidiError('Label ends with illegal codepoint directionality')
+ raise IDNABidiError("Label ends with illegal codepoint directionality")
return True
def check_initial_combiner(label: str) -> bool:
- if unicodedata.category(label[0])[0] == 'M':
- raise IDNAError('Label begins with an illegal combining character')
+ if unicodedata.category(label[0])[0] == "M":
+ raise IDNAError("Label begins with an illegal combining character")
return True
def check_hyphen_ok(label: str) -> bool:
- if label[2:4] == '--':
- raise IDNAError('Label has disallowed hyphens in 3rd and 4th position')
- if label[0] == '-' or label[-1] == '-':
- raise IDNAError('Label must not start or end with a hyphen')
+ if label[2:4] == "--":
+ raise IDNAError("Label has disallowed hyphens in 3rd and 4th position")
+ if label[0] == "-" or label[-1] == "-":
+ raise IDNAError("Label must not start or end with a hyphen")
return True
def check_nfc(label: str) -> None:
- if unicodedata.normalize('NFC', label) != label:
- raise IDNAError('Label must be in Normalization Form C')
+ if unicodedata.normalize("NFC", label) != label:
+ raise IDNAError("Label must be in Normalization Form C")
def valid_contextj(label: str, pos: int) -> bool:
cp_value = ord(label[pos])
- if cp_value == 0x200c:
-
+ if cp_value == 0x200C:
if pos > 0:
if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
return True
ok = False
- for i in range(pos-1, -1, -1):
+ for i in range(pos - 1, -1, -1):
joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
+ if joining_type == ord("T"):
continue
- elif joining_type in [ord('L'), ord('D')]:
+ elif joining_type in [ord("L"), ord("D")]:
ok = True
break
else:
@@ -160,63 +179,61 @@ def valid_contextj(label: str, pos: int) -> bool:
return False
ok = False
- for i in range(pos+1, len(label)):
+ for i in range(pos + 1, len(label)):
joining_type = idnadata.joining_types.get(ord(label[i]))
- if joining_type == ord('T'):
+ if joining_type == ord("T"):
continue
- elif joining_type in [ord('R'), ord('D')]:
+ elif joining_type in [ord("R"), ord("D")]:
ok = True
break
else:
break
return ok
- if cp_value == 0x200d:
-
+ if cp_value == 0x200D:
if pos > 0:
if _combining_class(ord(label[pos - 1])) == _virama_combining_class:
return True
return False
else:
-
return False
def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
cp_value = ord(label[pos])
- if cp_value == 0x00b7:
- if 0 < pos < len(label)-1:
- if ord(label[pos - 1]) == 0x006c and ord(label[pos + 1]) == 0x006c:
+ if cp_value == 0x00B7:
+ if 0 < pos < len(label) - 1:
+ if ord(label[pos - 1]) == 0x006C and ord(label[pos + 1]) == 0x006C:
return True
return False
elif cp_value == 0x0375:
- if pos < len(label)-1 and len(label) > 1:
- return _is_script(label[pos + 1], 'Greek')
+ if pos < len(label) - 1 and len(label) > 1:
+ return _is_script(label[pos + 1], "Greek")
return False
- elif cp_value == 0x05f3 or cp_value == 0x05f4:
+ elif cp_value == 0x05F3 or cp_value == 0x05F4:
if pos > 0:
- return _is_script(label[pos - 1], 'Hebrew')
+ return _is_script(label[pos - 1], "Hebrew")
return False
- elif cp_value == 0x30fb:
+ elif cp_value == 0x30FB:
for cp in label:
- if cp == '\u30fb':
+ if cp == "\u30fb":
continue
- if _is_script(cp, 'Hiragana') or _is_script(cp, 'Katakana') or _is_script(cp, 'Han'):
+ if _is_script(cp, "Hiragana") or _is_script(cp, "Katakana") or _is_script(cp, "Han"):
return True
return False
elif 0x660 <= cp_value <= 0x669:
for cp in label:
- if 0x6f0 <= ord(cp) <= 0x06f9:
+ if 0x6F0 <= ord(cp) <= 0x06F9:
return False
return True
- elif 0x6f0 <= cp_value <= 0x6f9:
+ elif 0x6F0 <= cp_value <= 0x6F9:
for cp in label:
if 0x660 <= ord(cp) <= 0x0669:
return False
@@ -227,51 +244,58 @@ def valid_contexto(label: str, pos: int, exception: bool = False) -> bool:
def check_label(label: Union[str, bytes, bytearray]) -> None:
if isinstance(label, (bytes, bytearray)):
- label = label.decode('utf-8')
+ label = label.decode("utf-8")
if len(label) == 0:
- raise IDNAError('Empty Label')
+ raise IDNAError("Empty Label")
check_nfc(label)
check_hyphen_ok(label)
check_initial_combiner(label)
- for (pos, cp) in enumerate(label):
+ for pos, cp in enumerate(label):
cp_value = ord(cp)
- if intranges_contain(cp_value, idnadata.codepoint_classes['PVALID']):
+ if intranges_contain(cp_value, idnadata.codepoint_classes["PVALID"]):
continue
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTJ']):
- if not valid_contextj(label, pos):
- raise InvalidCodepointContext('Joiner {} not allowed at position {} in {}'.format(
- _unot(cp_value), pos+1, repr(label)))
- elif intranges_contain(cp_value, idnadata.codepoint_classes['CONTEXTO']):
+ elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTJ"]):
+ try:
+ if not valid_contextj(label, pos):
+ raise InvalidCodepointContext(
+ "Joiner {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label))
+ )
+ except ValueError:
+ raise IDNAError(
+ "Unknown codepoint adjacent to joiner {} at position {} in {}".format(
+ _unot(cp_value), pos + 1, repr(label)
+ )
+ )
+ elif intranges_contain(cp_value, idnadata.codepoint_classes["CONTEXTO"]):
if not valid_contexto(label, pos):
- raise InvalidCodepointContext('Codepoint {} not allowed at position {} in {}'.format(_unot(cp_value), pos+1, repr(label)))
+ raise InvalidCodepointContext(
+ "Codepoint {} not allowed at position {} in {}".format(_unot(cp_value), pos + 1, repr(label))
+ )
else:
- raise InvalidCodepoint('Codepoint {} at position {} of {} not allowed'.format(_unot(cp_value), pos+1, repr(label)))
+ raise InvalidCodepoint(
+ "Codepoint {} at position {} of {} not allowed".format(_unot(cp_value), pos + 1, repr(label))
+ )
check_bidi(label)
def alabel(label: str) -> bytes:
try:
- label_bytes = label.encode('ascii')
+ label_bytes = label.encode("ascii")
ulabel(label_bytes)
if not valid_label_length(label_bytes):
- raise IDNAError('Label too long')
+ raise IDNAError("Label too long")
return label_bytes
except UnicodeEncodeError:
pass
- if not label:
- raise IDNAError('No Input')
-
- label = str(label)
check_label(label)
- label_bytes = _punycode(label)
- label_bytes = _alabel_prefix + label_bytes
+ label_bytes = _alabel_prefix + _punycode(label)
if not valid_label_length(label_bytes):
- raise IDNAError('Label too long')
+ raise IDNAError("Label too long")
return label_bytes
@@ -279,7 +303,7 @@ def alabel(label: str) -> bytes:
def ulabel(label: Union[str, bytes, bytearray]) -> str:
if not isinstance(label, (bytes, bytearray)):
try:
- label_bytes = label.encode('ascii')
+ label_bytes = label.encode("ascii")
except UnicodeEncodeError:
check_label(label)
return label
@@ -288,19 +312,19 @@ def ulabel(label: Union[str, bytes, bytearray]) -> str:
label_bytes = label_bytes.lower()
if label_bytes.startswith(_alabel_prefix):
- label_bytes = label_bytes[len(_alabel_prefix):]
+ label_bytes = label_bytes[len(_alabel_prefix) :]
if not label_bytes:
- raise IDNAError('Malformed A-label, no Punycode eligible content found')
- if label_bytes.decode('ascii')[-1] == '-':
- raise IDNAError('A-label must not end with a hyphen')
+ raise IDNAError("Malformed A-label, no Punycode eligible content found")
+ if label_bytes.decode("ascii")[-1] == "-":
+ raise IDNAError("A-label must not end with a hyphen")
else:
check_label(label_bytes)
- return label_bytes.decode('ascii')
+ return label_bytes.decode("ascii")
try:
- label = label_bytes.decode('punycode')
+ label = label_bytes.decode("punycode")
except UnicodeError:
- raise IDNAError('Invalid A-label')
+ raise IDNAError("Invalid A-label")
check_label(label)
return label
@@ -308,52 +332,60 @@ def ulabel(label: Union[str, bytes, bytearray]) -> str:
def uts46_remap(domain: str, std3_rules: bool = True, transitional: bool = False) -> str:
"""Re-map the characters in the string according to UTS46 processing."""
from .uts46data import uts46data
- output = ''
+
+ output = ""
for pos, char in enumerate(domain):
code_point = ord(char)
try:
- uts46row = uts46data[code_point if code_point < 256 else
- bisect.bisect_left(uts46data, (code_point, 'Z')) - 1]
+ uts46row = uts46data[code_point if code_point < 256 else bisect.bisect_left(uts46data, (code_point, "Z")) - 1]
status = uts46row[1]
- replacement = None # type: Optional[str]
+ replacement: Optional[str] = None
if len(uts46row) == 3:
- replacement = uts46row[2] # type: ignore
- if (status == 'V' or
- (status == 'D' and not transitional) or
- (status == '3' and not std3_rules and replacement is None)):
+ replacement = uts46row[2]
+ if (
+ status == "V"
+ or (status == "D" and not transitional)
+ or (status == "3" and not std3_rules and replacement is None)
+ ):
output += char
- elif replacement is not None and (status == 'M' or
- (status == '3' and not std3_rules) or
- (status == 'D' and transitional)):
+ elif replacement is not None and (
+ status == "M" or (status == "3" and not std3_rules) or (status == "D" and transitional)
+ ):
output += replacement
- elif status != 'I':
+ elif status != "I":
raise IndexError()
except IndexError:
raise InvalidCodepoint(
- 'Codepoint {} not allowed at position {} in {}'.format(
- _unot(code_point), pos + 1, repr(domain)))
+ "Codepoint {} not allowed at position {} in {}".format(_unot(code_point), pos + 1, repr(domain))
+ )
- return unicodedata.normalize('NFC', output)
+ return unicodedata.normalize("NFC", output)
-def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False, transitional: bool = False) -> bytes:
- if isinstance(s, (bytes, bytearray)):
+def encode(
+ s: Union[str, bytes, bytearray],
+ strict: bool = False,
+ uts46: bool = False,
+ std3_rules: bool = False,
+ transitional: bool = False,
+) -> bytes:
+ if not isinstance(s, str):
try:
- s = s.decode('ascii')
+ s = str(s, "ascii")
except UnicodeDecodeError:
- raise IDNAError('should pass a unicode string to the function rather than a byte string.')
+ raise IDNAError("should pass a unicode string to the function rather than a byte string.")
if uts46:
s = uts46_remap(s, std3_rules, transitional)
trailing_dot = False
result = []
if strict:
- labels = s.split('.')
+ labels = s.split(".")
else:
labels = _unicode_dots_re.split(s)
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
- if labels[-1] == '':
+ if not labels or labels == [""]:
+ raise IDNAError("Empty domain")
+ if labels[-1] == "":
del labels[-1]
trailing_dot = True
for label in labels:
@@ -361,21 +393,26 @@ def encode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool =
if s:
result.append(s)
else:
- raise IDNAError('Empty label')
+ raise IDNAError("Empty label")
if trailing_dot:
- result.append(b'')
- s = b'.'.join(result)
+ result.append(b"")
+ s = b".".join(result)
if not valid_string_length(s, trailing_dot):
- raise IDNAError('Domain too long')
+ raise IDNAError("Domain too long")
return s
-def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool = False, std3_rules: bool = False) -> str:
+def decode(
+ s: Union[str, bytes, bytearray],
+ strict: bool = False,
+ uts46: bool = False,
+ std3_rules: bool = False,
+) -> str:
try:
- if isinstance(s, (bytes, bytearray)):
- s = s.decode('ascii')
+ if not isinstance(s, str):
+ s = str(s, "ascii")
except UnicodeDecodeError:
- raise IDNAError('Invalid ASCII in A-label')
+ raise IDNAError("Invalid ASCII in A-label")
if uts46:
s = uts46_remap(s, std3_rules, False)
trailing_dot = False
@@ -383,9 +420,9 @@ def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool =
if not strict:
labels = _unicode_dots_re.split(s)
else:
- labels = s.split('.')
- if not labels or labels == ['']:
- raise IDNAError('Empty domain')
+ labels = s.split(".")
+ if not labels or labels == [""]:
+ raise IDNAError("Empty domain")
if not labels[-1]:
del labels[-1]
trailing_dot = True
@@ -394,7 +431,7 @@ def decode(s: Union[str, bytes, bytearray], strict: bool = False, uts46: bool =
if s:
result.append(s)
else:
- raise IDNAError('Empty label')
+ raise IDNAError("Empty label")
if trailing_dot:
- result.append('')
- return '.'.join(result)
+ result.append("")
+ return ".".join(result)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py
index 5b5e02a7..4be60046 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py
@@ -1,106 +1,107 @@
# This file is automatically generated by tools/idna-data
-__version__ = '15.0.0'
+__version__ = "15.1.0"
scripts = {
- 'Greek': (
+ "Greek": (
0x37000000374,
0x37500000378,
- 0x37a0000037e,
- 0x37f00000380,
+ 0x37A0000037E,
+ 0x37F00000380,
0x38400000385,
0x38600000387,
- 0x3880000038b,
- 0x38c0000038d,
- 0x38e000003a2,
- 0x3a3000003e2,
- 0x3f000000400,
- 0x1d2600001d2b,
- 0x1d5d00001d62,
- 0x1d6600001d6b,
- 0x1dbf00001dc0,
- 0x1f0000001f16,
- 0x1f1800001f1e,
- 0x1f2000001f46,
- 0x1f4800001f4e,
- 0x1f5000001f58,
- 0x1f5900001f5a,
- 0x1f5b00001f5c,
- 0x1f5d00001f5e,
- 0x1f5f00001f7e,
- 0x1f8000001fb5,
- 0x1fb600001fc5,
- 0x1fc600001fd4,
- 0x1fd600001fdc,
- 0x1fdd00001ff0,
- 0x1ff200001ff5,
- 0x1ff600001fff,
+ 0x3880000038B,
+ 0x38C0000038D,
+ 0x38E000003A2,
+ 0x3A3000003E2,
+ 0x3F000000400,
+ 0x1D2600001D2B,
+ 0x1D5D00001D62,
+ 0x1D6600001D6B,
+ 0x1DBF00001DC0,
+ 0x1F0000001F16,
+ 0x1F1800001F1E,
+ 0x1F2000001F46,
+ 0x1F4800001F4E,
+ 0x1F5000001F58,
+ 0x1F5900001F5A,
+ 0x1F5B00001F5C,
+ 0x1F5D00001F5E,
+ 0x1F5F00001F7E,
+ 0x1F8000001FB5,
+ 0x1FB600001FC5,
+ 0x1FC600001FD4,
+ 0x1FD600001FDC,
+ 0x1FDD00001FF0,
+ 0x1FF200001FF5,
+ 0x1FF600001FFF,
0x212600002127,
- 0xab650000ab66,
- 0x101400001018f,
- 0x101a0000101a1,
- 0x1d2000001d246,
+ 0xAB650000AB66,
+ 0x101400001018F,
+ 0x101A0000101A1,
+ 0x1D2000001D246,
),
- 'Han': (
- 0x2e8000002e9a,
- 0x2e9b00002ef4,
- 0x2f0000002fd6,
+ "Han": (
+ 0x2E8000002E9A,
+ 0x2E9B00002EF4,
+ 0x2F0000002FD6,
0x300500003006,
0x300700003008,
- 0x30210000302a,
- 0x30380000303c,
- 0x340000004dc0,
- 0x4e000000a000,
- 0xf9000000fa6e,
- 0xfa700000fada,
- 0x16fe200016fe4,
- 0x16ff000016ff2,
- 0x200000002a6e0,
- 0x2a7000002b73a,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x2f8000002fa1e,
- 0x300000003134b,
- 0x31350000323b0,
+ 0x30210000302A,
+ 0x30380000303C,
+ 0x340000004DC0,
+ 0x4E000000A000,
+ 0xF9000000FA6E,
+ 0xFA700000FADA,
+ 0x16FE200016FE4,
+ 0x16FF000016FF2,
+ 0x200000002A6E0,
+ 0x2A7000002B73A,
+ 0x2B7400002B81E,
+ 0x2B8200002CEA2,
+ 0x2CEB00002EBE1,
+ 0x2EBF00002EE5E,
+ 0x2F8000002FA1E,
+ 0x300000003134B,
+ 0x31350000323B0,
),
- 'Hebrew': (
- 0x591000005c8,
- 0x5d0000005eb,
- 0x5ef000005f5,
- 0xfb1d0000fb37,
- 0xfb380000fb3d,
- 0xfb3e0000fb3f,
- 0xfb400000fb42,
- 0xfb430000fb45,
- 0xfb460000fb50,
+ "Hebrew": (
+ 0x591000005C8,
+ 0x5D0000005EB,
+ 0x5EF000005F5,
+ 0xFB1D0000FB37,
+ 0xFB380000FB3D,
+ 0xFB3E0000FB3F,
+ 0xFB400000FB42,
+ 0xFB430000FB45,
+ 0xFB460000FB50,
),
- 'Hiragana': (
+ "Hiragana": (
0x304100003097,
- 0x309d000030a0,
- 0x1b0010001b120,
- 0x1b1320001b133,
- 0x1b1500001b153,
- 0x1f2000001f201,
+ 0x309D000030A0,
+ 0x1B0010001B120,
+ 0x1B1320001B133,
+ 0x1B1500001B153,
+ 0x1F2000001F201,
),
- 'Katakana': (
- 0x30a1000030fb,
- 0x30fd00003100,
- 0x31f000003200,
- 0x32d0000032ff,
+ "Katakana": (
+ 0x30A1000030FB,
+ 0x30FD00003100,
+ 0x31F000003200,
+ 0x32D0000032FF,
0x330000003358,
- 0xff660000ff70,
- 0xff710000ff9e,
- 0x1aff00001aff4,
- 0x1aff50001affc,
- 0x1affd0001afff,
- 0x1b0000001b001,
- 0x1b1200001b123,
- 0x1b1550001b156,
- 0x1b1640001b168,
+ 0xFF660000FF70,
+ 0xFF710000FF9E,
+ 0x1AFF00001AFF4,
+ 0x1AFF50001AFFC,
+ 0x1AFFD0001AFFF,
+ 0x1B0000001B001,
+ 0x1B1200001B123,
+ 0x1B1550001B156,
+ 0x1B1640001B168,
),
}
joining_types = {
- 0xad: 84,
+ 0xAD: 84,
0x300: 84,
0x301: 84,
0x302: 84,
@@ -111,12 +112,12 @@ joining_types = {
0x307: 84,
0x308: 84,
0x309: 84,
- 0x30a: 84,
- 0x30b: 84,
- 0x30c: 84,
- 0x30d: 84,
- 0x30e: 84,
- 0x30f: 84,
+ 0x30A: 84,
+ 0x30B: 84,
+ 0x30C: 84,
+ 0x30D: 84,
+ 0x30E: 84,
+ 0x30F: 84,
0x310: 84,
0x311: 84,
0x312: 84,
@@ -127,12 +128,12 @@ joining_types = {
0x317: 84,
0x318: 84,
0x319: 84,
- 0x31a: 84,
- 0x31b: 84,
- 0x31c: 84,
- 0x31d: 84,
- 0x31e: 84,
- 0x31f: 84,
+ 0x31A: 84,
+ 0x31B: 84,
+ 0x31C: 84,
+ 0x31D: 84,
+ 0x31E: 84,
+ 0x31F: 84,
0x320: 84,
0x321: 84,
0x322: 84,
@@ -143,12 +144,12 @@ joining_types = {
0x327: 84,
0x328: 84,
0x329: 84,
- 0x32a: 84,
- 0x32b: 84,
- 0x32c: 84,
- 0x32d: 84,
- 0x32e: 84,
- 0x32f: 84,
+ 0x32A: 84,
+ 0x32B: 84,
+ 0x32C: 84,
+ 0x32D: 84,
+ 0x32E: 84,
+ 0x32F: 84,
0x330: 84,
0x331: 84,
0x332: 84,
@@ -159,12 +160,12 @@ joining_types = {
0x337: 84,
0x338: 84,
0x339: 84,
- 0x33a: 84,
- 0x33b: 84,
- 0x33c: 84,
- 0x33d: 84,
- 0x33e: 84,
- 0x33f: 84,
+ 0x33A: 84,
+ 0x33B: 84,
+ 0x33C: 84,
+ 0x33D: 84,
+ 0x33E: 84,
+ 0x33F: 84,
0x340: 84,
0x341: 84,
0x342: 84,
@@ -175,12 +176,12 @@ joining_types = {
0x347: 84,
0x348: 84,
0x349: 84,
- 0x34a: 84,
- 0x34b: 84,
- 0x34c: 84,
- 0x34d: 84,
- 0x34e: 84,
- 0x34f: 84,
+ 0x34A: 84,
+ 0x34B: 84,
+ 0x34C: 84,
+ 0x34D: 84,
+ 0x34E: 84,
+ 0x34F: 84,
0x350: 84,
0x351: 84,
0x352: 84,
@@ -191,12 +192,12 @@ joining_types = {
0x357: 84,
0x358: 84,
0x359: 84,
- 0x35a: 84,
- 0x35b: 84,
- 0x35c: 84,
- 0x35d: 84,
- 0x35e: 84,
- 0x35f: 84,
+ 0x35A: 84,
+ 0x35B: 84,
+ 0x35C: 84,
+ 0x35D: 84,
+ 0x35E: 84,
+ 0x35F: 84,
0x360: 84,
0x361: 84,
0x362: 84,
@@ -207,12 +208,12 @@ joining_types = {
0x367: 84,
0x368: 84,
0x369: 84,
- 0x36a: 84,
- 0x36b: 84,
- 0x36c: 84,
- 0x36d: 84,
- 0x36e: 84,
- 0x36f: 84,
+ 0x36A: 84,
+ 0x36B: 84,
+ 0x36C: 84,
+ 0x36D: 84,
+ 0x36E: 84,
+ 0x36F: 84,
0x483: 84,
0x484: 84,
0x485: 84,
@@ -229,48 +230,48 @@ joining_types = {
0x597: 84,
0x598: 84,
0x599: 84,
- 0x59a: 84,
- 0x59b: 84,
- 0x59c: 84,
- 0x59d: 84,
- 0x59e: 84,
- 0x59f: 84,
- 0x5a0: 84,
- 0x5a1: 84,
- 0x5a2: 84,
- 0x5a3: 84,
- 0x5a4: 84,
- 0x5a5: 84,
- 0x5a6: 84,
- 0x5a7: 84,
- 0x5a8: 84,
- 0x5a9: 84,
- 0x5aa: 84,
- 0x5ab: 84,
- 0x5ac: 84,
- 0x5ad: 84,
- 0x5ae: 84,
- 0x5af: 84,
- 0x5b0: 84,
- 0x5b1: 84,
- 0x5b2: 84,
- 0x5b3: 84,
- 0x5b4: 84,
- 0x5b5: 84,
- 0x5b6: 84,
- 0x5b7: 84,
- 0x5b8: 84,
- 0x5b9: 84,
- 0x5ba: 84,
- 0x5bb: 84,
- 0x5bc: 84,
- 0x5bd: 84,
- 0x5bf: 84,
- 0x5c1: 84,
- 0x5c2: 84,
- 0x5c4: 84,
- 0x5c5: 84,
- 0x5c7: 84,
+ 0x59A: 84,
+ 0x59B: 84,
+ 0x59C: 84,
+ 0x59D: 84,
+ 0x59E: 84,
+ 0x59F: 84,
+ 0x5A0: 84,
+ 0x5A1: 84,
+ 0x5A2: 84,
+ 0x5A3: 84,
+ 0x5A4: 84,
+ 0x5A5: 84,
+ 0x5A6: 84,
+ 0x5A7: 84,
+ 0x5A8: 84,
+ 0x5A9: 84,
+ 0x5AA: 84,
+ 0x5AB: 84,
+ 0x5AC: 84,
+ 0x5AD: 84,
+ 0x5AE: 84,
+ 0x5AF: 84,
+ 0x5B0: 84,
+ 0x5B1: 84,
+ 0x5B2: 84,
+ 0x5B3: 84,
+ 0x5B4: 84,
+ 0x5B5: 84,
+ 0x5B6: 84,
+ 0x5B7: 84,
+ 0x5B8: 84,
+ 0x5B9: 84,
+ 0x5BA: 84,
+ 0x5BB: 84,
+ 0x5BC: 84,
+ 0x5BD: 84,
+ 0x5BF: 84,
+ 0x5C1: 84,
+ 0x5C2: 84,
+ 0x5C4: 84,
+ 0x5C5: 84,
+ 0x5C7: 84,
0x610: 84,
0x611: 84,
0x612: 84,
@@ -281,8 +282,8 @@ joining_types = {
0x617: 84,
0x618: 84,
0x619: 84,
- 0x61a: 84,
- 0x61c: 84,
+ 0x61A: 84,
+ 0x61C: 84,
0x620: 68,
0x622: 82,
0x623: 82,
@@ -292,12 +293,12 @@ joining_types = {
0x627: 82,
0x628: 68,
0x629: 82,
- 0x62a: 68,
- 0x62b: 68,
- 0x62c: 68,
- 0x62d: 68,
- 0x62e: 68,
- 0x62f: 82,
+ 0x62A: 68,
+ 0x62B: 68,
+ 0x62C: 68,
+ 0x62D: 68,
+ 0x62E: 68,
+ 0x62F: 82,
0x630: 82,
0x631: 82,
0x632: 82,
@@ -308,12 +309,12 @@ joining_types = {
0x637: 68,
0x638: 68,
0x639: 68,
- 0x63a: 68,
- 0x63b: 68,
- 0x63c: 68,
- 0x63d: 68,
- 0x63e: 68,
- 0x63f: 68,
+ 0x63A: 68,
+ 0x63B: 68,
+ 0x63C: 68,
+ 0x63D: 68,
+ 0x63E: 68,
+ 0x63F: 68,
0x640: 67,
0x641: 68,
0x642: 68,
@@ -324,12 +325,12 @@ joining_types = {
0x647: 68,
0x648: 82,
0x649: 68,
- 0x64a: 68,
- 0x64b: 84,
- 0x64c: 84,
- 0x64d: 84,
- 0x64e: 84,
- 0x64f: 84,
+ 0x64A: 68,
+ 0x64B: 84,
+ 0x64C: 84,
+ 0x64D: 84,
+ 0x64E: 84,
+ 0x64F: 84,
0x650: 84,
0x651: 84,
0x652: 84,
@@ -340,14 +341,14 @@ joining_types = {
0x657: 84,
0x658: 84,
0x659: 84,
- 0x65a: 84,
- 0x65b: 84,
- 0x65c: 84,
- 0x65d: 84,
- 0x65e: 84,
- 0x65f: 84,
- 0x66e: 68,
- 0x66f: 68,
+ 0x65A: 84,
+ 0x65B: 84,
+ 0x65C: 84,
+ 0x65D: 84,
+ 0x65E: 84,
+ 0x65F: 84,
+ 0x66E: 68,
+ 0x66F: 68,
0x670: 84,
0x671: 82,
0x672: 82,
@@ -357,12 +358,12 @@ joining_types = {
0x677: 82,
0x678: 68,
0x679: 68,
- 0x67a: 68,
- 0x67b: 68,
- 0x67c: 68,
- 0x67d: 68,
- 0x67e: 68,
- 0x67f: 68,
+ 0x67A: 68,
+ 0x67B: 68,
+ 0x67C: 68,
+ 0x67D: 68,
+ 0x67E: 68,
+ 0x67F: 68,
0x680: 68,
0x681: 68,
0x682: 68,
@@ -373,12 +374,12 @@ joining_types = {
0x687: 68,
0x688: 82,
0x689: 82,
- 0x68a: 82,
- 0x68b: 82,
- 0x68c: 82,
- 0x68d: 82,
- 0x68e: 82,
- 0x68f: 82,
+ 0x68A: 82,
+ 0x68B: 82,
+ 0x68C: 82,
+ 0x68D: 82,
+ 0x68E: 82,
+ 0x68F: 82,
0x690: 82,
0x691: 82,
0x692: 82,
@@ -389,91 +390,91 @@ joining_types = {
0x697: 82,
0x698: 82,
0x699: 82,
- 0x69a: 68,
- 0x69b: 68,
- 0x69c: 68,
- 0x69d: 68,
- 0x69e: 68,
- 0x69f: 68,
- 0x6a0: 68,
- 0x6a1: 68,
- 0x6a2: 68,
- 0x6a3: 68,
- 0x6a4: 68,
- 0x6a5: 68,
- 0x6a6: 68,
- 0x6a7: 68,
- 0x6a8: 68,
- 0x6a9: 68,
- 0x6aa: 68,
- 0x6ab: 68,
- 0x6ac: 68,
- 0x6ad: 68,
- 0x6ae: 68,
- 0x6af: 68,
- 0x6b0: 68,
- 0x6b1: 68,
- 0x6b2: 68,
- 0x6b3: 68,
- 0x6b4: 68,
- 0x6b5: 68,
- 0x6b6: 68,
- 0x6b7: 68,
- 0x6b8: 68,
- 0x6b9: 68,
- 0x6ba: 68,
- 0x6bb: 68,
- 0x6bc: 68,
- 0x6bd: 68,
- 0x6be: 68,
- 0x6bf: 68,
- 0x6c0: 82,
- 0x6c1: 68,
- 0x6c2: 68,
- 0x6c3: 82,
- 0x6c4: 82,
- 0x6c5: 82,
- 0x6c6: 82,
- 0x6c7: 82,
- 0x6c8: 82,
- 0x6c9: 82,
- 0x6ca: 82,
- 0x6cb: 82,
- 0x6cc: 68,
- 0x6cd: 82,
- 0x6ce: 68,
- 0x6cf: 82,
- 0x6d0: 68,
- 0x6d1: 68,
- 0x6d2: 82,
- 0x6d3: 82,
- 0x6d5: 82,
- 0x6d6: 84,
- 0x6d7: 84,
- 0x6d8: 84,
- 0x6d9: 84,
- 0x6da: 84,
- 0x6db: 84,
- 0x6dc: 84,
- 0x6df: 84,
- 0x6e0: 84,
- 0x6e1: 84,
- 0x6e2: 84,
- 0x6e3: 84,
- 0x6e4: 84,
- 0x6e7: 84,
- 0x6e8: 84,
- 0x6ea: 84,
- 0x6eb: 84,
- 0x6ec: 84,
- 0x6ed: 84,
- 0x6ee: 82,
- 0x6ef: 82,
- 0x6fa: 68,
- 0x6fb: 68,
- 0x6fc: 68,
- 0x6ff: 68,
- 0x70f: 84,
+ 0x69A: 68,
+ 0x69B: 68,
+ 0x69C: 68,
+ 0x69D: 68,
+ 0x69E: 68,
+ 0x69F: 68,
+ 0x6A0: 68,
+ 0x6A1: 68,
+ 0x6A2: 68,
+ 0x6A3: 68,
+ 0x6A4: 68,
+ 0x6A5: 68,
+ 0x6A6: 68,
+ 0x6A7: 68,
+ 0x6A8: 68,
+ 0x6A9: 68,
+ 0x6AA: 68,
+ 0x6AB: 68,
+ 0x6AC: 68,
+ 0x6AD: 68,
+ 0x6AE: 68,
+ 0x6AF: 68,
+ 0x6B0: 68,
+ 0x6B1: 68,
+ 0x6B2: 68,
+ 0x6B3: 68,
+ 0x6B4: 68,
+ 0x6B5: 68,
+ 0x6B6: 68,
+ 0x6B7: 68,
+ 0x6B8: 68,
+ 0x6B9: 68,
+ 0x6BA: 68,
+ 0x6BB: 68,
+ 0x6BC: 68,
+ 0x6BD: 68,
+ 0x6BE: 68,
+ 0x6BF: 68,
+ 0x6C0: 82,
+ 0x6C1: 68,
+ 0x6C2: 68,
+ 0x6C3: 82,
+ 0x6C4: 82,
+ 0x6C5: 82,
+ 0x6C6: 82,
+ 0x6C7: 82,
+ 0x6C8: 82,
+ 0x6C9: 82,
+ 0x6CA: 82,
+ 0x6CB: 82,
+ 0x6CC: 68,
+ 0x6CD: 82,
+ 0x6CE: 68,
+ 0x6CF: 82,
+ 0x6D0: 68,
+ 0x6D1: 68,
+ 0x6D2: 82,
+ 0x6D3: 82,
+ 0x6D5: 82,
+ 0x6D6: 84,
+ 0x6D7: 84,
+ 0x6D8: 84,
+ 0x6D9: 84,
+ 0x6DA: 84,
+ 0x6DB: 84,
+ 0x6DC: 84,
+ 0x6DF: 84,
+ 0x6E0: 84,
+ 0x6E1: 84,
+ 0x6E2: 84,
+ 0x6E3: 84,
+ 0x6E4: 84,
+ 0x6E7: 84,
+ 0x6E8: 84,
+ 0x6EA: 84,
+ 0x6EB: 84,
+ 0x6EC: 84,
+ 0x6ED: 84,
+ 0x6EE: 82,
+ 0x6EF: 82,
+ 0x6FA: 68,
+ 0x6FB: 68,
+ 0x6FC: 68,
+ 0x6FF: 68,
+ 0x70F: 84,
0x710: 82,
0x711: 84,
0x712: 68,
@@ -484,12 +485,12 @@ joining_types = {
0x717: 82,
0x718: 82,
0x719: 82,
- 0x71a: 68,
- 0x71b: 68,
- 0x71c: 68,
- 0x71d: 68,
- 0x71e: 82,
- 0x71f: 68,
+ 0x71A: 68,
+ 0x71B: 68,
+ 0x71C: 68,
+ 0x71D: 68,
+ 0x71E: 82,
+ 0x71F: 68,
0x720: 68,
0x721: 68,
0x722: 68,
@@ -500,12 +501,12 @@ joining_types = {
0x727: 68,
0x728: 82,
0x729: 68,
- 0x72a: 82,
- 0x72b: 68,
- 0x72c: 82,
- 0x72d: 68,
- 0x72e: 68,
- 0x72f: 82,
+ 0x72A: 82,
+ 0x72B: 68,
+ 0x72C: 82,
+ 0x72D: 68,
+ 0x72E: 68,
+ 0x72F: 82,
0x730: 84,
0x731: 84,
0x732: 84,
@@ -516,12 +517,12 @@ joining_types = {
0x737: 84,
0x738: 84,
0x739: 84,
- 0x73a: 84,
- 0x73b: 84,
- 0x73c: 84,
- 0x73d: 84,
- 0x73e: 84,
- 0x73f: 84,
+ 0x73A: 84,
+ 0x73B: 84,
+ 0x73C: 84,
+ 0x73D: 84,
+ 0x73E: 84,
+ 0x73F: 84,
0x740: 84,
0x741: 84,
0x742: 84,
@@ -532,10 +533,10 @@ joining_types = {
0x747: 84,
0x748: 84,
0x749: 84,
- 0x74a: 84,
- 0x74d: 82,
- 0x74e: 68,
- 0x74f: 68,
+ 0x74A: 84,
+ 0x74D: 82,
+ 0x74E: 68,
+ 0x74F: 68,
0x750: 68,
0x751: 68,
0x752: 68,
@@ -546,12 +547,12 @@ joining_types = {
0x757: 68,
0x758: 68,
0x759: 82,
- 0x75a: 82,
- 0x75b: 82,
- 0x75c: 68,
- 0x75d: 68,
- 0x75e: 68,
- 0x75f: 68,
+ 0x75A: 82,
+ 0x75B: 82,
+ 0x75C: 68,
+ 0x75D: 68,
+ 0x75E: 68,
+ 0x75F: 68,
0x760: 68,
0x761: 68,
0x762: 68,
@@ -562,12 +563,12 @@ joining_types = {
0x767: 68,
0x768: 68,
0x769: 68,
- 0x76a: 68,
- 0x76b: 82,
- 0x76c: 82,
- 0x76d: 68,
- 0x76e: 68,
- 0x76f: 68,
+ 0x76A: 68,
+ 0x76B: 82,
+ 0x76C: 82,
+ 0x76D: 68,
+ 0x76E: 68,
+ 0x76F: 68,
0x770: 68,
0x771: 82,
0x772: 68,
@@ -578,76 +579,76 @@ joining_types = {
0x777: 68,
0x778: 82,
0x779: 82,
- 0x77a: 68,
- 0x77b: 68,
- 0x77c: 68,
- 0x77d: 68,
- 0x77e: 68,
- 0x77f: 68,
- 0x7a6: 84,
- 0x7a7: 84,
- 0x7a8: 84,
- 0x7a9: 84,
- 0x7aa: 84,
- 0x7ab: 84,
- 0x7ac: 84,
- 0x7ad: 84,
- 0x7ae: 84,
- 0x7af: 84,
- 0x7b0: 84,
- 0x7ca: 68,
- 0x7cb: 68,
- 0x7cc: 68,
- 0x7cd: 68,
- 0x7ce: 68,
- 0x7cf: 68,
- 0x7d0: 68,
- 0x7d1: 68,
- 0x7d2: 68,
- 0x7d3: 68,
- 0x7d4: 68,
- 0x7d5: 68,
- 0x7d6: 68,
- 0x7d7: 68,
- 0x7d8: 68,
- 0x7d9: 68,
- 0x7da: 68,
- 0x7db: 68,
- 0x7dc: 68,
- 0x7dd: 68,
- 0x7de: 68,
- 0x7df: 68,
- 0x7e0: 68,
- 0x7e1: 68,
- 0x7e2: 68,
- 0x7e3: 68,
- 0x7e4: 68,
- 0x7e5: 68,
- 0x7e6: 68,
- 0x7e7: 68,
- 0x7e8: 68,
- 0x7e9: 68,
- 0x7ea: 68,
- 0x7eb: 84,
- 0x7ec: 84,
- 0x7ed: 84,
- 0x7ee: 84,
- 0x7ef: 84,
- 0x7f0: 84,
- 0x7f1: 84,
- 0x7f2: 84,
- 0x7f3: 84,
- 0x7fa: 67,
- 0x7fd: 84,
+ 0x77A: 68,
+ 0x77B: 68,
+ 0x77C: 68,
+ 0x77D: 68,
+ 0x77E: 68,
+ 0x77F: 68,
+ 0x7A6: 84,
+ 0x7A7: 84,
+ 0x7A8: 84,
+ 0x7A9: 84,
+ 0x7AA: 84,
+ 0x7AB: 84,
+ 0x7AC: 84,
+ 0x7AD: 84,
+ 0x7AE: 84,
+ 0x7AF: 84,
+ 0x7B0: 84,
+ 0x7CA: 68,
+ 0x7CB: 68,
+ 0x7CC: 68,
+ 0x7CD: 68,
+ 0x7CE: 68,
+ 0x7CF: 68,
+ 0x7D0: 68,
+ 0x7D1: 68,
+ 0x7D2: 68,
+ 0x7D3: 68,
+ 0x7D4: 68,
+ 0x7D5: 68,
+ 0x7D6: 68,
+ 0x7D7: 68,
+ 0x7D8: 68,
+ 0x7D9: 68,
+ 0x7DA: 68,
+ 0x7DB: 68,
+ 0x7DC: 68,
+ 0x7DD: 68,
+ 0x7DE: 68,
+ 0x7DF: 68,
+ 0x7E0: 68,
+ 0x7E1: 68,
+ 0x7E2: 68,
+ 0x7E3: 68,
+ 0x7E4: 68,
+ 0x7E5: 68,
+ 0x7E6: 68,
+ 0x7E7: 68,
+ 0x7E8: 68,
+ 0x7E9: 68,
+ 0x7EA: 68,
+ 0x7EB: 84,
+ 0x7EC: 84,
+ 0x7ED: 84,
+ 0x7EE: 84,
+ 0x7EF: 84,
+ 0x7F0: 84,
+ 0x7F1: 84,
+ 0x7F2: 84,
+ 0x7F3: 84,
+ 0x7FA: 67,
+ 0x7FD: 84,
0x816: 84,
0x817: 84,
0x818: 84,
0x819: 84,
- 0x81b: 84,
- 0x81c: 84,
- 0x81d: 84,
- 0x81e: 84,
- 0x81f: 84,
+ 0x81B: 84,
+ 0x81C: 84,
+ 0x81D: 84,
+ 0x81E: 84,
+ 0x81F: 84,
0x820: 84,
0x821: 84,
0x822: 84,
@@ -656,10 +657,10 @@ joining_types = {
0x826: 84,
0x827: 84,
0x829: 84,
- 0x82a: 84,
- 0x82b: 84,
- 0x82c: 84,
- 0x82d: 84,
+ 0x82A: 84,
+ 0x82B: 84,
+ 0x82C: 84,
+ 0x82D: 84,
0x840: 82,
0x841: 68,
0x842: 68,
@@ -670,12 +671,12 @@ joining_types = {
0x847: 82,
0x848: 68,
0x849: 82,
- 0x84a: 68,
- 0x84b: 68,
- 0x84c: 68,
- 0x84d: 68,
- 0x84e: 68,
- 0x84f: 68,
+ 0x84A: 68,
+ 0x84B: 68,
+ 0x84C: 68,
+ 0x84D: 68,
+ 0x84E: 68,
+ 0x84F: 68,
0x850: 68,
0x851: 68,
0x852: 68,
@@ -686,8 +687,8 @@ joining_types = {
0x857: 82,
0x858: 82,
0x859: 84,
- 0x85a: 84,
- 0x85b: 84,
+ 0x85A: 84,
+ 0x85B: 84,
0x860: 68,
0x862: 68,
0x863: 68,
@@ -696,7 +697,7 @@ joining_types = {
0x867: 82,
0x868: 68,
0x869: 82,
- 0x86a: 82,
+ 0x86A: 82,
0x870: 82,
0x871: 82,
0x872: 82,
@@ -707,12 +708,12 @@ joining_types = {
0x877: 82,
0x878: 82,
0x879: 82,
- 0x87a: 82,
- 0x87b: 82,
- 0x87c: 82,
- 0x87d: 82,
- 0x87e: 82,
- 0x87f: 82,
+ 0x87A: 82,
+ 0x87B: 82,
+ 0x87C: 82,
+ 0x87D: 82,
+ 0x87E: 82,
+ 0x87F: 82,
0x880: 82,
0x881: 82,
0x882: 82,
@@ -721,117 +722,117 @@ joining_types = {
0x885: 67,
0x886: 68,
0x889: 68,
- 0x88a: 68,
- 0x88b: 68,
- 0x88c: 68,
- 0x88d: 68,
- 0x88e: 82,
+ 0x88A: 68,
+ 0x88B: 68,
+ 0x88C: 68,
+ 0x88D: 68,
+ 0x88E: 82,
0x898: 84,
0x899: 84,
- 0x89a: 84,
- 0x89b: 84,
- 0x89c: 84,
- 0x89d: 84,
- 0x89e: 84,
- 0x89f: 84,
- 0x8a0: 68,
- 0x8a1: 68,
- 0x8a2: 68,
- 0x8a3: 68,
- 0x8a4: 68,
- 0x8a5: 68,
- 0x8a6: 68,
- 0x8a7: 68,
- 0x8a8: 68,
- 0x8a9: 68,
- 0x8aa: 82,
- 0x8ab: 82,
- 0x8ac: 82,
- 0x8ae: 82,
- 0x8af: 68,
- 0x8b0: 68,
- 0x8b1: 82,
- 0x8b2: 82,
- 0x8b3: 68,
- 0x8b4: 68,
- 0x8b5: 68,
- 0x8b6: 68,
- 0x8b7: 68,
- 0x8b8: 68,
- 0x8b9: 82,
- 0x8ba: 68,
- 0x8bb: 68,
- 0x8bc: 68,
- 0x8bd: 68,
- 0x8be: 68,
- 0x8bf: 68,
- 0x8c0: 68,
- 0x8c1: 68,
- 0x8c2: 68,
- 0x8c3: 68,
- 0x8c4: 68,
- 0x8c5: 68,
- 0x8c6: 68,
- 0x8c7: 68,
- 0x8c8: 68,
- 0x8ca: 84,
- 0x8cb: 84,
- 0x8cc: 84,
- 0x8cd: 84,
- 0x8ce: 84,
- 0x8cf: 84,
- 0x8d0: 84,
- 0x8d1: 84,
- 0x8d2: 84,
- 0x8d3: 84,
- 0x8d4: 84,
- 0x8d5: 84,
- 0x8d6: 84,
- 0x8d7: 84,
- 0x8d8: 84,
- 0x8d9: 84,
- 0x8da: 84,
- 0x8db: 84,
- 0x8dc: 84,
- 0x8dd: 84,
- 0x8de: 84,
- 0x8df: 84,
- 0x8e0: 84,
- 0x8e1: 84,
- 0x8e3: 84,
- 0x8e4: 84,
- 0x8e5: 84,
- 0x8e6: 84,
- 0x8e7: 84,
- 0x8e8: 84,
- 0x8e9: 84,
- 0x8ea: 84,
- 0x8eb: 84,
- 0x8ec: 84,
- 0x8ed: 84,
- 0x8ee: 84,
- 0x8ef: 84,
- 0x8f0: 84,
- 0x8f1: 84,
- 0x8f2: 84,
- 0x8f3: 84,
- 0x8f4: 84,
- 0x8f5: 84,
- 0x8f6: 84,
- 0x8f7: 84,
- 0x8f8: 84,
- 0x8f9: 84,
- 0x8fa: 84,
- 0x8fb: 84,
- 0x8fc: 84,
- 0x8fd: 84,
- 0x8fe: 84,
- 0x8ff: 84,
+ 0x89A: 84,
+ 0x89B: 84,
+ 0x89C: 84,
+ 0x89D: 84,
+ 0x89E: 84,
+ 0x89F: 84,
+ 0x8A0: 68,
+ 0x8A1: 68,
+ 0x8A2: 68,
+ 0x8A3: 68,
+ 0x8A4: 68,
+ 0x8A5: 68,
+ 0x8A6: 68,
+ 0x8A7: 68,
+ 0x8A8: 68,
+ 0x8A9: 68,
+ 0x8AA: 82,
+ 0x8AB: 82,
+ 0x8AC: 82,
+ 0x8AE: 82,
+ 0x8AF: 68,
+ 0x8B0: 68,
+ 0x8B1: 82,
+ 0x8B2: 82,
+ 0x8B3: 68,
+ 0x8B4: 68,
+ 0x8B5: 68,
+ 0x8B6: 68,
+ 0x8B7: 68,
+ 0x8B8: 68,
+ 0x8B9: 82,
+ 0x8BA: 68,
+ 0x8BB: 68,
+ 0x8BC: 68,
+ 0x8BD: 68,
+ 0x8BE: 68,
+ 0x8BF: 68,
+ 0x8C0: 68,
+ 0x8C1: 68,
+ 0x8C2: 68,
+ 0x8C3: 68,
+ 0x8C4: 68,
+ 0x8C5: 68,
+ 0x8C6: 68,
+ 0x8C7: 68,
+ 0x8C8: 68,
+ 0x8CA: 84,
+ 0x8CB: 84,
+ 0x8CC: 84,
+ 0x8CD: 84,
+ 0x8CE: 84,
+ 0x8CF: 84,
+ 0x8D0: 84,
+ 0x8D1: 84,
+ 0x8D2: 84,
+ 0x8D3: 84,
+ 0x8D4: 84,
+ 0x8D5: 84,
+ 0x8D6: 84,
+ 0x8D7: 84,
+ 0x8D8: 84,
+ 0x8D9: 84,
+ 0x8DA: 84,
+ 0x8DB: 84,
+ 0x8DC: 84,
+ 0x8DD: 84,
+ 0x8DE: 84,
+ 0x8DF: 84,
+ 0x8E0: 84,
+ 0x8E1: 84,
+ 0x8E3: 84,
+ 0x8E4: 84,
+ 0x8E5: 84,
+ 0x8E6: 84,
+ 0x8E7: 84,
+ 0x8E8: 84,
+ 0x8E9: 84,
+ 0x8EA: 84,
+ 0x8EB: 84,
+ 0x8EC: 84,
+ 0x8ED: 84,
+ 0x8EE: 84,
+ 0x8EF: 84,
+ 0x8F0: 84,
+ 0x8F1: 84,
+ 0x8F2: 84,
+ 0x8F3: 84,
+ 0x8F4: 84,
+ 0x8F5: 84,
+ 0x8F6: 84,
+ 0x8F7: 84,
+ 0x8F8: 84,
+ 0x8F9: 84,
+ 0x8FA: 84,
+ 0x8FB: 84,
+ 0x8FC: 84,
+ 0x8FD: 84,
+ 0x8FE: 84,
+ 0x8FF: 84,
0x900: 84,
0x901: 84,
0x902: 84,
- 0x93a: 84,
- 0x93c: 84,
+ 0x93A: 84,
+ 0x93C: 84,
0x941: 84,
0x942: 84,
0x943: 84,
@@ -840,7 +841,7 @@ joining_types = {
0x946: 84,
0x947: 84,
0x948: 84,
- 0x94d: 84,
+ 0x94D: 84,
0x951: 84,
0x952: 84,
0x953: 84,
@@ -851,215 +852,215 @@ joining_types = {
0x962: 84,
0x963: 84,
0x981: 84,
- 0x9bc: 84,
- 0x9c1: 84,
- 0x9c2: 84,
- 0x9c3: 84,
- 0x9c4: 84,
- 0x9cd: 84,
- 0x9e2: 84,
- 0x9e3: 84,
- 0x9fe: 84,
- 0xa01: 84,
- 0xa02: 84,
- 0xa3c: 84,
- 0xa41: 84,
- 0xa42: 84,
- 0xa47: 84,
- 0xa48: 84,
- 0xa4b: 84,
- 0xa4c: 84,
- 0xa4d: 84,
- 0xa51: 84,
- 0xa70: 84,
- 0xa71: 84,
- 0xa75: 84,
- 0xa81: 84,
- 0xa82: 84,
- 0xabc: 84,
- 0xac1: 84,
- 0xac2: 84,
- 0xac3: 84,
- 0xac4: 84,
- 0xac5: 84,
- 0xac7: 84,
- 0xac8: 84,
- 0xacd: 84,
- 0xae2: 84,
- 0xae3: 84,
- 0xafa: 84,
- 0xafb: 84,
- 0xafc: 84,
- 0xafd: 84,
- 0xafe: 84,
- 0xaff: 84,
- 0xb01: 84,
- 0xb3c: 84,
- 0xb3f: 84,
- 0xb41: 84,
- 0xb42: 84,
- 0xb43: 84,
- 0xb44: 84,
- 0xb4d: 84,
- 0xb55: 84,
- 0xb56: 84,
- 0xb62: 84,
- 0xb63: 84,
- 0xb82: 84,
- 0xbc0: 84,
- 0xbcd: 84,
- 0xc00: 84,
- 0xc04: 84,
- 0xc3c: 84,
- 0xc3e: 84,
- 0xc3f: 84,
- 0xc40: 84,
- 0xc46: 84,
- 0xc47: 84,
- 0xc48: 84,
- 0xc4a: 84,
- 0xc4b: 84,
- 0xc4c: 84,
- 0xc4d: 84,
- 0xc55: 84,
- 0xc56: 84,
- 0xc62: 84,
- 0xc63: 84,
- 0xc81: 84,
- 0xcbc: 84,
- 0xcbf: 84,
- 0xcc6: 84,
- 0xccc: 84,
- 0xccd: 84,
- 0xce2: 84,
- 0xce3: 84,
- 0xd00: 84,
- 0xd01: 84,
- 0xd3b: 84,
- 0xd3c: 84,
- 0xd41: 84,
- 0xd42: 84,
- 0xd43: 84,
- 0xd44: 84,
- 0xd4d: 84,
- 0xd62: 84,
- 0xd63: 84,
- 0xd81: 84,
- 0xdca: 84,
- 0xdd2: 84,
- 0xdd3: 84,
- 0xdd4: 84,
- 0xdd6: 84,
- 0xe31: 84,
- 0xe34: 84,
- 0xe35: 84,
- 0xe36: 84,
- 0xe37: 84,
- 0xe38: 84,
- 0xe39: 84,
- 0xe3a: 84,
- 0xe47: 84,
- 0xe48: 84,
- 0xe49: 84,
- 0xe4a: 84,
- 0xe4b: 84,
- 0xe4c: 84,
- 0xe4d: 84,
- 0xe4e: 84,
- 0xeb1: 84,
- 0xeb4: 84,
- 0xeb5: 84,
- 0xeb6: 84,
- 0xeb7: 84,
- 0xeb8: 84,
- 0xeb9: 84,
- 0xeba: 84,
- 0xebb: 84,
- 0xebc: 84,
- 0xec8: 84,
- 0xec9: 84,
- 0xeca: 84,
- 0xecb: 84,
- 0xecc: 84,
- 0xecd: 84,
- 0xece: 84,
- 0xf18: 84,
- 0xf19: 84,
- 0xf35: 84,
- 0xf37: 84,
- 0xf39: 84,
- 0xf71: 84,
- 0xf72: 84,
- 0xf73: 84,
- 0xf74: 84,
- 0xf75: 84,
- 0xf76: 84,
- 0xf77: 84,
- 0xf78: 84,
- 0xf79: 84,
- 0xf7a: 84,
- 0xf7b: 84,
- 0xf7c: 84,
- 0xf7d: 84,
- 0xf7e: 84,
- 0xf80: 84,
- 0xf81: 84,
- 0xf82: 84,
- 0xf83: 84,
- 0xf84: 84,
- 0xf86: 84,
- 0xf87: 84,
- 0xf8d: 84,
- 0xf8e: 84,
- 0xf8f: 84,
- 0xf90: 84,
- 0xf91: 84,
- 0xf92: 84,
- 0xf93: 84,
- 0xf94: 84,
- 0xf95: 84,
- 0xf96: 84,
- 0xf97: 84,
- 0xf99: 84,
- 0xf9a: 84,
- 0xf9b: 84,
- 0xf9c: 84,
- 0xf9d: 84,
- 0xf9e: 84,
- 0xf9f: 84,
- 0xfa0: 84,
- 0xfa1: 84,
- 0xfa2: 84,
- 0xfa3: 84,
- 0xfa4: 84,
- 0xfa5: 84,
- 0xfa6: 84,
- 0xfa7: 84,
- 0xfa8: 84,
- 0xfa9: 84,
- 0xfaa: 84,
- 0xfab: 84,
- 0xfac: 84,
- 0xfad: 84,
- 0xfae: 84,
- 0xfaf: 84,
- 0xfb0: 84,
- 0xfb1: 84,
- 0xfb2: 84,
- 0xfb3: 84,
- 0xfb4: 84,
- 0xfb5: 84,
- 0xfb6: 84,
- 0xfb7: 84,
- 0xfb8: 84,
- 0xfb9: 84,
- 0xfba: 84,
- 0xfbb: 84,
- 0xfbc: 84,
- 0xfc6: 84,
- 0x102d: 84,
- 0x102e: 84,
- 0x102f: 84,
+ 0x9BC: 84,
+ 0x9C1: 84,
+ 0x9C2: 84,
+ 0x9C3: 84,
+ 0x9C4: 84,
+ 0x9CD: 84,
+ 0x9E2: 84,
+ 0x9E3: 84,
+ 0x9FE: 84,
+ 0xA01: 84,
+ 0xA02: 84,
+ 0xA3C: 84,
+ 0xA41: 84,
+ 0xA42: 84,
+ 0xA47: 84,
+ 0xA48: 84,
+ 0xA4B: 84,
+ 0xA4C: 84,
+ 0xA4D: 84,
+ 0xA51: 84,
+ 0xA70: 84,
+ 0xA71: 84,
+ 0xA75: 84,
+ 0xA81: 84,
+ 0xA82: 84,
+ 0xABC: 84,
+ 0xAC1: 84,
+ 0xAC2: 84,
+ 0xAC3: 84,
+ 0xAC4: 84,
+ 0xAC5: 84,
+ 0xAC7: 84,
+ 0xAC8: 84,
+ 0xACD: 84,
+ 0xAE2: 84,
+ 0xAE3: 84,
+ 0xAFA: 84,
+ 0xAFB: 84,
+ 0xAFC: 84,
+ 0xAFD: 84,
+ 0xAFE: 84,
+ 0xAFF: 84,
+ 0xB01: 84,
+ 0xB3C: 84,
+ 0xB3F: 84,
+ 0xB41: 84,
+ 0xB42: 84,
+ 0xB43: 84,
+ 0xB44: 84,
+ 0xB4D: 84,
+ 0xB55: 84,
+ 0xB56: 84,
+ 0xB62: 84,
+ 0xB63: 84,
+ 0xB82: 84,
+ 0xBC0: 84,
+ 0xBCD: 84,
+ 0xC00: 84,
+ 0xC04: 84,
+ 0xC3C: 84,
+ 0xC3E: 84,
+ 0xC3F: 84,
+ 0xC40: 84,
+ 0xC46: 84,
+ 0xC47: 84,
+ 0xC48: 84,
+ 0xC4A: 84,
+ 0xC4B: 84,
+ 0xC4C: 84,
+ 0xC4D: 84,
+ 0xC55: 84,
+ 0xC56: 84,
+ 0xC62: 84,
+ 0xC63: 84,
+ 0xC81: 84,
+ 0xCBC: 84,
+ 0xCBF: 84,
+ 0xCC6: 84,
+ 0xCCC: 84,
+ 0xCCD: 84,
+ 0xCE2: 84,
+ 0xCE3: 84,
+ 0xD00: 84,
+ 0xD01: 84,
+ 0xD3B: 84,
+ 0xD3C: 84,
+ 0xD41: 84,
+ 0xD42: 84,
+ 0xD43: 84,
+ 0xD44: 84,
+ 0xD4D: 84,
+ 0xD62: 84,
+ 0xD63: 84,
+ 0xD81: 84,
+ 0xDCA: 84,
+ 0xDD2: 84,
+ 0xDD3: 84,
+ 0xDD4: 84,
+ 0xDD6: 84,
+ 0xE31: 84,
+ 0xE34: 84,
+ 0xE35: 84,
+ 0xE36: 84,
+ 0xE37: 84,
+ 0xE38: 84,
+ 0xE39: 84,
+ 0xE3A: 84,
+ 0xE47: 84,
+ 0xE48: 84,
+ 0xE49: 84,
+ 0xE4A: 84,
+ 0xE4B: 84,
+ 0xE4C: 84,
+ 0xE4D: 84,
+ 0xE4E: 84,
+ 0xEB1: 84,
+ 0xEB4: 84,
+ 0xEB5: 84,
+ 0xEB6: 84,
+ 0xEB7: 84,
+ 0xEB8: 84,
+ 0xEB9: 84,
+ 0xEBA: 84,
+ 0xEBB: 84,
+ 0xEBC: 84,
+ 0xEC8: 84,
+ 0xEC9: 84,
+ 0xECA: 84,
+ 0xECB: 84,
+ 0xECC: 84,
+ 0xECD: 84,
+ 0xECE: 84,
+ 0xF18: 84,
+ 0xF19: 84,
+ 0xF35: 84,
+ 0xF37: 84,
+ 0xF39: 84,
+ 0xF71: 84,
+ 0xF72: 84,
+ 0xF73: 84,
+ 0xF74: 84,
+ 0xF75: 84,
+ 0xF76: 84,
+ 0xF77: 84,
+ 0xF78: 84,
+ 0xF79: 84,
+ 0xF7A: 84,
+ 0xF7B: 84,
+ 0xF7C: 84,
+ 0xF7D: 84,
+ 0xF7E: 84,
+ 0xF80: 84,
+ 0xF81: 84,
+ 0xF82: 84,
+ 0xF83: 84,
+ 0xF84: 84,
+ 0xF86: 84,
+ 0xF87: 84,
+ 0xF8D: 84,
+ 0xF8E: 84,
+ 0xF8F: 84,
+ 0xF90: 84,
+ 0xF91: 84,
+ 0xF92: 84,
+ 0xF93: 84,
+ 0xF94: 84,
+ 0xF95: 84,
+ 0xF96: 84,
+ 0xF97: 84,
+ 0xF99: 84,
+ 0xF9A: 84,
+ 0xF9B: 84,
+ 0xF9C: 84,
+ 0xF9D: 84,
+ 0xF9E: 84,
+ 0xF9F: 84,
+ 0xFA0: 84,
+ 0xFA1: 84,
+ 0xFA2: 84,
+ 0xFA3: 84,
+ 0xFA4: 84,
+ 0xFA5: 84,
+ 0xFA6: 84,
+ 0xFA7: 84,
+ 0xFA8: 84,
+ 0xFA9: 84,
+ 0xFAA: 84,
+ 0xFAB: 84,
+ 0xFAC: 84,
+ 0xFAD: 84,
+ 0xFAE: 84,
+ 0xFAF: 84,
+ 0xFB0: 84,
+ 0xFB1: 84,
+ 0xFB2: 84,
+ 0xFB3: 84,
+ 0xFB4: 84,
+ 0xFB5: 84,
+ 0xFB6: 84,
+ 0xFB7: 84,
+ 0xFB8: 84,
+ 0xFB9: 84,
+ 0xFBA: 84,
+ 0xFBB: 84,
+ 0xFBC: 84,
+ 0xFC6: 84,
+ 0x102D: 84,
+ 0x102E: 84,
+ 0x102F: 84,
0x1030: 84,
0x1032: 84,
0x1033: 84,
@@ -1068,13 +1069,13 @@ joining_types = {
0x1036: 84,
0x1037: 84,
0x1039: 84,
- 0x103a: 84,
- 0x103d: 84,
- 0x103e: 84,
+ 0x103A: 84,
+ 0x103D: 84,
+ 0x103E: 84,
0x1058: 84,
0x1059: 84,
- 0x105e: 84,
- 0x105f: 84,
+ 0x105E: 84,
+ 0x105F: 84,
0x1060: 84,
0x1071: 84,
0x1072: 84,
@@ -1083,11 +1084,11 @@ joining_types = {
0x1082: 84,
0x1085: 84,
0x1086: 84,
- 0x108d: 84,
- 0x109d: 84,
- 0x135d: 84,
- 0x135e: 84,
- 0x135f: 84,
+ 0x108D: 84,
+ 0x109D: 84,
+ 0x135D: 84,
+ 0x135E: 84,
+ 0x135F: 84,
0x1712: 84,
0x1713: 84,
0x1714: 84,
@@ -1097,34 +1098,34 @@ joining_types = {
0x1753: 84,
0x1772: 84,
0x1773: 84,
- 0x17b4: 84,
- 0x17b5: 84,
- 0x17b7: 84,
- 0x17b8: 84,
- 0x17b9: 84,
- 0x17ba: 84,
- 0x17bb: 84,
- 0x17bc: 84,
- 0x17bd: 84,
- 0x17c6: 84,
- 0x17c9: 84,
- 0x17ca: 84,
- 0x17cb: 84,
- 0x17cc: 84,
- 0x17cd: 84,
- 0x17ce: 84,
- 0x17cf: 84,
- 0x17d0: 84,
- 0x17d1: 84,
- 0x17d2: 84,
- 0x17d3: 84,
- 0x17dd: 84,
+ 0x17B4: 84,
+ 0x17B5: 84,
+ 0x17B7: 84,
+ 0x17B8: 84,
+ 0x17B9: 84,
+ 0x17BA: 84,
+ 0x17BB: 84,
+ 0x17BC: 84,
+ 0x17BD: 84,
+ 0x17C6: 84,
+ 0x17C9: 84,
+ 0x17CA: 84,
+ 0x17CB: 84,
+ 0x17CC: 84,
+ 0x17CD: 84,
+ 0x17CE: 84,
+ 0x17CF: 84,
+ 0x17D0: 84,
+ 0x17D1: 84,
+ 0x17D2: 84,
+ 0x17D3: 84,
+ 0x17DD: 84,
0x1807: 68,
- 0x180a: 67,
- 0x180b: 84,
- 0x180c: 84,
- 0x180d: 84,
- 0x180f: 84,
+ 0x180A: 67,
+ 0x180B: 84,
+ 0x180C: 84,
+ 0x180D: 84,
+ 0x180F: 84,
0x1820: 68,
0x1821: 68,
0x1822: 68,
@@ -1135,12 +1136,12 @@ joining_types = {
0x1827: 68,
0x1828: 68,
0x1829: 68,
- 0x182a: 68,
- 0x182b: 68,
- 0x182c: 68,
- 0x182d: 68,
- 0x182e: 68,
- 0x182f: 68,
+ 0x182A: 68,
+ 0x182B: 68,
+ 0x182C: 68,
+ 0x182D: 68,
+ 0x182E: 68,
+ 0x182F: 68,
0x1830: 68,
0x1831: 68,
0x1832: 68,
@@ -1151,12 +1152,12 @@ joining_types = {
0x1837: 68,
0x1838: 68,
0x1839: 68,
- 0x183a: 68,
- 0x183b: 68,
- 0x183c: 68,
- 0x183d: 68,
- 0x183e: 68,
- 0x183f: 68,
+ 0x183A: 68,
+ 0x183B: 68,
+ 0x183C: 68,
+ 0x183D: 68,
+ 0x183E: 68,
+ 0x183F: 68,
0x1840: 68,
0x1841: 68,
0x1842: 68,
@@ -1167,12 +1168,12 @@ joining_types = {
0x1847: 68,
0x1848: 68,
0x1849: 68,
- 0x184a: 68,
- 0x184b: 68,
- 0x184c: 68,
- 0x184d: 68,
- 0x184e: 68,
- 0x184f: 68,
+ 0x184A: 68,
+ 0x184B: 68,
+ 0x184C: 68,
+ 0x184D: 68,
+ 0x184E: 68,
+ 0x184F: 68,
0x1850: 68,
0x1851: 68,
0x1852: 68,
@@ -1183,12 +1184,12 @@ joining_types = {
0x1857: 68,
0x1858: 68,
0x1859: 68,
- 0x185a: 68,
- 0x185b: 68,
- 0x185c: 68,
- 0x185d: 68,
- 0x185e: 68,
- 0x185f: 68,
+ 0x185A: 68,
+ 0x185B: 68,
+ 0x185C: 68,
+ 0x185D: 68,
+ 0x185E: 68,
+ 0x185F: 68,
0x1860: 68,
0x1861: 68,
0x1862: 68,
@@ -1199,12 +1200,12 @@ joining_types = {
0x1867: 68,
0x1868: 68,
0x1869: 68,
- 0x186a: 68,
- 0x186b: 68,
- 0x186c: 68,
- 0x186d: 68,
- 0x186e: 68,
- 0x186f: 68,
+ 0x186A: 68,
+ 0x186B: 68,
+ 0x186C: 68,
+ 0x186D: 68,
+ 0x186E: 68,
+ 0x186F: 68,
0x1870: 68,
0x1871: 68,
0x1872: 68,
@@ -1219,12 +1220,12 @@ joining_types = {
0x1887: 68,
0x1888: 68,
0x1889: 68,
- 0x188a: 68,
- 0x188b: 68,
- 0x188c: 68,
- 0x188d: 68,
- 0x188e: 68,
- 0x188f: 68,
+ 0x188A: 68,
+ 0x188B: 68,
+ 0x188C: 68,
+ 0x188D: 68,
+ 0x188E: 68,
+ 0x188F: 68,
0x1890: 68,
0x1891: 68,
0x1892: 68,
@@ -1235,23 +1236,23 @@ joining_types = {
0x1897: 68,
0x1898: 68,
0x1899: 68,
- 0x189a: 68,
- 0x189b: 68,
- 0x189c: 68,
- 0x189d: 68,
- 0x189e: 68,
- 0x189f: 68,
- 0x18a0: 68,
- 0x18a1: 68,
- 0x18a2: 68,
- 0x18a3: 68,
- 0x18a4: 68,
- 0x18a5: 68,
- 0x18a6: 68,
- 0x18a7: 68,
- 0x18a8: 68,
- 0x18a9: 84,
- 0x18aa: 68,
+ 0x189A: 68,
+ 0x189B: 68,
+ 0x189C: 68,
+ 0x189D: 68,
+ 0x189E: 68,
+ 0x189F: 68,
+ 0x18A0: 68,
+ 0x18A1: 68,
+ 0x18A2: 68,
+ 0x18A3: 68,
+ 0x18A4: 68,
+ 0x18A5: 68,
+ 0x18A6: 68,
+ 0x18A7: 68,
+ 0x18A8: 68,
+ 0x18A9: 84,
+ 0x18AA: 68,
0x1920: 84,
0x1921: 84,
0x1922: 84,
@@ -1259,712 +1260,712 @@ joining_types = {
0x1928: 84,
0x1932: 84,
0x1939: 84,
- 0x193a: 84,
- 0x193b: 84,
- 0x1a17: 84,
- 0x1a18: 84,
- 0x1a1b: 84,
- 0x1a56: 84,
- 0x1a58: 84,
- 0x1a59: 84,
- 0x1a5a: 84,
- 0x1a5b: 84,
- 0x1a5c: 84,
- 0x1a5d: 84,
- 0x1a5e: 84,
- 0x1a60: 84,
- 0x1a62: 84,
- 0x1a65: 84,
- 0x1a66: 84,
- 0x1a67: 84,
- 0x1a68: 84,
- 0x1a69: 84,
- 0x1a6a: 84,
- 0x1a6b: 84,
- 0x1a6c: 84,
- 0x1a73: 84,
- 0x1a74: 84,
- 0x1a75: 84,
- 0x1a76: 84,
- 0x1a77: 84,
- 0x1a78: 84,
- 0x1a79: 84,
- 0x1a7a: 84,
- 0x1a7b: 84,
- 0x1a7c: 84,
- 0x1a7f: 84,
- 0x1ab0: 84,
- 0x1ab1: 84,
- 0x1ab2: 84,
- 0x1ab3: 84,
- 0x1ab4: 84,
- 0x1ab5: 84,
- 0x1ab6: 84,
- 0x1ab7: 84,
- 0x1ab8: 84,
- 0x1ab9: 84,
- 0x1aba: 84,
- 0x1abb: 84,
- 0x1abc: 84,
- 0x1abd: 84,
- 0x1abe: 84,
- 0x1abf: 84,
- 0x1ac0: 84,
- 0x1ac1: 84,
- 0x1ac2: 84,
- 0x1ac3: 84,
- 0x1ac4: 84,
- 0x1ac5: 84,
- 0x1ac6: 84,
- 0x1ac7: 84,
- 0x1ac8: 84,
- 0x1ac9: 84,
- 0x1aca: 84,
- 0x1acb: 84,
- 0x1acc: 84,
- 0x1acd: 84,
- 0x1ace: 84,
- 0x1b00: 84,
- 0x1b01: 84,
- 0x1b02: 84,
- 0x1b03: 84,
- 0x1b34: 84,
- 0x1b36: 84,
- 0x1b37: 84,
- 0x1b38: 84,
- 0x1b39: 84,
- 0x1b3a: 84,
- 0x1b3c: 84,
- 0x1b42: 84,
- 0x1b6b: 84,
- 0x1b6c: 84,
- 0x1b6d: 84,
- 0x1b6e: 84,
- 0x1b6f: 84,
- 0x1b70: 84,
- 0x1b71: 84,
- 0x1b72: 84,
- 0x1b73: 84,
- 0x1b80: 84,
- 0x1b81: 84,
- 0x1ba2: 84,
- 0x1ba3: 84,
- 0x1ba4: 84,
- 0x1ba5: 84,
- 0x1ba8: 84,
- 0x1ba9: 84,
- 0x1bab: 84,
- 0x1bac: 84,
- 0x1bad: 84,
- 0x1be6: 84,
- 0x1be8: 84,
- 0x1be9: 84,
- 0x1bed: 84,
- 0x1bef: 84,
- 0x1bf0: 84,
- 0x1bf1: 84,
- 0x1c2c: 84,
- 0x1c2d: 84,
- 0x1c2e: 84,
- 0x1c2f: 84,
- 0x1c30: 84,
- 0x1c31: 84,
- 0x1c32: 84,
- 0x1c33: 84,
- 0x1c36: 84,
- 0x1c37: 84,
- 0x1cd0: 84,
- 0x1cd1: 84,
- 0x1cd2: 84,
- 0x1cd4: 84,
- 0x1cd5: 84,
- 0x1cd6: 84,
- 0x1cd7: 84,
- 0x1cd8: 84,
- 0x1cd9: 84,
- 0x1cda: 84,
- 0x1cdb: 84,
- 0x1cdc: 84,
- 0x1cdd: 84,
- 0x1cde: 84,
- 0x1cdf: 84,
- 0x1ce0: 84,
- 0x1ce2: 84,
- 0x1ce3: 84,
- 0x1ce4: 84,
- 0x1ce5: 84,
- 0x1ce6: 84,
- 0x1ce7: 84,
- 0x1ce8: 84,
- 0x1ced: 84,
- 0x1cf4: 84,
- 0x1cf8: 84,
- 0x1cf9: 84,
- 0x1dc0: 84,
- 0x1dc1: 84,
- 0x1dc2: 84,
- 0x1dc3: 84,
- 0x1dc4: 84,
- 0x1dc5: 84,
- 0x1dc6: 84,
- 0x1dc7: 84,
- 0x1dc8: 84,
- 0x1dc9: 84,
- 0x1dca: 84,
- 0x1dcb: 84,
- 0x1dcc: 84,
- 0x1dcd: 84,
- 0x1dce: 84,
- 0x1dcf: 84,
- 0x1dd0: 84,
- 0x1dd1: 84,
- 0x1dd2: 84,
- 0x1dd3: 84,
- 0x1dd4: 84,
- 0x1dd5: 84,
- 0x1dd6: 84,
- 0x1dd7: 84,
- 0x1dd8: 84,
- 0x1dd9: 84,
- 0x1dda: 84,
- 0x1ddb: 84,
- 0x1ddc: 84,
- 0x1ddd: 84,
- 0x1dde: 84,
- 0x1ddf: 84,
- 0x1de0: 84,
- 0x1de1: 84,
- 0x1de2: 84,
- 0x1de3: 84,
- 0x1de4: 84,
- 0x1de5: 84,
- 0x1de6: 84,
- 0x1de7: 84,
- 0x1de8: 84,
- 0x1de9: 84,
- 0x1dea: 84,
- 0x1deb: 84,
- 0x1dec: 84,
- 0x1ded: 84,
- 0x1dee: 84,
- 0x1def: 84,
- 0x1df0: 84,
- 0x1df1: 84,
- 0x1df2: 84,
- 0x1df3: 84,
- 0x1df4: 84,
- 0x1df5: 84,
- 0x1df6: 84,
- 0x1df7: 84,
- 0x1df8: 84,
- 0x1df9: 84,
- 0x1dfa: 84,
- 0x1dfb: 84,
- 0x1dfc: 84,
- 0x1dfd: 84,
- 0x1dfe: 84,
- 0x1dff: 84,
- 0x200b: 84,
- 0x200d: 67,
- 0x200e: 84,
- 0x200f: 84,
- 0x202a: 84,
- 0x202b: 84,
- 0x202c: 84,
- 0x202d: 84,
- 0x202e: 84,
+ 0x193A: 84,
+ 0x193B: 84,
+ 0x1A17: 84,
+ 0x1A18: 84,
+ 0x1A1B: 84,
+ 0x1A56: 84,
+ 0x1A58: 84,
+ 0x1A59: 84,
+ 0x1A5A: 84,
+ 0x1A5B: 84,
+ 0x1A5C: 84,
+ 0x1A5D: 84,
+ 0x1A5E: 84,
+ 0x1A60: 84,
+ 0x1A62: 84,
+ 0x1A65: 84,
+ 0x1A66: 84,
+ 0x1A67: 84,
+ 0x1A68: 84,
+ 0x1A69: 84,
+ 0x1A6A: 84,
+ 0x1A6B: 84,
+ 0x1A6C: 84,
+ 0x1A73: 84,
+ 0x1A74: 84,
+ 0x1A75: 84,
+ 0x1A76: 84,
+ 0x1A77: 84,
+ 0x1A78: 84,
+ 0x1A79: 84,
+ 0x1A7A: 84,
+ 0x1A7B: 84,
+ 0x1A7C: 84,
+ 0x1A7F: 84,
+ 0x1AB0: 84,
+ 0x1AB1: 84,
+ 0x1AB2: 84,
+ 0x1AB3: 84,
+ 0x1AB4: 84,
+ 0x1AB5: 84,
+ 0x1AB6: 84,
+ 0x1AB7: 84,
+ 0x1AB8: 84,
+ 0x1AB9: 84,
+ 0x1ABA: 84,
+ 0x1ABB: 84,
+ 0x1ABC: 84,
+ 0x1ABD: 84,
+ 0x1ABE: 84,
+ 0x1ABF: 84,
+ 0x1AC0: 84,
+ 0x1AC1: 84,
+ 0x1AC2: 84,
+ 0x1AC3: 84,
+ 0x1AC4: 84,
+ 0x1AC5: 84,
+ 0x1AC6: 84,
+ 0x1AC7: 84,
+ 0x1AC8: 84,
+ 0x1AC9: 84,
+ 0x1ACA: 84,
+ 0x1ACB: 84,
+ 0x1ACC: 84,
+ 0x1ACD: 84,
+ 0x1ACE: 84,
+ 0x1B00: 84,
+ 0x1B01: 84,
+ 0x1B02: 84,
+ 0x1B03: 84,
+ 0x1B34: 84,
+ 0x1B36: 84,
+ 0x1B37: 84,
+ 0x1B38: 84,
+ 0x1B39: 84,
+ 0x1B3A: 84,
+ 0x1B3C: 84,
+ 0x1B42: 84,
+ 0x1B6B: 84,
+ 0x1B6C: 84,
+ 0x1B6D: 84,
+ 0x1B6E: 84,
+ 0x1B6F: 84,
+ 0x1B70: 84,
+ 0x1B71: 84,
+ 0x1B72: 84,
+ 0x1B73: 84,
+ 0x1B80: 84,
+ 0x1B81: 84,
+ 0x1BA2: 84,
+ 0x1BA3: 84,
+ 0x1BA4: 84,
+ 0x1BA5: 84,
+ 0x1BA8: 84,
+ 0x1BA9: 84,
+ 0x1BAB: 84,
+ 0x1BAC: 84,
+ 0x1BAD: 84,
+ 0x1BE6: 84,
+ 0x1BE8: 84,
+ 0x1BE9: 84,
+ 0x1BED: 84,
+ 0x1BEF: 84,
+ 0x1BF0: 84,
+ 0x1BF1: 84,
+ 0x1C2C: 84,
+ 0x1C2D: 84,
+ 0x1C2E: 84,
+ 0x1C2F: 84,
+ 0x1C30: 84,
+ 0x1C31: 84,
+ 0x1C32: 84,
+ 0x1C33: 84,
+ 0x1C36: 84,
+ 0x1C37: 84,
+ 0x1CD0: 84,
+ 0x1CD1: 84,
+ 0x1CD2: 84,
+ 0x1CD4: 84,
+ 0x1CD5: 84,
+ 0x1CD6: 84,
+ 0x1CD7: 84,
+ 0x1CD8: 84,
+ 0x1CD9: 84,
+ 0x1CDA: 84,
+ 0x1CDB: 84,
+ 0x1CDC: 84,
+ 0x1CDD: 84,
+ 0x1CDE: 84,
+ 0x1CDF: 84,
+ 0x1CE0: 84,
+ 0x1CE2: 84,
+ 0x1CE3: 84,
+ 0x1CE4: 84,
+ 0x1CE5: 84,
+ 0x1CE6: 84,
+ 0x1CE7: 84,
+ 0x1CE8: 84,
+ 0x1CED: 84,
+ 0x1CF4: 84,
+ 0x1CF8: 84,
+ 0x1CF9: 84,
+ 0x1DC0: 84,
+ 0x1DC1: 84,
+ 0x1DC2: 84,
+ 0x1DC3: 84,
+ 0x1DC4: 84,
+ 0x1DC5: 84,
+ 0x1DC6: 84,
+ 0x1DC7: 84,
+ 0x1DC8: 84,
+ 0x1DC9: 84,
+ 0x1DCA: 84,
+ 0x1DCB: 84,
+ 0x1DCC: 84,
+ 0x1DCD: 84,
+ 0x1DCE: 84,
+ 0x1DCF: 84,
+ 0x1DD0: 84,
+ 0x1DD1: 84,
+ 0x1DD2: 84,
+ 0x1DD3: 84,
+ 0x1DD4: 84,
+ 0x1DD5: 84,
+ 0x1DD6: 84,
+ 0x1DD7: 84,
+ 0x1DD8: 84,
+ 0x1DD9: 84,
+ 0x1DDA: 84,
+ 0x1DDB: 84,
+ 0x1DDC: 84,
+ 0x1DDD: 84,
+ 0x1DDE: 84,
+ 0x1DDF: 84,
+ 0x1DE0: 84,
+ 0x1DE1: 84,
+ 0x1DE2: 84,
+ 0x1DE3: 84,
+ 0x1DE4: 84,
+ 0x1DE5: 84,
+ 0x1DE6: 84,
+ 0x1DE7: 84,
+ 0x1DE8: 84,
+ 0x1DE9: 84,
+ 0x1DEA: 84,
+ 0x1DEB: 84,
+ 0x1DEC: 84,
+ 0x1DED: 84,
+ 0x1DEE: 84,
+ 0x1DEF: 84,
+ 0x1DF0: 84,
+ 0x1DF1: 84,
+ 0x1DF2: 84,
+ 0x1DF3: 84,
+ 0x1DF4: 84,
+ 0x1DF5: 84,
+ 0x1DF6: 84,
+ 0x1DF7: 84,
+ 0x1DF8: 84,
+ 0x1DF9: 84,
+ 0x1DFA: 84,
+ 0x1DFB: 84,
+ 0x1DFC: 84,
+ 0x1DFD: 84,
+ 0x1DFE: 84,
+ 0x1DFF: 84,
+ 0x200B: 84,
+ 0x200D: 67,
+ 0x200E: 84,
+ 0x200F: 84,
+ 0x202A: 84,
+ 0x202B: 84,
+ 0x202C: 84,
+ 0x202D: 84,
+ 0x202E: 84,
0x2060: 84,
0x2061: 84,
0x2062: 84,
0x2063: 84,
0x2064: 84,
- 0x206a: 84,
- 0x206b: 84,
- 0x206c: 84,
- 0x206d: 84,
- 0x206e: 84,
- 0x206f: 84,
- 0x20d0: 84,
- 0x20d1: 84,
- 0x20d2: 84,
- 0x20d3: 84,
- 0x20d4: 84,
- 0x20d5: 84,
- 0x20d6: 84,
- 0x20d7: 84,
- 0x20d8: 84,
- 0x20d9: 84,
- 0x20da: 84,
- 0x20db: 84,
- 0x20dc: 84,
- 0x20dd: 84,
- 0x20de: 84,
- 0x20df: 84,
- 0x20e0: 84,
- 0x20e1: 84,
- 0x20e2: 84,
- 0x20e3: 84,
- 0x20e4: 84,
- 0x20e5: 84,
- 0x20e6: 84,
- 0x20e7: 84,
- 0x20e8: 84,
- 0x20e9: 84,
- 0x20ea: 84,
- 0x20eb: 84,
- 0x20ec: 84,
- 0x20ed: 84,
- 0x20ee: 84,
- 0x20ef: 84,
- 0x20f0: 84,
- 0x2cef: 84,
- 0x2cf0: 84,
- 0x2cf1: 84,
- 0x2d7f: 84,
- 0x2de0: 84,
- 0x2de1: 84,
- 0x2de2: 84,
- 0x2de3: 84,
- 0x2de4: 84,
- 0x2de5: 84,
- 0x2de6: 84,
- 0x2de7: 84,
- 0x2de8: 84,
- 0x2de9: 84,
- 0x2dea: 84,
- 0x2deb: 84,
- 0x2dec: 84,
- 0x2ded: 84,
- 0x2dee: 84,
- 0x2def: 84,
- 0x2df0: 84,
- 0x2df1: 84,
- 0x2df2: 84,
- 0x2df3: 84,
- 0x2df4: 84,
- 0x2df5: 84,
- 0x2df6: 84,
- 0x2df7: 84,
- 0x2df8: 84,
- 0x2df9: 84,
- 0x2dfa: 84,
- 0x2dfb: 84,
- 0x2dfc: 84,
- 0x2dfd: 84,
- 0x2dfe: 84,
- 0x2dff: 84,
- 0x302a: 84,
- 0x302b: 84,
- 0x302c: 84,
- 0x302d: 84,
+ 0x206A: 84,
+ 0x206B: 84,
+ 0x206C: 84,
+ 0x206D: 84,
+ 0x206E: 84,
+ 0x206F: 84,
+ 0x20D0: 84,
+ 0x20D1: 84,
+ 0x20D2: 84,
+ 0x20D3: 84,
+ 0x20D4: 84,
+ 0x20D5: 84,
+ 0x20D6: 84,
+ 0x20D7: 84,
+ 0x20D8: 84,
+ 0x20D9: 84,
+ 0x20DA: 84,
+ 0x20DB: 84,
+ 0x20DC: 84,
+ 0x20DD: 84,
+ 0x20DE: 84,
+ 0x20DF: 84,
+ 0x20E0: 84,
+ 0x20E1: 84,
+ 0x20E2: 84,
+ 0x20E3: 84,
+ 0x20E4: 84,
+ 0x20E5: 84,
+ 0x20E6: 84,
+ 0x20E7: 84,
+ 0x20E8: 84,
+ 0x20E9: 84,
+ 0x20EA: 84,
+ 0x20EB: 84,
+ 0x20EC: 84,
+ 0x20ED: 84,
+ 0x20EE: 84,
+ 0x20EF: 84,
+ 0x20F0: 84,
+ 0x2CEF: 84,
+ 0x2CF0: 84,
+ 0x2CF1: 84,
+ 0x2D7F: 84,
+ 0x2DE0: 84,
+ 0x2DE1: 84,
+ 0x2DE2: 84,
+ 0x2DE3: 84,
+ 0x2DE4: 84,
+ 0x2DE5: 84,
+ 0x2DE6: 84,
+ 0x2DE7: 84,
+ 0x2DE8: 84,
+ 0x2DE9: 84,
+ 0x2DEA: 84,
+ 0x2DEB: 84,
+ 0x2DEC: 84,
+ 0x2DED: 84,
+ 0x2DEE: 84,
+ 0x2DEF: 84,
+ 0x2DF0: 84,
+ 0x2DF1: 84,
+ 0x2DF2: 84,
+ 0x2DF3: 84,
+ 0x2DF4: 84,
+ 0x2DF5: 84,
+ 0x2DF6: 84,
+ 0x2DF7: 84,
+ 0x2DF8: 84,
+ 0x2DF9: 84,
+ 0x2DFA: 84,
+ 0x2DFB: 84,
+ 0x2DFC: 84,
+ 0x2DFD: 84,
+ 0x2DFE: 84,
+ 0x2DFF: 84,
+ 0x302A: 84,
+ 0x302B: 84,
+ 0x302C: 84,
+ 0x302D: 84,
0x3099: 84,
- 0x309a: 84,
- 0xa66f: 84,
- 0xa670: 84,
- 0xa671: 84,
- 0xa672: 84,
- 0xa674: 84,
- 0xa675: 84,
- 0xa676: 84,
- 0xa677: 84,
- 0xa678: 84,
- 0xa679: 84,
- 0xa67a: 84,
- 0xa67b: 84,
- 0xa67c: 84,
- 0xa67d: 84,
- 0xa69e: 84,
- 0xa69f: 84,
- 0xa6f0: 84,
- 0xa6f1: 84,
- 0xa802: 84,
- 0xa806: 84,
- 0xa80b: 84,
- 0xa825: 84,
- 0xa826: 84,
- 0xa82c: 84,
- 0xa840: 68,
- 0xa841: 68,
- 0xa842: 68,
- 0xa843: 68,
- 0xa844: 68,
- 0xa845: 68,
- 0xa846: 68,
- 0xa847: 68,
- 0xa848: 68,
- 0xa849: 68,
- 0xa84a: 68,
- 0xa84b: 68,
- 0xa84c: 68,
- 0xa84d: 68,
- 0xa84e: 68,
- 0xa84f: 68,
- 0xa850: 68,
- 0xa851: 68,
- 0xa852: 68,
- 0xa853: 68,
- 0xa854: 68,
- 0xa855: 68,
- 0xa856: 68,
- 0xa857: 68,
- 0xa858: 68,
- 0xa859: 68,
- 0xa85a: 68,
- 0xa85b: 68,
- 0xa85c: 68,
- 0xa85d: 68,
- 0xa85e: 68,
- 0xa85f: 68,
- 0xa860: 68,
- 0xa861: 68,
- 0xa862: 68,
- 0xa863: 68,
- 0xa864: 68,
- 0xa865: 68,
- 0xa866: 68,
- 0xa867: 68,
- 0xa868: 68,
- 0xa869: 68,
- 0xa86a: 68,
- 0xa86b: 68,
- 0xa86c: 68,
- 0xa86d: 68,
- 0xa86e: 68,
- 0xa86f: 68,
- 0xa870: 68,
- 0xa871: 68,
- 0xa872: 76,
- 0xa8c4: 84,
- 0xa8c5: 84,
- 0xa8e0: 84,
- 0xa8e1: 84,
- 0xa8e2: 84,
- 0xa8e3: 84,
- 0xa8e4: 84,
- 0xa8e5: 84,
- 0xa8e6: 84,
- 0xa8e7: 84,
- 0xa8e8: 84,
- 0xa8e9: 84,
- 0xa8ea: 84,
- 0xa8eb: 84,
- 0xa8ec: 84,
- 0xa8ed: 84,
- 0xa8ee: 84,
- 0xa8ef: 84,
- 0xa8f0: 84,
- 0xa8f1: 84,
- 0xa8ff: 84,
- 0xa926: 84,
- 0xa927: 84,
- 0xa928: 84,
- 0xa929: 84,
- 0xa92a: 84,
- 0xa92b: 84,
- 0xa92c: 84,
- 0xa92d: 84,
- 0xa947: 84,
- 0xa948: 84,
- 0xa949: 84,
- 0xa94a: 84,
- 0xa94b: 84,
- 0xa94c: 84,
- 0xa94d: 84,
- 0xa94e: 84,
- 0xa94f: 84,
- 0xa950: 84,
- 0xa951: 84,
- 0xa980: 84,
- 0xa981: 84,
- 0xa982: 84,
- 0xa9b3: 84,
- 0xa9b6: 84,
- 0xa9b7: 84,
- 0xa9b8: 84,
- 0xa9b9: 84,
- 0xa9bc: 84,
- 0xa9bd: 84,
- 0xa9e5: 84,
- 0xaa29: 84,
- 0xaa2a: 84,
- 0xaa2b: 84,
- 0xaa2c: 84,
- 0xaa2d: 84,
- 0xaa2e: 84,
- 0xaa31: 84,
- 0xaa32: 84,
- 0xaa35: 84,
- 0xaa36: 84,
- 0xaa43: 84,
- 0xaa4c: 84,
- 0xaa7c: 84,
- 0xaab0: 84,
- 0xaab2: 84,
- 0xaab3: 84,
- 0xaab4: 84,
- 0xaab7: 84,
- 0xaab8: 84,
- 0xaabe: 84,
- 0xaabf: 84,
- 0xaac1: 84,
- 0xaaec: 84,
- 0xaaed: 84,
- 0xaaf6: 84,
- 0xabe5: 84,
- 0xabe8: 84,
- 0xabed: 84,
- 0xfb1e: 84,
- 0xfe00: 84,
- 0xfe01: 84,
- 0xfe02: 84,
- 0xfe03: 84,
- 0xfe04: 84,
- 0xfe05: 84,
- 0xfe06: 84,
- 0xfe07: 84,
- 0xfe08: 84,
- 0xfe09: 84,
- 0xfe0a: 84,
- 0xfe0b: 84,
- 0xfe0c: 84,
- 0xfe0d: 84,
- 0xfe0e: 84,
- 0xfe0f: 84,
- 0xfe20: 84,
- 0xfe21: 84,
- 0xfe22: 84,
- 0xfe23: 84,
- 0xfe24: 84,
- 0xfe25: 84,
- 0xfe26: 84,
- 0xfe27: 84,
- 0xfe28: 84,
- 0xfe29: 84,
- 0xfe2a: 84,
- 0xfe2b: 84,
- 0xfe2c: 84,
- 0xfe2d: 84,
- 0xfe2e: 84,
- 0xfe2f: 84,
- 0xfeff: 84,
- 0xfff9: 84,
- 0xfffa: 84,
- 0xfffb: 84,
- 0x101fd: 84,
- 0x102e0: 84,
+ 0x309A: 84,
+ 0xA66F: 84,
+ 0xA670: 84,
+ 0xA671: 84,
+ 0xA672: 84,
+ 0xA674: 84,
+ 0xA675: 84,
+ 0xA676: 84,
+ 0xA677: 84,
+ 0xA678: 84,
+ 0xA679: 84,
+ 0xA67A: 84,
+ 0xA67B: 84,
+ 0xA67C: 84,
+ 0xA67D: 84,
+ 0xA69E: 84,
+ 0xA69F: 84,
+ 0xA6F0: 84,
+ 0xA6F1: 84,
+ 0xA802: 84,
+ 0xA806: 84,
+ 0xA80B: 84,
+ 0xA825: 84,
+ 0xA826: 84,
+ 0xA82C: 84,
+ 0xA840: 68,
+ 0xA841: 68,
+ 0xA842: 68,
+ 0xA843: 68,
+ 0xA844: 68,
+ 0xA845: 68,
+ 0xA846: 68,
+ 0xA847: 68,
+ 0xA848: 68,
+ 0xA849: 68,
+ 0xA84A: 68,
+ 0xA84B: 68,
+ 0xA84C: 68,
+ 0xA84D: 68,
+ 0xA84E: 68,
+ 0xA84F: 68,
+ 0xA850: 68,
+ 0xA851: 68,
+ 0xA852: 68,
+ 0xA853: 68,
+ 0xA854: 68,
+ 0xA855: 68,
+ 0xA856: 68,
+ 0xA857: 68,
+ 0xA858: 68,
+ 0xA859: 68,
+ 0xA85A: 68,
+ 0xA85B: 68,
+ 0xA85C: 68,
+ 0xA85D: 68,
+ 0xA85E: 68,
+ 0xA85F: 68,
+ 0xA860: 68,
+ 0xA861: 68,
+ 0xA862: 68,
+ 0xA863: 68,
+ 0xA864: 68,
+ 0xA865: 68,
+ 0xA866: 68,
+ 0xA867: 68,
+ 0xA868: 68,
+ 0xA869: 68,
+ 0xA86A: 68,
+ 0xA86B: 68,
+ 0xA86C: 68,
+ 0xA86D: 68,
+ 0xA86E: 68,
+ 0xA86F: 68,
+ 0xA870: 68,
+ 0xA871: 68,
+ 0xA872: 76,
+ 0xA8C4: 84,
+ 0xA8C5: 84,
+ 0xA8E0: 84,
+ 0xA8E1: 84,
+ 0xA8E2: 84,
+ 0xA8E3: 84,
+ 0xA8E4: 84,
+ 0xA8E5: 84,
+ 0xA8E6: 84,
+ 0xA8E7: 84,
+ 0xA8E8: 84,
+ 0xA8E9: 84,
+ 0xA8EA: 84,
+ 0xA8EB: 84,
+ 0xA8EC: 84,
+ 0xA8ED: 84,
+ 0xA8EE: 84,
+ 0xA8EF: 84,
+ 0xA8F0: 84,
+ 0xA8F1: 84,
+ 0xA8FF: 84,
+ 0xA926: 84,
+ 0xA927: 84,
+ 0xA928: 84,
+ 0xA929: 84,
+ 0xA92A: 84,
+ 0xA92B: 84,
+ 0xA92C: 84,
+ 0xA92D: 84,
+ 0xA947: 84,
+ 0xA948: 84,
+ 0xA949: 84,
+ 0xA94A: 84,
+ 0xA94B: 84,
+ 0xA94C: 84,
+ 0xA94D: 84,
+ 0xA94E: 84,
+ 0xA94F: 84,
+ 0xA950: 84,
+ 0xA951: 84,
+ 0xA980: 84,
+ 0xA981: 84,
+ 0xA982: 84,
+ 0xA9B3: 84,
+ 0xA9B6: 84,
+ 0xA9B7: 84,
+ 0xA9B8: 84,
+ 0xA9B9: 84,
+ 0xA9BC: 84,
+ 0xA9BD: 84,
+ 0xA9E5: 84,
+ 0xAA29: 84,
+ 0xAA2A: 84,
+ 0xAA2B: 84,
+ 0xAA2C: 84,
+ 0xAA2D: 84,
+ 0xAA2E: 84,
+ 0xAA31: 84,
+ 0xAA32: 84,
+ 0xAA35: 84,
+ 0xAA36: 84,
+ 0xAA43: 84,
+ 0xAA4C: 84,
+ 0xAA7C: 84,
+ 0xAAB0: 84,
+ 0xAAB2: 84,
+ 0xAAB3: 84,
+ 0xAAB4: 84,
+ 0xAAB7: 84,
+ 0xAAB8: 84,
+ 0xAABE: 84,
+ 0xAABF: 84,
+ 0xAAC1: 84,
+ 0xAAEC: 84,
+ 0xAAED: 84,
+ 0xAAF6: 84,
+ 0xABE5: 84,
+ 0xABE8: 84,
+ 0xABED: 84,
+ 0xFB1E: 84,
+ 0xFE00: 84,
+ 0xFE01: 84,
+ 0xFE02: 84,
+ 0xFE03: 84,
+ 0xFE04: 84,
+ 0xFE05: 84,
+ 0xFE06: 84,
+ 0xFE07: 84,
+ 0xFE08: 84,
+ 0xFE09: 84,
+ 0xFE0A: 84,
+ 0xFE0B: 84,
+ 0xFE0C: 84,
+ 0xFE0D: 84,
+ 0xFE0E: 84,
+ 0xFE0F: 84,
+ 0xFE20: 84,
+ 0xFE21: 84,
+ 0xFE22: 84,
+ 0xFE23: 84,
+ 0xFE24: 84,
+ 0xFE25: 84,
+ 0xFE26: 84,
+ 0xFE27: 84,
+ 0xFE28: 84,
+ 0xFE29: 84,
+ 0xFE2A: 84,
+ 0xFE2B: 84,
+ 0xFE2C: 84,
+ 0xFE2D: 84,
+ 0xFE2E: 84,
+ 0xFE2F: 84,
+ 0xFEFF: 84,
+ 0xFFF9: 84,
+ 0xFFFA: 84,
+ 0xFFFB: 84,
+ 0x101FD: 84,
+ 0x102E0: 84,
0x10376: 84,
0x10377: 84,
0x10378: 84,
0x10379: 84,
- 0x1037a: 84,
- 0x10a01: 84,
- 0x10a02: 84,
- 0x10a03: 84,
- 0x10a05: 84,
- 0x10a06: 84,
- 0x10a0c: 84,
- 0x10a0d: 84,
- 0x10a0e: 84,
- 0x10a0f: 84,
- 0x10a38: 84,
- 0x10a39: 84,
- 0x10a3a: 84,
- 0x10a3f: 84,
- 0x10ac0: 68,
- 0x10ac1: 68,
- 0x10ac2: 68,
- 0x10ac3: 68,
- 0x10ac4: 68,
- 0x10ac5: 82,
- 0x10ac7: 82,
- 0x10ac9: 82,
- 0x10aca: 82,
- 0x10acd: 76,
- 0x10ace: 82,
- 0x10acf: 82,
- 0x10ad0: 82,
- 0x10ad1: 82,
- 0x10ad2: 82,
- 0x10ad3: 68,
- 0x10ad4: 68,
- 0x10ad5: 68,
- 0x10ad6: 68,
- 0x10ad7: 76,
- 0x10ad8: 68,
- 0x10ad9: 68,
- 0x10ada: 68,
- 0x10adb: 68,
- 0x10adc: 68,
- 0x10add: 82,
- 0x10ade: 68,
- 0x10adf: 68,
- 0x10ae0: 68,
- 0x10ae1: 82,
- 0x10ae4: 82,
- 0x10ae5: 84,
- 0x10ae6: 84,
- 0x10aeb: 68,
- 0x10aec: 68,
- 0x10aed: 68,
- 0x10aee: 68,
- 0x10aef: 82,
- 0x10b80: 68,
- 0x10b81: 82,
- 0x10b82: 68,
- 0x10b83: 82,
- 0x10b84: 82,
- 0x10b85: 82,
- 0x10b86: 68,
- 0x10b87: 68,
- 0x10b88: 68,
- 0x10b89: 82,
- 0x10b8a: 68,
- 0x10b8b: 68,
- 0x10b8c: 82,
- 0x10b8d: 68,
- 0x10b8e: 82,
- 0x10b8f: 82,
- 0x10b90: 68,
- 0x10b91: 82,
- 0x10ba9: 82,
- 0x10baa: 82,
- 0x10bab: 82,
- 0x10bac: 82,
- 0x10bad: 68,
- 0x10bae: 68,
- 0x10d00: 76,
- 0x10d01: 68,
- 0x10d02: 68,
- 0x10d03: 68,
- 0x10d04: 68,
- 0x10d05: 68,
- 0x10d06: 68,
- 0x10d07: 68,
- 0x10d08: 68,
- 0x10d09: 68,
- 0x10d0a: 68,
- 0x10d0b: 68,
- 0x10d0c: 68,
- 0x10d0d: 68,
- 0x10d0e: 68,
- 0x10d0f: 68,
- 0x10d10: 68,
- 0x10d11: 68,
- 0x10d12: 68,
- 0x10d13: 68,
- 0x10d14: 68,
- 0x10d15: 68,
- 0x10d16: 68,
- 0x10d17: 68,
- 0x10d18: 68,
- 0x10d19: 68,
- 0x10d1a: 68,
- 0x10d1b: 68,
- 0x10d1c: 68,
- 0x10d1d: 68,
- 0x10d1e: 68,
- 0x10d1f: 68,
- 0x10d20: 68,
- 0x10d21: 68,
- 0x10d22: 82,
- 0x10d23: 68,
- 0x10d24: 84,
- 0x10d25: 84,
- 0x10d26: 84,
- 0x10d27: 84,
- 0x10eab: 84,
- 0x10eac: 84,
- 0x10efd: 84,
- 0x10efe: 84,
- 0x10eff: 84,
- 0x10f30: 68,
- 0x10f31: 68,
- 0x10f32: 68,
- 0x10f33: 82,
- 0x10f34: 68,
- 0x10f35: 68,
- 0x10f36: 68,
- 0x10f37: 68,
- 0x10f38: 68,
- 0x10f39: 68,
- 0x10f3a: 68,
- 0x10f3b: 68,
- 0x10f3c: 68,
- 0x10f3d: 68,
- 0x10f3e: 68,
- 0x10f3f: 68,
- 0x10f40: 68,
- 0x10f41: 68,
- 0x10f42: 68,
- 0x10f43: 68,
- 0x10f44: 68,
- 0x10f46: 84,
- 0x10f47: 84,
- 0x10f48: 84,
- 0x10f49: 84,
- 0x10f4a: 84,
- 0x10f4b: 84,
- 0x10f4c: 84,
- 0x10f4d: 84,
- 0x10f4e: 84,
- 0x10f4f: 84,
- 0x10f50: 84,
- 0x10f51: 68,
- 0x10f52: 68,
- 0x10f53: 68,
- 0x10f54: 82,
- 0x10f70: 68,
- 0x10f71: 68,
- 0x10f72: 68,
- 0x10f73: 68,
- 0x10f74: 82,
- 0x10f75: 82,
- 0x10f76: 68,
- 0x10f77: 68,
- 0x10f78: 68,
- 0x10f79: 68,
- 0x10f7a: 68,
- 0x10f7b: 68,
- 0x10f7c: 68,
- 0x10f7d: 68,
- 0x10f7e: 68,
- 0x10f7f: 68,
- 0x10f80: 68,
- 0x10f81: 68,
- 0x10f82: 84,
- 0x10f83: 84,
- 0x10f84: 84,
- 0x10f85: 84,
- 0x10fb0: 68,
- 0x10fb2: 68,
- 0x10fb3: 68,
- 0x10fb4: 82,
- 0x10fb5: 82,
- 0x10fb6: 82,
- 0x10fb8: 68,
- 0x10fb9: 82,
- 0x10fba: 82,
- 0x10fbb: 68,
- 0x10fbc: 68,
- 0x10fbd: 82,
- 0x10fbe: 68,
- 0x10fbf: 68,
- 0x10fc1: 68,
- 0x10fc2: 82,
- 0x10fc3: 82,
- 0x10fc4: 68,
- 0x10fc9: 82,
- 0x10fca: 68,
- 0x10fcb: 76,
+ 0x1037A: 84,
+ 0x10A01: 84,
+ 0x10A02: 84,
+ 0x10A03: 84,
+ 0x10A05: 84,
+ 0x10A06: 84,
+ 0x10A0C: 84,
+ 0x10A0D: 84,
+ 0x10A0E: 84,
+ 0x10A0F: 84,
+ 0x10A38: 84,
+ 0x10A39: 84,
+ 0x10A3A: 84,
+ 0x10A3F: 84,
+ 0x10AC0: 68,
+ 0x10AC1: 68,
+ 0x10AC2: 68,
+ 0x10AC3: 68,
+ 0x10AC4: 68,
+ 0x10AC5: 82,
+ 0x10AC7: 82,
+ 0x10AC9: 82,
+ 0x10ACA: 82,
+ 0x10ACD: 76,
+ 0x10ACE: 82,
+ 0x10ACF: 82,
+ 0x10AD0: 82,
+ 0x10AD1: 82,
+ 0x10AD2: 82,
+ 0x10AD3: 68,
+ 0x10AD4: 68,
+ 0x10AD5: 68,
+ 0x10AD6: 68,
+ 0x10AD7: 76,
+ 0x10AD8: 68,
+ 0x10AD9: 68,
+ 0x10ADA: 68,
+ 0x10ADB: 68,
+ 0x10ADC: 68,
+ 0x10ADD: 82,
+ 0x10ADE: 68,
+ 0x10ADF: 68,
+ 0x10AE0: 68,
+ 0x10AE1: 82,
+ 0x10AE4: 82,
+ 0x10AE5: 84,
+ 0x10AE6: 84,
+ 0x10AEB: 68,
+ 0x10AEC: 68,
+ 0x10AED: 68,
+ 0x10AEE: 68,
+ 0x10AEF: 82,
+ 0x10B80: 68,
+ 0x10B81: 82,
+ 0x10B82: 68,
+ 0x10B83: 82,
+ 0x10B84: 82,
+ 0x10B85: 82,
+ 0x10B86: 68,
+ 0x10B87: 68,
+ 0x10B88: 68,
+ 0x10B89: 82,
+ 0x10B8A: 68,
+ 0x10B8B: 68,
+ 0x10B8C: 82,
+ 0x10B8D: 68,
+ 0x10B8E: 82,
+ 0x10B8F: 82,
+ 0x10B90: 68,
+ 0x10B91: 82,
+ 0x10BA9: 82,
+ 0x10BAA: 82,
+ 0x10BAB: 82,
+ 0x10BAC: 82,
+ 0x10BAD: 68,
+ 0x10BAE: 68,
+ 0x10D00: 76,
+ 0x10D01: 68,
+ 0x10D02: 68,
+ 0x10D03: 68,
+ 0x10D04: 68,
+ 0x10D05: 68,
+ 0x10D06: 68,
+ 0x10D07: 68,
+ 0x10D08: 68,
+ 0x10D09: 68,
+ 0x10D0A: 68,
+ 0x10D0B: 68,
+ 0x10D0C: 68,
+ 0x10D0D: 68,
+ 0x10D0E: 68,
+ 0x10D0F: 68,
+ 0x10D10: 68,
+ 0x10D11: 68,
+ 0x10D12: 68,
+ 0x10D13: 68,
+ 0x10D14: 68,
+ 0x10D15: 68,
+ 0x10D16: 68,
+ 0x10D17: 68,
+ 0x10D18: 68,
+ 0x10D19: 68,
+ 0x10D1A: 68,
+ 0x10D1B: 68,
+ 0x10D1C: 68,
+ 0x10D1D: 68,
+ 0x10D1E: 68,
+ 0x10D1F: 68,
+ 0x10D20: 68,
+ 0x10D21: 68,
+ 0x10D22: 82,
+ 0x10D23: 68,
+ 0x10D24: 84,
+ 0x10D25: 84,
+ 0x10D26: 84,
+ 0x10D27: 84,
+ 0x10EAB: 84,
+ 0x10EAC: 84,
+ 0x10EFD: 84,
+ 0x10EFE: 84,
+ 0x10EFF: 84,
+ 0x10F30: 68,
+ 0x10F31: 68,
+ 0x10F32: 68,
+ 0x10F33: 82,
+ 0x10F34: 68,
+ 0x10F35: 68,
+ 0x10F36: 68,
+ 0x10F37: 68,
+ 0x10F38: 68,
+ 0x10F39: 68,
+ 0x10F3A: 68,
+ 0x10F3B: 68,
+ 0x10F3C: 68,
+ 0x10F3D: 68,
+ 0x10F3E: 68,
+ 0x10F3F: 68,
+ 0x10F40: 68,
+ 0x10F41: 68,
+ 0x10F42: 68,
+ 0x10F43: 68,
+ 0x10F44: 68,
+ 0x10F46: 84,
+ 0x10F47: 84,
+ 0x10F48: 84,
+ 0x10F49: 84,
+ 0x10F4A: 84,
+ 0x10F4B: 84,
+ 0x10F4C: 84,
+ 0x10F4D: 84,
+ 0x10F4E: 84,
+ 0x10F4F: 84,
+ 0x10F50: 84,
+ 0x10F51: 68,
+ 0x10F52: 68,
+ 0x10F53: 68,
+ 0x10F54: 82,
+ 0x10F70: 68,
+ 0x10F71: 68,
+ 0x10F72: 68,
+ 0x10F73: 68,
+ 0x10F74: 82,
+ 0x10F75: 82,
+ 0x10F76: 68,
+ 0x10F77: 68,
+ 0x10F78: 68,
+ 0x10F79: 68,
+ 0x10F7A: 68,
+ 0x10F7B: 68,
+ 0x10F7C: 68,
+ 0x10F7D: 68,
+ 0x10F7E: 68,
+ 0x10F7F: 68,
+ 0x10F80: 68,
+ 0x10F81: 68,
+ 0x10F82: 84,
+ 0x10F83: 84,
+ 0x10F84: 84,
+ 0x10F85: 84,
+ 0x10FB0: 68,
+ 0x10FB2: 68,
+ 0x10FB3: 68,
+ 0x10FB4: 82,
+ 0x10FB5: 82,
+ 0x10FB6: 82,
+ 0x10FB8: 68,
+ 0x10FB9: 82,
+ 0x10FBA: 82,
+ 0x10FBB: 68,
+ 0x10FBC: 68,
+ 0x10FBD: 82,
+ 0x10FBE: 68,
+ 0x10FBF: 68,
+ 0x10FC1: 68,
+ 0x10FC2: 82,
+ 0x10FC3: 82,
+ 0x10FC4: 68,
+ 0x10FC9: 82,
+ 0x10FCA: 68,
+ 0x10FCB: 76,
0x11001: 84,
0x11038: 84,
0x11039: 84,
- 0x1103a: 84,
- 0x1103b: 84,
- 0x1103c: 84,
- 0x1103d: 84,
- 0x1103e: 84,
- 0x1103f: 84,
+ 0x1103A: 84,
+ 0x1103B: 84,
+ 0x1103C: 84,
+ 0x1103D: 84,
+ 0x1103E: 84,
+ 0x1103F: 84,
0x11040: 84,
0x11041: 84,
0x11042: 84,
@@ -1975,27 +1976,27 @@ joining_types = {
0x11070: 84,
0x11073: 84,
0x11074: 84,
- 0x1107f: 84,
+ 0x1107F: 84,
0x11080: 84,
0x11081: 84,
- 0x110b3: 84,
- 0x110b4: 84,
- 0x110b5: 84,
- 0x110b6: 84,
- 0x110b9: 84,
- 0x110ba: 84,
- 0x110c2: 84,
+ 0x110B3: 84,
+ 0x110B4: 84,
+ 0x110B5: 84,
+ 0x110B6: 84,
+ 0x110B9: 84,
+ 0x110BA: 84,
+ 0x110C2: 84,
0x11100: 84,
0x11101: 84,
0x11102: 84,
0x11127: 84,
0x11128: 84,
0x11129: 84,
- 0x1112a: 84,
- 0x1112b: 84,
- 0x1112d: 84,
- 0x1112e: 84,
- 0x1112f: 84,
+ 0x1112A: 84,
+ 0x1112B: 84,
+ 0x1112D: 84,
+ 0x1112E: 84,
+ 0x1112F: 84,
0x11130: 84,
0x11131: 84,
0x11132: 84,
@@ -2004,49 +2005,49 @@ joining_types = {
0x11173: 84,
0x11180: 84,
0x11181: 84,
- 0x111b6: 84,
- 0x111b7: 84,
- 0x111b8: 84,
- 0x111b9: 84,
- 0x111ba: 84,
- 0x111bb: 84,
- 0x111bc: 84,
- 0x111bd: 84,
- 0x111be: 84,
- 0x111c9: 84,
- 0x111ca: 84,
- 0x111cb: 84,
- 0x111cc: 84,
- 0x111cf: 84,
- 0x1122f: 84,
+ 0x111B6: 84,
+ 0x111B7: 84,
+ 0x111B8: 84,
+ 0x111B9: 84,
+ 0x111BA: 84,
+ 0x111BB: 84,
+ 0x111BC: 84,
+ 0x111BD: 84,
+ 0x111BE: 84,
+ 0x111C9: 84,
+ 0x111CA: 84,
+ 0x111CB: 84,
+ 0x111CC: 84,
+ 0x111CF: 84,
+ 0x1122F: 84,
0x11230: 84,
0x11231: 84,
0x11234: 84,
0x11236: 84,
0x11237: 84,
- 0x1123e: 84,
+ 0x1123E: 84,
0x11241: 84,
- 0x112df: 84,
- 0x112e3: 84,
- 0x112e4: 84,
- 0x112e5: 84,
- 0x112e6: 84,
- 0x112e7: 84,
- 0x112e8: 84,
- 0x112e9: 84,
- 0x112ea: 84,
+ 0x112DF: 84,
+ 0x112E3: 84,
+ 0x112E4: 84,
+ 0x112E5: 84,
+ 0x112E6: 84,
+ 0x112E7: 84,
+ 0x112E8: 84,
+ 0x112E9: 84,
+ 0x112EA: 84,
0x11300: 84,
0x11301: 84,
- 0x1133b: 84,
- 0x1133c: 84,
+ 0x1133B: 84,
+ 0x1133C: 84,
0x11340: 84,
0x11366: 84,
0x11367: 84,
0x11368: 84,
0x11369: 84,
- 0x1136a: 84,
- 0x1136b: 84,
- 0x1136c: 84,
+ 0x1136A: 84,
+ 0x1136B: 84,
+ 0x1136C: 84,
0x11370: 84,
0x11371: 84,
0x11372: 84,
@@ -2054,38 +2055,38 @@ joining_types = {
0x11374: 84,
0x11438: 84,
0x11439: 84,
- 0x1143a: 84,
- 0x1143b: 84,
- 0x1143c: 84,
- 0x1143d: 84,
- 0x1143e: 84,
- 0x1143f: 84,
+ 0x1143A: 84,
+ 0x1143B: 84,
+ 0x1143C: 84,
+ 0x1143D: 84,
+ 0x1143E: 84,
+ 0x1143F: 84,
0x11442: 84,
0x11443: 84,
0x11444: 84,
0x11446: 84,
- 0x1145e: 84,
- 0x114b3: 84,
- 0x114b4: 84,
- 0x114b5: 84,
- 0x114b6: 84,
- 0x114b7: 84,
- 0x114b8: 84,
- 0x114ba: 84,
- 0x114bf: 84,
- 0x114c0: 84,
- 0x114c2: 84,
- 0x114c3: 84,
- 0x115b2: 84,
- 0x115b3: 84,
- 0x115b4: 84,
- 0x115b5: 84,
- 0x115bc: 84,
- 0x115bd: 84,
- 0x115bf: 84,
- 0x115c0: 84,
- 0x115dc: 84,
- 0x115dd: 84,
+ 0x1145E: 84,
+ 0x114B3: 84,
+ 0x114B4: 84,
+ 0x114B5: 84,
+ 0x114B6: 84,
+ 0x114B7: 84,
+ 0x114B8: 84,
+ 0x114BA: 84,
+ 0x114BF: 84,
+ 0x114C0: 84,
+ 0x114C2: 84,
+ 0x114C3: 84,
+ 0x115B2: 84,
+ 0x115B3: 84,
+ 0x115B4: 84,
+ 0x115B5: 84,
+ 0x115BC: 84,
+ 0x115BD: 84,
+ 0x115BF: 84,
+ 0x115C0: 84,
+ 0x115DC: 84,
+ 0x115DD: 84,
0x11633: 84,
0x11634: 84,
0x11635: 84,
@@ -2093,22 +2094,22 @@ joining_types = {
0x11637: 84,
0x11638: 84,
0x11639: 84,
- 0x1163a: 84,
- 0x1163d: 84,
- 0x1163f: 84,
+ 0x1163A: 84,
+ 0x1163D: 84,
+ 0x1163F: 84,
0x11640: 84,
- 0x116ab: 84,
- 0x116ad: 84,
- 0x116b0: 84,
- 0x116b1: 84,
- 0x116b2: 84,
- 0x116b3: 84,
- 0x116b4: 84,
- 0x116b5: 84,
- 0x116b7: 84,
- 0x1171d: 84,
- 0x1171e: 84,
- 0x1171f: 84,
+ 0x116AB: 84,
+ 0x116AD: 84,
+ 0x116B0: 84,
+ 0x116B1: 84,
+ 0x116B2: 84,
+ 0x116B3: 84,
+ 0x116B4: 84,
+ 0x116B5: 84,
+ 0x116B7: 84,
+ 0x1171D: 84,
+ 0x1171E: 84,
+ 0x1171F: 84,
0x11722: 84,
0x11723: 84,
0x11724: 84,
@@ -2116,9 +2117,9 @@ joining_types = {
0x11727: 84,
0x11728: 84,
0x11729: 84,
- 0x1172a: 84,
- 0x1172b: 84,
- 0x1182f: 84,
+ 0x1172A: 84,
+ 0x1172B: 84,
+ 0x1182F: 84,
0x11830: 84,
0x11831: 84,
0x11832: 84,
@@ -2128,142 +2129,142 @@ joining_types = {
0x11836: 84,
0x11837: 84,
0x11839: 84,
- 0x1183a: 84,
- 0x1193b: 84,
- 0x1193c: 84,
- 0x1193e: 84,
+ 0x1183A: 84,
+ 0x1193B: 84,
+ 0x1193C: 84,
+ 0x1193E: 84,
0x11943: 84,
- 0x119d4: 84,
- 0x119d5: 84,
- 0x119d6: 84,
- 0x119d7: 84,
- 0x119da: 84,
- 0x119db: 84,
- 0x119e0: 84,
- 0x11a01: 84,
- 0x11a02: 84,
- 0x11a03: 84,
- 0x11a04: 84,
- 0x11a05: 84,
- 0x11a06: 84,
- 0x11a07: 84,
- 0x11a08: 84,
- 0x11a09: 84,
- 0x11a0a: 84,
- 0x11a33: 84,
- 0x11a34: 84,
- 0x11a35: 84,
- 0x11a36: 84,
- 0x11a37: 84,
- 0x11a38: 84,
- 0x11a3b: 84,
- 0x11a3c: 84,
- 0x11a3d: 84,
- 0x11a3e: 84,
- 0x11a47: 84,
- 0x11a51: 84,
- 0x11a52: 84,
- 0x11a53: 84,
- 0x11a54: 84,
- 0x11a55: 84,
- 0x11a56: 84,
- 0x11a59: 84,
- 0x11a5a: 84,
- 0x11a5b: 84,
- 0x11a8a: 84,
- 0x11a8b: 84,
- 0x11a8c: 84,
- 0x11a8d: 84,
- 0x11a8e: 84,
- 0x11a8f: 84,
- 0x11a90: 84,
- 0x11a91: 84,
- 0x11a92: 84,
- 0x11a93: 84,
- 0x11a94: 84,
- 0x11a95: 84,
- 0x11a96: 84,
- 0x11a98: 84,
- 0x11a99: 84,
- 0x11c30: 84,
- 0x11c31: 84,
- 0x11c32: 84,
- 0x11c33: 84,
- 0x11c34: 84,
- 0x11c35: 84,
- 0x11c36: 84,
- 0x11c38: 84,
- 0x11c39: 84,
- 0x11c3a: 84,
- 0x11c3b: 84,
- 0x11c3c: 84,
- 0x11c3d: 84,
- 0x11c3f: 84,
- 0x11c92: 84,
- 0x11c93: 84,
- 0x11c94: 84,
- 0x11c95: 84,
- 0x11c96: 84,
- 0x11c97: 84,
- 0x11c98: 84,
- 0x11c99: 84,
- 0x11c9a: 84,
- 0x11c9b: 84,
- 0x11c9c: 84,
- 0x11c9d: 84,
- 0x11c9e: 84,
- 0x11c9f: 84,
- 0x11ca0: 84,
- 0x11ca1: 84,
- 0x11ca2: 84,
- 0x11ca3: 84,
- 0x11ca4: 84,
- 0x11ca5: 84,
- 0x11ca6: 84,
- 0x11ca7: 84,
- 0x11caa: 84,
- 0x11cab: 84,
- 0x11cac: 84,
- 0x11cad: 84,
- 0x11cae: 84,
- 0x11caf: 84,
- 0x11cb0: 84,
- 0x11cb2: 84,
- 0x11cb3: 84,
- 0x11cb5: 84,
- 0x11cb6: 84,
- 0x11d31: 84,
- 0x11d32: 84,
- 0x11d33: 84,
- 0x11d34: 84,
- 0x11d35: 84,
- 0x11d36: 84,
- 0x11d3a: 84,
- 0x11d3c: 84,
- 0x11d3d: 84,
- 0x11d3f: 84,
- 0x11d40: 84,
- 0x11d41: 84,
- 0x11d42: 84,
- 0x11d43: 84,
- 0x11d44: 84,
- 0x11d45: 84,
- 0x11d47: 84,
- 0x11d90: 84,
- 0x11d91: 84,
- 0x11d95: 84,
- 0x11d97: 84,
- 0x11ef3: 84,
- 0x11ef4: 84,
- 0x11f00: 84,
- 0x11f01: 84,
- 0x11f36: 84,
- 0x11f37: 84,
- 0x11f38: 84,
- 0x11f39: 84,
- 0x11f3a: 84,
- 0x11f40: 84,
- 0x11f42: 84,
+ 0x119D4: 84,
+ 0x119D5: 84,
+ 0x119D6: 84,
+ 0x119D7: 84,
+ 0x119DA: 84,
+ 0x119DB: 84,
+ 0x119E0: 84,
+ 0x11A01: 84,
+ 0x11A02: 84,
+ 0x11A03: 84,
+ 0x11A04: 84,
+ 0x11A05: 84,
+ 0x11A06: 84,
+ 0x11A07: 84,
+ 0x11A08: 84,
+ 0x11A09: 84,
+ 0x11A0A: 84,
+ 0x11A33: 84,
+ 0x11A34: 84,
+ 0x11A35: 84,
+ 0x11A36: 84,
+ 0x11A37: 84,
+ 0x11A38: 84,
+ 0x11A3B: 84,
+ 0x11A3C: 84,
+ 0x11A3D: 84,
+ 0x11A3E: 84,
+ 0x11A47: 84,
+ 0x11A51: 84,
+ 0x11A52: 84,
+ 0x11A53: 84,
+ 0x11A54: 84,
+ 0x11A55: 84,
+ 0x11A56: 84,
+ 0x11A59: 84,
+ 0x11A5A: 84,
+ 0x11A5B: 84,
+ 0x11A8A: 84,
+ 0x11A8B: 84,
+ 0x11A8C: 84,
+ 0x11A8D: 84,
+ 0x11A8E: 84,
+ 0x11A8F: 84,
+ 0x11A90: 84,
+ 0x11A91: 84,
+ 0x11A92: 84,
+ 0x11A93: 84,
+ 0x11A94: 84,
+ 0x11A95: 84,
+ 0x11A96: 84,
+ 0x11A98: 84,
+ 0x11A99: 84,
+ 0x11C30: 84,
+ 0x11C31: 84,
+ 0x11C32: 84,
+ 0x11C33: 84,
+ 0x11C34: 84,
+ 0x11C35: 84,
+ 0x11C36: 84,
+ 0x11C38: 84,
+ 0x11C39: 84,
+ 0x11C3A: 84,
+ 0x11C3B: 84,
+ 0x11C3C: 84,
+ 0x11C3D: 84,
+ 0x11C3F: 84,
+ 0x11C92: 84,
+ 0x11C93: 84,
+ 0x11C94: 84,
+ 0x11C95: 84,
+ 0x11C96: 84,
+ 0x11C97: 84,
+ 0x11C98: 84,
+ 0x11C99: 84,
+ 0x11C9A: 84,
+ 0x11C9B: 84,
+ 0x11C9C: 84,
+ 0x11C9D: 84,
+ 0x11C9E: 84,
+ 0x11C9F: 84,
+ 0x11CA0: 84,
+ 0x11CA1: 84,
+ 0x11CA2: 84,
+ 0x11CA3: 84,
+ 0x11CA4: 84,
+ 0x11CA5: 84,
+ 0x11CA6: 84,
+ 0x11CA7: 84,
+ 0x11CAA: 84,
+ 0x11CAB: 84,
+ 0x11CAC: 84,
+ 0x11CAD: 84,
+ 0x11CAE: 84,
+ 0x11CAF: 84,
+ 0x11CB0: 84,
+ 0x11CB2: 84,
+ 0x11CB3: 84,
+ 0x11CB5: 84,
+ 0x11CB6: 84,
+ 0x11D31: 84,
+ 0x11D32: 84,
+ 0x11D33: 84,
+ 0x11D34: 84,
+ 0x11D35: 84,
+ 0x11D36: 84,
+ 0x11D3A: 84,
+ 0x11D3C: 84,
+ 0x11D3D: 84,
+ 0x11D3F: 84,
+ 0x11D40: 84,
+ 0x11D41: 84,
+ 0x11D42: 84,
+ 0x11D43: 84,
+ 0x11D44: 84,
+ 0x11D45: 84,
+ 0x11D47: 84,
+ 0x11D90: 84,
+ 0x11D91: 84,
+ 0x11D95: 84,
+ 0x11D97: 84,
+ 0x11EF3: 84,
+ 0x11EF4: 84,
+ 0x11F00: 84,
+ 0x11F01: 84,
+ 0x11F36: 84,
+ 0x11F37: 84,
+ 0x11F38: 84,
+ 0x11F39: 84,
+ 0x11F3A: 84,
+ 0x11F40: 84,
+ 0x11F42: 84,
0x13430: 84,
0x13431: 84,
0x13432: 84,
@@ -2274,1973 +2275,1969 @@ joining_types = {
0x13437: 84,
0x13438: 84,
0x13439: 84,
- 0x1343a: 84,
- 0x1343b: 84,
- 0x1343c: 84,
- 0x1343d: 84,
- 0x1343e: 84,
- 0x1343f: 84,
+ 0x1343A: 84,
+ 0x1343B: 84,
+ 0x1343C: 84,
+ 0x1343D: 84,
+ 0x1343E: 84,
+ 0x1343F: 84,
0x13440: 84,
0x13447: 84,
0x13448: 84,
0x13449: 84,
- 0x1344a: 84,
- 0x1344b: 84,
- 0x1344c: 84,
- 0x1344d: 84,
- 0x1344e: 84,
- 0x1344f: 84,
+ 0x1344A: 84,
+ 0x1344B: 84,
+ 0x1344C: 84,
+ 0x1344D: 84,
+ 0x1344E: 84,
+ 0x1344F: 84,
0x13450: 84,
0x13451: 84,
0x13452: 84,
0x13453: 84,
0x13454: 84,
0x13455: 84,
- 0x16af0: 84,
- 0x16af1: 84,
- 0x16af2: 84,
- 0x16af3: 84,
- 0x16af4: 84,
- 0x16b30: 84,
- 0x16b31: 84,
- 0x16b32: 84,
- 0x16b33: 84,
- 0x16b34: 84,
- 0x16b35: 84,
- 0x16b36: 84,
- 0x16f4f: 84,
- 0x16f8f: 84,
- 0x16f90: 84,
- 0x16f91: 84,
- 0x16f92: 84,
- 0x16fe4: 84,
- 0x1bc9d: 84,
- 0x1bc9e: 84,
- 0x1bca0: 84,
- 0x1bca1: 84,
- 0x1bca2: 84,
- 0x1bca3: 84,
- 0x1cf00: 84,
- 0x1cf01: 84,
- 0x1cf02: 84,
- 0x1cf03: 84,
- 0x1cf04: 84,
- 0x1cf05: 84,
- 0x1cf06: 84,
- 0x1cf07: 84,
- 0x1cf08: 84,
- 0x1cf09: 84,
- 0x1cf0a: 84,
- 0x1cf0b: 84,
- 0x1cf0c: 84,
- 0x1cf0d: 84,
- 0x1cf0e: 84,
- 0x1cf0f: 84,
- 0x1cf10: 84,
- 0x1cf11: 84,
- 0x1cf12: 84,
- 0x1cf13: 84,
- 0x1cf14: 84,
- 0x1cf15: 84,
- 0x1cf16: 84,
- 0x1cf17: 84,
- 0x1cf18: 84,
- 0x1cf19: 84,
- 0x1cf1a: 84,
- 0x1cf1b: 84,
- 0x1cf1c: 84,
- 0x1cf1d: 84,
- 0x1cf1e: 84,
- 0x1cf1f: 84,
- 0x1cf20: 84,
- 0x1cf21: 84,
- 0x1cf22: 84,
- 0x1cf23: 84,
- 0x1cf24: 84,
- 0x1cf25: 84,
- 0x1cf26: 84,
- 0x1cf27: 84,
- 0x1cf28: 84,
- 0x1cf29: 84,
- 0x1cf2a: 84,
- 0x1cf2b: 84,
- 0x1cf2c: 84,
- 0x1cf2d: 84,
- 0x1cf30: 84,
- 0x1cf31: 84,
- 0x1cf32: 84,
- 0x1cf33: 84,
- 0x1cf34: 84,
- 0x1cf35: 84,
- 0x1cf36: 84,
- 0x1cf37: 84,
- 0x1cf38: 84,
- 0x1cf39: 84,
- 0x1cf3a: 84,
- 0x1cf3b: 84,
- 0x1cf3c: 84,
- 0x1cf3d: 84,
- 0x1cf3e: 84,
- 0x1cf3f: 84,
- 0x1cf40: 84,
- 0x1cf41: 84,
- 0x1cf42: 84,
- 0x1cf43: 84,
- 0x1cf44: 84,
- 0x1cf45: 84,
- 0x1cf46: 84,
- 0x1d167: 84,
- 0x1d168: 84,
- 0x1d169: 84,
- 0x1d173: 84,
- 0x1d174: 84,
- 0x1d175: 84,
- 0x1d176: 84,
- 0x1d177: 84,
- 0x1d178: 84,
- 0x1d179: 84,
- 0x1d17a: 84,
- 0x1d17b: 84,
- 0x1d17c: 84,
- 0x1d17d: 84,
- 0x1d17e: 84,
- 0x1d17f: 84,
- 0x1d180: 84,
- 0x1d181: 84,
- 0x1d182: 84,
- 0x1d185: 84,
- 0x1d186: 84,
- 0x1d187: 84,
- 0x1d188: 84,
- 0x1d189: 84,
- 0x1d18a: 84,
- 0x1d18b: 84,
- 0x1d1aa: 84,
- 0x1d1ab: 84,
- 0x1d1ac: 84,
- 0x1d1ad: 84,
- 0x1d242: 84,
- 0x1d243: 84,
- 0x1d244: 84,
- 0x1da00: 84,
- 0x1da01: 84,
- 0x1da02: 84,
- 0x1da03: 84,
- 0x1da04: 84,
- 0x1da05: 84,
- 0x1da06: 84,
- 0x1da07: 84,
- 0x1da08: 84,
- 0x1da09: 84,
- 0x1da0a: 84,
- 0x1da0b: 84,
- 0x1da0c: 84,
- 0x1da0d: 84,
- 0x1da0e: 84,
- 0x1da0f: 84,
- 0x1da10: 84,
- 0x1da11: 84,
- 0x1da12: 84,
- 0x1da13: 84,
- 0x1da14: 84,
- 0x1da15: 84,
- 0x1da16: 84,
- 0x1da17: 84,
- 0x1da18: 84,
- 0x1da19: 84,
- 0x1da1a: 84,
- 0x1da1b: 84,
- 0x1da1c: 84,
- 0x1da1d: 84,
- 0x1da1e: 84,
- 0x1da1f: 84,
- 0x1da20: 84,
- 0x1da21: 84,
- 0x1da22: 84,
- 0x1da23: 84,
- 0x1da24: 84,
- 0x1da25: 84,
- 0x1da26: 84,
- 0x1da27: 84,
- 0x1da28: 84,
- 0x1da29: 84,
- 0x1da2a: 84,
- 0x1da2b: 84,
- 0x1da2c: 84,
- 0x1da2d: 84,
- 0x1da2e: 84,
- 0x1da2f: 84,
- 0x1da30: 84,
- 0x1da31: 84,
- 0x1da32: 84,
- 0x1da33: 84,
- 0x1da34: 84,
- 0x1da35: 84,
- 0x1da36: 84,
- 0x1da3b: 84,
- 0x1da3c: 84,
- 0x1da3d: 84,
- 0x1da3e: 84,
- 0x1da3f: 84,
- 0x1da40: 84,
- 0x1da41: 84,
- 0x1da42: 84,
- 0x1da43: 84,
- 0x1da44: 84,
- 0x1da45: 84,
- 0x1da46: 84,
- 0x1da47: 84,
- 0x1da48: 84,
- 0x1da49: 84,
- 0x1da4a: 84,
- 0x1da4b: 84,
- 0x1da4c: 84,
- 0x1da4d: 84,
- 0x1da4e: 84,
- 0x1da4f: 84,
- 0x1da50: 84,
- 0x1da51: 84,
- 0x1da52: 84,
- 0x1da53: 84,
- 0x1da54: 84,
- 0x1da55: 84,
- 0x1da56: 84,
- 0x1da57: 84,
- 0x1da58: 84,
- 0x1da59: 84,
- 0x1da5a: 84,
- 0x1da5b: 84,
- 0x1da5c: 84,
- 0x1da5d: 84,
- 0x1da5e: 84,
- 0x1da5f: 84,
- 0x1da60: 84,
- 0x1da61: 84,
- 0x1da62: 84,
- 0x1da63: 84,
- 0x1da64: 84,
- 0x1da65: 84,
- 0x1da66: 84,
- 0x1da67: 84,
- 0x1da68: 84,
- 0x1da69: 84,
- 0x1da6a: 84,
- 0x1da6b: 84,
- 0x1da6c: 84,
- 0x1da75: 84,
- 0x1da84: 84,
- 0x1da9b: 84,
- 0x1da9c: 84,
- 0x1da9d: 84,
- 0x1da9e: 84,
- 0x1da9f: 84,
- 0x1daa1: 84,
- 0x1daa2: 84,
- 0x1daa3: 84,
- 0x1daa4: 84,
- 0x1daa5: 84,
- 0x1daa6: 84,
- 0x1daa7: 84,
- 0x1daa8: 84,
- 0x1daa9: 84,
- 0x1daaa: 84,
- 0x1daab: 84,
- 0x1daac: 84,
- 0x1daad: 84,
- 0x1daae: 84,
- 0x1daaf: 84,
- 0x1e000: 84,
- 0x1e001: 84,
- 0x1e002: 84,
- 0x1e003: 84,
- 0x1e004: 84,
- 0x1e005: 84,
- 0x1e006: 84,
- 0x1e008: 84,
- 0x1e009: 84,
- 0x1e00a: 84,
- 0x1e00b: 84,
- 0x1e00c: 84,
- 0x1e00d: 84,
- 0x1e00e: 84,
- 0x1e00f: 84,
- 0x1e010: 84,
- 0x1e011: 84,
- 0x1e012: 84,
- 0x1e013: 84,
- 0x1e014: 84,
- 0x1e015: 84,
- 0x1e016: 84,
- 0x1e017: 84,
- 0x1e018: 84,
- 0x1e01b: 84,
- 0x1e01c: 84,
- 0x1e01d: 84,
- 0x1e01e: 84,
- 0x1e01f: 84,
- 0x1e020: 84,
- 0x1e021: 84,
- 0x1e023: 84,
- 0x1e024: 84,
- 0x1e026: 84,
- 0x1e027: 84,
- 0x1e028: 84,
- 0x1e029: 84,
- 0x1e02a: 84,
- 0x1e08f: 84,
- 0x1e130: 84,
- 0x1e131: 84,
- 0x1e132: 84,
- 0x1e133: 84,
- 0x1e134: 84,
- 0x1e135: 84,
- 0x1e136: 84,
- 0x1e2ae: 84,
- 0x1e2ec: 84,
- 0x1e2ed: 84,
- 0x1e2ee: 84,
- 0x1e2ef: 84,
- 0x1e4ec: 84,
- 0x1e4ed: 84,
- 0x1e4ee: 84,
- 0x1e4ef: 84,
- 0x1e8d0: 84,
- 0x1e8d1: 84,
- 0x1e8d2: 84,
- 0x1e8d3: 84,
- 0x1e8d4: 84,
- 0x1e8d5: 84,
- 0x1e8d6: 84,
- 0x1e900: 68,
- 0x1e901: 68,
- 0x1e902: 68,
- 0x1e903: 68,
- 0x1e904: 68,
- 0x1e905: 68,
- 0x1e906: 68,
- 0x1e907: 68,
- 0x1e908: 68,
- 0x1e909: 68,
- 0x1e90a: 68,
- 0x1e90b: 68,
- 0x1e90c: 68,
- 0x1e90d: 68,
- 0x1e90e: 68,
- 0x1e90f: 68,
- 0x1e910: 68,
- 0x1e911: 68,
- 0x1e912: 68,
- 0x1e913: 68,
- 0x1e914: 68,
- 0x1e915: 68,
- 0x1e916: 68,
- 0x1e917: 68,
- 0x1e918: 68,
- 0x1e919: 68,
- 0x1e91a: 68,
- 0x1e91b: 68,
- 0x1e91c: 68,
- 0x1e91d: 68,
- 0x1e91e: 68,
- 0x1e91f: 68,
- 0x1e920: 68,
- 0x1e921: 68,
- 0x1e922: 68,
- 0x1e923: 68,
- 0x1e924: 68,
- 0x1e925: 68,
- 0x1e926: 68,
- 0x1e927: 68,
- 0x1e928: 68,
- 0x1e929: 68,
- 0x1e92a: 68,
- 0x1e92b: 68,
- 0x1e92c: 68,
- 0x1e92d: 68,
- 0x1e92e: 68,
- 0x1e92f: 68,
- 0x1e930: 68,
- 0x1e931: 68,
- 0x1e932: 68,
- 0x1e933: 68,
- 0x1e934: 68,
- 0x1e935: 68,
- 0x1e936: 68,
- 0x1e937: 68,
- 0x1e938: 68,
- 0x1e939: 68,
- 0x1e93a: 68,
- 0x1e93b: 68,
- 0x1e93c: 68,
- 0x1e93d: 68,
- 0x1e93e: 68,
- 0x1e93f: 68,
- 0x1e940: 68,
- 0x1e941: 68,
- 0x1e942: 68,
- 0x1e943: 68,
- 0x1e944: 84,
- 0x1e945: 84,
- 0x1e946: 84,
- 0x1e947: 84,
- 0x1e948: 84,
- 0x1e949: 84,
- 0x1e94a: 84,
- 0x1e94b: 84,
- 0xe0001: 84,
- 0xe0020: 84,
- 0xe0021: 84,
- 0xe0022: 84,
- 0xe0023: 84,
- 0xe0024: 84,
- 0xe0025: 84,
- 0xe0026: 84,
- 0xe0027: 84,
- 0xe0028: 84,
- 0xe0029: 84,
- 0xe002a: 84,
- 0xe002b: 84,
- 0xe002c: 84,
- 0xe002d: 84,
- 0xe002e: 84,
- 0xe002f: 84,
- 0xe0030: 84,
- 0xe0031: 84,
- 0xe0032: 84,
- 0xe0033: 84,
- 0xe0034: 84,
- 0xe0035: 84,
- 0xe0036: 84,
- 0xe0037: 84,
- 0xe0038: 84,
- 0xe0039: 84,
- 0xe003a: 84,
- 0xe003b: 84,
- 0xe003c: 84,
- 0xe003d: 84,
- 0xe003e: 84,
- 0xe003f: 84,
- 0xe0040: 84,
- 0xe0041: 84,
- 0xe0042: 84,
- 0xe0043: 84,
- 0xe0044: 84,
- 0xe0045: 84,
- 0xe0046: 84,
- 0xe0047: 84,
- 0xe0048: 84,
- 0xe0049: 84,
- 0xe004a: 84,
- 0xe004b: 84,
- 0xe004c: 84,
- 0xe004d: 84,
- 0xe004e: 84,
- 0xe004f: 84,
- 0xe0050: 84,
- 0xe0051: 84,
- 0xe0052: 84,
- 0xe0053: 84,
- 0xe0054: 84,
- 0xe0055: 84,
- 0xe0056: 84,
- 0xe0057: 84,
- 0xe0058: 84,
- 0xe0059: 84,
- 0xe005a: 84,
- 0xe005b: 84,
- 0xe005c: 84,
- 0xe005d: 84,
- 0xe005e: 84,
- 0xe005f: 84,
- 0xe0060: 84,
- 0xe0061: 84,
- 0xe0062: 84,
- 0xe0063: 84,
- 0xe0064: 84,
- 0xe0065: 84,
- 0xe0066: 84,
- 0xe0067: 84,
- 0xe0068: 84,
- 0xe0069: 84,
- 0xe006a: 84,
- 0xe006b: 84,
- 0xe006c: 84,
- 0xe006d: 84,
- 0xe006e: 84,
- 0xe006f: 84,
- 0xe0070: 84,
- 0xe0071: 84,
- 0xe0072: 84,
- 0xe0073: 84,
- 0xe0074: 84,
- 0xe0075: 84,
- 0xe0076: 84,
- 0xe0077: 84,
- 0xe0078: 84,
- 0xe0079: 84,
- 0xe007a: 84,
- 0xe007b: 84,
- 0xe007c: 84,
- 0xe007d: 84,
- 0xe007e: 84,
- 0xe007f: 84,
- 0xe0100: 84,
- 0xe0101: 84,
- 0xe0102: 84,
- 0xe0103: 84,
- 0xe0104: 84,
- 0xe0105: 84,
- 0xe0106: 84,
- 0xe0107: 84,
- 0xe0108: 84,
- 0xe0109: 84,
- 0xe010a: 84,
- 0xe010b: 84,
- 0xe010c: 84,
- 0xe010d: 84,
- 0xe010e: 84,
- 0xe010f: 84,
- 0xe0110: 84,
- 0xe0111: 84,
- 0xe0112: 84,
- 0xe0113: 84,
- 0xe0114: 84,
- 0xe0115: 84,
- 0xe0116: 84,
- 0xe0117: 84,
- 0xe0118: 84,
- 0xe0119: 84,
- 0xe011a: 84,
- 0xe011b: 84,
- 0xe011c: 84,
- 0xe011d: 84,
- 0xe011e: 84,
- 0xe011f: 84,
- 0xe0120: 84,
- 0xe0121: 84,
- 0xe0122: 84,
- 0xe0123: 84,
- 0xe0124: 84,
- 0xe0125: 84,
- 0xe0126: 84,
- 0xe0127: 84,
- 0xe0128: 84,
- 0xe0129: 84,
- 0xe012a: 84,
- 0xe012b: 84,
- 0xe012c: 84,
- 0xe012d: 84,
- 0xe012e: 84,
- 0xe012f: 84,
- 0xe0130: 84,
- 0xe0131: 84,
- 0xe0132: 84,
- 0xe0133: 84,
- 0xe0134: 84,
- 0xe0135: 84,
- 0xe0136: 84,
- 0xe0137: 84,
- 0xe0138: 84,
- 0xe0139: 84,
- 0xe013a: 84,
- 0xe013b: 84,
- 0xe013c: 84,
- 0xe013d: 84,
- 0xe013e: 84,
- 0xe013f: 84,
- 0xe0140: 84,
- 0xe0141: 84,
- 0xe0142: 84,
- 0xe0143: 84,
- 0xe0144: 84,
- 0xe0145: 84,
- 0xe0146: 84,
- 0xe0147: 84,
- 0xe0148: 84,
- 0xe0149: 84,
- 0xe014a: 84,
- 0xe014b: 84,
- 0xe014c: 84,
- 0xe014d: 84,
- 0xe014e: 84,
- 0xe014f: 84,
- 0xe0150: 84,
- 0xe0151: 84,
- 0xe0152: 84,
- 0xe0153: 84,
- 0xe0154: 84,
- 0xe0155: 84,
- 0xe0156: 84,
- 0xe0157: 84,
- 0xe0158: 84,
- 0xe0159: 84,
- 0xe015a: 84,
- 0xe015b: 84,
- 0xe015c: 84,
- 0xe015d: 84,
- 0xe015e: 84,
- 0xe015f: 84,
- 0xe0160: 84,
- 0xe0161: 84,
- 0xe0162: 84,
- 0xe0163: 84,
- 0xe0164: 84,
- 0xe0165: 84,
- 0xe0166: 84,
- 0xe0167: 84,
- 0xe0168: 84,
- 0xe0169: 84,
- 0xe016a: 84,
- 0xe016b: 84,
- 0xe016c: 84,
- 0xe016d: 84,
- 0xe016e: 84,
- 0xe016f: 84,
- 0xe0170: 84,
- 0xe0171: 84,
- 0xe0172: 84,
- 0xe0173: 84,
- 0xe0174: 84,
- 0xe0175: 84,
- 0xe0176: 84,
- 0xe0177: 84,
- 0xe0178: 84,
- 0xe0179: 84,
- 0xe017a: 84,
- 0xe017b: 84,
- 0xe017c: 84,
- 0xe017d: 84,
- 0xe017e: 84,
- 0xe017f: 84,
- 0xe0180: 84,
- 0xe0181: 84,
- 0xe0182: 84,
- 0xe0183: 84,
- 0xe0184: 84,
- 0xe0185: 84,
- 0xe0186: 84,
- 0xe0187: 84,
- 0xe0188: 84,
- 0xe0189: 84,
- 0xe018a: 84,
- 0xe018b: 84,
- 0xe018c: 84,
- 0xe018d: 84,
- 0xe018e: 84,
- 0xe018f: 84,
- 0xe0190: 84,
- 0xe0191: 84,
- 0xe0192: 84,
- 0xe0193: 84,
- 0xe0194: 84,
- 0xe0195: 84,
- 0xe0196: 84,
- 0xe0197: 84,
- 0xe0198: 84,
- 0xe0199: 84,
- 0xe019a: 84,
- 0xe019b: 84,
- 0xe019c: 84,
- 0xe019d: 84,
- 0xe019e: 84,
- 0xe019f: 84,
- 0xe01a0: 84,
- 0xe01a1: 84,
- 0xe01a2: 84,
- 0xe01a3: 84,
- 0xe01a4: 84,
- 0xe01a5: 84,
- 0xe01a6: 84,
- 0xe01a7: 84,
- 0xe01a8: 84,
- 0xe01a9: 84,
- 0xe01aa: 84,
- 0xe01ab: 84,
- 0xe01ac: 84,
- 0xe01ad: 84,
- 0xe01ae: 84,
- 0xe01af: 84,
- 0xe01b0: 84,
- 0xe01b1: 84,
- 0xe01b2: 84,
- 0xe01b3: 84,
- 0xe01b4: 84,
- 0xe01b5: 84,
- 0xe01b6: 84,
- 0xe01b7: 84,
- 0xe01b8: 84,
- 0xe01b9: 84,
- 0xe01ba: 84,
- 0xe01bb: 84,
- 0xe01bc: 84,
- 0xe01bd: 84,
- 0xe01be: 84,
- 0xe01bf: 84,
- 0xe01c0: 84,
- 0xe01c1: 84,
- 0xe01c2: 84,
- 0xe01c3: 84,
- 0xe01c4: 84,
- 0xe01c5: 84,
- 0xe01c6: 84,
- 0xe01c7: 84,
- 0xe01c8: 84,
- 0xe01c9: 84,
- 0xe01ca: 84,
- 0xe01cb: 84,
- 0xe01cc: 84,
- 0xe01cd: 84,
- 0xe01ce: 84,
- 0xe01cf: 84,
- 0xe01d0: 84,
- 0xe01d1: 84,
- 0xe01d2: 84,
- 0xe01d3: 84,
- 0xe01d4: 84,
- 0xe01d5: 84,
- 0xe01d6: 84,
- 0xe01d7: 84,
- 0xe01d8: 84,
- 0xe01d9: 84,
- 0xe01da: 84,
- 0xe01db: 84,
- 0xe01dc: 84,
- 0xe01dd: 84,
- 0xe01de: 84,
- 0xe01df: 84,
- 0xe01e0: 84,
- 0xe01e1: 84,
- 0xe01e2: 84,
- 0xe01e3: 84,
- 0xe01e4: 84,
- 0xe01e5: 84,
- 0xe01e6: 84,
- 0xe01e7: 84,
- 0xe01e8: 84,
- 0xe01e9: 84,
- 0xe01ea: 84,
- 0xe01eb: 84,
- 0xe01ec: 84,
- 0xe01ed: 84,
- 0xe01ee: 84,
- 0xe01ef: 84,
+ 0x16AF0: 84,
+ 0x16AF1: 84,
+ 0x16AF2: 84,
+ 0x16AF3: 84,
+ 0x16AF4: 84,
+ 0x16B30: 84,
+ 0x16B31: 84,
+ 0x16B32: 84,
+ 0x16B33: 84,
+ 0x16B34: 84,
+ 0x16B35: 84,
+ 0x16B36: 84,
+ 0x16F4F: 84,
+ 0x16F8F: 84,
+ 0x16F90: 84,
+ 0x16F91: 84,
+ 0x16F92: 84,
+ 0x16FE4: 84,
+ 0x1BC9D: 84,
+ 0x1BC9E: 84,
+ 0x1BCA0: 84,
+ 0x1BCA1: 84,
+ 0x1BCA2: 84,
+ 0x1BCA3: 84,
+ 0x1CF00: 84,
+ 0x1CF01: 84,
+ 0x1CF02: 84,
+ 0x1CF03: 84,
+ 0x1CF04: 84,
+ 0x1CF05: 84,
+ 0x1CF06: 84,
+ 0x1CF07: 84,
+ 0x1CF08: 84,
+ 0x1CF09: 84,
+ 0x1CF0A: 84,
+ 0x1CF0B: 84,
+ 0x1CF0C: 84,
+ 0x1CF0D: 84,
+ 0x1CF0E: 84,
+ 0x1CF0F: 84,
+ 0x1CF10: 84,
+ 0x1CF11: 84,
+ 0x1CF12: 84,
+ 0x1CF13: 84,
+ 0x1CF14: 84,
+ 0x1CF15: 84,
+ 0x1CF16: 84,
+ 0x1CF17: 84,
+ 0x1CF18: 84,
+ 0x1CF19: 84,
+ 0x1CF1A: 84,
+ 0x1CF1B: 84,
+ 0x1CF1C: 84,
+ 0x1CF1D: 84,
+ 0x1CF1E: 84,
+ 0x1CF1F: 84,
+ 0x1CF20: 84,
+ 0x1CF21: 84,
+ 0x1CF22: 84,
+ 0x1CF23: 84,
+ 0x1CF24: 84,
+ 0x1CF25: 84,
+ 0x1CF26: 84,
+ 0x1CF27: 84,
+ 0x1CF28: 84,
+ 0x1CF29: 84,
+ 0x1CF2A: 84,
+ 0x1CF2B: 84,
+ 0x1CF2C: 84,
+ 0x1CF2D: 84,
+ 0x1CF30: 84,
+ 0x1CF31: 84,
+ 0x1CF32: 84,
+ 0x1CF33: 84,
+ 0x1CF34: 84,
+ 0x1CF35: 84,
+ 0x1CF36: 84,
+ 0x1CF37: 84,
+ 0x1CF38: 84,
+ 0x1CF39: 84,
+ 0x1CF3A: 84,
+ 0x1CF3B: 84,
+ 0x1CF3C: 84,
+ 0x1CF3D: 84,
+ 0x1CF3E: 84,
+ 0x1CF3F: 84,
+ 0x1CF40: 84,
+ 0x1CF41: 84,
+ 0x1CF42: 84,
+ 0x1CF43: 84,
+ 0x1CF44: 84,
+ 0x1CF45: 84,
+ 0x1CF46: 84,
+ 0x1D167: 84,
+ 0x1D168: 84,
+ 0x1D169: 84,
+ 0x1D173: 84,
+ 0x1D174: 84,
+ 0x1D175: 84,
+ 0x1D176: 84,
+ 0x1D177: 84,
+ 0x1D178: 84,
+ 0x1D179: 84,
+ 0x1D17A: 84,
+ 0x1D17B: 84,
+ 0x1D17C: 84,
+ 0x1D17D: 84,
+ 0x1D17E: 84,
+ 0x1D17F: 84,
+ 0x1D180: 84,
+ 0x1D181: 84,
+ 0x1D182: 84,
+ 0x1D185: 84,
+ 0x1D186: 84,
+ 0x1D187: 84,
+ 0x1D188: 84,
+ 0x1D189: 84,
+ 0x1D18A: 84,
+ 0x1D18B: 84,
+ 0x1D1AA: 84,
+ 0x1D1AB: 84,
+ 0x1D1AC: 84,
+ 0x1D1AD: 84,
+ 0x1D242: 84,
+ 0x1D243: 84,
+ 0x1D244: 84,
+ 0x1DA00: 84,
+ 0x1DA01: 84,
+ 0x1DA02: 84,
+ 0x1DA03: 84,
+ 0x1DA04: 84,
+ 0x1DA05: 84,
+ 0x1DA06: 84,
+ 0x1DA07: 84,
+ 0x1DA08: 84,
+ 0x1DA09: 84,
+ 0x1DA0A: 84,
+ 0x1DA0B: 84,
+ 0x1DA0C: 84,
+ 0x1DA0D: 84,
+ 0x1DA0E: 84,
+ 0x1DA0F: 84,
+ 0x1DA10: 84,
+ 0x1DA11: 84,
+ 0x1DA12: 84,
+ 0x1DA13: 84,
+ 0x1DA14: 84,
+ 0x1DA15: 84,
+ 0x1DA16: 84,
+ 0x1DA17: 84,
+ 0x1DA18: 84,
+ 0x1DA19: 84,
+ 0x1DA1A: 84,
+ 0x1DA1B: 84,
+ 0x1DA1C: 84,
+ 0x1DA1D: 84,
+ 0x1DA1E: 84,
+ 0x1DA1F: 84,
+ 0x1DA20: 84,
+ 0x1DA21: 84,
+ 0x1DA22: 84,
+ 0x1DA23: 84,
+ 0x1DA24: 84,
+ 0x1DA25: 84,
+ 0x1DA26: 84,
+ 0x1DA27: 84,
+ 0x1DA28: 84,
+ 0x1DA29: 84,
+ 0x1DA2A: 84,
+ 0x1DA2B: 84,
+ 0x1DA2C: 84,
+ 0x1DA2D: 84,
+ 0x1DA2E: 84,
+ 0x1DA2F: 84,
+ 0x1DA30: 84,
+ 0x1DA31: 84,
+ 0x1DA32: 84,
+ 0x1DA33: 84,
+ 0x1DA34: 84,
+ 0x1DA35: 84,
+ 0x1DA36: 84,
+ 0x1DA3B: 84,
+ 0x1DA3C: 84,
+ 0x1DA3D: 84,
+ 0x1DA3E: 84,
+ 0x1DA3F: 84,
+ 0x1DA40: 84,
+ 0x1DA41: 84,
+ 0x1DA42: 84,
+ 0x1DA43: 84,
+ 0x1DA44: 84,
+ 0x1DA45: 84,
+ 0x1DA46: 84,
+ 0x1DA47: 84,
+ 0x1DA48: 84,
+ 0x1DA49: 84,
+ 0x1DA4A: 84,
+ 0x1DA4B: 84,
+ 0x1DA4C: 84,
+ 0x1DA4D: 84,
+ 0x1DA4E: 84,
+ 0x1DA4F: 84,
+ 0x1DA50: 84,
+ 0x1DA51: 84,
+ 0x1DA52: 84,
+ 0x1DA53: 84,
+ 0x1DA54: 84,
+ 0x1DA55: 84,
+ 0x1DA56: 84,
+ 0x1DA57: 84,
+ 0x1DA58: 84,
+ 0x1DA59: 84,
+ 0x1DA5A: 84,
+ 0x1DA5B: 84,
+ 0x1DA5C: 84,
+ 0x1DA5D: 84,
+ 0x1DA5E: 84,
+ 0x1DA5F: 84,
+ 0x1DA60: 84,
+ 0x1DA61: 84,
+ 0x1DA62: 84,
+ 0x1DA63: 84,
+ 0x1DA64: 84,
+ 0x1DA65: 84,
+ 0x1DA66: 84,
+ 0x1DA67: 84,
+ 0x1DA68: 84,
+ 0x1DA69: 84,
+ 0x1DA6A: 84,
+ 0x1DA6B: 84,
+ 0x1DA6C: 84,
+ 0x1DA75: 84,
+ 0x1DA84: 84,
+ 0x1DA9B: 84,
+ 0x1DA9C: 84,
+ 0x1DA9D: 84,
+ 0x1DA9E: 84,
+ 0x1DA9F: 84,
+ 0x1DAA1: 84,
+ 0x1DAA2: 84,
+ 0x1DAA3: 84,
+ 0x1DAA4: 84,
+ 0x1DAA5: 84,
+ 0x1DAA6: 84,
+ 0x1DAA7: 84,
+ 0x1DAA8: 84,
+ 0x1DAA9: 84,
+ 0x1DAAA: 84,
+ 0x1DAAB: 84,
+ 0x1DAAC: 84,
+ 0x1DAAD: 84,
+ 0x1DAAE: 84,
+ 0x1DAAF: 84,
+ 0x1E000: 84,
+ 0x1E001: 84,
+ 0x1E002: 84,
+ 0x1E003: 84,
+ 0x1E004: 84,
+ 0x1E005: 84,
+ 0x1E006: 84,
+ 0x1E008: 84,
+ 0x1E009: 84,
+ 0x1E00A: 84,
+ 0x1E00B: 84,
+ 0x1E00C: 84,
+ 0x1E00D: 84,
+ 0x1E00E: 84,
+ 0x1E00F: 84,
+ 0x1E010: 84,
+ 0x1E011: 84,
+ 0x1E012: 84,
+ 0x1E013: 84,
+ 0x1E014: 84,
+ 0x1E015: 84,
+ 0x1E016: 84,
+ 0x1E017: 84,
+ 0x1E018: 84,
+ 0x1E01B: 84,
+ 0x1E01C: 84,
+ 0x1E01D: 84,
+ 0x1E01E: 84,
+ 0x1E01F: 84,
+ 0x1E020: 84,
+ 0x1E021: 84,
+ 0x1E023: 84,
+ 0x1E024: 84,
+ 0x1E026: 84,
+ 0x1E027: 84,
+ 0x1E028: 84,
+ 0x1E029: 84,
+ 0x1E02A: 84,
+ 0x1E08F: 84,
+ 0x1E130: 84,
+ 0x1E131: 84,
+ 0x1E132: 84,
+ 0x1E133: 84,
+ 0x1E134: 84,
+ 0x1E135: 84,
+ 0x1E136: 84,
+ 0x1E2AE: 84,
+ 0x1E2EC: 84,
+ 0x1E2ED: 84,
+ 0x1E2EE: 84,
+ 0x1E2EF: 84,
+ 0x1E4EC: 84,
+ 0x1E4ED: 84,
+ 0x1E4EE: 84,
+ 0x1E4EF: 84,
+ 0x1E8D0: 84,
+ 0x1E8D1: 84,
+ 0x1E8D2: 84,
+ 0x1E8D3: 84,
+ 0x1E8D4: 84,
+ 0x1E8D5: 84,
+ 0x1E8D6: 84,
+ 0x1E900: 68,
+ 0x1E901: 68,
+ 0x1E902: 68,
+ 0x1E903: 68,
+ 0x1E904: 68,
+ 0x1E905: 68,
+ 0x1E906: 68,
+ 0x1E907: 68,
+ 0x1E908: 68,
+ 0x1E909: 68,
+ 0x1E90A: 68,
+ 0x1E90B: 68,
+ 0x1E90C: 68,
+ 0x1E90D: 68,
+ 0x1E90E: 68,
+ 0x1E90F: 68,
+ 0x1E910: 68,
+ 0x1E911: 68,
+ 0x1E912: 68,
+ 0x1E913: 68,
+ 0x1E914: 68,
+ 0x1E915: 68,
+ 0x1E916: 68,
+ 0x1E917: 68,
+ 0x1E918: 68,
+ 0x1E919: 68,
+ 0x1E91A: 68,
+ 0x1E91B: 68,
+ 0x1E91C: 68,
+ 0x1E91D: 68,
+ 0x1E91E: 68,
+ 0x1E91F: 68,
+ 0x1E920: 68,
+ 0x1E921: 68,
+ 0x1E922: 68,
+ 0x1E923: 68,
+ 0x1E924: 68,
+ 0x1E925: 68,
+ 0x1E926: 68,
+ 0x1E927: 68,
+ 0x1E928: 68,
+ 0x1E929: 68,
+ 0x1E92A: 68,
+ 0x1E92B: 68,
+ 0x1E92C: 68,
+ 0x1E92D: 68,
+ 0x1E92E: 68,
+ 0x1E92F: 68,
+ 0x1E930: 68,
+ 0x1E931: 68,
+ 0x1E932: 68,
+ 0x1E933: 68,
+ 0x1E934: 68,
+ 0x1E935: 68,
+ 0x1E936: 68,
+ 0x1E937: 68,
+ 0x1E938: 68,
+ 0x1E939: 68,
+ 0x1E93A: 68,
+ 0x1E93B: 68,
+ 0x1E93C: 68,
+ 0x1E93D: 68,
+ 0x1E93E: 68,
+ 0x1E93F: 68,
+ 0x1E940: 68,
+ 0x1E941: 68,
+ 0x1E942: 68,
+ 0x1E943: 68,
+ 0x1E944: 84,
+ 0x1E945: 84,
+ 0x1E946: 84,
+ 0x1E947: 84,
+ 0x1E948: 84,
+ 0x1E949: 84,
+ 0x1E94A: 84,
+ 0x1E94B: 84,
+ 0xE0001: 84,
+ 0xE0020: 84,
+ 0xE0021: 84,
+ 0xE0022: 84,
+ 0xE0023: 84,
+ 0xE0024: 84,
+ 0xE0025: 84,
+ 0xE0026: 84,
+ 0xE0027: 84,
+ 0xE0028: 84,
+ 0xE0029: 84,
+ 0xE002A: 84,
+ 0xE002B: 84,
+ 0xE002C: 84,
+ 0xE002D: 84,
+ 0xE002E: 84,
+ 0xE002F: 84,
+ 0xE0030: 84,
+ 0xE0031: 84,
+ 0xE0032: 84,
+ 0xE0033: 84,
+ 0xE0034: 84,
+ 0xE0035: 84,
+ 0xE0036: 84,
+ 0xE0037: 84,
+ 0xE0038: 84,
+ 0xE0039: 84,
+ 0xE003A: 84,
+ 0xE003B: 84,
+ 0xE003C: 84,
+ 0xE003D: 84,
+ 0xE003E: 84,
+ 0xE003F: 84,
+ 0xE0040: 84,
+ 0xE0041: 84,
+ 0xE0042: 84,
+ 0xE0043: 84,
+ 0xE0044: 84,
+ 0xE0045: 84,
+ 0xE0046: 84,
+ 0xE0047: 84,
+ 0xE0048: 84,
+ 0xE0049: 84,
+ 0xE004A: 84,
+ 0xE004B: 84,
+ 0xE004C: 84,
+ 0xE004D: 84,
+ 0xE004E: 84,
+ 0xE004F: 84,
+ 0xE0050: 84,
+ 0xE0051: 84,
+ 0xE0052: 84,
+ 0xE0053: 84,
+ 0xE0054: 84,
+ 0xE0055: 84,
+ 0xE0056: 84,
+ 0xE0057: 84,
+ 0xE0058: 84,
+ 0xE0059: 84,
+ 0xE005A: 84,
+ 0xE005B: 84,
+ 0xE005C: 84,
+ 0xE005D: 84,
+ 0xE005E: 84,
+ 0xE005F: 84,
+ 0xE0060: 84,
+ 0xE0061: 84,
+ 0xE0062: 84,
+ 0xE0063: 84,
+ 0xE0064: 84,
+ 0xE0065: 84,
+ 0xE0066: 84,
+ 0xE0067: 84,
+ 0xE0068: 84,
+ 0xE0069: 84,
+ 0xE006A: 84,
+ 0xE006B: 84,
+ 0xE006C: 84,
+ 0xE006D: 84,
+ 0xE006E: 84,
+ 0xE006F: 84,
+ 0xE0070: 84,
+ 0xE0071: 84,
+ 0xE0072: 84,
+ 0xE0073: 84,
+ 0xE0074: 84,
+ 0xE0075: 84,
+ 0xE0076: 84,
+ 0xE0077: 84,
+ 0xE0078: 84,
+ 0xE0079: 84,
+ 0xE007A: 84,
+ 0xE007B: 84,
+ 0xE007C: 84,
+ 0xE007D: 84,
+ 0xE007E: 84,
+ 0xE007F: 84,
+ 0xE0100: 84,
+ 0xE0101: 84,
+ 0xE0102: 84,
+ 0xE0103: 84,
+ 0xE0104: 84,
+ 0xE0105: 84,
+ 0xE0106: 84,
+ 0xE0107: 84,
+ 0xE0108: 84,
+ 0xE0109: 84,
+ 0xE010A: 84,
+ 0xE010B: 84,
+ 0xE010C: 84,
+ 0xE010D: 84,
+ 0xE010E: 84,
+ 0xE010F: 84,
+ 0xE0110: 84,
+ 0xE0111: 84,
+ 0xE0112: 84,
+ 0xE0113: 84,
+ 0xE0114: 84,
+ 0xE0115: 84,
+ 0xE0116: 84,
+ 0xE0117: 84,
+ 0xE0118: 84,
+ 0xE0119: 84,
+ 0xE011A: 84,
+ 0xE011B: 84,
+ 0xE011C: 84,
+ 0xE011D: 84,
+ 0xE011E: 84,
+ 0xE011F: 84,
+ 0xE0120: 84,
+ 0xE0121: 84,
+ 0xE0122: 84,
+ 0xE0123: 84,
+ 0xE0124: 84,
+ 0xE0125: 84,
+ 0xE0126: 84,
+ 0xE0127: 84,
+ 0xE0128: 84,
+ 0xE0129: 84,
+ 0xE012A: 84,
+ 0xE012B: 84,
+ 0xE012C: 84,
+ 0xE012D: 84,
+ 0xE012E: 84,
+ 0xE012F: 84,
+ 0xE0130: 84,
+ 0xE0131: 84,
+ 0xE0132: 84,
+ 0xE0133: 84,
+ 0xE0134: 84,
+ 0xE0135: 84,
+ 0xE0136: 84,
+ 0xE0137: 84,
+ 0xE0138: 84,
+ 0xE0139: 84,
+ 0xE013A: 84,
+ 0xE013B: 84,
+ 0xE013C: 84,
+ 0xE013D: 84,
+ 0xE013E: 84,
+ 0xE013F: 84,
+ 0xE0140: 84,
+ 0xE0141: 84,
+ 0xE0142: 84,
+ 0xE0143: 84,
+ 0xE0144: 84,
+ 0xE0145: 84,
+ 0xE0146: 84,
+ 0xE0147: 84,
+ 0xE0148: 84,
+ 0xE0149: 84,
+ 0xE014A: 84,
+ 0xE014B: 84,
+ 0xE014C: 84,
+ 0xE014D: 84,
+ 0xE014E: 84,
+ 0xE014F: 84,
+ 0xE0150: 84,
+ 0xE0151: 84,
+ 0xE0152: 84,
+ 0xE0153: 84,
+ 0xE0154: 84,
+ 0xE0155: 84,
+ 0xE0156: 84,
+ 0xE0157: 84,
+ 0xE0158: 84,
+ 0xE0159: 84,
+ 0xE015A: 84,
+ 0xE015B: 84,
+ 0xE015C: 84,
+ 0xE015D: 84,
+ 0xE015E: 84,
+ 0xE015F: 84,
+ 0xE0160: 84,
+ 0xE0161: 84,
+ 0xE0162: 84,
+ 0xE0163: 84,
+ 0xE0164: 84,
+ 0xE0165: 84,
+ 0xE0166: 84,
+ 0xE0167: 84,
+ 0xE0168: 84,
+ 0xE0169: 84,
+ 0xE016A: 84,
+ 0xE016B: 84,
+ 0xE016C: 84,
+ 0xE016D: 84,
+ 0xE016E: 84,
+ 0xE016F: 84,
+ 0xE0170: 84,
+ 0xE0171: 84,
+ 0xE0172: 84,
+ 0xE0173: 84,
+ 0xE0174: 84,
+ 0xE0175: 84,
+ 0xE0176: 84,
+ 0xE0177: 84,
+ 0xE0178: 84,
+ 0xE0179: 84,
+ 0xE017A: 84,
+ 0xE017B: 84,
+ 0xE017C: 84,
+ 0xE017D: 84,
+ 0xE017E: 84,
+ 0xE017F: 84,
+ 0xE0180: 84,
+ 0xE0181: 84,
+ 0xE0182: 84,
+ 0xE0183: 84,
+ 0xE0184: 84,
+ 0xE0185: 84,
+ 0xE0186: 84,
+ 0xE0187: 84,
+ 0xE0188: 84,
+ 0xE0189: 84,
+ 0xE018A: 84,
+ 0xE018B: 84,
+ 0xE018C: 84,
+ 0xE018D: 84,
+ 0xE018E: 84,
+ 0xE018F: 84,
+ 0xE0190: 84,
+ 0xE0191: 84,
+ 0xE0192: 84,
+ 0xE0193: 84,
+ 0xE0194: 84,
+ 0xE0195: 84,
+ 0xE0196: 84,
+ 0xE0197: 84,
+ 0xE0198: 84,
+ 0xE0199: 84,
+ 0xE019A: 84,
+ 0xE019B: 84,
+ 0xE019C: 84,
+ 0xE019D: 84,
+ 0xE019E: 84,
+ 0xE019F: 84,
+ 0xE01A0: 84,
+ 0xE01A1: 84,
+ 0xE01A2: 84,
+ 0xE01A3: 84,
+ 0xE01A4: 84,
+ 0xE01A5: 84,
+ 0xE01A6: 84,
+ 0xE01A7: 84,
+ 0xE01A8: 84,
+ 0xE01A9: 84,
+ 0xE01AA: 84,
+ 0xE01AB: 84,
+ 0xE01AC: 84,
+ 0xE01AD: 84,
+ 0xE01AE: 84,
+ 0xE01AF: 84,
+ 0xE01B0: 84,
+ 0xE01B1: 84,
+ 0xE01B2: 84,
+ 0xE01B3: 84,
+ 0xE01B4: 84,
+ 0xE01B5: 84,
+ 0xE01B6: 84,
+ 0xE01B7: 84,
+ 0xE01B8: 84,
+ 0xE01B9: 84,
+ 0xE01BA: 84,
+ 0xE01BB: 84,
+ 0xE01BC: 84,
+ 0xE01BD: 84,
+ 0xE01BE: 84,
+ 0xE01BF: 84,
+ 0xE01C0: 84,
+ 0xE01C1: 84,
+ 0xE01C2: 84,
+ 0xE01C3: 84,
+ 0xE01C4: 84,
+ 0xE01C5: 84,
+ 0xE01C6: 84,
+ 0xE01C7: 84,
+ 0xE01C8: 84,
+ 0xE01C9: 84,
+ 0xE01CA: 84,
+ 0xE01CB: 84,
+ 0xE01CC: 84,
+ 0xE01CD: 84,
+ 0xE01CE: 84,
+ 0xE01CF: 84,
+ 0xE01D0: 84,
+ 0xE01D1: 84,
+ 0xE01D2: 84,
+ 0xE01D3: 84,
+ 0xE01D4: 84,
+ 0xE01D5: 84,
+ 0xE01D6: 84,
+ 0xE01D7: 84,
+ 0xE01D8: 84,
+ 0xE01D9: 84,
+ 0xE01DA: 84,
+ 0xE01DB: 84,
+ 0xE01DC: 84,
+ 0xE01DD: 84,
+ 0xE01DE: 84,
+ 0xE01DF: 84,
+ 0xE01E0: 84,
+ 0xE01E1: 84,
+ 0xE01E2: 84,
+ 0xE01E3: 84,
+ 0xE01E4: 84,
+ 0xE01E5: 84,
+ 0xE01E6: 84,
+ 0xE01E7: 84,
+ 0xE01E8: 84,
+ 0xE01E9: 84,
+ 0xE01EA: 84,
+ 0xE01EB: 84,
+ 0xE01EC: 84,
+ 0xE01ED: 84,
+ 0xE01EE: 84,
+ 0xE01EF: 84,
}
codepoint_classes = {
- 'PVALID': (
- 0x2d0000002e,
- 0x300000003a,
- 0x610000007b,
- 0xdf000000f7,
- 0xf800000100,
+ "PVALID": (
+ 0x2D0000002E,
+ 0x300000003A,
+ 0x610000007B,
+ 0xDF000000F7,
+ 0xF800000100,
0x10100000102,
0x10300000104,
0x10500000106,
0x10700000108,
- 0x1090000010a,
- 0x10b0000010c,
- 0x10d0000010e,
- 0x10f00000110,
+ 0x1090000010A,
+ 0x10B0000010C,
+ 0x10D0000010E,
+ 0x10F00000110,
0x11100000112,
0x11300000114,
0x11500000116,
0x11700000118,
- 0x1190000011a,
- 0x11b0000011c,
- 0x11d0000011e,
- 0x11f00000120,
+ 0x1190000011A,
+ 0x11B0000011C,
+ 0x11D0000011E,
+ 0x11F00000120,
0x12100000122,
0x12300000124,
0x12500000126,
0x12700000128,
- 0x1290000012a,
- 0x12b0000012c,
- 0x12d0000012e,
- 0x12f00000130,
+ 0x1290000012A,
+ 0x12B0000012C,
+ 0x12D0000012E,
+ 0x12F00000130,
0x13100000132,
0x13500000136,
0x13700000139,
- 0x13a0000013b,
- 0x13c0000013d,
- 0x13e0000013f,
+ 0x13A0000013B,
+ 0x13C0000013D,
+ 0x13E0000013F,
0x14200000143,
0x14400000145,
0x14600000147,
0x14800000149,
- 0x14b0000014c,
- 0x14d0000014e,
- 0x14f00000150,
+ 0x14B0000014C,
+ 0x14D0000014E,
+ 0x14F00000150,
0x15100000152,
0x15300000154,
0x15500000156,
0x15700000158,
- 0x1590000015a,
- 0x15b0000015c,
- 0x15d0000015e,
- 0x15f00000160,
+ 0x1590000015A,
+ 0x15B0000015C,
+ 0x15D0000015E,
+ 0x15F00000160,
0x16100000162,
0x16300000164,
0x16500000166,
0x16700000168,
- 0x1690000016a,
- 0x16b0000016c,
- 0x16d0000016e,
- 0x16f00000170,
+ 0x1690000016A,
+ 0x16B0000016C,
+ 0x16D0000016E,
+ 0x16F00000170,
0x17100000172,
0x17300000174,
0x17500000176,
0x17700000178,
- 0x17a0000017b,
- 0x17c0000017d,
- 0x17e0000017f,
+ 0x17A0000017B,
+ 0x17C0000017D,
+ 0x17E0000017F,
0x18000000181,
0x18300000184,
0x18500000186,
0x18800000189,
- 0x18c0000018e,
+ 0x18C0000018E,
0x19200000193,
0x19500000196,
- 0x1990000019c,
- 0x19e0000019f,
- 0x1a1000001a2,
- 0x1a3000001a4,
- 0x1a5000001a6,
- 0x1a8000001a9,
- 0x1aa000001ac,
- 0x1ad000001ae,
- 0x1b0000001b1,
- 0x1b4000001b5,
- 0x1b6000001b7,
- 0x1b9000001bc,
- 0x1bd000001c4,
- 0x1ce000001cf,
- 0x1d0000001d1,
- 0x1d2000001d3,
- 0x1d4000001d5,
- 0x1d6000001d7,
- 0x1d8000001d9,
- 0x1da000001db,
- 0x1dc000001de,
- 0x1df000001e0,
- 0x1e1000001e2,
- 0x1e3000001e4,
- 0x1e5000001e6,
- 0x1e7000001e8,
- 0x1e9000001ea,
- 0x1eb000001ec,
- 0x1ed000001ee,
- 0x1ef000001f1,
- 0x1f5000001f6,
- 0x1f9000001fa,
- 0x1fb000001fc,
- 0x1fd000001fe,
- 0x1ff00000200,
+ 0x1990000019C,
+ 0x19E0000019F,
+ 0x1A1000001A2,
+ 0x1A3000001A4,
+ 0x1A5000001A6,
+ 0x1A8000001A9,
+ 0x1AA000001AC,
+ 0x1AD000001AE,
+ 0x1B0000001B1,
+ 0x1B4000001B5,
+ 0x1B6000001B7,
+ 0x1B9000001BC,
+ 0x1BD000001C4,
+ 0x1CE000001CF,
+ 0x1D0000001D1,
+ 0x1D2000001D3,
+ 0x1D4000001D5,
+ 0x1D6000001D7,
+ 0x1D8000001D9,
+ 0x1DA000001DB,
+ 0x1DC000001DE,
+ 0x1DF000001E0,
+ 0x1E1000001E2,
+ 0x1E3000001E4,
+ 0x1E5000001E6,
+ 0x1E7000001E8,
+ 0x1E9000001EA,
+ 0x1EB000001EC,
+ 0x1ED000001EE,
+ 0x1EF000001F1,
+ 0x1F5000001F6,
+ 0x1F9000001FA,
+ 0x1FB000001FC,
+ 0x1FD000001FE,
+ 0x1FF00000200,
0x20100000202,
0x20300000204,
0x20500000206,
0x20700000208,
- 0x2090000020a,
- 0x20b0000020c,
- 0x20d0000020e,
- 0x20f00000210,
+ 0x2090000020A,
+ 0x20B0000020C,
+ 0x20D0000020E,
+ 0x20F00000210,
0x21100000212,
0x21300000214,
0x21500000216,
0x21700000218,
- 0x2190000021a,
- 0x21b0000021c,
- 0x21d0000021e,
- 0x21f00000220,
+ 0x2190000021A,
+ 0x21B0000021C,
+ 0x21D0000021E,
+ 0x21F00000220,
0x22100000222,
0x22300000224,
0x22500000226,
0x22700000228,
- 0x2290000022a,
- 0x22b0000022c,
- 0x22d0000022e,
- 0x22f00000230,
+ 0x2290000022A,
+ 0x22B0000022C,
+ 0x22D0000022E,
+ 0x22F00000230,
0x23100000232,
- 0x2330000023a,
- 0x23c0000023d,
- 0x23f00000241,
+ 0x2330000023A,
+ 0x23C0000023D,
+ 0x23F00000241,
0x24200000243,
0x24700000248,
- 0x2490000024a,
- 0x24b0000024c,
- 0x24d0000024e,
- 0x24f000002b0,
- 0x2b9000002c2,
- 0x2c6000002d2,
- 0x2ec000002ed,
- 0x2ee000002ef,
+ 0x2490000024A,
+ 0x24B0000024C,
+ 0x24D0000024E,
+ 0x24F000002B0,
+ 0x2B9000002C2,
+ 0x2C6000002D2,
+ 0x2EC000002ED,
+ 0x2EE000002EF,
0x30000000340,
0x34200000343,
- 0x3460000034f,
+ 0x3460000034F,
0x35000000370,
0x37100000372,
0x37300000374,
0x37700000378,
- 0x37b0000037e,
+ 0x37B0000037E,
0x39000000391,
- 0x3ac000003cf,
- 0x3d7000003d8,
- 0x3d9000003da,
- 0x3db000003dc,
- 0x3dd000003de,
- 0x3df000003e0,
- 0x3e1000003e2,
- 0x3e3000003e4,
- 0x3e5000003e6,
- 0x3e7000003e8,
- 0x3e9000003ea,
- 0x3eb000003ec,
- 0x3ed000003ee,
- 0x3ef000003f0,
- 0x3f3000003f4,
- 0x3f8000003f9,
- 0x3fb000003fd,
+ 0x3AC000003CF,
+ 0x3D7000003D8,
+ 0x3D9000003DA,
+ 0x3DB000003DC,
+ 0x3DD000003DE,
+ 0x3DF000003E0,
+ 0x3E1000003E2,
+ 0x3E3000003E4,
+ 0x3E5000003E6,
+ 0x3E7000003E8,
+ 0x3E9000003EA,
+ 0x3EB000003EC,
+ 0x3ED000003EE,
+ 0x3EF000003F0,
+ 0x3F3000003F4,
+ 0x3F8000003F9,
+ 0x3FB000003FD,
0x43000000460,
0x46100000462,
0x46300000464,
0x46500000466,
0x46700000468,
- 0x4690000046a,
- 0x46b0000046c,
- 0x46d0000046e,
- 0x46f00000470,
+ 0x4690000046A,
+ 0x46B0000046C,
+ 0x46D0000046E,
+ 0x46F00000470,
0x47100000472,
0x47300000474,
0x47500000476,
0x47700000478,
- 0x4790000047a,
- 0x47b0000047c,
- 0x47d0000047e,
- 0x47f00000480,
+ 0x4790000047A,
+ 0x47B0000047C,
+ 0x47D0000047E,
+ 0x47F00000480,
0x48100000482,
0x48300000488,
- 0x48b0000048c,
- 0x48d0000048e,
- 0x48f00000490,
+ 0x48B0000048C,
+ 0x48D0000048E,
+ 0x48F00000490,
0x49100000492,
0x49300000494,
0x49500000496,
0x49700000498,
- 0x4990000049a,
- 0x49b0000049c,
- 0x49d0000049e,
- 0x49f000004a0,
- 0x4a1000004a2,
- 0x4a3000004a4,
- 0x4a5000004a6,
- 0x4a7000004a8,
- 0x4a9000004aa,
- 0x4ab000004ac,
- 0x4ad000004ae,
- 0x4af000004b0,
- 0x4b1000004b2,
- 0x4b3000004b4,
- 0x4b5000004b6,
- 0x4b7000004b8,
- 0x4b9000004ba,
- 0x4bb000004bc,
- 0x4bd000004be,
- 0x4bf000004c0,
- 0x4c2000004c3,
- 0x4c4000004c5,
- 0x4c6000004c7,
- 0x4c8000004c9,
- 0x4ca000004cb,
- 0x4cc000004cd,
- 0x4ce000004d0,
- 0x4d1000004d2,
- 0x4d3000004d4,
- 0x4d5000004d6,
- 0x4d7000004d8,
- 0x4d9000004da,
- 0x4db000004dc,
- 0x4dd000004de,
- 0x4df000004e0,
- 0x4e1000004e2,
- 0x4e3000004e4,
- 0x4e5000004e6,
- 0x4e7000004e8,
- 0x4e9000004ea,
- 0x4eb000004ec,
- 0x4ed000004ee,
- 0x4ef000004f0,
- 0x4f1000004f2,
- 0x4f3000004f4,
- 0x4f5000004f6,
- 0x4f7000004f8,
- 0x4f9000004fa,
- 0x4fb000004fc,
- 0x4fd000004fe,
- 0x4ff00000500,
+ 0x4990000049A,
+ 0x49B0000049C,
+ 0x49D0000049E,
+ 0x49F000004A0,
+ 0x4A1000004A2,
+ 0x4A3000004A4,
+ 0x4A5000004A6,
+ 0x4A7000004A8,
+ 0x4A9000004AA,
+ 0x4AB000004AC,
+ 0x4AD000004AE,
+ 0x4AF000004B0,
+ 0x4B1000004B2,
+ 0x4B3000004B4,
+ 0x4B5000004B6,
+ 0x4B7000004B8,
+ 0x4B9000004BA,
+ 0x4BB000004BC,
+ 0x4BD000004BE,
+ 0x4BF000004C0,
+ 0x4C2000004C3,
+ 0x4C4000004C5,
+ 0x4C6000004C7,
+ 0x4C8000004C9,
+ 0x4CA000004CB,
+ 0x4CC000004CD,
+ 0x4CE000004D0,
+ 0x4D1000004D2,
+ 0x4D3000004D4,
+ 0x4D5000004D6,
+ 0x4D7000004D8,
+ 0x4D9000004DA,
+ 0x4DB000004DC,
+ 0x4DD000004DE,
+ 0x4DF000004E0,
+ 0x4E1000004E2,
+ 0x4E3000004E4,
+ 0x4E5000004E6,
+ 0x4E7000004E8,
+ 0x4E9000004EA,
+ 0x4EB000004EC,
+ 0x4ED000004EE,
+ 0x4EF000004F0,
+ 0x4F1000004F2,
+ 0x4F3000004F4,
+ 0x4F5000004F6,
+ 0x4F7000004F8,
+ 0x4F9000004FA,
+ 0x4FB000004FC,
+ 0x4FD000004FE,
+ 0x4FF00000500,
0x50100000502,
0x50300000504,
0x50500000506,
0x50700000508,
- 0x5090000050a,
- 0x50b0000050c,
- 0x50d0000050e,
- 0x50f00000510,
+ 0x5090000050A,
+ 0x50B0000050C,
+ 0x50D0000050E,
+ 0x50F00000510,
0x51100000512,
0x51300000514,
0x51500000516,
0x51700000518,
- 0x5190000051a,
- 0x51b0000051c,
- 0x51d0000051e,
- 0x51f00000520,
+ 0x5190000051A,
+ 0x51B0000051C,
+ 0x51D0000051E,
+ 0x51F00000520,
0x52100000522,
0x52300000524,
0x52500000526,
0x52700000528,
- 0x5290000052a,
- 0x52b0000052c,
- 0x52d0000052e,
- 0x52f00000530,
- 0x5590000055a,
+ 0x5290000052A,
+ 0x52B0000052C,
+ 0x52D0000052E,
+ 0x52F00000530,
+ 0x5590000055A,
0x56000000587,
0x58800000589,
- 0x591000005be,
- 0x5bf000005c0,
- 0x5c1000005c3,
- 0x5c4000005c6,
- 0x5c7000005c8,
- 0x5d0000005eb,
- 0x5ef000005f3,
- 0x6100000061b,
+ 0x591000005BE,
+ 0x5BF000005C0,
+ 0x5C1000005C3,
+ 0x5C4000005C6,
+ 0x5C7000005C8,
+ 0x5D0000005EB,
+ 0x5EF000005F3,
+ 0x6100000061B,
0x62000000640,
0x64100000660,
- 0x66e00000675,
- 0x679000006d4,
- 0x6d5000006dd,
- 0x6df000006e9,
- 0x6ea000006f0,
- 0x6fa00000700,
- 0x7100000074b,
- 0x74d000007b2,
- 0x7c0000007f6,
- 0x7fd000007fe,
- 0x8000000082e,
- 0x8400000085c,
- 0x8600000086b,
+ 0x66E00000675,
+ 0x679000006D4,
+ 0x6D5000006DD,
+ 0x6DF000006E9,
+ 0x6EA000006F0,
+ 0x6FA00000700,
+ 0x7100000074B,
+ 0x74D000007B2,
+ 0x7C0000007F6,
+ 0x7FD000007FE,
+ 0x8000000082E,
+ 0x8400000085C,
+ 0x8600000086B,
0x87000000888,
- 0x8890000088f,
- 0x898000008e2,
- 0x8e300000958,
+ 0x8890000088F,
+ 0x898000008E2,
+ 0x8E300000958,
0x96000000964,
0x96600000970,
0x97100000984,
- 0x9850000098d,
- 0x98f00000991,
- 0x993000009a9,
- 0x9aa000009b1,
- 0x9b2000009b3,
- 0x9b6000009ba,
- 0x9bc000009c5,
- 0x9c7000009c9,
- 0x9cb000009cf,
- 0x9d7000009d8,
- 0x9e0000009e4,
- 0x9e6000009f2,
- 0x9fc000009fd,
- 0x9fe000009ff,
- 0xa0100000a04,
- 0xa0500000a0b,
- 0xa0f00000a11,
- 0xa1300000a29,
- 0xa2a00000a31,
- 0xa3200000a33,
- 0xa3500000a36,
- 0xa3800000a3a,
- 0xa3c00000a3d,
- 0xa3e00000a43,
- 0xa4700000a49,
- 0xa4b00000a4e,
- 0xa5100000a52,
- 0xa5c00000a5d,
- 0xa6600000a76,
- 0xa8100000a84,
- 0xa8500000a8e,
- 0xa8f00000a92,
- 0xa9300000aa9,
- 0xaaa00000ab1,
- 0xab200000ab4,
- 0xab500000aba,
- 0xabc00000ac6,
- 0xac700000aca,
- 0xacb00000ace,
- 0xad000000ad1,
- 0xae000000ae4,
- 0xae600000af0,
- 0xaf900000b00,
- 0xb0100000b04,
- 0xb0500000b0d,
- 0xb0f00000b11,
- 0xb1300000b29,
- 0xb2a00000b31,
- 0xb3200000b34,
- 0xb3500000b3a,
- 0xb3c00000b45,
- 0xb4700000b49,
- 0xb4b00000b4e,
- 0xb5500000b58,
- 0xb5f00000b64,
- 0xb6600000b70,
- 0xb7100000b72,
- 0xb8200000b84,
- 0xb8500000b8b,
- 0xb8e00000b91,
- 0xb9200000b96,
- 0xb9900000b9b,
- 0xb9c00000b9d,
- 0xb9e00000ba0,
- 0xba300000ba5,
- 0xba800000bab,
- 0xbae00000bba,
- 0xbbe00000bc3,
- 0xbc600000bc9,
- 0xbca00000bce,
- 0xbd000000bd1,
- 0xbd700000bd8,
- 0xbe600000bf0,
- 0xc0000000c0d,
- 0xc0e00000c11,
- 0xc1200000c29,
- 0xc2a00000c3a,
- 0xc3c00000c45,
- 0xc4600000c49,
- 0xc4a00000c4e,
- 0xc5500000c57,
- 0xc5800000c5b,
- 0xc5d00000c5e,
- 0xc6000000c64,
- 0xc6600000c70,
- 0xc8000000c84,
- 0xc8500000c8d,
- 0xc8e00000c91,
- 0xc9200000ca9,
- 0xcaa00000cb4,
- 0xcb500000cba,
- 0xcbc00000cc5,
- 0xcc600000cc9,
- 0xcca00000cce,
- 0xcd500000cd7,
- 0xcdd00000cdf,
- 0xce000000ce4,
- 0xce600000cf0,
- 0xcf100000cf4,
- 0xd0000000d0d,
- 0xd0e00000d11,
- 0xd1200000d45,
- 0xd4600000d49,
- 0xd4a00000d4f,
- 0xd5400000d58,
- 0xd5f00000d64,
- 0xd6600000d70,
- 0xd7a00000d80,
- 0xd8100000d84,
- 0xd8500000d97,
- 0xd9a00000db2,
- 0xdb300000dbc,
- 0xdbd00000dbe,
- 0xdc000000dc7,
- 0xdca00000dcb,
- 0xdcf00000dd5,
- 0xdd600000dd7,
- 0xdd800000de0,
- 0xde600000df0,
- 0xdf200000df4,
- 0xe0100000e33,
- 0xe3400000e3b,
- 0xe4000000e4f,
- 0xe5000000e5a,
- 0xe8100000e83,
- 0xe8400000e85,
- 0xe8600000e8b,
- 0xe8c00000ea4,
- 0xea500000ea6,
- 0xea700000eb3,
- 0xeb400000ebe,
- 0xec000000ec5,
- 0xec600000ec7,
- 0xec800000ecf,
- 0xed000000eda,
- 0xede00000ee0,
- 0xf0000000f01,
- 0xf0b00000f0c,
- 0xf1800000f1a,
- 0xf2000000f2a,
- 0xf3500000f36,
- 0xf3700000f38,
- 0xf3900000f3a,
- 0xf3e00000f43,
- 0xf4400000f48,
- 0xf4900000f4d,
- 0xf4e00000f52,
- 0xf5300000f57,
- 0xf5800000f5c,
- 0xf5d00000f69,
- 0xf6a00000f6d,
- 0xf7100000f73,
- 0xf7400000f75,
- 0xf7a00000f81,
- 0xf8200000f85,
- 0xf8600000f93,
- 0xf9400000f98,
- 0xf9900000f9d,
- 0xf9e00000fa2,
- 0xfa300000fa7,
- 0xfa800000fac,
- 0xfad00000fb9,
- 0xfba00000fbd,
- 0xfc600000fc7,
- 0x10000000104a,
- 0x10500000109e,
- 0x10d0000010fb,
- 0x10fd00001100,
+ 0x9850000098D,
+ 0x98F00000991,
+ 0x993000009A9,
+ 0x9AA000009B1,
+ 0x9B2000009B3,
+ 0x9B6000009BA,
+ 0x9BC000009C5,
+ 0x9C7000009C9,
+ 0x9CB000009CF,
+ 0x9D7000009D8,
+ 0x9E0000009E4,
+ 0x9E6000009F2,
+ 0x9FC000009FD,
+ 0x9FE000009FF,
+ 0xA0100000A04,
+ 0xA0500000A0B,
+ 0xA0F00000A11,
+ 0xA1300000A29,
+ 0xA2A00000A31,
+ 0xA3200000A33,
+ 0xA3500000A36,
+ 0xA3800000A3A,
+ 0xA3C00000A3D,
+ 0xA3E00000A43,
+ 0xA4700000A49,
+ 0xA4B00000A4E,
+ 0xA5100000A52,
+ 0xA5C00000A5D,
+ 0xA6600000A76,
+ 0xA8100000A84,
+ 0xA8500000A8E,
+ 0xA8F00000A92,
+ 0xA9300000AA9,
+ 0xAAA00000AB1,
+ 0xAB200000AB4,
+ 0xAB500000ABA,
+ 0xABC00000AC6,
+ 0xAC700000ACA,
+ 0xACB00000ACE,
+ 0xAD000000AD1,
+ 0xAE000000AE4,
+ 0xAE600000AF0,
+ 0xAF900000B00,
+ 0xB0100000B04,
+ 0xB0500000B0D,
+ 0xB0F00000B11,
+ 0xB1300000B29,
+ 0xB2A00000B31,
+ 0xB3200000B34,
+ 0xB3500000B3A,
+ 0xB3C00000B45,
+ 0xB4700000B49,
+ 0xB4B00000B4E,
+ 0xB5500000B58,
+ 0xB5F00000B64,
+ 0xB6600000B70,
+ 0xB7100000B72,
+ 0xB8200000B84,
+ 0xB8500000B8B,
+ 0xB8E00000B91,
+ 0xB9200000B96,
+ 0xB9900000B9B,
+ 0xB9C00000B9D,
+ 0xB9E00000BA0,
+ 0xBA300000BA5,
+ 0xBA800000BAB,
+ 0xBAE00000BBA,
+ 0xBBE00000BC3,
+ 0xBC600000BC9,
+ 0xBCA00000BCE,
+ 0xBD000000BD1,
+ 0xBD700000BD8,
+ 0xBE600000BF0,
+ 0xC0000000C0D,
+ 0xC0E00000C11,
+ 0xC1200000C29,
+ 0xC2A00000C3A,
+ 0xC3C00000C45,
+ 0xC4600000C49,
+ 0xC4A00000C4E,
+ 0xC5500000C57,
+ 0xC5800000C5B,
+ 0xC5D00000C5E,
+ 0xC6000000C64,
+ 0xC6600000C70,
+ 0xC8000000C84,
+ 0xC8500000C8D,
+ 0xC8E00000C91,
+ 0xC9200000CA9,
+ 0xCAA00000CB4,
+ 0xCB500000CBA,
+ 0xCBC00000CC5,
+ 0xCC600000CC9,
+ 0xCCA00000CCE,
+ 0xCD500000CD7,
+ 0xCDD00000CDF,
+ 0xCE000000CE4,
+ 0xCE600000CF0,
+ 0xCF100000CF4,
+ 0xD0000000D0D,
+ 0xD0E00000D11,
+ 0xD1200000D45,
+ 0xD4600000D49,
+ 0xD4A00000D4F,
+ 0xD5400000D58,
+ 0xD5F00000D64,
+ 0xD6600000D70,
+ 0xD7A00000D80,
+ 0xD8100000D84,
+ 0xD8500000D97,
+ 0xD9A00000DB2,
+ 0xDB300000DBC,
+ 0xDBD00000DBE,
+ 0xDC000000DC7,
+ 0xDCA00000DCB,
+ 0xDCF00000DD5,
+ 0xDD600000DD7,
+ 0xDD800000DE0,
+ 0xDE600000DF0,
+ 0xDF200000DF4,
+ 0xE0100000E33,
+ 0xE3400000E3B,
+ 0xE4000000E4F,
+ 0xE5000000E5A,
+ 0xE8100000E83,
+ 0xE8400000E85,
+ 0xE8600000E8B,
+ 0xE8C00000EA4,
+ 0xEA500000EA6,
+ 0xEA700000EB3,
+ 0xEB400000EBE,
+ 0xEC000000EC5,
+ 0xEC600000EC7,
+ 0xEC800000ECF,
+ 0xED000000EDA,
+ 0xEDE00000EE0,
+ 0xF0000000F01,
+ 0xF0B00000F0C,
+ 0xF1800000F1A,
+ 0xF2000000F2A,
+ 0xF3500000F36,
+ 0xF3700000F38,
+ 0xF3900000F3A,
+ 0xF3E00000F43,
+ 0xF4400000F48,
+ 0xF4900000F4D,
+ 0xF4E00000F52,
+ 0xF5300000F57,
+ 0xF5800000F5C,
+ 0xF5D00000F69,
+ 0xF6A00000F6D,
+ 0xF7100000F73,
+ 0xF7400000F75,
+ 0xF7A00000F81,
+ 0xF8200000F85,
+ 0xF8600000F93,
+ 0xF9400000F98,
+ 0xF9900000F9D,
+ 0xF9E00000FA2,
+ 0xFA300000FA7,
+ 0xFA800000FAC,
+ 0xFAD00000FB9,
+ 0xFBA00000FBD,
+ 0xFC600000FC7,
+ 0x10000000104A,
+ 0x10500000109E,
+ 0x10D0000010FB,
+ 0x10FD00001100,
0x120000001249,
- 0x124a0000124e,
+ 0x124A0000124E,
0x125000001257,
0x125800001259,
- 0x125a0000125e,
+ 0x125A0000125E,
0x126000001289,
- 0x128a0000128e,
- 0x1290000012b1,
- 0x12b2000012b6,
- 0x12b8000012bf,
- 0x12c0000012c1,
- 0x12c2000012c6,
- 0x12c8000012d7,
- 0x12d800001311,
+ 0x128A0000128E,
+ 0x1290000012B1,
+ 0x12B2000012B6,
+ 0x12B8000012BF,
+ 0x12C0000012C1,
+ 0x12C2000012C6,
+ 0x12C8000012D7,
+ 0x12D800001311,
0x131200001316,
- 0x13180000135b,
- 0x135d00001360,
+ 0x13180000135B,
+ 0x135D00001360,
0x138000001390,
- 0x13a0000013f6,
- 0x14010000166d,
- 0x166f00001680,
- 0x16810000169b,
- 0x16a0000016eb,
- 0x16f1000016f9,
+ 0x13A0000013F6,
+ 0x14010000166D,
+ 0x166F00001680,
+ 0x16810000169B,
+ 0x16A0000016EB,
+ 0x16F1000016F9,
0x170000001716,
- 0x171f00001735,
+ 0x171F00001735,
0x174000001754,
- 0x17600000176d,
- 0x176e00001771,
+ 0x17600000176D,
+ 0x176E00001771,
0x177200001774,
- 0x1780000017b4,
- 0x17b6000017d4,
- 0x17d7000017d8,
- 0x17dc000017de,
- 0x17e0000017ea,
- 0x18100000181a,
+ 0x1780000017B4,
+ 0x17B6000017D4,
+ 0x17D7000017D8,
+ 0x17DC000017DE,
+ 0x17E0000017EA,
+ 0x18100000181A,
0x182000001879,
- 0x1880000018ab,
- 0x18b0000018f6,
- 0x19000000191f,
- 0x19200000192c,
- 0x19300000193c,
- 0x19460000196e,
+ 0x1880000018AB,
+ 0x18B0000018F6,
+ 0x19000000191F,
+ 0x19200000192C,
+ 0x19300000193C,
+ 0x19460000196E,
0x197000001975,
- 0x1980000019ac,
- 0x19b0000019ca,
- 0x19d0000019da,
- 0x1a0000001a1c,
- 0x1a2000001a5f,
- 0x1a6000001a7d,
- 0x1a7f00001a8a,
- 0x1a9000001a9a,
- 0x1aa700001aa8,
- 0x1ab000001abe,
- 0x1abf00001acf,
- 0x1b0000001b4d,
- 0x1b5000001b5a,
- 0x1b6b00001b74,
- 0x1b8000001bf4,
- 0x1c0000001c38,
- 0x1c4000001c4a,
- 0x1c4d00001c7e,
- 0x1cd000001cd3,
- 0x1cd400001cfb,
- 0x1d0000001d2c,
- 0x1d2f00001d30,
- 0x1d3b00001d3c,
- 0x1d4e00001d4f,
- 0x1d6b00001d78,
- 0x1d7900001d9b,
- 0x1dc000001e00,
- 0x1e0100001e02,
- 0x1e0300001e04,
- 0x1e0500001e06,
- 0x1e0700001e08,
- 0x1e0900001e0a,
- 0x1e0b00001e0c,
- 0x1e0d00001e0e,
- 0x1e0f00001e10,
- 0x1e1100001e12,
- 0x1e1300001e14,
- 0x1e1500001e16,
- 0x1e1700001e18,
- 0x1e1900001e1a,
- 0x1e1b00001e1c,
- 0x1e1d00001e1e,
- 0x1e1f00001e20,
- 0x1e2100001e22,
- 0x1e2300001e24,
- 0x1e2500001e26,
- 0x1e2700001e28,
- 0x1e2900001e2a,
- 0x1e2b00001e2c,
- 0x1e2d00001e2e,
- 0x1e2f00001e30,
- 0x1e3100001e32,
- 0x1e3300001e34,
- 0x1e3500001e36,
- 0x1e3700001e38,
- 0x1e3900001e3a,
- 0x1e3b00001e3c,
- 0x1e3d00001e3e,
- 0x1e3f00001e40,
- 0x1e4100001e42,
- 0x1e4300001e44,
- 0x1e4500001e46,
- 0x1e4700001e48,
- 0x1e4900001e4a,
- 0x1e4b00001e4c,
- 0x1e4d00001e4e,
- 0x1e4f00001e50,
- 0x1e5100001e52,
- 0x1e5300001e54,
- 0x1e5500001e56,
- 0x1e5700001e58,
- 0x1e5900001e5a,
- 0x1e5b00001e5c,
- 0x1e5d00001e5e,
- 0x1e5f00001e60,
- 0x1e6100001e62,
- 0x1e6300001e64,
- 0x1e6500001e66,
- 0x1e6700001e68,
- 0x1e6900001e6a,
- 0x1e6b00001e6c,
- 0x1e6d00001e6e,
- 0x1e6f00001e70,
- 0x1e7100001e72,
- 0x1e7300001e74,
- 0x1e7500001e76,
- 0x1e7700001e78,
- 0x1e7900001e7a,
- 0x1e7b00001e7c,
- 0x1e7d00001e7e,
- 0x1e7f00001e80,
- 0x1e8100001e82,
- 0x1e8300001e84,
- 0x1e8500001e86,
- 0x1e8700001e88,
- 0x1e8900001e8a,
- 0x1e8b00001e8c,
- 0x1e8d00001e8e,
- 0x1e8f00001e90,
- 0x1e9100001e92,
- 0x1e9300001e94,
- 0x1e9500001e9a,
- 0x1e9c00001e9e,
- 0x1e9f00001ea0,
- 0x1ea100001ea2,
- 0x1ea300001ea4,
- 0x1ea500001ea6,
- 0x1ea700001ea8,
- 0x1ea900001eaa,
- 0x1eab00001eac,
- 0x1ead00001eae,
- 0x1eaf00001eb0,
- 0x1eb100001eb2,
- 0x1eb300001eb4,
- 0x1eb500001eb6,
- 0x1eb700001eb8,
- 0x1eb900001eba,
- 0x1ebb00001ebc,
- 0x1ebd00001ebe,
- 0x1ebf00001ec0,
- 0x1ec100001ec2,
- 0x1ec300001ec4,
- 0x1ec500001ec6,
- 0x1ec700001ec8,
- 0x1ec900001eca,
- 0x1ecb00001ecc,
- 0x1ecd00001ece,
- 0x1ecf00001ed0,
- 0x1ed100001ed2,
- 0x1ed300001ed4,
- 0x1ed500001ed6,
- 0x1ed700001ed8,
- 0x1ed900001eda,
- 0x1edb00001edc,
- 0x1edd00001ede,
- 0x1edf00001ee0,
- 0x1ee100001ee2,
- 0x1ee300001ee4,
- 0x1ee500001ee6,
- 0x1ee700001ee8,
- 0x1ee900001eea,
- 0x1eeb00001eec,
- 0x1eed00001eee,
- 0x1eef00001ef0,
- 0x1ef100001ef2,
- 0x1ef300001ef4,
- 0x1ef500001ef6,
- 0x1ef700001ef8,
- 0x1ef900001efa,
- 0x1efb00001efc,
- 0x1efd00001efe,
- 0x1eff00001f08,
- 0x1f1000001f16,
- 0x1f2000001f28,
- 0x1f3000001f38,
- 0x1f4000001f46,
- 0x1f5000001f58,
- 0x1f6000001f68,
- 0x1f7000001f71,
- 0x1f7200001f73,
- 0x1f7400001f75,
- 0x1f7600001f77,
- 0x1f7800001f79,
- 0x1f7a00001f7b,
- 0x1f7c00001f7d,
- 0x1fb000001fb2,
- 0x1fb600001fb7,
- 0x1fc600001fc7,
- 0x1fd000001fd3,
- 0x1fd600001fd8,
- 0x1fe000001fe3,
- 0x1fe400001fe8,
- 0x1ff600001ff7,
- 0x214e0000214f,
+ 0x1980000019AC,
+ 0x19B0000019CA,
+ 0x19D0000019DA,
+ 0x1A0000001A1C,
+ 0x1A2000001A5F,
+ 0x1A6000001A7D,
+ 0x1A7F00001A8A,
+ 0x1A9000001A9A,
+ 0x1AA700001AA8,
+ 0x1AB000001ABE,
+ 0x1ABF00001ACF,
+ 0x1B0000001B4D,
+ 0x1B5000001B5A,
+ 0x1B6B00001B74,
+ 0x1B8000001BF4,
+ 0x1C0000001C38,
+ 0x1C4000001C4A,
+ 0x1C4D00001C7E,
+ 0x1CD000001CD3,
+ 0x1CD400001CFB,
+ 0x1D0000001D2C,
+ 0x1D2F00001D30,
+ 0x1D3B00001D3C,
+ 0x1D4E00001D4F,
+ 0x1D6B00001D78,
+ 0x1D7900001D9B,
+ 0x1DC000001E00,
+ 0x1E0100001E02,
+ 0x1E0300001E04,
+ 0x1E0500001E06,
+ 0x1E0700001E08,
+ 0x1E0900001E0A,
+ 0x1E0B00001E0C,
+ 0x1E0D00001E0E,
+ 0x1E0F00001E10,
+ 0x1E1100001E12,
+ 0x1E1300001E14,
+ 0x1E1500001E16,
+ 0x1E1700001E18,
+ 0x1E1900001E1A,
+ 0x1E1B00001E1C,
+ 0x1E1D00001E1E,
+ 0x1E1F00001E20,
+ 0x1E2100001E22,
+ 0x1E2300001E24,
+ 0x1E2500001E26,
+ 0x1E2700001E28,
+ 0x1E2900001E2A,
+ 0x1E2B00001E2C,
+ 0x1E2D00001E2E,
+ 0x1E2F00001E30,
+ 0x1E3100001E32,
+ 0x1E3300001E34,
+ 0x1E3500001E36,
+ 0x1E3700001E38,
+ 0x1E3900001E3A,
+ 0x1E3B00001E3C,
+ 0x1E3D00001E3E,
+ 0x1E3F00001E40,
+ 0x1E4100001E42,
+ 0x1E4300001E44,
+ 0x1E4500001E46,
+ 0x1E4700001E48,
+ 0x1E4900001E4A,
+ 0x1E4B00001E4C,
+ 0x1E4D00001E4E,
+ 0x1E4F00001E50,
+ 0x1E5100001E52,
+ 0x1E5300001E54,
+ 0x1E5500001E56,
+ 0x1E5700001E58,
+ 0x1E5900001E5A,
+ 0x1E5B00001E5C,
+ 0x1E5D00001E5E,
+ 0x1E5F00001E60,
+ 0x1E6100001E62,
+ 0x1E6300001E64,
+ 0x1E6500001E66,
+ 0x1E6700001E68,
+ 0x1E6900001E6A,
+ 0x1E6B00001E6C,
+ 0x1E6D00001E6E,
+ 0x1E6F00001E70,
+ 0x1E7100001E72,
+ 0x1E7300001E74,
+ 0x1E7500001E76,
+ 0x1E7700001E78,
+ 0x1E7900001E7A,
+ 0x1E7B00001E7C,
+ 0x1E7D00001E7E,
+ 0x1E7F00001E80,
+ 0x1E8100001E82,
+ 0x1E8300001E84,
+ 0x1E8500001E86,
+ 0x1E8700001E88,
+ 0x1E8900001E8A,
+ 0x1E8B00001E8C,
+ 0x1E8D00001E8E,
+ 0x1E8F00001E90,
+ 0x1E9100001E92,
+ 0x1E9300001E94,
+ 0x1E9500001E9A,
+ 0x1E9C00001E9E,
+ 0x1E9F00001EA0,
+ 0x1EA100001EA2,
+ 0x1EA300001EA4,
+ 0x1EA500001EA6,
+ 0x1EA700001EA8,
+ 0x1EA900001EAA,
+ 0x1EAB00001EAC,
+ 0x1EAD00001EAE,
+ 0x1EAF00001EB0,
+ 0x1EB100001EB2,
+ 0x1EB300001EB4,
+ 0x1EB500001EB6,
+ 0x1EB700001EB8,
+ 0x1EB900001EBA,
+ 0x1EBB00001EBC,
+ 0x1EBD00001EBE,
+ 0x1EBF00001EC0,
+ 0x1EC100001EC2,
+ 0x1EC300001EC4,
+ 0x1EC500001EC6,
+ 0x1EC700001EC8,
+ 0x1EC900001ECA,
+ 0x1ECB00001ECC,
+ 0x1ECD00001ECE,
+ 0x1ECF00001ED0,
+ 0x1ED100001ED2,
+ 0x1ED300001ED4,
+ 0x1ED500001ED6,
+ 0x1ED700001ED8,
+ 0x1ED900001EDA,
+ 0x1EDB00001EDC,
+ 0x1EDD00001EDE,
+ 0x1EDF00001EE0,
+ 0x1EE100001EE2,
+ 0x1EE300001EE4,
+ 0x1EE500001EE6,
+ 0x1EE700001EE8,
+ 0x1EE900001EEA,
+ 0x1EEB00001EEC,
+ 0x1EED00001EEE,
+ 0x1EEF00001EF0,
+ 0x1EF100001EF2,
+ 0x1EF300001EF4,
+ 0x1EF500001EF6,
+ 0x1EF700001EF8,
+ 0x1EF900001EFA,
+ 0x1EFB00001EFC,
+ 0x1EFD00001EFE,
+ 0x1EFF00001F08,
+ 0x1F1000001F16,
+ 0x1F2000001F28,
+ 0x1F3000001F38,
+ 0x1F4000001F46,
+ 0x1F5000001F58,
+ 0x1F6000001F68,
+ 0x1F7000001F71,
+ 0x1F7200001F73,
+ 0x1F7400001F75,
+ 0x1F7600001F77,
+ 0x1F7800001F79,
+ 0x1F7A00001F7B,
+ 0x1F7C00001F7D,
+ 0x1FB000001FB2,
+ 0x1FB600001FB7,
+ 0x1FC600001FC7,
+ 0x1FD000001FD3,
+ 0x1FD600001FD8,
+ 0x1FE000001FE3,
+ 0x1FE400001FE8,
+ 0x1FF600001FF7,
+ 0x214E0000214F,
0x218400002185,
- 0x2c3000002c60,
- 0x2c6100002c62,
- 0x2c6500002c67,
- 0x2c6800002c69,
- 0x2c6a00002c6b,
- 0x2c6c00002c6d,
- 0x2c7100002c72,
- 0x2c7300002c75,
- 0x2c7600002c7c,
- 0x2c8100002c82,
- 0x2c8300002c84,
- 0x2c8500002c86,
- 0x2c8700002c88,
- 0x2c8900002c8a,
- 0x2c8b00002c8c,
- 0x2c8d00002c8e,
- 0x2c8f00002c90,
- 0x2c9100002c92,
- 0x2c9300002c94,
- 0x2c9500002c96,
- 0x2c9700002c98,
- 0x2c9900002c9a,
- 0x2c9b00002c9c,
- 0x2c9d00002c9e,
- 0x2c9f00002ca0,
- 0x2ca100002ca2,
- 0x2ca300002ca4,
- 0x2ca500002ca6,
- 0x2ca700002ca8,
- 0x2ca900002caa,
- 0x2cab00002cac,
- 0x2cad00002cae,
- 0x2caf00002cb0,
- 0x2cb100002cb2,
- 0x2cb300002cb4,
- 0x2cb500002cb6,
- 0x2cb700002cb8,
- 0x2cb900002cba,
- 0x2cbb00002cbc,
- 0x2cbd00002cbe,
- 0x2cbf00002cc0,
- 0x2cc100002cc2,
- 0x2cc300002cc4,
- 0x2cc500002cc6,
- 0x2cc700002cc8,
- 0x2cc900002cca,
- 0x2ccb00002ccc,
- 0x2ccd00002cce,
- 0x2ccf00002cd0,
- 0x2cd100002cd2,
- 0x2cd300002cd4,
- 0x2cd500002cd6,
- 0x2cd700002cd8,
- 0x2cd900002cda,
- 0x2cdb00002cdc,
- 0x2cdd00002cde,
- 0x2cdf00002ce0,
- 0x2ce100002ce2,
- 0x2ce300002ce5,
- 0x2cec00002ced,
- 0x2cee00002cf2,
- 0x2cf300002cf4,
- 0x2d0000002d26,
- 0x2d2700002d28,
- 0x2d2d00002d2e,
- 0x2d3000002d68,
- 0x2d7f00002d97,
- 0x2da000002da7,
- 0x2da800002daf,
- 0x2db000002db7,
- 0x2db800002dbf,
- 0x2dc000002dc7,
- 0x2dc800002dcf,
- 0x2dd000002dd7,
- 0x2dd800002ddf,
- 0x2de000002e00,
- 0x2e2f00002e30,
+ 0x2C3000002C60,
+ 0x2C6100002C62,
+ 0x2C6500002C67,
+ 0x2C6800002C69,
+ 0x2C6A00002C6B,
+ 0x2C6C00002C6D,
+ 0x2C7100002C72,
+ 0x2C7300002C75,
+ 0x2C7600002C7C,
+ 0x2C8100002C82,
+ 0x2C8300002C84,
+ 0x2C8500002C86,
+ 0x2C8700002C88,
+ 0x2C8900002C8A,
+ 0x2C8B00002C8C,
+ 0x2C8D00002C8E,
+ 0x2C8F00002C90,
+ 0x2C9100002C92,
+ 0x2C9300002C94,
+ 0x2C9500002C96,
+ 0x2C9700002C98,
+ 0x2C9900002C9A,
+ 0x2C9B00002C9C,
+ 0x2C9D00002C9E,
+ 0x2C9F00002CA0,
+ 0x2CA100002CA2,
+ 0x2CA300002CA4,
+ 0x2CA500002CA6,
+ 0x2CA700002CA8,
+ 0x2CA900002CAA,
+ 0x2CAB00002CAC,
+ 0x2CAD00002CAE,
+ 0x2CAF00002CB0,
+ 0x2CB100002CB2,
+ 0x2CB300002CB4,
+ 0x2CB500002CB6,
+ 0x2CB700002CB8,
+ 0x2CB900002CBA,
+ 0x2CBB00002CBC,
+ 0x2CBD00002CBE,
+ 0x2CBF00002CC0,
+ 0x2CC100002CC2,
+ 0x2CC300002CC4,
+ 0x2CC500002CC6,
+ 0x2CC700002CC8,
+ 0x2CC900002CCA,
+ 0x2CCB00002CCC,
+ 0x2CCD00002CCE,
+ 0x2CCF00002CD0,
+ 0x2CD100002CD2,
+ 0x2CD300002CD4,
+ 0x2CD500002CD6,
+ 0x2CD700002CD8,
+ 0x2CD900002CDA,
+ 0x2CDB00002CDC,
+ 0x2CDD00002CDE,
+ 0x2CDF00002CE0,
+ 0x2CE100002CE2,
+ 0x2CE300002CE5,
+ 0x2CEC00002CED,
+ 0x2CEE00002CF2,
+ 0x2CF300002CF4,
+ 0x2D0000002D26,
+ 0x2D2700002D28,
+ 0x2D2D00002D2E,
+ 0x2D3000002D68,
+ 0x2D7F00002D97,
+ 0x2DA000002DA7,
+ 0x2DA800002DAF,
+ 0x2DB000002DB7,
+ 0x2DB800002DBF,
+ 0x2DC000002DC7,
+ 0x2DC800002DCF,
+ 0x2DD000002DD7,
+ 0x2DD800002DDF,
+ 0x2DE000002E00,
+ 0x2E2F00002E30,
0x300500003008,
- 0x302a0000302e,
- 0x303c0000303d,
+ 0x302A0000302E,
+ 0x303C0000303D,
0x304100003097,
- 0x30990000309b,
- 0x309d0000309f,
- 0x30a1000030fb,
- 0x30fc000030ff,
+ 0x30990000309B,
+ 0x309D0000309F,
+ 0x30A1000030FB,
+ 0x30FC000030FF,
0x310500003130,
- 0x31a0000031c0,
- 0x31f000003200,
- 0x340000004dc0,
- 0x4e000000a48d,
- 0xa4d00000a4fe,
- 0xa5000000a60d,
- 0xa6100000a62c,
- 0xa6410000a642,
- 0xa6430000a644,
- 0xa6450000a646,
- 0xa6470000a648,
- 0xa6490000a64a,
- 0xa64b0000a64c,
- 0xa64d0000a64e,
- 0xa64f0000a650,
- 0xa6510000a652,
- 0xa6530000a654,
- 0xa6550000a656,
- 0xa6570000a658,
- 0xa6590000a65a,
- 0xa65b0000a65c,
- 0xa65d0000a65e,
- 0xa65f0000a660,
- 0xa6610000a662,
- 0xa6630000a664,
- 0xa6650000a666,
- 0xa6670000a668,
- 0xa6690000a66a,
- 0xa66b0000a66c,
- 0xa66d0000a670,
- 0xa6740000a67e,
- 0xa67f0000a680,
- 0xa6810000a682,
- 0xa6830000a684,
- 0xa6850000a686,
- 0xa6870000a688,
- 0xa6890000a68a,
- 0xa68b0000a68c,
- 0xa68d0000a68e,
- 0xa68f0000a690,
- 0xa6910000a692,
- 0xa6930000a694,
- 0xa6950000a696,
- 0xa6970000a698,
- 0xa6990000a69a,
- 0xa69b0000a69c,
- 0xa69e0000a6e6,
- 0xa6f00000a6f2,
- 0xa7170000a720,
- 0xa7230000a724,
- 0xa7250000a726,
- 0xa7270000a728,
- 0xa7290000a72a,
- 0xa72b0000a72c,
- 0xa72d0000a72e,
- 0xa72f0000a732,
- 0xa7330000a734,
- 0xa7350000a736,
- 0xa7370000a738,
- 0xa7390000a73a,
- 0xa73b0000a73c,
- 0xa73d0000a73e,
- 0xa73f0000a740,
- 0xa7410000a742,
- 0xa7430000a744,
- 0xa7450000a746,
- 0xa7470000a748,
- 0xa7490000a74a,
- 0xa74b0000a74c,
- 0xa74d0000a74e,
- 0xa74f0000a750,
- 0xa7510000a752,
- 0xa7530000a754,
- 0xa7550000a756,
- 0xa7570000a758,
- 0xa7590000a75a,
- 0xa75b0000a75c,
- 0xa75d0000a75e,
- 0xa75f0000a760,
- 0xa7610000a762,
- 0xa7630000a764,
- 0xa7650000a766,
- 0xa7670000a768,
- 0xa7690000a76a,
- 0xa76b0000a76c,
- 0xa76d0000a76e,
- 0xa76f0000a770,
- 0xa7710000a779,
- 0xa77a0000a77b,
- 0xa77c0000a77d,
- 0xa77f0000a780,
- 0xa7810000a782,
- 0xa7830000a784,
- 0xa7850000a786,
- 0xa7870000a789,
- 0xa78c0000a78d,
- 0xa78e0000a790,
- 0xa7910000a792,
- 0xa7930000a796,
- 0xa7970000a798,
- 0xa7990000a79a,
- 0xa79b0000a79c,
- 0xa79d0000a79e,
- 0xa79f0000a7a0,
- 0xa7a10000a7a2,
- 0xa7a30000a7a4,
- 0xa7a50000a7a6,
- 0xa7a70000a7a8,
- 0xa7a90000a7aa,
- 0xa7af0000a7b0,
- 0xa7b50000a7b6,
- 0xa7b70000a7b8,
- 0xa7b90000a7ba,
- 0xa7bb0000a7bc,
- 0xa7bd0000a7be,
- 0xa7bf0000a7c0,
- 0xa7c10000a7c2,
- 0xa7c30000a7c4,
- 0xa7c80000a7c9,
- 0xa7ca0000a7cb,
- 0xa7d10000a7d2,
- 0xa7d30000a7d4,
- 0xa7d50000a7d6,
- 0xa7d70000a7d8,
- 0xa7d90000a7da,
- 0xa7f20000a7f5,
- 0xa7f60000a7f8,
- 0xa7fa0000a828,
- 0xa82c0000a82d,
- 0xa8400000a874,
- 0xa8800000a8c6,
- 0xa8d00000a8da,
- 0xa8e00000a8f8,
- 0xa8fb0000a8fc,
- 0xa8fd0000a92e,
- 0xa9300000a954,
- 0xa9800000a9c1,
- 0xa9cf0000a9da,
- 0xa9e00000a9ff,
- 0xaa000000aa37,
- 0xaa400000aa4e,
- 0xaa500000aa5a,
- 0xaa600000aa77,
- 0xaa7a0000aac3,
- 0xaadb0000aade,
- 0xaae00000aaf0,
- 0xaaf20000aaf7,
- 0xab010000ab07,
- 0xab090000ab0f,
- 0xab110000ab17,
- 0xab200000ab27,
- 0xab280000ab2f,
- 0xab300000ab5b,
- 0xab600000ab69,
- 0xabc00000abeb,
- 0xabec0000abee,
- 0xabf00000abfa,
- 0xac000000d7a4,
- 0xfa0e0000fa10,
- 0xfa110000fa12,
- 0xfa130000fa15,
- 0xfa1f0000fa20,
- 0xfa210000fa22,
- 0xfa230000fa25,
- 0xfa270000fa2a,
- 0xfb1e0000fb1f,
- 0xfe200000fe30,
- 0xfe730000fe74,
- 0x100000001000c,
- 0x1000d00010027,
- 0x100280001003b,
- 0x1003c0001003e,
- 0x1003f0001004e,
- 0x100500001005e,
- 0x10080000100fb,
- 0x101fd000101fe,
- 0x102800001029d,
- 0x102a0000102d1,
- 0x102e0000102e1,
+ 0x31A0000031C0,
+ 0x31F000003200,
+ 0x340000004DC0,
+ 0x4E000000A48D,
+ 0xA4D00000A4FE,
+ 0xA5000000A60D,
+ 0xA6100000A62C,
+ 0xA6410000A642,
+ 0xA6430000A644,
+ 0xA6450000A646,
+ 0xA6470000A648,
+ 0xA6490000A64A,
+ 0xA64B0000A64C,
+ 0xA64D0000A64E,
+ 0xA64F0000A650,
+ 0xA6510000A652,
+ 0xA6530000A654,
+ 0xA6550000A656,
+ 0xA6570000A658,
+ 0xA6590000A65A,
+ 0xA65B0000A65C,
+ 0xA65D0000A65E,
+ 0xA65F0000A660,
+ 0xA6610000A662,
+ 0xA6630000A664,
+ 0xA6650000A666,
+ 0xA6670000A668,
+ 0xA6690000A66A,
+ 0xA66B0000A66C,
+ 0xA66D0000A670,
+ 0xA6740000A67E,
+ 0xA67F0000A680,
+ 0xA6810000A682,
+ 0xA6830000A684,
+ 0xA6850000A686,
+ 0xA6870000A688,
+ 0xA6890000A68A,
+ 0xA68B0000A68C,
+ 0xA68D0000A68E,
+ 0xA68F0000A690,
+ 0xA6910000A692,
+ 0xA6930000A694,
+ 0xA6950000A696,
+ 0xA6970000A698,
+ 0xA6990000A69A,
+ 0xA69B0000A69C,
+ 0xA69E0000A6E6,
+ 0xA6F00000A6F2,
+ 0xA7170000A720,
+ 0xA7230000A724,
+ 0xA7250000A726,
+ 0xA7270000A728,
+ 0xA7290000A72A,
+ 0xA72B0000A72C,
+ 0xA72D0000A72E,
+ 0xA72F0000A732,
+ 0xA7330000A734,
+ 0xA7350000A736,
+ 0xA7370000A738,
+ 0xA7390000A73A,
+ 0xA73B0000A73C,
+ 0xA73D0000A73E,
+ 0xA73F0000A740,
+ 0xA7410000A742,
+ 0xA7430000A744,
+ 0xA7450000A746,
+ 0xA7470000A748,
+ 0xA7490000A74A,
+ 0xA74B0000A74C,
+ 0xA74D0000A74E,
+ 0xA74F0000A750,
+ 0xA7510000A752,
+ 0xA7530000A754,
+ 0xA7550000A756,
+ 0xA7570000A758,
+ 0xA7590000A75A,
+ 0xA75B0000A75C,
+ 0xA75D0000A75E,
+ 0xA75F0000A760,
+ 0xA7610000A762,
+ 0xA7630000A764,
+ 0xA7650000A766,
+ 0xA7670000A768,
+ 0xA7690000A76A,
+ 0xA76B0000A76C,
+ 0xA76D0000A76E,
+ 0xA76F0000A770,
+ 0xA7710000A779,
+ 0xA77A0000A77B,
+ 0xA77C0000A77D,
+ 0xA77F0000A780,
+ 0xA7810000A782,
+ 0xA7830000A784,
+ 0xA7850000A786,
+ 0xA7870000A789,
+ 0xA78C0000A78D,
+ 0xA78E0000A790,
+ 0xA7910000A792,
+ 0xA7930000A796,
+ 0xA7970000A798,
+ 0xA7990000A79A,
+ 0xA79B0000A79C,
+ 0xA79D0000A79E,
+ 0xA79F0000A7A0,
+ 0xA7A10000A7A2,
+ 0xA7A30000A7A4,
+ 0xA7A50000A7A6,
+ 0xA7A70000A7A8,
+ 0xA7A90000A7AA,
+ 0xA7AF0000A7B0,
+ 0xA7B50000A7B6,
+ 0xA7B70000A7B8,
+ 0xA7B90000A7BA,
+ 0xA7BB0000A7BC,
+ 0xA7BD0000A7BE,
+ 0xA7BF0000A7C0,
+ 0xA7C10000A7C2,
+ 0xA7C30000A7C4,
+ 0xA7C80000A7C9,
+ 0xA7CA0000A7CB,
+ 0xA7D10000A7D2,
+ 0xA7D30000A7D4,
+ 0xA7D50000A7D6,
+ 0xA7D70000A7D8,
+ 0xA7D90000A7DA,
+ 0xA7F60000A7F8,
+ 0xA7FA0000A828,
+ 0xA82C0000A82D,
+ 0xA8400000A874,
+ 0xA8800000A8C6,
+ 0xA8D00000A8DA,
+ 0xA8E00000A8F8,
+ 0xA8FB0000A8FC,
+ 0xA8FD0000A92E,
+ 0xA9300000A954,
+ 0xA9800000A9C1,
+ 0xA9CF0000A9DA,
+ 0xA9E00000A9FF,
+ 0xAA000000AA37,
+ 0xAA400000AA4E,
+ 0xAA500000AA5A,
+ 0xAA600000AA77,
+ 0xAA7A0000AAC3,
+ 0xAADB0000AADE,
+ 0xAAE00000AAF0,
+ 0xAAF20000AAF7,
+ 0xAB010000AB07,
+ 0xAB090000AB0F,
+ 0xAB110000AB17,
+ 0xAB200000AB27,
+ 0xAB280000AB2F,
+ 0xAB300000AB5B,
+ 0xAB600000AB69,
+ 0xABC00000ABEB,
+ 0xABEC0000ABEE,
+ 0xABF00000ABFA,
+ 0xAC000000D7A4,
+ 0xFA0E0000FA10,
+ 0xFA110000FA12,
+ 0xFA130000FA15,
+ 0xFA1F0000FA20,
+ 0xFA210000FA22,
+ 0xFA230000FA25,
+ 0xFA270000FA2A,
+ 0xFB1E0000FB1F,
+ 0xFE200000FE30,
+ 0xFE730000FE74,
+ 0x100000001000C,
+ 0x1000D00010027,
+ 0x100280001003B,
+ 0x1003C0001003E,
+ 0x1003F0001004E,
+ 0x100500001005E,
+ 0x10080000100FB,
+ 0x101FD000101FE,
+ 0x102800001029D,
+ 0x102A0000102D1,
+ 0x102E0000102E1,
0x1030000010320,
- 0x1032d00010341,
- 0x103420001034a,
- 0x103500001037b,
- 0x103800001039e,
- 0x103a0000103c4,
- 0x103c8000103d0,
- 0x104280001049e,
- 0x104a0000104aa,
- 0x104d8000104fc,
+ 0x1032D00010341,
+ 0x103420001034A,
+ 0x103500001037B,
+ 0x103800001039E,
+ 0x103A0000103C4,
+ 0x103C8000103D0,
+ 0x104280001049E,
+ 0x104A0000104AA,
+ 0x104D8000104FC,
0x1050000010528,
0x1053000010564,
- 0x10597000105a2,
- 0x105a3000105b2,
- 0x105b3000105ba,
- 0x105bb000105bd,
+ 0x10597000105A2,
+ 0x105A3000105B2,
+ 0x105B3000105BA,
+ 0x105BB000105BD,
0x1060000010737,
0x1074000010756,
0x1076000010768,
- 0x1078000010786,
- 0x10787000107b1,
- 0x107b2000107bb,
+ 0x1078000010781,
0x1080000010806,
0x1080800010809,
- 0x1080a00010836,
+ 0x1080A00010836,
0x1083700010839,
- 0x1083c0001083d,
- 0x1083f00010856,
+ 0x1083C0001083D,
+ 0x1083F00010856,
0x1086000010877,
- 0x108800001089f,
- 0x108e0000108f3,
- 0x108f4000108f6,
+ 0x108800001089F,
+ 0x108E0000108F3,
+ 0x108F4000108F6,
0x1090000010916,
- 0x109200001093a,
- 0x10980000109b8,
- 0x109be000109c0,
- 0x10a0000010a04,
- 0x10a0500010a07,
- 0x10a0c00010a14,
- 0x10a1500010a18,
- 0x10a1900010a36,
- 0x10a3800010a3b,
- 0x10a3f00010a40,
- 0x10a6000010a7d,
- 0x10a8000010a9d,
- 0x10ac000010ac8,
- 0x10ac900010ae7,
- 0x10b0000010b36,
- 0x10b4000010b56,
- 0x10b6000010b73,
- 0x10b8000010b92,
- 0x10c0000010c49,
- 0x10cc000010cf3,
- 0x10d0000010d28,
- 0x10d3000010d3a,
- 0x10e8000010eaa,
- 0x10eab00010ead,
- 0x10eb000010eb2,
- 0x10efd00010f1d,
- 0x10f2700010f28,
- 0x10f3000010f51,
- 0x10f7000010f86,
- 0x10fb000010fc5,
- 0x10fe000010ff7,
+ 0x109200001093A,
+ 0x10980000109B8,
+ 0x109BE000109C0,
+ 0x10A0000010A04,
+ 0x10A0500010A07,
+ 0x10A0C00010A14,
+ 0x10A1500010A18,
+ 0x10A1900010A36,
+ 0x10A3800010A3B,
+ 0x10A3F00010A40,
+ 0x10A6000010A7D,
+ 0x10A8000010A9D,
+ 0x10AC000010AC8,
+ 0x10AC900010AE7,
+ 0x10B0000010B36,
+ 0x10B4000010B56,
+ 0x10B6000010B73,
+ 0x10B8000010B92,
+ 0x10C0000010C49,
+ 0x10CC000010CF3,
+ 0x10D0000010D28,
+ 0x10D3000010D3A,
+ 0x10E8000010EAA,
+ 0x10EAB00010EAD,
+ 0x10EB000010EB2,
+ 0x10EFD00010F1D,
+ 0x10F2700010F28,
+ 0x10F3000010F51,
+ 0x10F7000010F86,
+ 0x10FB000010FC5,
+ 0x10FE000010FF7,
0x1100000011047,
0x1106600011076,
- 0x1107f000110bb,
- 0x110c2000110c3,
- 0x110d0000110e9,
- 0x110f0000110fa,
+ 0x1107F000110BB,
+ 0x110C2000110C3,
+ 0x110D0000110E9,
+ 0x110F0000110FA,
0x1110000011135,
0x1113600011140,
0x1114400011148,
0x1115000011174,
0x1117600011177,
- 0x11180000111c5,
- 0x111c9000111cd,
- 0x111ce000111db,
- 0x111dc000111dd,
+ 0x11180000111C5,
+ 0x111C9000111CD,
+ 0x111CE000111DB,
+ 0x111DC000111DD,
0x1120000011212,
0x1121300011238,
- 0x1123e00011242,
+ 0x1123E00011242,
0x1128000011287,
0x1128800011289,
- 0x1128a0001128e,
- 0x1128f0001129e,
- 0x1129f000112a9,
- 0x112b0000112eb,
- 0x112f0000112fa,
+ 0x1128A0001128E,
+ 0x1128F0001129E,
+ 0x1129F000112A9,
+ 0x112B0000112EB,
+ 0x112F0000112FA,
0x1130000011304,
- 0x113050001130d,
- 0x1130f00011311,
+ 0x113050001130D,
+ 0x1130F00011311,
0x1131300011329,
- 0x1132a00011331,
+ 0x1132A00011331,
0x1133200011334,
- 0x113350001133a,
- 0x1133b00011345,
+ 0x113350001133A,
+ 0x1133B00011345,
0x1134700011349,
- 0x1134b0001134e,
+ 0x1134B0001134E,
0x1135000011351,
0x1135700011358,
- 0x1135d00011364,
- 0x113660001136d,
+ 0x1135D00011364,
+ 0x113660001136D,
0x1137000011375,
- 0x114000001144b,
- 0x114500001145a,
- 0x1145e00011462,
- 0x11480000114c6,
- 0x114c7000114c8,
- 0x114d0000114da,
- 0x11580000115b6,
- 0x115b8000115c1,
- 0x115d8000115de,
+ 0x114000001144B,
+ 0x114500001145A,
+ 0x1145E00011462,
+ 0x11480000114C6,
+ 0x114C7000114C8,
+ 0x114D0000114DA,
+ 0x11580000115B6,
+ 0x115B8000115C1,
+ 0x115D8000115DE,
0x1160000011641,
0x1164400011645,
- 0x116500001165a,
- 0x11680000116b9,
- 0x116c0000116ca,
- 0x117000001171b,
- 0x1171d0001172c,
- 0x117300001173a,
+ 0x116500001165A,
+ 0x11680000116B9,
+ 0x116C0000116CA,
+ 0x117000001171B,
+ 0x1171D0001172C,
+ 0x117300001173A,
0x1174000011747,
- 0x118000001183b,
- 0x118c0000118ea,
- 0x118ff00011907,
- 0x119090001190a,
- 0x1190c00011914,
+ 0x118000001183B,
+ 0x118C0000118EA,
+ 0x118FF00011907,
+ 0x119090001190A,
+ 0x1190C00011914,
0x1191500011917,
0x1191800011936,
0x1193700011939,
- 0x1193b00011944,
- 0x119500001195a,
- 0x119a0000119a8,
- 0x119aa000119d8,
- 0x119da000119e2,
- 0x119e3000119e5,
- 0x11a0000011a3f,
- 0x11a4700011a48,
- 0x11a5000011a9a,
- 0x11a9d00011a9e,
- 0x11ab000011af9,
- 0x11c0000011c09,
- 0x11c0a00011c37,
- 0x11c3800011c41,
- 0x11c5000011c5a,
- 0x11c7200011c90,
- 0x11c9200011ca8,
- 0x11ca900011cb7,
- 0x11d0000011d07,
- 0x11d0800011d0a,
- 0x11d0b00011d37,
- 0x11d3a00011d3b,
- 0x11d3c00011d3e,
- 0x11d3f00011d48,
- 0x11d5000011d5a,
- 0x11d6000011d66,
- 0x11d6700011d69,
- 0x11d6a00011d8f,
- 0x11d9000011d92,
- 0x11d9300011d99,
- 0x11da000011daa,
- 0x11ee000011ef7,
- 0x11f0000011f11,
- 0x11f1200011f3b,
- 0x11f3e00011f43,
- 0x11f5000011f5a,
- 0x11fb000011fb1,
- 0x120000001239a,
+ 0x1193B00011944,
+ 0x119500001195A,
+ 0x119A0000119A8,
+ 0x119AA000119D8,
+ 0x119DA000119E2,
+ 0x119E3000119E5,
+ 0x11A0000011A3F,
+ 0x11A4700011A48,
+ 0x11A5000011A9A,
+ 0x11A9D00011A9E,
+ 0x11AB000011AF9,
+ 0x11C0000011C09,
+ 0x11C0A00011C37,
+ 0x11C3800011C41,
+ 0x11C5000011C5A,
+ 0x11C7200011C90,
+ 0x11C9200011CA8,
+ 0x11CA900011CB7,
+ 0x11D0000011D07,
+ 0x11D0800011D0A,
+ 0x11D0B00011D37,
+ 0x11D3A00011D3B,
+ 0x11D3C00011D3E,
+ 0x11D3F00011D48,
+ 0x11D5000011D5A,
+ 0x11D6000011D66,
+ 0x11D6700011D69,
+ 0x11D6A00011D8F,
+ 0x11D9000011D92,
+ 0x11D9300011D99,
+ 0x11DA000011DAA,
+ 0x11EE000011EF7,
+ 0x11F0000011F11,
+ 0x11F1200011F3B,
+ 0x11F3E00011F43,
+ 0x11F5000011F5A,
+ 0x11FB000011FB1,
+ 0x120000001239A,
0x1248000012544,
- 0x12f9000012ff1,
+ 0x12F9000012FF1,
0x1300000013430,
0x1344000013456,
0x1440000014647,
- 0x1680000016a39,
- 0x16a4000016a5f,
- 0x16a6000016a6a,
- 0x16a7000016abf,
- 0x16ac000016aca,
- 0x16ad000016aee,
- 0x16af000016af5,
- 0x16b0000016b37,
- 0x16b4000016b44,
- 0x16b5000016b5a,
- 0x16b6300016b78,
- 0x16b7d00016b90,
- 0x16e6000016e80,
- 0x16f0000016f4b,
- 0x16f4f00016f88,
- 0x16f8f00016fa0,
- 0x16fe000016fe2,
- 0x16fe300016fe5,
- 0x16ff000016ff2,
- 0x17000000187f8,
- 0x1880000018cd6,
- 0x18d0000018d09,
- 0x1aff00001aff4,
- 0x1aff50001affc,
- 0x1affd0001afff,
- 0x1b0000001b123,
- 0x1b1320001b133,
- 0x1b1500001b153,
- 0x1b1550001b156,
- 0x1b1640001b168,
- 0x1b1700001b2fc,
- 0x1bc000001bc6b,
- 0x1bc700001bc7d,
- 0x1bc800001bc89,
- 0x1bc900001bc9a,
- 0x1bc9d0001bc9f,
- 0x1cf000001cf2e,
- 0x1cf300001cf47,
- 0x1da000001da37,
- 0x1da3b0001da6d,
- 0x1da750001da76,
- 0x1da840001da85,
- 0x1da9b0001daa0,
- 0x1daa10001dab0,
- 0x1df000001df1f,
- 0x1df250001df2b,
- 0x1e0000001e007,
- 0x1e0080001e019,
- 0x1e01b0001e022,
- 0x1e0230001e025,
- 0x1e0260001e02b,
- 0x1e08f0001e090,
- 0x1e1000001e12d,
- 0x1e1300001e13e,
- 0x1e1400001e14a,
- 0x1e14e0001e14f,
- 0x1e2900001e2af,
- 0x1e2c00001e2fa,
- 0x1e4d00001e4fa,
- 0x1e7e00001e7e7,
- 0x1e7e80001e7ec,
- 0x1e7ed0001e7ef,
- 0x1e7f00001e7ff,
- 0x1e8000001e8c5,
- 0x1e8d00001e8d7,
- 0x1e9220001e94c,
- 0x1e9500001e95a,
- 0x200000002a6e0,
- 0x2a7000002b73a,
- 0x2b7400002b81e,
- 0x2b8200002cea2,
- 0x2ceb00002ebe1,
- 0x300000003134b,
- 0x31350000323b0,
+ 0x1680000016A39,
+ 0x16A4000016A5F,
+ 0x16A6000016A6A,
+ 0x16A7000016ABF,
+ 0x16AC000016ACA,
+ 0x16AD000016AEE,
+ 0x16AF000016AF5,
+ 0x16B0000016B37,
+ 0x16B4000016B44,
+ 0x16B5000016B5A,
+ 0x16B6300016B78,
+ 0x16B7D00016B90,
+ 0x16E6000016E80,
+ 0x16F0000016F4B,
+ 0x16F4F00016F88,
+ 0x16F8F00016FA0,
+ 0x16FE000016FE2,
+ 0x16FE300016FE5,
+ 0x16FF000016FF2,
+ 0x17000000187F8,
+ 0x1880000018CD6,
+ 0x18D0000018D09,
+ 0x1AFF00001AFF4,
+ 0x1AFF50001AFFC,
+ 0x1AFFD0001AFFF,
+ 0x1B0000001B123,
+ 0x1B1320001B133,
+ 0x1B1500001B153,
+ 0x1B1550001B156,
+ 0x1B1640001B168,
+ 0x1B1700001B2FC,
+ 0x1BC000001BC6B,
+ 0x1BC700001BC7D,
+ 0x1BC800001BC89,
+ 0x1BC900001BC9A,
+ 0x1BC9D0001BC9F,
+ 0x1CF000001CF2E,
+ 0x1CF300001CF47,
+ 0x1DA000001DA37,
+ 0x1DA3B0001DA6D,
+ 0x1DA750001DA76,
+ 0x1DA840001DA85,
+ 0x1DA9B0001DAA0,
+ 0x1DAA10001DAB0,
+ 0x1DF000001DF1F,
+ 0x1DF250001DF2B,
+ 0x1E0000001E007,
+ 0x1E0080001E019,
+ 0x1E01B0001E022,
+ 0x1E0230001E025,
+ 0x1E0260001E02B,
+ 0x1E08F0001E090,
+ 0x1E1000001E12D,
+ 0x1E1300001E13E,
+ 0x1E1400001E14A,
+ 0x1E14E0001E14F,
+ 0x1E2900001E2AF,
+ 0x1E2C00001E2FA,
+ 0x1E4D00001E4FA,
+ 0x1E7E00001E7E7,
+ 0x1E7E80001E7EC,
+ 0x1E7ED0001E7EF,
+ 0x1E7F00001E7FF,
+ 0x1E8000001E8C5,
+ 0x1E8D00001E8D7,
+ 0x1E9220001E94C,
+ 0x1E9500001E95A,
+ 0x200000002A6E0,
+ 0x2A7000002B73A,
+ 0x2B7400002B81E,
+ 0x2B8200002CEA2,
+ 0x2CEB00002EBE1,
+ 0x2EBF00002EE5E,
+ 0x300000003134B,
+ 0x31350000323B0,
),
- 'CONTEXTJ': (
- 0x200c0000200e,
- ),
- 'CONTEXTO': (
- 0xb7000000b8,
+ "CONTEXTJ": (0x200C0000200E,),
+ "CONTEXTO": (
+ 0xB7000000B8,
0x37500000376,
- 0x5f3000005f5,
- 0x6600000066a,
- 0x6f0000006fa,
- 0x30fb000030fc,
+ 0x5F3000005F5,
+ 0x6600000066A,
+ 0x6F0000006FA,
+ 0x30FB000030FC,
),
}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py
index 6a43b047..7bfaa8d8 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py
@@ -8,6 +8,7 @@ in the original list?" in time O(log(# runs)).
import bisect
from typing import List, Tuple
+
def intranges_from_list(list_: List[int]) -> Tuple[int, ...]:
"""Represent a list of integers as a sequence of ranges:
((start_0, end_0), (start_1, end_1), ...), such that the original
@@ -20,18 +21,20 @@ def intranges_from_list(list_: List[int]) -> Tuple[int, ...]:
ranges = []
last_write = -1
for i in range(len(sorted_list)):
- if i+1 < len(sorted_list):
- if sorted_list[i] == sorted_list[i+1]-1:
+ if i + 1 < len(sorted_list):
+ if sorted_list[i] == sorted_list[i + 1] - 1:
continue
- current_range = sorted_list[last_write+1:i+1]
+ current_range = sorted_list[last_write + 1 : i + 1]
ranges.append(_encode_range(current_range[0], current_range[-1] + 1))
last_write = i
return tuple(ranges)
+
def _encode_range(start: int, end: int) -> int:
return (start << 32) | end
+
def _decode_range(r: int) -> Tuple[int, int]:
return (r >> 32), (r & ((1 << 32) - 1))
@@ -43,7 +46,7 @@ def intranges_contain(int_: int, ranges: Tuple[int, ...]) -> bool:
# we could be immediately ahead of a tuple (start, end)
# with start < int_ <= end
if pos > 0:
- left, right = _decode_range(ranges[pos-1])
+ left, right = _decode_range(ranges[pos - 1])
if left <= int_ < right:
return True
# or we could be immediately behind a tuple (int_, end)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py
index 8501893b..514ff7e2 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py
@@ -1,2 +1 @@
-__version__ = '3.4'
-
+__version__ = "3.10"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py
index 186796c1..eb894327 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py
@@ -3,8517 +3,8598 @@
from typing import List, Tuple, Union
-
"""IDNA Mapping Table from UTS46."""
-__version__ = '15.0.0'
+__version__ = "15.1.0"
+
+
def _seg_0() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x0, '3'),
- (0x1, '3'),
- (0x2, '3'),
- (0x3, '3'),
- (0x4, '3'),
- (0x5, '3'),
- (0x6, '3'),
- (0x7, '3'),
- (0x8, '3'),
- (0x9, '3'),
- (0xA, '3'),
- (0xB, '3'),
- (0xC, '3'),
- (0xD, '3'),
- (0xE, '3'),
- (0xF, '3'),
- (0x10, '3'),
- (0x11, '3'),
- (0x12, '3'),
- (0x13, '3'),
- (0x14, '3'),
- (0x15, '3'),
- (0x16, '3'),
- (0x17, '3'),
- (0x18, '3'),
- (0x19, '3'),
- (0x1A, '3'),
- (0x1B, '3'),
- (0x1C, '3'),
- (0x1D, '3'),
- (0x1E, '3'),
- (0x1F, '3'),
- (0x20, '3'),
- (0x21, '3'),
- (0x22, '3'),
- (0x23, '3'),
- (0x24, '3'),
- (0x25, '3'),
- (0x26, '3'),
- (0x27, '3'),
- (0x28, '3'),
- (0x29, '3'),
- (0x2A, '3'),
- (0x2B, '3'),
- (0x2C, '3'),
- (0x2D, 'V'),
- (0x2E, 'V'),
- (0x2F, '3'),
- (0x30, 'V'),
- (0x31, 'V'),
- (0x32, 'V'),
- (0x33, 'V'),
- (0x34, 'V'),
- (0x35, 'V'),
- (0x36, 'V'),
- (0x37, 'V'),
- (0x38, 'V'),
- (0x39, 'V'),
- (0x3A, '3'),
- (0x3B, '3'),
- (0x3C, '3'),
- (0x3D, '3'),
- (0x3E, '3'),
- (0x3F, '3'),
- (0x40, '3'),
- (0x41, 'M', 'a'),
- (0x42, 'M', 'b'),
- (0x43, 'M', 'c'),
- (0x44, 'M', 'd'),
- (0x45, 'M', 'e'),
- (0x46, 'M', 'f'),
- (0x47, 'M', 'g'),
- (0x48, 'M', 'h'),
- (0x49, 'M', 'i'),
- (0x4A, 'M', 'j'),
- (0x4B, 'M', 'k'),
- (0x4C, 'M', 'l'),
- (0x4D, 'M', 'm'),
- (0x4E, 'M', 'n'),
- (0x4F, 'M', 'o'),
- (0x50, 'M', 'p'),
- (0x51, 'M', 'q'),
- (0x52, 'M', 'r'),
- (0x53, 'M', 's'),
- (0x54, 'M', 't'),
- (0x55, 'M', 'u'),
- (0x56, 'M', 'v'),
- (0x57, 'M', 'w'),
- (0x58, 'M', 'x'),
- (0x59, 'M', 'y'),
- (0x5A, 'M', 'z'),
- (0x5B, '3'),
- (0x5C, '3'),
- (0x5D, '3'),
- (0x5E, '3'),
- (0x5F, '3'),
- (0x60, '3'),
- (0x61, 'V'),
- (0x62, 'V'),
- (0x63, 'V'),
+ (0x0, "3"),
+ (0x1, "3"),
+ (0x2, "3"),
+ (0x3, "3"),
+ (0x4, "3"),
+ (0x5, "3"),
+ (0x6, "3"),
+ (0x7, "3"),
+ (0x8, "3"),
+ (0x9, "3"),
+ (0xA, "3"),
+ (0xB, "3"),
+ (0xC, "3"),
+ (0xD, "3"),
+ (0xE, "3"),
+ (0xF, "3"),
+ (0x10, "3"),
+ (0x11, "3"),
+ (0x12, "3"),
+ (0x13, "3"),
+ (0x14, "3"),
+ (0x15, "3"),
+ (0x16, "3"),
+ (0x17, "3"),
+ (0x18, "3"),
+ (0x19, "3"),
+ (0x1A, "3"),
+ (0x1B, "3"),
+ (0x1C, "3"),
+ (0x1D, "3"),
+ (0x1E, "3"),
+ (0x1F, "3"),
+ (0x20, "3"),
+ (0x21, "3"),
+ (0x22, "3"),
+ (0x23, "3"),
+ (0x24, "3"),
+ (0x25, "3"),
+ (0x26, "3"),
+ (0x27, "3"),
+ (0x28, "3"),
+ (0x29, "3"),
+ (0x2A, "3"),
+ (0x2B, "3"),
+ (0x2C, "3"),
+ (0x2D, "V"),
+ (0x2E, "V"),
+ (0x2F, "3"),
+ (0x30, "V"),
+ (0x31, "V"),
+ (0x32, "V"),
+ (0x33, "V"),
+ (0x34, "V"),
+ (0x35, "V"),
+ (0x36, "V"),
+ (0x37, "V"),
+ (0x38, "V"),
+ (0x39, "V"),
+ (0x3A, "3"),
+ (0x3B, "3"),
+ (0x3C, "3"),
+ (0x3D, "3"),
+ (0x3E, "3"),
+ (0x3F, "3"),
+ (0x40, "3"),
+ (0x41, "M", "a"),
+ (0x42, "M", "b"),
+ (0x43, "M", "c"),
+ (0x44, "M", "d"),
+ (0x45, "M", "e"),
+ (0x46, "M", "f"),
+ (0x47, "M", "g"),
+ (0x48, "M", "h"),
+ (0x49, "M", "i"),
+ (0x4A, "M", "j"),
+ (0x4B, "M", "k"),
+ (0x4C, "M", "l"),
+ (0x4D, "M", "m"),
+ (0x4E, "M", "n"),
+ (0x4F, "M", "o"),
+ (0x50, "M", "p"),
+ (0x51, "M", "q"),
+ (0x52, "M", "r"),
+ (0x53, "M", "s"),
+ (0x54, "M", "t"),
+ (0x55, "M", "u"),
+ (0x56, "M", "v"),
+ (0x57, "M", "w"),
+ (0x58, "M", "x"),
+ (0x59, "M", "y"),
+ (0x5A, "M", "z"),
+ (0x5B, "3"),
+ (0x5C, "3"),
+ (0x5D, "3"),
+ (0x5E, "3"),
+ (0x5F, "3"),
+ (0x60, "3"),
+ (0x61, "V"),
+ (0x62, "V"),
+ (0x63, "V"),
]
+
def _seg_1() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x64, 'V'),
- (0x65, 'V'),
- (0x66, 'V'),
- (0x67, 'V'),
- (0x68, 'V'),
- (0x69, 'V'),
- (0x6A, 'V'),
- (0x6B, 'V'),
- (0x6C, 'V'),
- (0x6D, 'V'),
- (0x6E, 'V'),
- (0x6F, 'V'),
- (0x70, 'V'),
- (0x71, 'V'),
- (0x72, 'V'),
- (0x73, 'V'),
- (0x74, 'V'),
- (0x75, 'V'),
- (0x76, 'V'),
- (0x77, 'V'),
- (0x78, 'V'),
- (0x79, 'V'),
- (0x7A, 'V'),
- (0x7B, '3'),
- (0x7C, '3'),
- (0x7D, '3'),
- (0x7E, '3'),
- (0x7F, '3'),
- (0x80, 'X'),
- (0x81, 'X'),
- (0x82, 'X'),
- (0x83, 'X'),
- (0x84, 'X'),
- (0x85, 'X'),
- (0x86, 'X'),
- (0x87, 'X'),
- (0x88, 'X'),
- (0x89, 'X'),
- (0x8A, 'X'),
- (0x8B, 'X'),
- (0x8C, 'X'),
- (0x8D, 'X'),
- (0x8E, 'X'),
- (0x8F, 'X'),
- (0x90, 'X'),
- (0x91, 'X'),
- (0x92, 'X'),
- (0x93, 'X'),
- (0x94, 'X'),
- (0x95, 'X'),
- (0x96, 'X'),
- (0x97, 'X'),
- (0x98, 'X'),
- (0x99, 'X'),
- (0x9A, 'X'),
- (0x9B, 'X'),
- (0x9C, 'X'),
- (0x9D, 'X'),
- (0x9E, 'X'),
- (0x9F, 'X'),
- (0xA0, '3', ' '),
- (0xA1, 'V'),
- (0xA2, 'V'),
- (0xA3, 'V'),
- (0xA4, 'V'),
- (0xA5, 'V'),
- (0xA6, 'V'),
- (0xA7, 'V'),
- (0xA8, '3', ' ̈'),
- (0xA9, 'V'),
- (0xAA, 'M', 'a'),
- (0xAB, 'V'),
- (0xAC, 'V'),
- (0xAD, 'I'),
- (0xAE, 'V'),
- (0xAF, '3', ' ̄'),
- (0xB0, 'V'),
- (0xB1, 'V'),
- (0xB2, 'M', '2'),
- (0xB3, 'M', '3'),
- (0xB4, '3', ' ́'),
- (0xB5, 'M', 'μ'),
- (0xB6, 'V'),
- (0xB7, 'V'),
- (0xB8, '3', ' ̧'),
- (0xB9, 'M', '1'),
- (0xBA, 'M', 'o'),
- (0xBB, 'V'),
- (0xBC, 'M', '1⁄4'),
- (0xBD, 'M', '1⁄2'),
- (0xBE, 'M', '3⁄4'),
- (0xBF, 'V'),
- (0xC0, 'M', 'à'),
- (0xC1, 'M', 'á'),
- (0xC2, 'M', 'â'),
- (0xC3, 'M', 'ã'),
- (0xC4, 'M', 'ä'),
- (0xC5, 'M', 'å'),
- (0xC6, 'M', 'æ'),
- (0xC7, 'M', 'ç'),
+ (0x64, "V"),
+ (0x65, "V"),
+ (0x66, "V"),
+ (0x67, "V"),
+ (0x68, "V"),
+ (0x69, "V"),
+ (0x6A, "V"),
+ (0x6B, "V"),
+ (0x6C, "V"),
+ (0x6D, "V"),
+ (0x6E, "V"),
+ (0x6F, "V"),
+ (0x70, "V"),
+ (0x71, "V"),
+ (0x72, "V"),
+ (0x73, "V"),
+ (0x74, "V"),
+ (0x75, "V"),
+ (0x76, "V"),
+ (0x77, "V"),
+ (0x78, "V"),
+ (0x79, "V"),
+ (0x7A, "V"),
+ (0x7B, "3"),
+ (0x7C, "3"),
+ (0x7D, "3"),
+ (0x7E, "3"),
+ (0x7F, "3"),
+ (0x80, "X"),
+ (0x81, "X"),
+ (0x82, "X"),
+ (0x83, "X"),
+ (0x84, "X"),
+ (0x85, "X"),
+ (0x86, "X"),
+ (0x87, "X"),
+ (0x88, "X"),
+ (0x89, "X"),
+ (0x8A, "X"),
+ (0x8B, "X"),
+ (0x8C, "X"),
+ (0x8D, "X"),
+ (0x8E, "X"),
+ (0x8F, "X"),
+ (0x90, "X"),
+ (0x91, "X"),
+ (0x92, "X"),
+ (0x93, "X"),
+ (0x94, "X"),
+ (0x95, "X"),
+ (0x96, "X"),
+ (0x97, "X"),
+ (0x98, "X"),
+ (0x99, "X"),
+ (0x9A, "X"),
+ (0x9B, "X"),
+ (0x9C, "X"),
+ (0x9D, "X"),
+ (0x9E, "X"),
+ (0x9F, "X"),
+ (0xA0, "3", " "),
+ (0xA1, "V"),
+ (0xA2, "V"),
+ (0xA3, "V"),
+ (0xA4, "V"),
+ (0xA5, "V"),
+ (0xA6, "V"),
+ (0xA7, "V"),
+ (0xA8, "3", " ̈"),
+ (0xA9, "V"),
+ (0xAA, "M", "a"),
+ (0xAB, "V"),
+ (0xAC, "V"),
+ (0xAD, "I"),
+ (0xAE, "V"),
+ (0xAF, "3", " ̄"),
+ (0xB0, "V"),
+ (0xB1, "V"),
+ (0xB2, "M", "2"),
+ (0xB3, "M", "3"),
+ (0xB4, "3", " ́"),
+ (0xB5, "M", "μ"),
+ (0xB6, "V"),
+ (0xB7, "V"),
+ (0xB8, "3", " ̧"),
+ (0xB9, "M", "1"),
+ (0xBA, "M", "o"),
+ (0xBB, "V"),
+ (0xBC, "M", "1⁄4"),
+ (0xBD, "M", "1⁄2"),
+ (0xBE, "M", "3⁄4"),
+ (0xBF, "V"),
+ (0xC0, "M", "à"),
+ (0xC1, "M", "á"),
+ (0xC2, "M", "â"),
+ (0xC3, "M", "ã"),
+ (0xC4, "M", "ä"),
+ (0xC5, "M", "å"),
+ (0xC6, "M", "æ"),
+ (0xC7, "M", "ç"),
]
+
def _seg_2() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xC8, 'M', 'è'),
- (0xC9, 'M', 'é'),
- (0xCA, 'M', 'ê'),
- (0xCB, 'M', 'ë'),
- (0xCC, 'M', 'ì'),
- (0xCD, 'M', 'í'),
- (0xCE, 'M', 'î'),
- (0xCF, 'M', 'ï'),
- (0xD0, 'M', 'ð'),
- (0xD1, 'M', 'ñ'),
- (0xD2, 'M', 'ò'),
- (0xD3, 'M', 'ó'),
- (0xD4, 'M', 'ô'),
- (0xD5, 'M', 'õ'),
- (0xD6, 'M', 'ö'),
- (0xD7, 'V'),
- (0xD8, 'M', 'ø'),
- (0xD9, 'M', 'ù'),
- (0xDA, 'M', 'ú'),
- (0xDB, 'M', 'û'),
- (0xDC, 'M', 'ü'),
- (0xDD, 'M', 'ý'),
- (0xDE, 'M', 'þ'),
- (0xDF, 'D', 'ss'),
- (0xE0, 'V'),
- (0xE1, 'V'),
- (0xE2, 'V'),
- (0xE3, 'V'),
- (0xE4, 'V'),
- (0xE5, 'V'),
- (0xE6, 'V'),
- (0xE7, 'V'),
- (0xE8, 'V'),
- (0xE9, 'V'),
- (0xEA, 'V'),
- (0xEB, 'V'),
- (0xEC, 'V'),
- (0xED, 'V'),
- (0xEE, 'V'),
- (0xEF, 'V'),
- (0xF0, 'V'),
- (0xF1, 'V'),
- (0xF2, 'V'),
- (0xF3, 'V'),
- (0xF4, 'V'),
- (0xF5, 'V'),
- (0xF6, 'V'),
- (0xF7, 'V'),
- (0xF8, 'V'),
- (0xF9, 'V'),
- (0xFA, 'V'),
- (0xFB, 'V'),
- (0xFC, 'V'),
- (0xFD, 'V'),
- (0xFE, 'V'),
- (0xFF, 'V'),
- (0x100, 'M', 'ā'),
- (0x101, 'V'),
- (0x102, 'M', 'ă'),
- (0x103, 'V'),
- (0x104, 'M', 'ą'),
- (0x105, 'V'),
- (0x106, 'M', 'ć'),
- (0x107, 'V'),
- (0x108, 'M', 'ĉ'),
- (0x109, 'V'),
- (0x10A, 'M', 'ċ'),
- (0x10B, 'V'),
- (0x10C, 'M', 'č'),
- (0x10D, 'V'),
- (0x10E, 'M', 'ď'),
- (0x10F, 'V'),
- (0x110, 'M', 'đ'),
- (0x111, 'V'),
- (0x112, 'M', 'ē'),
- (0x113, 'V'),
- (0x114, 'M', 'ĕ'),
- (0x115, 'V'),
- (0x116, 'M', 'ė'),
- (0x117, 'V'),
- (0x118, 'M', 'ę'),
- (0x119, 'V'),
- (0x11A, 'M', 'ě'),
- (0x11B, 'V'),
- (0x11C, 'M', 'ĝ'),
- (0x11D, 'V'),
- (0x11E, 'M', 'ğ'),
- (0x11F, 'V'),
- (0x120, 'M', 'ġ'),
- (0x121, 'V'),
- (0x122, 'M', 'ģ'),
- (0x123, 'V'),
- (0x124, 'M', 'ĥ'),
- (0x125, 'V'),
- (0x126, 'M', 'ħ'),
- (0x127, 'V'),
- (0x128, 'M', 'ĩ'),
- (0x129, 'V'),
- (0x12A, 'M', 'ī'),
- (0x12B, 'V'),
+ (0xC8, "M", "è"),
+ (0xC9, "M", "é"),
+ (0xCA, "M", "ê"),
+ (0xCB, "M", "ë"),
+ (0xCC, "M", "ì"),
+ (0xCD, "M", "í"),
+ (0xCE, "M", "î"),
+ (0xCF, "M", "ï"),
+ (0xD0, "M", "ð"),
+ (0xD1, "M", "ñ"),
+ (0xD2, "M", "ò"),
+ (0xD3, "M", "ó"),
+ (0xD4, "M", "ô"),
+ (0xD5, "M", "õ"),
+ (0xD6, "M", "ö"),
+ (0xD7, "V"),
+ (0xD8, "M", "ø"),
+ (0xD9, "M", "ù"),
+ (0xDA, "M", "ú"),
+ (0xDB, "M", "û"),
+ (0xDC, "M", "ü"),
+ (0xDD, "M", "ý"),
+ (0xDE, "M", "þ"),
+ (0xDF, "D", "ss"),
+ (0xE0, "V"),
+ (0xE1, "V"),
+ (0xE2, "V"),
+ (0xE3, "V"),
+ (0xE4, "V"),
+ (0xE5, "V"),
+ (0xE6, "V"),
+ (0xE7, "V"),
+ (0xE8, "V"),
+ (0xE9, "V"),
+ (0xEA, "V"),
+ (0xEB, "V"),
+ (0xEC, "V"),
+ (0xED, "V"),
+ (0xEE, "V"),
+ (0xEF, "V"),
+ (0xF0, "V"),
+ (0xF1, "V"),
+ (0xF2, "V"),
+ (0xF3, "V"),
+ (0xF4, "V"),
+ (0xF5, "V"),
+ (0xF6, "V"),
+ (0xF7, "V"),
+ (0xF8, "V"),
+ (0xF9, "V"),
+ (0xFA, "V"),
+ (0xFB, "V"),
+ (0xFC, "V"),
+ (0xFD, "V"),
+ (0xFE, "V"),
+ (0xFF, "V"),
+ (0x100, "M", "ā"),
+ (0x101, "V"),
+ (0x102, "M", "ă"),
+ (0x103, "V"),
+ (0x104, "M", "ą"),
+ (0x105, "V"),
+ (0x106, "M", "ć"),
+ (0x107, "V"),
+ (0x108, "M", "ĉ"),
+ (0x109, "V"),
+ (0x10A, "M", "ċ"),
+ (0x10B, "V"),
+ (0x10C, "M", "č"),
+ (0x10D, "V"),
+ (0x10E, "M", "ď"),
+ (0x10F, "V"),
+ (0x110, "M", "đ"),
+ (0x111, "V"),
+ (0x112, "M", "ē"),
+ (0x113, "V"),
+ (0x114, "M", "ĕ"),
+ (0x115, "V"),
+ (0x116, "M", "ė"),
+ (0x117, "V"),
+ (0x118, "M", "ę"),
+ (0x119, "V"),
+ (0x11A, "M", "ě"),
+ (0x11B, "V"),
+ (0x11C, "M", "ĝ"),
+ (0x11D, "V"),
+ (0x11E, "M", "ğ"),
+ (0x11F, "V"),
+ (0x120, "M", "ġ"),
+ (0x121, "V"),
+ (0x122, "M", "ģ"),
+ (0x123, "V"),
+ (0x124, "M", "ĥ"),
+ (0x125, "V"),
+ (0x126, "M", "ħ"),
+ (0x127, "V"),
+ (0x128, "M", "ĩ"),
+ (0x129, "V"),
+ (0x12A, "M", "ī"),
+ (0x12B, "V"),
]
+
def _seg_3() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x12C, 'M', 'ĭ'),
- (0x12D, 'V'),
- (0x12E, 'M', 'į'),
- (0x12F, 'V'),
- (0x130, 'M', 'i̇'),
- (0x131, 'V'),
- (0x132, 'M', 'ij'),
- (0x134, 'M', 'ĵ'),
- (0x135, 'V'),
- (0x136, 'M', 'ķ'),
- (0x137, 'V'),
- (0x139, 'M', 'ĺ'),
- (0x13A, 'V'),
- (0x13B, 'M', 'ļ'),
- (0x13C, 'V'),
- (0x13D, 'M', 'ľ'),
- (0x13E, 'V'),
- (0x13F, 'M', 'l·'),
- (0x141, 'M', 'ł'),
- (0x142, 'V'),
- (0x143, 'M', 'ń'),
- (0x144, 'V'),
- (0x145, 'M', 'ņ'),
- (0x146, 'V'),
- (0x147, 'M', 'ň'),
- (0x148, 'V'),
- (0x149, 'M', 'ʼn'),
- (0x14A, 'M', 'ŋ'),
- (0x14B, 'V'),
- (0x14C, 'M', 'ō'),
- (0x14D, 'V'),
- (0x14E, 'M', 'ŏ'),
- (0x14F, 'V'),
- (0x150, 'M', 'ő'),
- (0x151, 'V'),
- (0x152, 'M', 'œ'),
- (0x153, 'V'),
- (0x154, 'M', 'ŕ'),
- (0x155, 'V'),
- (0x156, 'M', 'ŗ'),
- (0x157, 'V'),
- (0x158, 'M', 'ř'),
- (0x159, 'V'),
- (0x15A, 'M', 'ś'),
- (0x15B, 'V'),
- (0x15C, 'M', 'ŝ'),
- (0x15D, 'V'),
- (0x15E, 'M', 'ş'),
- (0x15F, 'V'),
- (0x160, 'M', 'š'),
- (0x161, 'V'),
- (0x162, 'M', 'ţ'),
- (0x163, 'V'),
- (0x164, 'M', 'ť'),
- (0x165, 'V'),
- (0x166, 'M', 'ŧ'),
- (0x167, 'V'),
- (0x168, 'M', 'ũ'),
- (0x169, 'V'),
- (0x16A, 'M', 'ū'),
- (0x16B, 'V'),
- (0x16C, 'M', 'ŭ'),
- (0x16D, 'V'),
- (0x16E, 'M', 'ů'),
- (0x16F, 'V'),
- (0x170, 'M', 'ű'),
- (0x171, 'V'),
- (0x172, 'M', 'ų'),
- (0x173, 'V'),
- (0x174, 'M', 'ŵ'),
- (0x175, 'V'),
- (0x176, 'M', 'ŷ'),
- (0x177, 'V'),
- (0x178, 'M', 'ÿ'),
- (0x179, 'M', 'ź'),
- (0x17A, 'V'),
- (0x17B, 'M', 'ż'),
- (0x17C, 'V'),
- (0x17D, 'M', 'ž'),
- (0x17E, 'V'),
- (0x17F, 'M', 's'),
- (0x180, 'V'),
- (0x181, 'M', 'ɓ'),
- (0x182, 'M', 'ƃ'),
- (0x183, 'V'),
- (0x184, 'M', 'ƅ'),
- (0x185, 'V'),
- (0x186, 'M', 'ɔ'),
- (0x187, 'M', 'ƈ'),
- (0x188, 'V'),
- (0x189, 'M', 'ɖ'),
- (0x18A, 'M', 'ɗ'),
- (0x18B, 'M', 'ƌ'),
- (0x18C, 'V'),
- (0x18E, 'M', 'ǝ'),
- (0x18F, 'M', 'ə'),
- (0x190, 'M', 'ɛ'),
- (0x191, 'M', 'ƒ'),
- (0x192, 'V'),
- (0x193, 'M', 'ɠ'),
+ (0x12C, "M", "ĭ"),
+ (0x12D, "V"),
+ (0x12E, "M", "į"),
+ (0x12F, "V"),
+ (0x130, "M", "i̇"),
+ (0x131, "V"),
+ (0x132, "M", "ij"),
+ (0x134, "M", "ĵ"),
+ (0x135, "V"),
+ (0x136, "M", "ķ"),
+ (0x137, "V"),
+ (0x139, "M", "ĺ"),
+ (0x13A, "V"),
+ (0x13B, "M", "ļ"),
+ (0x13C, "V"),
+ (0x13D, "M", "ľ"),
+ (0x13E, "V"),
+ (0x13F, "M", "l·"),
+ (0x141, "M", "ł"),
+ (0x142, "V"),
+ (0x143, "M", "ń"),
+ (0x144, "V"),
+ (0x145, "M", "ņ"),
+ (0x146, "V"),
+ (0x147, "M", "ň"),
+ (0x148, "V"),
+ (0x149, "M", "ʼn"),
+ (0x14A, "M", "ŋ"),
+ (0x14B, "V"),
+ (0x14C, "M", "ō"),
+ (0x14D, "V"),
+ (0x14E, "M", "ŏ"),
+ (0x14F, "V"),
+ (0x150, "M", "ő"),
+ (0x151, "V"),
+ (0x152, "M", "œ"),
+ (0x153, "V"),
+ (0x154, "M", "ŕ"),
+ (0x155, "V"),
+ (0x156, "M", "ŗ"),
+ (0x157, "V"),
+ (0x158, "M", "ř"),
+ (0x159, "V"),
+ (0x15A, "M", "ś"),
+ (0x15B, "V"),
+ (0x15C, "M", "ŝ"),
+ (0x15D, "V"),
+ (0x15E, "M", "ş"),
+ (0x15F, "V"),
+ (0x160, "M", "š"),
+ (0x161, "V"),
+ (0x162, "M", "ţ"),
+ (0x163, "V"),
+ (0x164, "M", "ť"),
+ (0x165, "V"),
+ (0x166, "M", "ŧ"),
+ (0x167, "V"),
+ (0x168, "M", "ũ"),
+ (0x169, "V"),
+ (0x16A, "M", "ū"),
+ (0x16B, "V"),
+ (0x16C, "M", "ŭ"),
+ (0x16D, "V"),
+ (0x16E, "M", "ů"),
+ (0x16F, "V"),
+ (0x170, "M", "ű"),
+ (0x171, "V"),
+ (0x172, "M", "ų"),
+ (0x173, "V"),
+ (0x174, "M", "ŵ"),
+ (0x175, "V"),
+ (0x176, "M", "ŷ"),
+ (0x177, "V"),
+ (0x178, "M", "ÿ"),
+ (0x179, "M", "ź"),
+ (0x17A, "V"),
+ (0x17B, "M", "ż"),
+ (0x17C, "V"),
+ (0x17D, "M", "ž"),
+ (0x17E, "V"),
+ (0x17F, "M", "s"),
+ (0x180, "V"),
+ (0x181, "M", "ɓ"),
+ (0x182, "M", "ƃ"),
+ (0x183, "V"),
+ (0x184, "M", "ƅ"),
+ (0x185, "V"),
+ (0x186, "M", "ɔ"),
+ (0x187, "M", "ƈ"),
+ (0x188, "V"),
+ (0x189, "M", "ɖ"),
+ (0x18A, "M", "ɗ"),
+ (0x18B, "M", "ƌ"),
+ (0x18C, "V"),
+ (0x18E, "M", "ǝ"),
+ (0x18F, "M", "ə"),
+ (0x190, "M", "ɛ"),
+ (0x191, "M", "ƒ"),
+ (0x192, "V"),
+ (0x193, "M", "ɠ"),
]
+
def _seg_4() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x194, 'M', 'ɣ'),
- (0x195, 'V'),
- (0x196, 'M', 'ɩ'),
- (0x197, 'M', 'ɨ'),
- (0x198, 'M', 'ƙ'),
- (0x199, 'V'),
- (0x19C, 'M', 'ɯ'),
- (0x19D, 'M', 'ɲ'),
- (0x19E, 'V'),
- (0x19F, 'M', 'ɵ'),
- (0x1A0, 'M', 'ơ'),
- (0x1A1, 'V'),
- (0x1A2, 'M', 'ƣ'),
- (0x1A3, 'V'),
- (0x1A4, 'M', 'ƥ'),
- (0x1A5, 'V'),
- (0x1A6, 'M', 'ʀ'),
- (0x1A7, 'M', 'ƨ'),
- (0x1A8, 'V'),
- (0x1A9, 'M', 'ʃ'),
- (0x1AA, 'V'),
- (0x1AC, 'M', 'ƭ'),
- (0x1AD, 'V'),
- (0x1AE, 'M', 'ʈ'),
- (0x1AF, 'M', 'ư'),
- (0x1B0, 'V'),
- (0x1B1, 'M', 'ʊ'),
- (0x1B2, 'M', 'ʋ'),
- (0x1B3, 'M', 'ƴ'),
- (0x1B4, 'V'),
- (0x1B5, 'M', 'ƶ'),
- (0x1B6, 'V'),
- (0x1B7, 'M', 'ʒ'),
- (0x1B8, 'M', 'ƹ'),
- (0x1B9, 'V'),
- (0x1BC, 'M', 'ƽ'),
- (0x1BD, 'V'),
- (0x1C4, 'M', 'dž'),
- (0x1C7, 'M', 'lj'),
- (0x1CA, 'M', 'nj'),
- (0x1CD, 'M', 'ǎ'),
- (0x1CE, 'V'),
- (0x1CF, 'M', 'ǐ'),
- (0x1D0, 'V'),
- (0x1D1, 'M', 'ǒ'),
- (0x1D2, 'V'),
- (0x1D3, 'M', 'ǔ'),
- (0x1D4, 'V'),
- (0x1D5, 'M', 'ǖ'),
- (0x1D6, 'V'),
- (0x1D7, 'M', 'ǘ'),
- (0x1D8, 'V'),
- (0x1D9, 'M', 'ǚ'),
- (0x1DA, 'V'),
- (0x1DB, 'M', 'ǜ'),
- (0x1DC, 'V'),
- (0x1DE, 'M', 'ǟ'),
- (0x1DF, 'V'),
- (0x1E0, 'M', 'ǡ'),
- (0x1E1, 'V'),
- (0x1E2, 'M', 'ǣ'),
- (0x1E3, 'V'),
- (0x1E4, 'M', 'ǥ'),
- (0x1E5, 'V'),
- (0x1E6, 'M', 'ǧ'),
- (0x1E7, 'V'),
- (0x1E8, 'M', 'ǩ'),
- (0x1E9, 'V'),
- (0x1EA, 'M', 'ǫ'),
- (0x1EB, 'V'),
- (0x1EC, 'M', 'ǭ'),
- (0x1ED, 'V'),
- (0x1EE, 'M', 'ǯ'),
- (0x1EF, 'V'),
- (0x1F1, 'M', 'dz'),
- (0x1F4, 'M', 'ǵ'),
- (0x1F5, 'V'),
- (0x1F6, 'M', 'ƕ'),
- (0x1F7, 'M', 'ƿ'),
- (0x1F8, 'M', 'ǹ'),
- (0x1F9, 'V'),
- (0x1FA, 'M', 'ǻ'),
- (0x1FB, 'V'),
- (0x1FC, 'M', 'ǽ'),
- (0x1FD, 'V'),
- (0x1FE, 'M', 'ǿ'),
- (0x1FF, 'V'),
- (0x200, 'M', 'ȁ'),
- (0x201, 'V'),
- (0x202, 'M', 'ȃ'),
- (0x203, 'V'),
- (0x204, 'M', 'ȅ'),
- (0x205, 'V'),
- (0x206, 'M', 'ȇ'),
- (0x207, 'V'),
- (0x208, 'M', 'ȉ'),
- (0x209, 'V'),
- (0x20A, 'M', 'ȋ'),
- (0x20B, 'V'),
- (0x20C, 'M', 'ȍ'),
+ (0x194, "M", "ɣ"),
+ (0x195, "V"),
+ (0x196, "M", "ɩ"),
+ (0x197, "M", "ɨ"),
+ (0x198, "M", "ƙ"),
+ (0x199, "V"),
+ (0x19C, "M", "ɯ"),
+ (0x19D, "M", "ɲ"),
+ (0x19E, "V"),
+ (0x19F, "M", "ɵ"),
+ (0x1A0, "M", "ơ"),
+ (0x1A1, "V"),
+ (0x1A2, "M", "ƣ"),
+ (0x1A3, "V"),
+ (0x1A4, "M", "ƥ"),
+ (0x1A5, "V"),
+ (0x1A6, "M", "ʀ"),
+ (0x1A7, "M", "ƨ"),
+ (0x1A8, "V"),
+ (0x1A9, "M", "ʃ"),
+ (0x1AA, "V"),
+ (0x1AC, "M", "ƭ"),
+ (0x1AD, "V"),
+ (0x1AE, "M", "ʈ"),
+ (0x1AF, "M", "ư"),
+ (0x1B0, "V"),
+ (0x1B1, "M", "ʊ"),
+ (0x1B2, "M", "ʋ"),
+ (0x1B3, "M", "ƴ"),
+ (0x1B4, "V"),
+ (0x1B5, "M", "ƶ"),
+ (0x1B6, "V"),
+ (0x1B7, "M", "ʒ"),
+ (0x1B8, "M", "ƹ"),
+ (0x1B9, "V"),
+ (0x1BC, "M", "ƽ"),
+ (0x1BD, "V"),
+ (0x1C4, "M", "dž"),
+ (0x1C7, "M", "lj"),
+ (0x1CA, "M", "nj"),
+ (0x1CD, "M", "ǎ"),
+ (0x1CE, "V"),
+ (0x1CF, "M", "ǐ"),
+ (0x1D0, "V"),
+ (0x1D1, "M", "ǒ"),
+ (0x1D2, "V"),
+ (0x1D3, "M", "ǔ"),
+ (0x1D4, "V"),
+ (0x1D5, "M", "ǖ"),
+ (0x1D6, "V"),
+ (0x1D7, "M", "ǘ"),
+ (0x1D8, "V"),
+ (0x1D9, "M", "ǚ"),
+ (0x1DA, "V"),
+ (0x1DB, "M", "ǜ"),
+ (0x1DC, "V"),
+ (0x1DE, "M", "ǟ"),
+ (0x1DF, "V"),
+ (0x1E0, "M", "ǡ"),
+ (0x1E1, "V"),
+ (0x1E2, "M", "ǣ"),
+ (0x1E3, "V"),
+ (0x1E4, "M", "ǥ"),
+ (0x1E5, "V"),
+ (0x1E6, "M", "ǧ"),
+ (0x1E7, "V"),
+ (0x1E8, "M", "ǩ"),
+ (0x1E9, "V"),
+ (0x1EA, "M", "ǫ"),
+ (0x1EB, "V"),
+ (0x1EC, "M", "ǭ"),
+ (0x1ED, "V"),
+ (0x1EE, "M", "ǯ"),
+ (0x1EF, "V"),
+ (0x1F1, "M", "dz"),
+ (0x1F4, "M", "ǵ"),
+ (0x1F5, "V"),
+ (0x1F6, "M", "ƕ"),
+ (0x1F7, "M", "ƿ"),
+ (0x1F8, "M", "ǹ"),
+ (0x1F9, "V"),
+ (0x1FA, "M", "ǻ"),
+ (0x1FB, "V"),
+ (0x1FC, "M", "ǽ"),
+ (0x1FD, "V"),
+ (0x1FE, "M", "ǿ"),
+ (0x1FF, "V"),
+ (0x200, "M", "ȁ"),
+ (0x201, "V"),
+ (0x202, "M", "ȃ"),
+ (0x203, "V"),
+ (0x204, "M", "ȅ"),
+ (0x205, "V"),
+ (0x206, "M", "ȇ"),
+ (0x207, "V"),
+ (0x208, "M", "ȉ"),
+ (0x209, "V"),
+ (0x20A, "M", "ȋ"),
+ (0x20B, "V"),
+ (0x20C, "M", "ȍ"),
]
+
def _seg_5() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x20D, 'V'),
- (0x20E, 'M', 'ȏ'),
- (0x20F, 'V'),
- (0x210, 'M', 'ȑ'),
- (0x211, 'V'),
- (0x212, 'M', 'ȓ'),
- (0x213, 'V'),
- (0x214, 'M', 'ȕ'),
- (0x215, 'V'),
- (0x216, 'M', 'ȗ'),
- (0x217, 'V'),
- (0x218, 'M', 'ș'),
- (0x219, 'V'),
- (0x21A, 'M', 'ț'),
- (0x21B, 'V'),
- (0x21C, 'M', 'ȝ'),
- (0x21D, 'V'),
- (0x21E, 'M', 'ȟ'),
- (0x21F, 'V'),
- (0x220, 'M', 'ƞ'),
- (0x221, 'V'),
- (0x222, 'M', 'ȣ'),
- (0x223, 'V'),
- (0x224, 'M', 'ȥ'),
- (0x225, 'V'),
- (0x226, 'M', 'ȧ'),
- (0x227, 'V'),
- (0x228, 'M', 'ȩ'),
- (0x229, 'V'),
- (0x22A, 'M', 'ȫ'),
- (0x22B, 'V'),
- (0x22C, 'M', 'ȭ'),
- (0x22D, 'V'),
- (0x22E, 'M', 'ȯ'),
- (0x22F, 'V'),
- (0x230, 'M', 'ȱ'),
- (0x231, 'V'),
- (0x232, 'M', 'ȳ'),
- (0x233, 'V'),
- (0x23A, 'M', 'ⱥ'),
- (0x23B, 'M', 'ȼ'),
- (0x23C, 'V'),
- (0x23D, 'M', 'ƚ'),
- (0x23E, 'M', 'ⱦ'),
- (0x23F, 'V'),
- (0x241, 'M', 'ɂ'),
- (0x242, 'V'),
- (0x243, 'M', 'ƀ'),
- (0x244, 'M', 'ʉ'),
- (0x245, 'M', 'ʌ'),
- (0x246, 'M', 'ɇ'),
- (0x247, 'V'),
- (0x248, 'M', 'ɉ'),
- (0x249, 'V'),
- (0x24A, 'M', 'ɋ'),
- (0x24B, 'V'),
- (0x24C, 'M', 'ɍ'),
- (0x24D, 'V'),
- (0x24E, 'M', 'ɏ'),
- (0x24F, 'V'),
- (0x2B0, 'M', 'h'),
- (0x2B1, 'M', 'ɦ'),
- (0x2B2, 'M', 'j'),
- (0x2B3, 'M', 'r'),
- (0x2B4, 'M', 'ɹ'),
- (0x2B5, 'M', 'ɻ'),
- (0x2B6, 'M', 'ʁ'),
- (0x2B7, 'M', 'w'),
- (0x2B8, 'M', 'y'),
- (0x2B9, 'V'),
- (0x2D8, '3', ' ̆'),
- (0x2D9, '3', ' ̇'),
- (0x2DA, '3', ' ̊'),
- (0x2DB, '3', ' ̨'),
- (0x2DC, '3', ' ̃'),
- (0x2DD, '3', ' ̋'),
- (0x2DE, 'V'),
- (0x2E0, 'M', 'ɣ'),
- (0x2E1, 'M', 'l'),
- (0x2E2, 'M', 's'),
- (0x2E3, 'M', 'x'),
- (0x2E4, 'M', 'ʕ'),
- (0x2E5, 'V'),
- (0x340, 'M', '̀'),
- (0x341, 'M', '́'),
- (0x342, 'V'),
- (0x343, 'M', '̓'),
- (0x344, 'M', '̈́'),
- (0x345, 'M', 'ι'),
- (0x346, 'V'),
- (0x34F, 'I'),
- (0x350, 'V'),
- (0x370, 'M', 'ͱ'),
- (0x371, 'V'),
- (0x372, 'M', 'ͳ'),
- (0x373, 'V'),
- (0x374, 'M', 'ʹ'),
- (0x375, 'V'),
- (0x376, 'M', 'ͷ'),
- (0x377, 'V'),
+ (0x20D, "V"),
+ (0x20E, "M", "ȏ"),
+ (0x20F, "V"),
+ (0x210, "M", "ȑ"),
+ (0x211, "V"),
+ (0x212, "M", "ȓ"),
+ (0x213, "V"),
+ (0x214, "M", "ȕ"),
+ (0x215, "V"),
+ (0x216, "M", "ȗ"),
+ (0x217, "V"),
+ (0x218, "M", "ș"),
+ (0x219, "V"),
+ (0x21A, "M", "ț"),
+ (0x21B, "V"),
+ (0x21C, "M", "ȝ"),
+ (0x21D, "V"),
+ (0x21E, "M", "ȟ"),
+ (0x21F, "V"),
+ (0x220, "M", "ƞ"),
+ (0x221, "V"),
+ (0x222, "M", "ȣ"),
+ (0x223, "V"),
+ (0x224, "M", "ȥ"),
+ (0x225, "V"),
+ (0x226, "M", "ȧ"),
+ (0x227, "V"),
+ (0x228, "M", "ȩ"),
+ (0x229, "V"),
+ (0x22A, "M", "ȫ"),
+ (0x22B, "V"),
+ (0x22C, "M", "ȭ"),
+ (0x22D, "V"),
+ (0x22E, "M", "ȯ"),
+ (0x22F, "V"),
+ (0x230, "M", "ȱ"),
+ (0x231, "V"),
+ (0x232, "M", "ȳ"),
+ (0x233, "V"),
+ (0x23A, "M", "ⱥ"),
+ (0x23B, "M", "ȼ"),
+ (0x23C, "V"),
+ (0x23D, "M", "ƚ"),
+ (0x23E, "M", "ⱦ"),
+ (0x23F, "V"),
+ (0x241, "M", "ɂ"),
+ (0x242, "V"),
+ (0x243, "M", "ƀ"),
+ (0x244, "M", "ʉ"),
+ (0x245, "M", "ʌ"),
+ (0x246, "M", "ɇ"),
+ (0x247, "V"),
+ (0x248, "M", "ɉ"),
+ (0x249, "V"),
+ (0x24A, "M", "ɋ"),
+ (0x24B, "V"),
+ (0x24C, "M", "ɍ"),
+ (0x24D, "V"),
+ (0x24E, "M", "ɏ"),
+ (0x24F, "V"),
+ (0x2B0, "M", "h"),
+ (0x2B1, "M", "ɦ"),
+ (0x2B2, "M", "j"),
+ (0x2B3, "M", "r"),
+ (0x2B4, "M", "ɹ"),
+ (0x2B5, "M", "ɻ"),
+ (0x2B6, "M", "ʁ"),
+ (0x2B7, "M", "w"),
+ (0x2B8, "M", "y"),
+ (0x2B9, "V"),
+ (0x2D8, "3", " ̆"),
+ (0x2D9, "3", " ̇"),
+ (0x2DA, "3", " ̊"),
+ (0x2DB, "3", " ̨"),
+ (0x2DC, "3", " ̃"),
+ (0x2DD, "3", " ̋"),
+ (0x2DE, "V"),
+ (0x2E0, "M", "ɣ"),
+ (0x2E1, "M", "l"),
+ (0x2E2, "M", "s"),
+ (0x2E3, "M", "x"),
+ (0x2E4, "M", "ʕ"),
+ (0x2E5, "V"),
+ (0x340, "M", "̀"),
+ (0x341, "M", "́"),
+ (0x342, "V"),
+ (0x343, "M", "̓"),
+ (0x344, "M", "̈́"),
+ (0x345, "M", "ι"),
+ (0x346, "V"),
+ (0x34F, "I"),
+ (0x350, "V"),
+ (0x370, "M", "ͱ"),
+ (0x371, "V"),
+ (0x372, "M", "ͳ"),
+ (0x373, "V"),
+ (0x374, "M", "ʹ"),
+ (0x375, "V"),
+ (0x376, "M", "ͷ"),
+ (0x377, "V"),
]
+
def _seg_6() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x378, 'X'),
- (0x37A, '3', ' ι'),
- (0x37B, 'V'),
- (0x37E, '3', ';'),
- (0x37F, 'M', 'ϳ'),
- (0x380, 'X'),
- (0x384, '3', ' ́'),
- (0x385, '3', ' ̈́'),
- (0x386, 'M', 'ά'),
- (0x387, 'M', '·'),
- (0x388, 'M', 'έ'),
- (0x389, 'M', 'ή'),
- (0x38A, 'M', 'ί'),
- (0x38B, 'X'),
- (0x38C, 'M', 'ό'),
- (0x38D, 'X'),
- (0x38E, 'M', 'ύ'),
- (0x38F, 'M', 'ώ'),
- (0x390, 'V'),
- (0x391, 'M', 'α'),
- (0x392, 'M', 'β'),
- (0x393, 'M', 'γ'),
- (0x394, 'M', 'δ'),
- (0x395, 'M', 'ε'),
- (0x396, 'M', 'ζ'),
- (0x397, 'M', 'η'),
- (0x398, 'M', 'θ'),
- (0x399, 'M', 'ι'),
- (0x39A, 'M', 'κ'),
- (0x39B, 'M', 'λ'),
- (0x39C, 'M', 'μ'),
- (0x39D, 'M', 'ν'),
- (0x39E, 'M', 'ξ'),
- (0x39F, 'M', 'ο'),
- (0x3A0, 'M', 'π'),
- (0x3A1, 'M', 'ρ'),
- (0x3A2, 'X'),
- (0x3A3, 'M', 'σ'),
- (0x3A4, 'M', 'τ'),
- (0x3A5, 'M', 'υ'),
- (0x3A6, 'M', 'φ'),
- (0x3A7, 'M', 'χ'),
- (0x3A8, 'M', 'ψ'),
- (0x3A9, 'M', 'ω'),
- (0x3AA, 'M', 'ϊ'),
- (0x3AB, 'M', 'ϋ'),
- (0x3AC, 'V'),
- (0x3C2, 'D', 'σ'),
- (0x3C3, 'V'),
- (0x3CF, 'M', 'ϗ'),
- (0x3D0, 'M', 'β'),
- (0x3D1, 'M', 'θ'),
- (0x3D2, 'M', 'υ'),
- (0x3D3, 'M', 'ύ'),
- (0x3D4, 'M', 'ϋ'),
- (0x3D5, 'M', 'φ'),
- (0x3D6, 'M', 'π'),
- (0x3D7, 'V'),
- (0x3D8, 'M', 'ϙ'),
- (0x3D9, 'V'),
- (0x3DA, 'M', 'ϛ'),
- (0x3DB, 'V'),
- (0x3DC, 'M', 'ϝ'),
- (0x3DD, 'V'),
- (0x3DE, 'M', 'ϟ'),
- (0x3DF, 'V'),
- (0x3E0, 'M', 'ϡ'),
- (0x3E1, 'V'),
- (0x3E2, 'M', 'ϣ'),
- (0x3E3, 'V'),
- (0x3E4, 'M', 'ϥ'),
- (0x3E5, 'V'),
- (0x3E6, 'M', 'ϧ'),
- (0x3E7, 'V'),
- (0x3E8, 'M', 'ϩ'),
- (0x3E9, 'V'),
- (0x3EA, 'M', 'ϫ'),
- (0x3EB, 'V'),
- (0x3EC, 'M', 'ϭ'),
- (0x3ED, 'V'),
- (0x3EE, 'M', 'ϯ'),
- (0x3EF, 'V'),
- (0x3F0, 'M', 'κ'),
- (0x3F1, 'M', 'ρ'),
- (0x3F2, 'M', 'σ'),
- (0x3F3, 'V'),
- (0x3F4, 'M', 'θ'),
- (0x3F5, 'M', 'ε'),
- (0x3F6, 'V'),
- (0x3F7, 'M', 'ϸ'),
- (0x3F8, 'V'),
- (0x3F9, 'M', 'σ'),
- (0x3FA, 'M', 'ϻ'),
- (0x3FB, 'V'),
- (0x3FD, 'M', 'ͻ'),
- (0x3FE, 'M', 'ͼ'),
- (0x3FF, 'M', 'ͽ'),
- (0x400, 'M', 'ѐ'),
- (0x401, 'M', 'ё'),
- (0x402, 'M', 'ђ'),
+ (0x378, "X"),
+ (0x37A, "3", " ι"),
+ (0x37B, "V"),
+ (0x37E, "3", ";"),
+ (0x37F, "M", "ϳ"),
+ (0x380, "X"),
+ (0x384, "3", " ́"),
+ (0x385, "3", " ̈́"),
+ (0x386, "M", "ά"),
+ (0x387, "M", "·"),
+ (0x388, "M", "έ"),
+ (0x389, "M", "ή"),
+ (0x38A, "M", "ί"),
+ (0x38B, "X"),
+ (0x38C, "M", "ό"),
+ (0x38D, "X"),
+ (0x38E, "M", "ύ"),
+ (0x38F, "M", "ώ"),
+ (0x390, "V"),
+ (0x391, "M", "α"),
+ (0x392, "M", "β"),
+ (0x393, "M", "γ"),
+ (0x394, "M", "δ"),
+ (0x395, "M", "ε"),
+ (0x396, "M", "ζ"),
+ (0x397, "M", "η"),
+ (0x398, "M", "θ"),
+ (0x399, "M", "ι"),
+ (0x39A, "M", "κ"),
+ (0x39B, "M", "λ"),
+ (0x39C, "M", "μ"),
+ (0x39D, "M", "ν"),
+ (0x39E, "M", "ξ"),
+ (0x39F, "M", "ο"),
+ (0x3A0, "M", "π"),
+ (0x3A1, "M", "ρ"),
+ (0x3A2, "X"),
+ (0x3A3, "M", "σ"),
+ (0x3A4, "M", "τ"),
+ (0x3A5, "M", "υ"),
+ (0x3A6, "M", "φ"),
+ (0x3A7, "M", "χ"),
+ (0x3A8, "M", "ψ"),
+ (0x3A9, "M", "ω"),
+ (0x3AA, "M", "ϊ"),
+ (0x3AB, "M", "ϋ"),
+ (0x3AC, "V"),
+ (0x3C2, "D", "σ"),
+ (0x3C3, "V"),
+ (0x3CF, "M", "ϗ"),
+ (0x3D0, "M", "β"),
+ (0x3D1, "M", "θ"),
+ (0x3D2, "M", "υ"),
+ (0x3D3, "M", "ύ"),
+ (0x3D4, "M", "ϋ"),
+ (0x3D5, "M", "φ"),
+ (0x3D6, "M", "π"),
+ (0x3D7, "V"),
+ (0x3D8, "M", "ϙ"),
+ (0x3D9, "V"),
+ (0x3DA, "M", "ϛ"),
+ (0x3DB, "V"),
+ (0x3DC, "M", "ϝ"),
+ (0x3DD, "V"),
+ (0x3DE, "M", "ϟ"),
+ (0x3DF, "V"),
+ (0x3E0, "M", "ϡ"),
+ (0x3E1, "V"),
+ (0x3E2, "M", "ϣ"),
+ (0x3E3, "V"),
+ (0x3E4, "M", "ϥ"),
+ (0x3E5, "V"),
+ (0x3E6, "M", "ϧ"),
+ (0x3E7, "V"),
+ (0x3E8, "M", "ϩ"),
+ (0x3E9, "V"),
+ (0x3EA, "M", "ϫ"),
+ (0x3EB, "V"),
+ (0x3EC, "M", "ϭ"),
+ (0x3ED, "V"),
+ (0x3EE, "M", "ϯ"),
+ (0x3EF, "V"),
+ (0x3F0, "M", "κ"),
+ (0x3F1, "M", "ρ"),
+ (0x3F2, "M", "σ"),
+ (0x3F3, "V"),
+ (0x3F4, "M", "θ"),
+ (0x3F5, "M", "ε"),
+ (0x3F6, "V"),
+ (0x3F7, "M", "ϸ"),
+ (0x3F8, "V"),
+ (0x3F9, "M", "σ"),
+ (0x3FA, "M", "ϻ"),
+ (0x3FB, "V"),
+ (0x3FD, "M", "ͻ"),
+ (0x3FE, "M", "ͼ"),
+ (0x3FF, "M", "ͽ"),
+ (0x400, "M", "ѐ"),
+ (0x401, "M", "ё"),
+ (0x402, "M", "ђ"),
]
+
def _seg_7() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x403, 'M', 'ѓ'),
- (0x404, 'M', 'є'),
- (0x405, 'M', 'ѕ'),
- (0x406, 'M', 'і'),
- (0x407, 'M', 'ї'),
- (0x408, 'M', 'ј'),
- (0x409, 'M', 'љ'),
- (0x40A, 'M', 'њ'),
- (0x40B, 'M', 'ћ'),
- (0x40C, 'M', 'ќ'),
- (0x40D, 'M', 'ѝ'),
- (0x40E, 'M', 'ў'),
- (0x40F, 'M', 'џ'),
- (0x410, 'M', 'а'),
- (0x411, 'M', 'б'),
- (0x412, 'M', 'в'),
- (0x413, 'M', 'г'),
- (0x414, 'M', 'д'),
- (0x415, 'M', 'е'),
- (0x416, 'M', 'ж'),
- (0x417, 'M', 'з'),
- (0x418, 'M', 'и'),
- (0x419, 'M', 'й'),
- (0x41A, 'M', 'к'),
- (0x41B, 'M', 'л'),
- (0x41C, 'M', 'м'),
- (0x41D, 'M', 'н'),
- (0x41E, 'M', 'о'),
- (0x41F, 'M', 'п'),
- (0x420, 'M', 'р'),
- (0x421, 'M', 'с'),
- (0x422, 'M', 'т'),
- (0x423, 'M', 'у'),
- (0x424, 'M', 'ф'),
- (0x425, 'M', 'х'),
- (0x426, 'M', 'ц'),
- (0x427, 'M', 'ч'),
- (0x428, 'M', 'ш'),
- (0x429, 'M', 'щ'),
- (0x42A, 'M', 'ъ'),
- (0x42B, 'M', 'ы'),
- (0x42C, 'M', 'ь'),
- (0x42D, 'M', 'э'),
- (0x42E, 'M', 'ю'),
- (0x42F, 'M', 'я'),
- (0x430, 'V'),
- (0x460, 'M', 'ѡ'),
- (0x461, 'V'),
- (0x462, 'M', 'ѣ'),
- (0x463, 'V'),
- (0x464, 'M', 'ѥ'),
- (0x465, 'V'),
- (0x466, 'M', 'ѧ'),
- (0x467, 'V'),
- (0x468, 'M', 'ѩ'),
- (0x469, 'V'),
- (0x46A, 'M', 'ѫ'),
- (0x46B, 'V'),
- (0x46C, 'M', 'ѭ'),
- (0x46D, 'V'),
- (0x46E, 'M', 'ѯ'),
- (0x46F, 'V'),
- (0x470, 'M', 'ѱ'),
- (0x471, 'V'),
- (0x472, 'M', 'ѳ'),
- (0x473, 'V'),
- (0x474, 'M', 'ѵ'),
- (0x475, 'V'),
- (0x476, 'M', 'ѷ'),
- (0x477, 'V'),
- (0x478, 'M', 'ѹ'),
- (0x479, 'V'),
- (0x47A, 'M', 'ѻ'),
- (0x47B, 'V'),
- (0x47C, 'M', 'ѽ'),
- (0x47D, 'V'),
- (0x47E, 'M', 'ѿ'),
- (0x47F, 'V'),
- (0x480, 'M', 'ҁ'),
- (0x481, 'V'),
- (0x48A, 'M', 'ҋ'),
- (0x48B, 'V'),
- (0x48C, 'M', 'ҍ'),
- (0x48D, 'V'),
- (0x48E, 'M', 'ҏ'),
- (0x48F, 'V'),
- (0x490, 'M', 'ґ'),
- (0x491, 'V'),
- (0x492, 'M', 'ғ'),
- (0x493, 'V'),
- (0x494, 'M', 'ҕ'),
- (0x495, 'V'),
- (0x496, 'M', 'җ'),
- (0x497, 'V'),
- (0x498, 'M', 'ҙ'),
- (0x499, 'V'),
- (0x49A, 'M', 'қ'),
- (0x49B, 'V'),
- (0x49C, 'M', 'ҝ'),
- (0x49D, 'V'),
+ (0x403, "M", "ѓ"),
+ (0x404, "M", "є"),
+ (0x405, "M", "ѕ"),
+ (0x406, "M", "і"),
+ (0x407, "M", "ї"),
+ (0x408, "M", "ј"),
+ (0x409, "M", "љ"),
+ (0x40A, "M", "њ"),
+ (0x40B, "M", "ћ"),
+ (0x40C, "M", "ќ"),
+ (0x40D, "M", "ѝ"),
+ (0x40E, "M", "ў"),
+ (0x40F, "M", "џ"),
+ (0x410, "M", "а"),
+ (0x411, "M", "б"),
+ (0x412, "M", "в"),
+ (0x413, "M", "г"),
+ (0x414, "M", "д"),
+ (0x415, "M", "е"),
+ (0x416, "M", "ж"),
+ (0x417, "M", "з"),
+ (0x418, "M", "и"),
+ (0x419, "M", "й"),
+ (0x41A, "M", "к"),
+ (0x41B, "M", "л"),
+ (0x41C, "M", "м"),
+ (0x41D, "M", "н"),
+ (0x41E, "M", "о"),
+ (0x41F, "M", "п"),
+ (0x420, "M", "р"),
+ (0x421, "M", "с"),
+ (0x422, "M", "т"),
+ (0x423, "M", "у"),
+ (0x424, "M", "ф"),
+ (0x425, "M", "х"),
+ (0x426, "M", "ц"),
+ (0x427, "M", "ч"),
+ (0x428, "M", "ш"),
+ (0x429, "M", "щ"),
+ (0x42A, "M", "ъ"),
+ (0x42B, "M", "ы"),
+ (0x42C, "M", "ь"),
+ (0x42D, "M", "э"),
+ (0x42E, "M", "ю"),
+ (0x42F, "M", "я"),
+ (0x430, "V"),
+ (0x460, "M", "ѡ"),
+ (0x461, "V"),
+ (0x462, "M", "ѣ"),
+ (0x463, "V"),
+ (0x464, "M", "ѥ"),
+ (0x465, "V"),
+ (0x466, "M", "ѧ"),
+ (0x467, "V"),
+ (0x468, "M", "ѩ"),
+ (0x469, "V"),
+ (0x46A, "M", "ѫ"),
+ (0x46B, "V"),
+ (0x46C, "M", "ѭ"),
+ (0x46D, "V"),
+ (0x46E, "M", "ѯ"),
+ (0x46F, "V"),
+ (0x470, "M", "ѱ"),
+ (0x471, "V"),
+ (0x472, "M", "ѳ"),
+ (0x473, "V"),
+ (0x474, "M", "ѵ"),
+ (0x475, "V"),
+ (0x476, "M", "ѷ"),
+ (0x477, "V"),
+ (0x478, "M", "ѹ"),
+ (0x479, "V"),
+ (0x47A, "M", "ѻ"),
+ (0x47B, "V"),
+ (0x47C, "M", "ѽ"),
+ (0x47D, "V"),
+ (0x47E, "M", "ѿ"),
+ (0x47F, "V"),
+ (0x480, "M", "ҁ"),
+ (0x481, "V"),
+ (0x48A, "M", "ҋ"),
+ (0x48B, "V"),
+ (0x48C, "M", "ҍ"),
+ (0x48D, "V"),
+ (0x48E, "M", "ҏ"),
+ (0x48F, "V"),
+ (0x490, "M", "ґ"),
+ (0x491, "V"),
+ (0x492, "M", "ғ"),
+ (0x493, "V"),
+ (0x494, "M", "ҕ"),
+ (0x495, "V"),
+ (0x496, "M", "җ"),
+ (0x497, "V"),
+ (0x498, "M", "ҙ"),
+ (0x499, "V"),
+ (0x49A, "M", "қ"),
+ (0x49B, "V"),
+ (0x49C, "M", "ҝ"),
+ (0x49D, "V"),
]
+
def _seg_8() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x49E, 'M', 'ҟ'),
- (0x49F, 'V'),
- (0x4A0, 'M', 'ҡ'),
- (0x4A1, 'V'),
- (0x4A2, 'M', 'ң'),
- (0x4A3, 'V'),
- (0x4A4, 'M', 'ҥ'),
- (0x4A5, 'V'),
- (0x4A6, 'M', 'ҧ'),
- (0x4A7, 'V'),
- (0x4A8, 'M', 'ҩ'),
- (0x4A9, 'V'),
- (0x4AA, 'M', 'ҫ'),
- (0x4AB, 'V'),
- (0x4AC, 'M', 'ҭ'),
- (0x4AD, 'V'),
- (0x4AE, 'M', 'ү'),
- (0x4AF, 'V'),
- (0x4B0, 'M', 'ұ'),
- (0x4B1, 'V'),
- (0x4B2, 'M', 'ҳ'),
- (0x4B3, 'V'),
- (0x4B4, 'M', 'ҵ'),
- (0x4B5, 'V'),
- (0x4B6, 'M', 'ҷ'),
- (0x4B7, 'V'),
- (0x4B8, 'M', 'ҹ'),
- (0x4B9, 'V'),
- (0x4BA, 'M', 'һ'),
- (0x4BB, 'V'),
- (0x4BC, 'M', 'ҽ'),
- (0x4BD, 'V'),
- (0x4BE, 'M', 'ҿ'),
- (0x4BF, 'V'),
- (0x4C0, 'X'),
- (0x4C1, 'M', 'ӂ'),
- (0x4C2, 'V'),
- (0x4C3, 'M', 'ӄ'),
- (0x4C4, 'V'),
- (0x4C5, 'M', 'ӆ'),
- (0x4C6, 'V'),
- (0x4C7, 'M', 'ӈ'),
- (0x4C8, 'V'),
- (0x4C9, 'M', 'ӊ'),
- (0x4CA, 'V'),
- (0x4CB, 'M', 'ӌ'),
- (0x4CC, 'V'),
- (0x4CD, 'M', 'ӎ'),
- (0x4CE, 'V'),
- (0x4D0, 'M', 'ӑ'),
- (0x4D1, 'V'),
- (0x4D2, 'M', 'ӓ'),
- (0x4D3, 'V'),
- (0x4D4, 'M', 'ӕ'),
- (0x4D5, 'V'),
- (0x4D6, 'M', 'ӗ'),
- (0x4D7, 'V'),
- (0x4D8, 'M', 'ә'),
- (0x4D9, 'V'),
- (0x4DA, 'M', 'ӛ'),
- (0x4DB, 'V'),
- (0x4DC, 'M', 'ӝ'),
- (0x4DD, 'V'),
- (0x4DE, 'M', 'ӟ'),
- (0x4DF, 'V'),
- (0x4E0, 'M', 'ӡ'),
- (0x4E1, 'V'),
- (0x4E2, 'M', 'ӣ'),
- (0x4E3, 'V'),
- (0x4E4, 'M', 'ӥ'),
- (0x4E5, 'V'),
- (0x4E6, 'M', 'ӧ'),
- (0x4E7, 'V'),
- (0x4E8, 'M', 'ө'),
- (0x4E9, 'V'),
- (0x4EA, 'M', 'ӫ'),
- (0x4EB, 'V'),
- (0x4EC, 'M', 'ӭ'),
- (0x4ED, 'V'),
- (0x4EE, 'M', 'ӯ'),
- (0x4EF, 'V'),
- (0x4F0, 'M', 'ӱ'),
- (0x4F1, 'V'),
- (0x4F2, 'M', 'ӳ'),
- (0x4F3, 'V'),
- (0x4F4, 'M', 'ӵ'),
- (0x4F5, 'V'),
- (0x4F6, 'M', 'ӷ'),
- (0x4F7, 'V'),
- (0x4F8, 'M', 'ӹ'),
- (0x4F9, 'V'),
- (0x4FA, 'M', 'ӻ'),
- (0x4FB, 'V'),
- (0x4FC, 'M', 'ӽ'),
- (0x4FD, 'V'),
- (0x4FE, 'M', 'ӿ'),
- (0x4FF, 'V'),
- (0x500, 'M', 'ԁ'),
- (0x501, 'V'),
- (0x502, 'M', 'ԃ'),
+ (0x49E, "M", "ҟ"),
+ (0x49F, "V"),
+ (0x4A0, "M", "ҡ"),
+ (0x4A1, "V"),
+ (0x4A2, "M", "ң"),
+ (0x4A3, "V"),
+ (0x4A4, "M", "ҥ"),
+ (0x4A5, "V"),
+ (0x4A6, "M", "ҧ"),
+ (0x4A7, "V"),
+ (0x4A8, "M", "ҩ"),
+ (0x4A9, "V"),
+ (0x4AA, "M", "ҫ"),
+ (0x4AB, "V"),
+ (0x4AC, "M", "ҭ"),
+ (0x4AD, "V"),
+ (0x4AE, "M", "ү"),
+ (0x4AF, "V"),
+ (0x4B0, "M", "ұ"),
+ (0x4B1, "V"),
+ (0x4B2, "M", "ҳ"),
+ (0x4B3, "V"),
+ (0x4B4, "M", "ҵ"),
+ (0x4B5, "V"),
+ (0x4B6, "M", "ҷ"),
+ (0x4B7, "V"),
+ (0x4B8, "M", "ҹ"),
+ (0x4B9, "V"),
+ (0x4BA, "M", "һ"),
+ (0x4BB, "V"),
+ (0x4BC, "M", "ҽ"),
+ (0x4BD, "V"),
+ (0x4BE, "M", "ҿ"),
+ (0x4BF, "V"),
+ (0x4C0, "X"),
+ (0x4C1, "M", "ӂ"),
+ (0x4C2, "V"),
+ (0x4C3, "M", "ӄ"),
+ (0x4C4, "V"),
+ (0x4C5, "M", "ӆ"),
+ (0x4C6, "V"),
+ (0x4C7, "M", "ӈ"),
+ (0x4C8, "V"),
+ (0x4C9, "M", "ӊ"),
+ (0x4CA, "V"),
+ (0x4CB, "M", "ӌ"),
+ (0x4CC, "V"),
+ (0x4CD, "M", "ӎ"),
+ (0x4CE, "V"),
+ (0x4D0, "M", "ӑ"),
+ (0x4D1, "V"),
+ (0x4D2, "M", "ӓ"),
+ (0x4D3, "V"),
+ (0x4D4, "M", "ӕ"),
+ (0x4D5, "V"),
+ (0x4D6, "M", "ӗ"),
+ (0x4D7, "V"),
+ (0x4D8, "M", "ә"),
+ (0x4D9, "V"),
+ (0x4DA, "M", "ӛ"),
+ (0x4DB, "V"),
+ (0x4DC, "M", "ӝ"),
+ (0x4DD, "V"),
+ (0x4DE, "M", "ӟ"),
+ (0x4DF, "V"),
+ (0x4E0, "M", "ӡ"),
+ (0x4E1, "V"),
+ (0x4E2, "M", "ӣ"),
+ (0x4E3, "V"),
+ (0x4E4, "M", "ӥ"),
+ (0x4E5, "V"),
+ (0x4E6, "M", "ӧ"),
+ (0x4E7, "V"),
+ (0x4E8, "M", "ө"),
+ (0x4E9, "V"),
+ (0x4EA, "M", "ӫ"),
+ (0x4EB, "V"),
+ (0x4EC, "M", "ӭ"),
+ (0x4ED, "V"),
+ (0x4EE, "M", "ӯ"),
+ (0x4EF, "V"),
+ (0x4F0, "M", "ӱ"),
+ (0x4F1, "V"),
+ (0x4F2, "M", "ӳ"),
+ (0x4F3, "V"),
+ (0x4F4, "M", "ӵ"),
+ (0x4F5, "V"),
+ (0x4F6, "M", "ӷ"),
+ (0x4F7, "V"),
+ (0x4F8, "M", "ӹ"),
+ (0x4F9, "V"),
+ (0x4FA, "M", "ӻ"),
+ (0x4FB, "V"),
+ (0x4FC, "M", "ӽ"),
+ (0x4FD, "V"),
+ (0x4FE, "M", "ӿ"),
+ (0x4FF, "V"),
+ (0x500, "M", "ԁ"),
+ (0x501, "V"),
+ (0x502, "M", "ԃ"),
]
+
def _seg_9() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x503, 'V'),
- (0x504, 'M', 'ԅ'),
- (0x505, 'V'),
- (0x506, 'M', 'ԇ'),
- (0x507, 'V'),
- (0x508, 'M', 'ԉ'),
- (0x509, 'V'),
- (0x50A, 'M', 'ԋ'),
- (0x50B, 'V'),
- (0x50C, 'M', 'ԍ'),
- (0x50D, 'V'),
- (0x50E, 'M', 'ԏ'),
- (0x50F, 'V'),
- (0x510, 'M', 'ԑ'),
- (0x511, 'V'),
- (0x512, 'M', 'ԓ'),
- (0x513, 'V'),
- (0x514, 'M', 'ԕ'),
- (0x515, 'V'),
- (0x516, 'M', 'ԗ'),
- (0x517, 'V'),
- (0x518, 'M', 'ԙ'),
- (0x519, 'V'),
- (0x51A, 'M', 'ԛ'),
- (0x51B, 'V'),
- (0x51C, 'M', 'ԝ'),
- (0x51D, 'V'),
- (0x51E, 'M', 'ԟ'),
- (0x51F, 'V'),
- (0x520, 'M', 'ԡ'),
- (0x521, 'V'),
- (0x522, 'M', 'ԣ'),
- (0x523, 'V'),
- (0x524, 'M', 'ԥ'),
- (0x525, 'V'),
- (0x526, 'M', 'ԧ'),
- (0x527, 'V'),
- (0x528, 'M', 'ԩ'),
- (0x529, 'V'),
- (0x52A, 'M', 'ԫ'),
- (0x52B, 'V'),
- (0x52C, 'M', 'ԭ'),
- (0x52D, 'V'),
- (0x52E, 'M', 'ԯ'),
- (0x52F, 'V'),
- (0x530, 'X'),
- (0x531, 'M', 'ա'),
- (0x532, 'M', 'բ'),
- (0x533, 'M', 'գ'),
- (0x534, 'M', 'դ'),
- (0x535, 'M', 'ե'),
- (0x536, 'M', 'զ'),
- (0x537, 'M', 'է'),
- (0x538, 'M', 'ը'),
- (0x539, 'M', 'թ'),
- (0x53A, 'M', 'ժ'),
- (0x53B, 'M', 'ի'),
- (0x53C, 'M', 'լ'),
- (0x53D, 'M', 'խ'),
- (0x53E, 'M', 'ծ'),
- (0x53F, 'M', 'կ'),
- (0x540, 'M', 'հ'),
- (0x541, 'M', 'ձ'),
- (0x542, 'M', 'ղ'),
- (0x543, 'M', 'ճ'),
- (0x544, 'M', 'մ'),
- (0x545, 'M', 'յ'),
- (0x546, 'M', 'ն'),
- (0x547, 'M', 'շ'),
- (0x548, 'M', 'ո'),
- (0x549, 'M', 'չ'),
- (0x54A, 'M', 'պ'),
- (0x54B, 'M', 'ջ'),
- (0x54C, 'M', 'ռ'),
- (0x54D, 'M', 'ս'),
- (0x54E, 'M', 'վ'),
- (0x54F, 'M', 'տ'),
- (0x550, 'M', 'ր'),
- (0x551, 'M', 'ց'),
- (0x552, 'M', 'ւ'),
- (0x553, 'M', 'փ'),
- (0x554, 'M', 'ք'),
- (0x555, 'M', 'օ'),
- (0x556, 'M', 'ֆ'),
- (0x557, 'X'),
- (0x559, 'V'),
- (0x587, 'M', 'եւ'),
- (0x588, 'V'),
- (0x58B, 'X'),
- (0x58D, 'V'),
- (0x590, 'X'),
- (0x591, 'V'),
- (0x5C8, 'X'),
- (0x5D0, 'V'),
- (0x5EB, 'X'),
- (0x5EF, 'V'),
- (0x5F5, 'X'),
- (0x606, 'V'),
- (0x61C, 'X'),
- (0x61D, 'V'),
+ (0x503, "V"),
+ (0x504, "M", "ԅ"),
+ (0x505, "V"),
+ (0x506, "M", "ԇ"),
+ (0x507, "V"),
+ (0x508, "M", "ԉ"),
+ (0x509, "V"),
+ (0x50A, "M", "ԋ"),
+ (0x50B, "V"),
+ (0x50C, "M", "ԍ"),
+ (0x50D, "V"),
+ (0x50E, "M", "ԏ"),
+ (0x50F, "V"),
+ (0x510, "M", "ԑ"),
+ (0x511, "V"),
+ (0x512, "M", "ԓ"),
+ (0x513, "V"),
+ (0x514, "M", "ԕ"),
+ (0x515, "V"),
+ (0x516, "M", "ԗ"),
+ (0x517, "V"),
+ (0x518, "M", "ԙ"),
+ (0x519, "V"),
+ (0x51A, "M", "ԛ"),
+ (0x51B, "V"),
+ (0x51C, "M", "ԝ"),
+ (0x51D, "V"),
+ (0x51E, "M", "ԟ"),
+ (0x51F, "V"),
+ (0x520, "M", "ԡ"),
+ (0x521, "V"),
+ (0x522, "M", "ԣ"),
+ (0x523, "V"),
+ (0x524, "M", "ԥ"),
+ (0x525, "V"),
+ (0x526, "M", "ԧ"),
+ (0x527, "V"),
+ (0x528, "M", "ԩ"),
+ (0x529, "V"),
+ (0x52A, "M", "ԫ"),
+ (0x52B, "V"),
+ (0x52C, "M", "ԭ"),
+ (0x52D, "V"),
+ (0x52E, "M", "ԯ"),
+ (0x52F, "V"),
+ (0x530, "X"),
+ (0x531, "M", "ա"),
+ (0x532, "M", "բ"),
+ (0x533, "M", "գ"),
+ (0x534, "M", "դ"),
+ (0x535, "M", "ե"),
+ (0x536, "M", "զ"),
+ (0x537, "M", "է"),
+ (0x538, "M", "ը"),
+ (0x539, "M", "թ"),
+ (0x53A, "M", "ժ"),
+ (0x53B, "M", "ի"),
+ (0x53C, "M", "լ"),
+ (0x53D, "M", "խ"),
+ (0x53E, "M", "ծ"),
+ (0x53F, "M", "կ"),
+ (0x540, "M", "հ"),
+ (0x541, "M", "ձ"),
+ (0x542, "M", "ղ"),
+ (0x543, "M", "ճ"),
+ (0x544, "M", "մ"),
+ (0x545, "M", "յ"),
+ (0x546, "M", "ն"),
+ (0x547, "M", "շ"),
+ (0x548, "M", "ո"),
+ (0x549, "M", "չ"),
+ (0x54A, "M", "պ"),
+ (0x54B, "M", "ջ"),
+ (0x54C, "M", "ռ"),
+ (0x54D, "M", "ս"),
+ (0x54E, "M", "վ"),
+ (0x54F, "M", "տ"),
+ (0x550, "M", "ր"),
+ (0x551, "M", "ց"),
+ (0x552, "M", "ւ"),
+ (0x553, "M", "փ"),
+ (0x554, "M", "ք"),
+ (0x555, "M", "օ"),
+ (0x556, "M", "ֆ"),
+ (0x557, "X"),
+ (0x559, "V"),
+ (0x587, "M", "եւ"),
+ (0x588, "V"),
+ (0x58B, "X"),
+ (0x58D, "V"),
+ (0x590, "X"),
+ (0x591, "V"),
+ (0x5C8, "X"),
+ (0x5D0, "V"),
+ (0x5EB, "X"),
+ (0x5EF, "V"),
+ (0x5F5, "X"),
+ (0x606, "V"),
+ (0x61C, "X"),
+ (0x61D, "V"),
]
+
def _seg_10() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x675, 'M', 'اٴ'),
- (0x676, 'M', 'وٴ'),
- (0x677, 'M', 'ۇٴ'),
- (0x678, 'M', 'يٴ'),
- (0x679, 'V'),
- (0x6DD, 'X'),
- (0x6DE, 'V'),
- (0x70E, 'X'),
- (0x710, 'V'),
- (0x74B, 'X'),
- (0x74D, 'V'),
- (0x7B2, 'X'),
- (0x7C0, 'V'),
- (0x7FB, 'X'),
- (0x7FD, 'V'),
- (0x82E, 'X'),
- (0x830, 'V'),
- (0x83F, 'X'),
- (0x840, 'V'),
- (0x85C, 'X'),
- (0x85E, 'V'),
- (0x85F, 'X'),
- (0x860, 'V'),
- (0x86B, 'X'),
- (0x870, 'V'),
- (0x88F, 'X'),
- (0x898, 'V'),
- (0x8E2, 'X'),
- (0x8E3, 'V'),
- (0x958, 'M', 'क़'),
- (0x959, 'M', 'ख़'),
- (0x95A, 'M', 'ग़'),
- (0x95B, 'M', 'ज़'),
- (0x95C, 'M', 'ड़'),
- (0x95D, 'M', 'ढ़'),
- (0x95E, 'M', 'फ़'),
- (0x95F, 'M', 'य़'),
- (0x960, 'V'),
- (0x984, 'X'),
- (0x985, 'V'),
- (0x98D, 'X'),
- (0x98F, 'V'),
- (0x991, 'X'),
- (0x993, 'V'),
- (0x9A9, 'X'),
- (0x9AA, 'V'),
- (0x9B1, 'X'),
- (0x9B2, 'V'),
- (0x9B3, 'X'),
- (0x9B6, 'V'),
- (0x9BA, 'X'),
- (0x9BC, 'V'),
- (0x9C5, 'X'),
- (0x9C7, 'V'),
- (0x9C9, 'X'),
- (0x9CB, 'V'),
- (0x9CF, 'X'),
- (0x9D7, 'V'),
- (0x9D8, 'X'),
- (0x9DC, 'M', 'ড়'),
- (0x9DD, 'M', 'ঢ়'),
- (0x9DE, 'X'),
- (0x9DF, 'M', 'য়'),
- (0x9E0, 'V'),
- (0x9E4, 'X'),
- (0x9E6, 'V'),
- (0x9FF, 'X'),
- (0xA01, 'V'),
- (0xA04, 'X'),
- (0xA05, 'V'),
- (0xA0B, 'X'),
- (0xA0F, 'V'),
- (0xA11, 'X'),
- (0xA13, 'V'),
- (0xA29, 'X'),
- (0xA2A, 'V'),
- (0xA31, 'X'),
- (0xA32, 'V'),
- (0xA33, 'M', 'ਲ਼'),
- (0xA34, 'X'),
- (0xA35, 'V'),
- (0xA36, 'M', 'ਸ਼'),
- (0xA37, 'X'),
- (0xA38, 'V'),
- (0xA3A, 'X'),
- (0xA3C, 'V'),
- (0xA3D, 'X'),
- (0xA3E, 'V'),
- (0xA43, 'X'),
- (0xA47, 'V'),
- (0xA49, 'X'),
- (0xA4B, 'V'),
- (0xA4E, 'X'),
- (0xA51, 'V'),
- (0xA52, 'X'),
- (0xA59, 'M', 'ਖ਼'),
- (0xA5A, 'M', 'ਗ਼'),
- (0xA5B, 'M', 'ਜ਼'),
- (0xA5C, 'V'),
- (0xA5D, 'X'),
+ (0x675, "M", "اٴ"),
+ (0x676, "M", "وٴ"),
+ (0x677, "M", "ۇٴ"),
+ (0x678, "M", "يٴ"),
+ (0x679, "V"),
+ (0x6DD, "X"),
+ (0x6DE, "V"),
+ (0x70E, "X"),
+ (0x710, "V"),
+ (0x74B, "X"),
+ (0x74D, "V"),
+ (0x7B2, "X"),
+ (0x7C0, "V"),
+ (0x7FB, "X"),
+ (0x7FD, "V"),
+ (0x82E, "X"),
+ (0x830, "V"),
+ (0x83F, "X"),
+ (0x840, "V"),
+ (0x85C, "X"),
+ (0x85E, "V"),
+ (0x85F, "X"),
+ (0x860, "V"),
+ (0x86B, "X"),
+ (0x870, "V"),
+ (0x88F, "X"),
+ (0x898, "V"),
+ (0x8E2, "X"),
+ (0x8E3, "V"),
+ (0x958, "M", "क़"),
+ (0x959, "M", "ख़"),
+ (0x95A, "M", "ग़"),
+ (0x95B, "M", "ज़"),
+ (0x95C, "M", "ड़"),
+ (0x95D, "M", "ढ़"),
+ (0x95E, "M", "फ़"),
+ (0x95F, "M", "य़"),
+ (0x960, "V"),
+ (0x984, "X"),
+ (0x985, "V"),
+ (0x98D, "X"),
+ (0x98F, "V"),
+ (0x991, "X"),
+ (0x993, "V"),
+ (0x9A9, "X"),
+ (0x9AA, "V"),
+ (0x9B1, "X"),
+ (0x9B2, "V"),
+ (0x9B3, "X"),
+ (0x9B6, "V"),
+ (0x9BA, "X"),
+ (0x9BC, "V"),
+ (0x9C5, "X"),
+ (0x9C7, "V"),
+ (0x9C9, "X"),
+ (0x9CB, "V"),
+ (0x9CF, "X"),
+ (0x9D7, "V"),
+ (0x9D8, "X"),
+ (0x9DC, "M", "ড়"),
+ (0x9DD, "M", "ঢ়"),
+ (0x9DE, "X"),
+ (0x9DF, "M", "য়"),
+ (0x9E0, "V"),
+ (0x9E4, "X"),
+ (0x9E6, "V"),
+ (0x9FF, "X"),
+ (0xA01, "V"),
+ (0xA04, "X"),
+ (0xA05, "V"),
+ (0xA0B, "X"),
+ (0xA0F, "V"),
+ (0xA11, "X"),
+ (0xA13, "V"),
+ (0xA29, "X"),
+ (0xA2A, "V"),
+ (0xA31, "X"),
+ (0xA32, "V"),
+ (0xA33, "M", "ਲ਼"),
+ (0xA34, "X"),
+ (0xA35, "V"),
+ (0xA36, "M", "ਸ਼"),
+ (0xA37, "X"),
+ (0xA38, "V"),
+ (0xA3A, "X"),
+ (0xA3C, "V"),
+ (0xA3D, "X"),
+ (0xA3E, "V"),
+ (0xA43, "X"),
+ (0xA47, "V"),
+ (0xA49, "X"),
+ (0xA4B, "V"),
+ (0xA4E, "X"),
+ (0xA51, "V"),
+ (0xA52, "X"),
+ (0xA59, "M", "ਖ਼"),
+ (0xA5A, "M", "ਗ਼"),
+ (0xA5B, "M", "ਜ਼"),
+ (0xA5C, "V"),
+ (0xA5D, "X"),
]
+
def _seg_11() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA5E, 'M', 'ਫ਼'),
- (0xA5F, 'X'),
- (0xA66, 'V'),
- (0xA77, 'X'),
- (0xA81, 'V'),
- (0xA84, 'X'),
- (0xA85, 'V'),
- (0xA8E, 'X'),
- (0xA8F, 'V'),
- (0xA92, 'X'),
- (0xA93, 'V'),
- (0xAA9, 'X'),
- (0xAAA, 'V'),
- (0xAB1, 'X'),
- (0xAB2, 'V'),
- (0xAB4, 'X'),
- (0xAB5, 'V'),
- (0xABA, 'X'),
- (0xABC, 'V'),
- (0xAC6, 'X'),
- (0xAC7, 'V'),
- (0xACA, 'X'),
- (0xACB, 'V'),
- (0xACE, 'X'),
- (0xAD0, 'V'),
- (0xAD1, 'X'),
- (0xAE0, 'V'),
- (0xAE4, 'X'),
- (0xAE6, 'V'),
- (0xAF2, 'X'),
- (0xAF9, 'V'),
- (0xB00, 'X'),
- (0xB01, 'V'),
- (0xB04, 'X'),
- (0xB05, 'V'),
- (0xB0D, 'X'),
- (0xB0F, 'V'),
- (0xB11, 'X'),
- (0xB13, 'V'),
- (0xB29, 'X'),
- (0xB2A, 'V'),
- (0xB31, 'X'),
- (0xB32, 'V'),
- (0xB34, 'X'),
- (0xB35, 'V'),
- (0xB3A, 'X'),
- (0xB3C, 'V'),
- (0xB45, 'X'),
- (0xB47, 'V'),
- (0xB49, 'X'),
- (0xB4B, 'V'),
- (0xB4E, 'X'),
- (0xB55, 'V'),
- (0xB58, 'X'),
- (0xB5C, 'M', 'ଡ଼'),
- (0xB5D, 'M', 'ଢ଼'),
- (0xB5E, 'X'),
- (0xB5F, 'V'),
- (0xB64, 'X'),
- (0xB66, 'V'),
- (0xB78, 'X'),
- (0xB82, 'V'),
- (0xB84, 'X'),
- (0xB85, 'V'),
- (0xB8B, 'X'),
- (0xB8E, 'V'),
- (0xB91, 'X'),
- (0xB92, 'V'),
- (0xB96, 'X'),
- (0xB99, 'V'),
- (0xB9B, 'X'),
- (0xB9C, 'V'),
- (0xB9D, 'X'),
- (0xB9E, 'V'),
- (0xBA0, 'X'),
- (0xBA3, 'V'),
- (0xBA5, 'X'),
- (0xBA8, 'V'),
- (0xBAB, 'X'),
- (0xBAE, 'V'),
- (0xBBA, 'X'),
- (0xBBE, 'V'),
- (0xBC3, 'X'),
- (0xBC6, 'V'),
- (0xBC9, 'X'),
- (0xBCA, 'V'),
- (0xBCE, 'X'),
- (0xBD0, 'V'),
- (0xBD1, 'X'),
- (0xBD7, 'V'),
- (0xBD8, 'X'),
- (0xBE6, 'V'),
- (0xBFB, 'X'),
- (0xC00, 'V'),
- (0xC0D, 'X'),
- (0xC0E, 'V'),
- (0xC11, 'X'),
- (0xC12, 'V'),
- (0xC29, 'X'),
- (0xC2A, 'V'),
+ (0xA5E, "M", "ਫ਼"),
+ (0xA5F, "X"),
+ (0xA66, "V"),
+ (0xA77, "X"),
+ (0xA81, "V"),
+ (0xA84, "X"),
+ (0xA85, "V"),
+ (0xA8E, "X"),
+ (0xA8F, "V"),
+ (0xA92, "X"),
+ (0xA93, "V"),
+ (0xAA9, "X"),
+ (0xAAA, "V"),
+ (0xAB1, "X"),
+ (0xAB2, "V"),
+ (0xAB4, "X"),
+ (0xAB5, "V"),
+ (0xABA, "X"),
+ (0xABC, "V"),
+ (0xAC6, "X"),
+ (0xAC7, "V"),
+ (0xACA, "X"),
+ (0xACB, "V"),
+ (0xACE, "X"),
+ (0xAD0, "V"),
+ (0xAD1, "X"),
+ (0xAE0, "V"),
+ (0xAE4, "X"),
+ (0xAE6, "V"),
+ (0xAF2, "X"),
+ (0xAF9, "V"),
+ (0xB00, "X"),
+ (0xB01, "V"),
+ (0xB04, "X"),
+ (0xB05, "V"),
+ (0xB0D, "X"),
+ (0xB0F, "V"),
+ (0xB11, "X"),
+ (0xB13, "V"),
+ (0xB29, "X"),
+ (0xB2A, "V"),
+ (0xB31, "X"),
+ (0xB32, "V"),
+ (0xB34, "X"),
+ (0xB35, "V"),
+ (0xB3A, "X"),
+ (0xB3C, "V"),
+ (0xB45, "X"),
+ (0xB47, "V"),
+ (0xB49, "X"),
+ (0xB4B, "V"),
+ (0xB4E, "X"),
+ (0xB55, "V"),
+ (0xB58, "X"),
+ (0xB5C, "M", "ଡ଼"),
+ (0xB5D, "M", "ଢ଼"),
+ (0xB5E, "X"),
+ (0xB5F, "V"),
+ (0xB64, "X"),
+ (0xB66, "V"),
+ (0xB78, "X"),
+ (0xB82, "V"),
+ (0xB84, "X"),
+ (0xB85, "V"),
+ (0xB8B, "X"),
+ (0xB8E, "V"),
+ (0xB91, "X"),
+ (0xB92, "V"),
+ (0xB96, "X"),
+ (0xB99, "V"),
+ (0xB9B, "X"),
+ (0xB9C, "V"),
+ (0xB9D, "X"),
+ (0xB9E, "V"),
+ (0xBA0, "X"),
+ (0xBA3, "V"),
+ (0xBA5, "X"),
+ (0xBA8, "V"),
+ (0xBAB, "X"),
+ (0xBAE, "V"),
+ (0xBBA, "X"),
+ (0xBBE, "V"),
+ (0xBC3, "X"),
+ (0xBC6, "V"),
+ (0xBC9, "X"),
+ (0xBCA, "V"),
+ (0xBCE, "X"),
+ (0xBD0, "V"),
+ (0xBD1, "X"),
+ (0xBD7, "V"),
+ (0xBD8, "X"),
+ (0xBE6, "V"),
+ (0xBFB, "X"),
+ (0xC00, "V"),
+ (0xC0D, "X"),
+ (0xC0E, "V"),
+ (0xC11, "X"),
+ (0xC12, "V"),
+ (0xC29, "X"),
+ (0xC2A, "V"),
]
+
def _seg_12() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xC3A, 'X'),
- (0xC3C, 'V'),
- (0xC45, 'X'),
- (0xC46, 'V'),
- (0xC49, 'X'),
- (0xC4A, 'V'),
- (0xC4E, 'X'),
- (0xC55, 'V'),
- (0xC57, 'X'),
- (0xC58, 'V'),
- (0xC5B, 'X'),
- (0xC5D, 'V'),
- (0xC5E, 'X'),
- (0xC60, 'V'),
- (0xC64, 'X'),
- (0xC66, 'V'),
- (0xC70, 'X'),
- (0xC77, 'V'),
- (0xC8D, 'X'),
- (0xC8E, 'V'),
- (0xC91, 'X'),
- (0xC92, 'V'),
- (0xCA9, 'X'),
- (0xCAA, 'V'),
- (0xCB4, 'X'),
- (0xCB5, 'V'),
- (0xCBA, 'X'),
- (0xCBC, 'V'),
- (0xCC5, 'X'),
- (0xCC6, 'V'),
- (0xCC9, 'X'),
- (0xCCA, 'V'),
- (0xCCE, 'X'),
- (0xCD5, 'V'),
- (0xCD7, 'X'),
- (0xCDD, 'V'),
- (0xCDF, 'X'),
- (0xCE0, 'V'),
- (0xCE4, 'X'),
- (0xCE6, 'V'),
- (0xCF0, 'X'),
- (0xCF1, 'V'),
- (0xCF4, 'X'),
- (0xD00, 'V'),
- (0xD0D, 'X'),
- (0xD0E, 'V'),
- (0xD11, 'X'),
- (0xD12, 'V'),
- (0xD45, 'X'),
- (0xD46, 'V'),
- (0xD49, 'X'),
- (0xD4A, 'V'),
- (0xD50, 'X'),
- (0xD54, 'V'),
- (0xD64, 'X'),
- (0xD66, 'V'),
- (0xD80, 'X'),
- (0xD81, 'V'),
- (0xD84, 'X'),
- (0xD85, 'V'),
- (0xD97, 'X'),
- (0xD9A, 'V'),
- (0xDB2, 'X'),
- (0xDB3, 'V'),
- (0xDBC, 'X'),
- (0xDBD, 'V'),
- (0xDBE, 'X'),
- (0xDC0, 'V'),
- (0xDC7, 'X'),
- (0xDCA, 'V'),
- (0xDCB, 'X'),
- (0xDCF, 'V'),
- (0xDD5, 'X'),
- (0xDD6, 'V'),
- (0xDD7, 'X'),
- (0xDD8, 'V'),
- (0xDE0, 'X'),
- (0xDE6, 'V'),
- (0xDF0, 'X'),
- (0xDF2, 'V'),
- (0xDF5, 'X'),
- (0xE01, 'V'),
- (0xE33, 'M', 'ํา'),
- (0xE34, 'V'),
- (0xE3B, 'X'),
- (0xE3F, 'V'),
- (0xE5C, 'X'),
- (0xE81, 'V'),
- (0xE83, 'X'),
- (0xE84, 'V'),
- (0xE85, 'X'),
- (0xE86, 'V'),
- (0xE8B, 'X'),
- (0xE8C, 'V'),
- (0xEA4, 'X'),
- (0xEA5, 'V'),
- (0xEA6, 'X'),
- (0xEA7, 'V'),
- (0xEB3, 'M', 'ໍາ'),
- (0xEB4, 'V'),
+ (0xC3A, "X"),
+ (0xC3C, "V"),
+ (0xC45, "X"),
+ (0xC46, "V"),
+ (0xC49, "X"),
+ (0xC4A, "V"),
+ (0xC4E, "X"),
+ (0xC55, "V"),
+ (0xC57, "X"),
+ (0xC58, "V"),
+ (0xC5B, "X"),
+ (0xC5D, "V"),
+ (0xC5E, "X"),
+ (0xC60, "V"),
+ (0xC64, "X"),
+ (0xC66, "V"),
+ (0xC70, "X"),
+ (0xC77, "V"),
+ (0xC8D, "X"),
+ (0xC8E, "V"),
+ (0xC91, "X"),
+ (0xC92, "V"),
+ (0xCA9, "X"),
+ (0xCAA, "V"),
+ (0xCB4, "X"),
+ (0xCB5, "V"),
+ (0xCBA, "X"),
+ (0xCBC, "V"),
+ (0xCC5, "X"),
+ (0xCC6, "V"),
+ (0xCC9, "X"),
+ (0xCCA, "V"),
+ (0xCCE, "X"),
+ (0xCD5, "V"),
+ (0xCD7, "X"),
+ (0xCDD, "V"),
+ (0xCDF, "X"),
+ (0xCE0, "V"),
+ (0xCE4, "X"),
+ (0xCE6, "V"),
+ (0xCF0, "X"),
+ (0xCF1, "V"),
+ (0xCF4, "X"),
+ (0xD00, "V"),
+ (0xD0D, "X"),
+ (0xD0E, "V"),
+ (0xD11, "X"),
+ (0xD12, "V"),
+ (0xD45, "X"),
+ (0xD46, "V"),
+ (0xD49, "X"),
+ (0xD4A, "V"),
+ (0xD50, "X"),
+ (0xD54, "V"),
+ (0xD64, "X"),
+ (0xD66, "V"),
+ (0xD80, "X"),
+ (0xD81, "V"),
+ (0xD84, "X"),
+ (0xD85, "V"),
+ (0xD97, "X"),
+ (0xD9A, "V"),
+ (0xDB2, "X"),
+ (0xDB3, "V"),
+ (0xDBC, "X"),
+ (0xDBD, "V"),
+ (0xDBE, "X"),
+ (0xDC0, "V"),
+ (0xDC7, "X"),
+ (0xDCA, "V"),
+ (0xDCB, "X"),
+ (0xDCF, "V"),
+ (0xDD5, "X"),
+ (0xDD6, "V"),
+ (0xDD7, "X"),
+ (0xDD8, "V"),
+ (0xDE0, "X"),
+ (0xDE6, "V"),
+ (0xDF0, "X"),
+ (0xDF2, "V"),
+ (0xDF5, "X"),
+ (0xE01, "V"),
+ (0xE33, "M", "ํา"),
+ (0xE34, "V"),
+ (0xE3B, "X"),
+ (0xE3F, "V"),
+ (0xE5C, "X"),
+ (0xE81, "V"),
+ (0xE83, "X"),
+ (0xE84, "V"),
+ (0xE85, "X"),
+ (0xE86, "V"),
+ (0xE8B, "X"),
+ (0xE8C, "V"),
+ (0xEA4, "X"),
+ (0xEA5, "V"),
+ (0xEA6, "X"),
+ (0xEA7, "V"),
+ (0xEB3, "M", "ໍາ"),
+ (0xEB4, "V"),
]
+
def _seg_13() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xEBE, 'X'),
- (0xEC0, 'V'),
- (0xEC5, 'X'),
- (0xEC6, 'V'),
- (0xEC7, 'X'),
- (0xEC8, 'V'),
- (0xECF, 'X'),
- (0xED0, 'V'),
- (0xEDA, 'X'),
- (0xEDC, 'M', 'ຫນ'),
- (0xEDD, 'M', 'ຫມ'),
- (0xEDE, 'V'),
- (0xEE0, 'X'),
- (0xF00, 'V'),
- (0xF0C, 'M', '་'),
- (0xF0D, 'V'),
- (0xF43, 'M', 'གྷ'),
- (0xF44, 'V'),
- (0xF48, 'X'),
- (0xF49, 'V'),
- (0xF4D, 'M', 'ཌྷ'),
- (0xF4E, 'V'),
- (0xF52, 'M', 'དྷ'),
- (0xF53, 'V'),
- (0xF57, 'M', 'བྷ'),
- (0xF58, 'V'),
- (0xF5C, 'M', 'ཛྷ'),
- (0xF5D, 'V'),
- (0xF69, 'M', 'ཀྵ'),
- (0xF6A, 'V'),
- (0xF6D, 'X'),
- (0xF71, 'V'),
- (0xF73, 'M', 'ཱི'),
- (0xF74, 'V'),
- (0xF75, 'M', 'ཱུ'),
- (0xF76, 'M', 'ྲྀ'),
- (0xF77, 'M', 'ྲཱྀ'),
- (0xF78, 'M', 'ླྀ'),
- (0xF79, 'M', 'ླཱྀ'),
- (0xF7A, 'V'),
- (0xF81, 'M', 'ཱྀ'),
- (0xF82, 'V'),
- (0xF93, 'M', 'ྒྷ'),
- (0xF94, 'V'),
- (0xF98, 'X'),
- (0xF99, 'V'),
- (0xF9D, 'M', 'ྜྷ'),
- (0xF9E, 'V'),
- (0xFA2, 'M', 'ྡྷ'),
- (0xFA3, 'V'),
- (0xFA7, 'M', 'ྦྷ'),
- (0xFA8, 'V'),
- (0xFAC, 'M', 'ྫྷ'),
- (0xFAD, 'V'),
- (0xFB9, 'M', 'ྐྵ'),
- (0xFBA, 'V'),
- (0xFBD, 'X'),
- (0xFBE, 'V'),
- (0xFCD, 'X'),
- (0xFCE, 'V'),
- (0xFDB, 'X'),
- (0x1000, 'V'),
- (0x10A0, 'X'),
- (0x10C7, 'M', 'ⴧ'),
- (0x10C8, 'X'),
- (0x10CD, 'M', 'ⴭ'),
- (0x10CE, 'X'),
- (0x10D0, 'V'),
- (0x10FC, 'M', 'ნ'),
- (0x10FD, 'V'),
- (0x115F, 'X'),
- (0x1161, 'V'),
- (0x1249, 'X'),
- (0x124A, 'V'),
- (0x124E, 'X'),
- (0x1250, 'V'),
- (0x1257, 'X'),
- (0x1258, 'V'),
- (0x1259, 'X'),
- (0x125A, 'V'),
- (0x125E, 'X'),
- (0x1260, 'V'),
- (0x1289, 'X'),
- (0x128A, 'V'),
- (0x128E, 'X'),
- (0x1290, 'V'),
- (0x12B1, 'X'),
- (0x12B2, 'V'),
- (0x12B6, 'X'),
- (0x12B8, 'V'),
- (0x12BF, 'X'),
- (0x12C0, 'V'),
- (0x12C1, 'X'),
- (0x12C2, 'V'),
- (0x12C6, 'X'),
- (0x12C8, 'V'),
- (0x12D7, 'X'),
- (0x12D8, 'V'),
- (0x1311, 'X'),
- (0x1312, 'V'),
+ (0xEBE, "X"),
+ (0xEC0, "V"),
+ (0xEC5, "X"),
+ (0xEC6, "V"),
+ (0xEC7, "X"),
+ (0xEC8, "V"),
+ (0xECF, "X"),
+ (0xED0, "V"),
+ (0xEDA, "X"),
+ (0xEDC, "M", "ຫນ"),
+ (0xEDD, "M", "ຫມ"),
+ (0xEDE, "V"),
+ (0xEE0, "X"),
+ (0xF00, "V"),
+ (0xF0C, "M", "་"),
+ (0xF0D, "V"),
+ (0xF43, "M", "གྷ"),
+ (0xF44, "V"),
+ (0xF48, "X"),
+ (0xF49, "V"),
+ (0xF4D, "M", "ཌྷ"),
+ (0xF4E, "V"),
+ (0xF52, "M", "དྷ"),
+ (0xF53, "V"),
+ (0xF57, "M", "བྷ"),
+ (0xF58, "V"),
+ (0xF5C, "M", "ཛྷ"),
+ (0xF5D, "V"),
+ (0xF69, "M", "ཀྵ"),
+ (0xF6A, "V"),
+ (0xF6D, "X"),
+ (0xF71, "V"),
+ (0xF73, "M", "ཱི"),
+ (0xF74, "V"),
+ (0xF75, "M", "ཱུ"),
+ (0xF76, "M", "ྲྀ"),
+ (0xF77, "M", "ྲཱྀ"),
+ (0xF78, "M", "ླྀ"),
+ (0xF79, "M", "ླཱྀ"),
+ (0xF7A, "V"),
+ (0xF81, "M", "ཱྀ"),
+ (0xF82, "V"),
+ (0xF93, "M", "ྒྷ"),
+ (0xF94, "V"),
+ (0xF98, "X"),
+ (0xF99, "V"),
+ (0xF9D, "M", "ྜྷ"),
+ (0xF9E, "V"),
+ (0xFA2, "M", "ྡྷ"),
+ (0xFA3, "V"),
+ (0xFA7, "M", "ྦྷ"),
+ (0xFA8, "V"),
+ (0xFAC, "M", "ྫྷ"),
+ (0xFAD, "V"),
+ (0xFB9, "M", "ྐྵ"),
+ (0xFBA, "V"),
+ (0xFBD, "X"),
+ (0xFBE, "V"),
+ (0xFCD, "X"),
+ (0xFCE, "V"),
+ (0xFDB, "X"),
+ (0x1000, "V"),
+ (0x10A0, "X"),
+ (0x10C7, "M", "ⴧ"),
+ (0x10C8, "X"),
+ (0x10CD, "M", "ⴭ"),
+ (0x10CE, "X"),
+ (0x10D0, "V"),
+ (0x10FC, "M", "ნ"),
+ (0x10FD, "V"),
+ (0x115F, "X"),
+ (0x1161, "V"),
+ (0x1249, "X"),
+ (0x124A, "V"),
+ (0x124E, "X"),
+ (0x1250, "V"),
+ (0x1257, "X"),
+ (0x1258, "V"),
+ (0x1259, "X"),
+ (0x125A, "V"),
+ (0x125E, "X"),
+ (0x1260, "V"),
+ (0x1289, "X"),
+ (0x128A, "V"),
+ (0x128E, "X"),
+ (0x1290, "V"),
+ (0x12B1, "X"),
+ (0x12B2, "V"),
+ (0x12B6, "X"),
+ (0x12B8, "V"),
+ (0x12BF, "X"),
+ (0x12C0, "V"),
+ (0x12C1, "X"),
+ (0x12C2, "V"),
+ (0x12C6, "X"),
+ (0x12C8, "V"),
+ (0x12D7, "X"),
+ (0x12D8, "V"),
+ (0x1311, "X"),
+ (0x1312, "V"),
]
+
def _seg_14() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1316, 'X'),
- (0x1318, 'V'),
- (0x135B, 'X'),
- (0x135D, 'V'),
- (0x137D, 'X'),
- (0x1380, 'V'),
- (0x139A, 'X'),
- (0x13A0, 'V'),
- (0x13F6, 'X'),
- (0x13F8, 'M', 'Ᏸ'),
- (0x13F9, 'M', 'Ᏹ'),
- (0x13FA, 'M', 'Ᏺ'),
- (0x13FB, 'M', 'Ᏻ'),
- (0x13FC, 'M', 'Ᏼ'),
- (0x13FD, 'M', 'Ᏽ'),
- (0x13FE, 'X'),
- (0x1400, 'V'),
- (0x1680, 'X'),
- (0x1681, 'V'),
- (0x169D, 'X'),
- (0x16A0, 'V'),
- (0x16F9, 'X'),
- (0x1700, 'V'),
- (0x1716, 'X'),
- (0x171F, 'V'),
- (0x1737, 'X'),
- (0x1740, 'V'),
- (0x1754, 'X'),
- (0x1760, 'V'),
- (0x176D, 'X'),
- (0x176E, 'V'),
- (0x1771, 'X'),
- (0x1772, 'V'),
- (0x1774, 'X'),
- (0x1780, 'V'),
- (0x17B4, 'X'),
- (0x17B6, 'V'),
- (0x17DE, 'X'),
- (0x17E0, 'V'),
- (0x17EA, 'X'),
- (0x17F0, 'V'),
- (0x17FA, 'X'),
- (0x1800, 'V'),
- (0x1806, 'X'),
- (0x1807, 'V'),
- (0x180B, 'I'),
- (0x180E, 'X'),
- (0x180F, 'I'),
- (0x1810, 'V'),
- (0x181A, 'X'),
- (0x1820, 'V'),
- (0x1879, 'X'),
- (0x1880, 'V'),
- (0x18AB, 'X'),
- (0x18B0, 'V'),
- (0x18F6, 'X'),
- (0x1900, 'V'),
- (0x191F, 'X'),
- (0x1920, 'V'),
- (0x192C, 'X'),
- (0x1930, 'V'),
- (0x193C, 'X'),
- (0x1940, 'V'),
- (0x1941, 'X'),
- (0x1944, 'V'),
- (0x196E, 'X'),
- (0x1970, 'V'),
- (0x1975, 'X'),
- (0x1980, 'V'),
- (0x19AC, 'X'),
- (0x19B0, 'V'),
- (0x19CA, 'X'),
- (0x19D0, 'V'),
- (0x19DB, 'X'),
- (0x19DE, 'V'),
- (0x1A1C, 'X'),
- (0x1A1E, 'V'),
- (0x1A5F, 'X'),
- (0x1A60, 'V'),
- (0x1A7D, 'X'),
- (0x1A7F, 'V'),
- (0x1A8A, 'X'),
- (0x1A90, 'V'),
- (0x1A9A, 'X'),
- (0x1AA0, 'V'),
- (0x1AAE, 'X'),
- (0x1AB0, 'V'),
- (0x1ACF, 'X'),
- (0x1B00, 'V'),
- (0x1B4D, 'X'),
- (0x1B50, 'V'),
- (0x1B7F, 'X'),
- (0x1B80, 'V'),
- (0x1BF4, 'X'),
- (0x1BFC, 'V'),
- (0x1C38, 'X'),
- (0x1C3B, 'V'),
- (0x1C4A, 'X'),
- (0x1C4D, 'V'),
- (0x1C80, 'M', 'в'),
+ (0x1316, "X"),
+ (0x1318, "V"),
+ (0x135B, "X"),
+ (0x135D, "V"),
+ (0x137D, "X"),
+ (0x1380, "V"),
+ (0x139A, "X"),
+ (0x13A0, "V"),
+ (0x13F6, "X"),
+ (0x13F8, "M", "Ᏸ"),
+ (0x13F9, "M", "Ᏹ"),
+ (0x13FA, "M", "Ᏺ"),
+ (0x13FB, "M", "Ᏻ"),
+ (0x13FC, "M", "Ᏼ"),
+ (0x13FD, "M", "Ᏽ"),
+ (0x13FE, "X"),
+ (0x1400, "V"),
+ (0x1680, "X"),
+ (0x1681, "V"),
+ (0x169D, "X"),
+ (0x16A0, "V"),
+ (0x16F9, "X"),
+ (0x1700, "V"),
+ (0x1716, "X"),
+ (0x171F, "V"),
+ (0x1737, "X"),
+ (0x1740, "V"),
+ (0x1754, "X"),
+ (0x1760, "V"),
+ (0x176D, "X"),
+ (0x176E, "V"),
+ (0x1771, "X"),
+ (0x1772, "V"),
+ (0x1774, "X"),
+ (0x1780, "V"),
+ (0x17B4, "X"),
+ (0x17B6, "V"),
+ (0x17DE, "X"),
+ (0x17E0, "V"),
+ (0x17EA, "X"),
+ (0x17F0, "V"),
+ (0x17FA, "X"),
+ (0x1800, "V"),
+ (0x1806, "X"),
+ (0x1807, "V"),
+ (0x180B, "I"),
+ (0x180E, "X"),
+ (0x180F, "I"),
+ (0x1810, "V"),
+ (0x181A, "X"),
+ (0x1820, "V"),
+ (0x1879, "X"),
+ (0x1880, "V"),
+ (0x18AB, "X"),
+ (0x18B0, "V"),
+ (0x18F6, "X"),
+ (0x1900, "V"),
+ (0x191F, "X"),
+ (0x1920, "V"),
+ (0x192C, "X"),
+ (0x1930, "V"),
+ (0x193C, "X"),
+ (0x1940, "V"),
+ (0x1941, "X"),
+ (0x1944, "V"),
+ (0x196E, "X"),
+ (0x1970, "V"),
+ (0x1975, "X"),
+ (0x1980, "V"),
+ (0x19AC, "X"),
+ (0x19B0, "V"),
+ (0x19CA, "X"),
+ (0x19D0, "V"),
+ (0x19DB, "X"),
+ (0x19DE, "V"),
+ (0x1A1C, "X"),
+ (0x1A1E, "V"),
+ (0x1A5F, "X"),
+ (0x1A60, "V"),
+ (0x1A7D, "X"),
+ (0x1A7F, "V"),
+ (0x1A8A, "X"),
+ (0x1A90, "V"),
+ (0x1A9A, "X"),
+ (0x1AA0, "V"),
+ (0x1AAE, "X"),
+ (0x1AB0, "V"),
+ (0x1ACF, "X"),
+ (0x1B00, "V"),
+ (0x1B4D, "X"),
+ (0x1B50, "V"),
+ (0x1B7F, "X"),
+ (0x1B80, "V"),
+ (0x1BF4, "X"),
+ (0x1BFC, "V"),
+ (0x1C38, "X"),
+ (0x1C3B, "V"),
+ (0x1C4A, "X"),
+ (0x1C4D, "V"),
+ (0x1C80, "M", "в"),
]
+
def _seg_15() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1C81, 'M', 'д'),
- (0x1C82, 'M', 'о'),
- (0x1C83, 'M', 'с'),
- (0x1C84, 'M', 'т'),
- (0x1C86, 'M', 'ъ'),
- (0x1C87, 'M', 'ѣ'),
- (0x1C88, 'M', 'ꙋ'),
- (0x1C89, 'X'),
- (0x1C90, 'M', 'ა'),
- (0x1C91, 'M', 'ბ'),
- (0x1C92, 'M', 'გ'),
- (0x1C93, 'M', 'დ'),
- (0x1C94, 'M', 'ე'),
- (0x1C95, 'M', 'ვ'),
- (0x1C96, 'M', 'ზ'),
- (0x1C97, 'M', 'თ'),
- (0x1C98, 'M', 'ი'),
- (0x1C99, 'M', 'კ'),
- (0x1C9A, 'M', 'ლ'),
- (0x1C9B, 'M', 'მ'),
- (0x1C9C, 'M', 'ნ'),
- (0x1C9D, 'M', 'ო'),
- (0x1C9E, 'M', 'პ'),
- (0x1C9F, 'M', 'ჟ'),
- (0x1CA0, 'M', 'რ'),
- (0x1CA1, 'M', 'ს'),
- (0x1CA2, 'M', 'ტ'),
- (0x1CA3, 'M', 'უ'),
- (0x1CA4, 'M', 'ფ'),
- (0x1CA5, 'M', 'ქ'),
- (0x1CA6, 'M', 'ღ'),
- (0x1CA7, 'M', 'ყ'),
- (0x1CA8, 'M', 'შ'),
- (0x1CA9, 'M', 'ჩ'),
- (0x1CAA, 'M', 'ც'),
- (0x1CAB, 'M', 'ძ'),
- (0x1CAC, 'M', 'წ'),
- (0x1CAD, 'M', 'ჭ'),
- (0x1CAE, 'M', 'ხ'),
- (0x1CAF, 'M', 'ჯ'),
- (0x1CB0, 'M', 'ჰ'),
- (0x1CB1, 'M', 'ჱ'),
- (0x1CB2, 'M', 'ჲ'),
- (0x1CB3, 'M', 'ჳ'),
- (0x1CB4, 'M', 'ჴ'),
- (0x1CB5, 'M', 'ჵ'),
- (0x1CB6, 'M', 'ჶ'),
- (0x1CB7, 'M', 'ჷ'),
- (0x1CB8, 'M', 'ჸ'),
- (0x1CB9, 'M', 'ჹ'),
- (0x1CBA, 'M', 'ჺ'),
- (0x1CBB, 'X'),
- (0x1CBD, 'M', 'ჽ'),
- (0x1CBE, 'M', 'ჾ'),
- (0x1CBF, 'M', 'ჿ'),
- (0x1CC0, 'V'),
- (0x1CC8, 'X'),
- (0x1CD0, 'V'),
- (0x1CFB, 'X'),
- (0x1D00, 'V'),
- (0x1D2C, 'M', 'a'),
- (0x1D2D, 'M', 'æ'),
- (0x1D2E, 'M', 'b'),
- (0x1D2F, 'V'),
- (0x1D30, 'M', 'd'),
- (0x1D31, 'M', 'e'),
- (0x1D32, 'M', 'ǝ'),
- (0x1D33, 'M', 'g'),
- (0x1D34, 'M', 'h'),
- (0x1D35, 'M', 'i'),
- (0x1D36, 'M', 'j'),
- (0x1D37, 'M', 'k'),
- (0x1D38, 'M', 'l'),
- (0x1D39, 'M', 'm'),
- (0x1D3A, 'M', 'n'),
- (0x1D3B, 'V'),
- (0x1D3C, 'M', 'o'),
- (0x1D3D, 'M', 'ȣ'),
- (0x1D3E, 'M', 'p'),
- (0x1D3F, 'M', 'r'),
- (0x1D40, 'M', 't'),
- (0x1D41, 'M', 'u'),
- (0x1D42, 'M', 'w'),
- (0x1D43, 'M', 'a'),
- (0x1D44, 'M', 'ɐ'),
- (0x1D45, 'M', 'ɑ'),
- (0x1D46, 'M', 'ᴂ'),
- (0x1D47, 'M', 'b'),
- (0x1D48, 'M', 'd'),
- (0x1D49, 'M', 'e'),
- (0x1D4A, 'M', 'ə'),
- (0x1D4B, 'M', 'ɛ'),
- (0x1D4C, 'M', 'ɜ'),
- (0x1D4D, 'M', 'g'),
- (0x1D4E, 'V'),
- (0x1D4F, 'M', 'k'),
- (0x1D50, 'M', 'm'),
- (0x1D51, 'M', 'ŋ'),
- (0x1D52, 'M', 'o'),
- (0x1D53, 'M', 'ɔ'),
+ (0x1C81, "M", "д"),
+ (0x1C82, "M", "о"),
+ (0x1C83, "M", "с"),
+ (0x1C84, "M", "т"),
+ (0x1C86, "M", "ъ"),
+ (0x1C87, "M", "ѣ"),
+ (0x1C88, "M", "ꙋ"),
+ (0x1C89, "X"),
+ (0x1C90, "M", "ა"),
+ (0x1C91, "M", "ბ"),
+ (0x1C92, "M", "გ"),
+ (0x1C93, "M", "დ"),
+ (0x1C94, "M", "ე"),
+ (0x1C95, "M", "ვ"),
+ (0x1C96, "M", "ზ"),
+ (0x1C97, "M", "თ"),
+ (0x1C98, "M", "ი"),
+ (0x1C99, "M", "კ"),
+ (0x1C9A, "M", "ლ"),
+ (0x1C9B, "M", "მ"),
+ (0x1C9C, "M", "ნ"),
+ (0x1C9D, "M", "ო"),
+ (0x1C9E, "M", "პ"),
+ (0x1C9F, "M", "ჟ"),
+ (0x1CA0, "M", "რ"),
+ (0x1CA1, "M", "ს"),
+ (0x1CA2, "M", "ტ"),
+ (0x1CA3, "M", "უ"),
+ (0x1CA4, "M", "ფ"),
+ (0x1CA5, "M", "ქ"),
+ (0x1CA6, "M", "ღ"),
+ (0x1CA7, "M", "ყ"),
+ (0x1CA8, "M", "შ"),
+ (0x1CA9, "M", "ჩ"),
+ (0x1CAA, "M", "ც"),
+ (0x1CAB, "M", "ძ"),
+ (0x1CAC, "M", "წ"),
+ (0x1CAD, "M", "ჭ"),
+ (0x1CAE, "M", "ხ"),
+ (0x1CAF, "M", "ჯ"),
+ (0x1CB0, "M", "ჰ"),
+ (0x1CB1, "M", "ჱ"),
+ (0x1CB2, "M", "ჲ"),
+ (0x1CB3, "M", "ჳ"),
+ (0x1CB4, "M", "ჴ"),
+ (0x1CB5, "M", "ჵ"),
+ (0x1CB6, "M", "ჶ"),
+ (0x1CB7, "M", "ჷ"),
+ (0x1CB8, "M", "ჸ"),
+ (0x1CB9, "M", "ჹ"),
+ (0x1CBA, "M", "ჺ"),
+ (0x1CBB, "X"),
+ (0x1CBD, "M", "ჽ"),
+ (0x1CBE, "M", "ჾ"),
+ (0x1CBF, "M", "ჿ"),
+ (0x1CC0, "V"),
+ (0x1CC8, "X"),
+ (0x1CD0, "V"),
+ (0x1CFB, "X"),
+ (0x1D00, "V"),
+ (0x1D2C, "M", "a"),
+ (0x1D2D, "M", "æ"),
+ (0x1D2E, "M", "b"),
+ (0x1D2F, "V"),
+ (0x1D30, "M", "d"),
+ (0x1D31, "M", "e"),
+ (0x1D32, "M", "ǝ"),
+ (0x1D33, "M", "g"),
+ (0x1D34, "M", "h"),
+ (0x1D35, "M", "i"),
+ (0x1D36, "M", "j"),
+ (0x1D37, "M", "k"),
+ (0x1D38, "M", "l"),
+ (0x1D39, "M", "m"),
+ (0x1D3A, "M", "n"),
+ (0x1D3B, "V"),
+ (0x1D3C, "M", "o"),
+ (0x1D3D, "M", "ȣ"),
+ (0x1D3E, "M", "p"),
+ (0x1D3F, "M", "r"),
+ (0x1D40, "M", "t"),
+ (0x1D41, "M", "u"),
+ (0x1D42, "M", "w"),
+ (0x1D43, "M", "a"),
+ (0x1D44, "M", "ɐ"),
+ (0x1D45, "M", "ɑ"),
+ (0x1D46, "M", "ᴂ"),
+ (0x1D47, "M", "b"),
+ (0x1D48, "M", "d"),
+ (0x1D49, "M", "e"),
+ (0x1D4A, "M", "ə"),
+ (0x1D4B, "M", "ɛ"),
+ (0x1D4C, "M", "ɜ"),
+ (0x1D4D, "M", "g"),
+ (0x1D4E, "V"),
+ (0x1D4F, "M", "k"),
+ (0x1D50, "M", "m"),
+ (0x1D51, "M", "ŋ"),
+ (0x1D52, "M", "o"),
+ (0x1D53, "M", "ɔ"),
]
+
def _seg_16() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D54, 'M', 'ᴖ'),
- (0x1D55, 'M', 'ᴗ'),
- (0x1D56, 'M', 'p'),
- (0x1D57, 'M', 't'),
- (0x1D58, 'M', 'u'),
- (0x1D59, 'M', 'ᴝ'),
- (0x1D5A, 'M', 'ɯ'),
- (0x1D5B, 'M', 'v'),
- (0x1D5C, 'M', 'ᴥ'),
- (0x1D5D, 'M', 'β'),
- (0x1D5E, 'M', 'γ'),
- (0x1D5F, 'M', 'δ'),
- (0x1D60, 'M', 'φ'),
- (0x1D61, 'M', 'χ'),
- (0x1D62, 'M', 'i'),
- (0x1D63, 'M', 'r'),
- (0x1D64, 'M', 'u'),
- (0x1D65, 'M', 'v'),
- (0x1D66, 'M', 'β'),
- (0x1D67, 'M', 'γ'),
- (0x1D68, 'M', 'ρ'),
- (0x1D69, 'M', 'φ'),
- (0x1D6A, 'M', 'χ'),
- (0x1D6B, 'V'),
- (0x1D78, 'M', 'н'),
- (0x1D79, 'V'),
- (0x1D9B, 'M', 'ɒ'),
- (0x1D9C, 'M', 'c'),
- (0x1D9D, 'M', 'ɕ'),
- (0x1D9E, 'M', 'ð'),
- (0x1D9F, 'M', 'ɜ'),
- (0x1DA0, 'M', 'f'),
- (0x1DA1, 'M', 'ɟ'),
- (0x1DA2, 'M', 'ɡ'),
- (0x1DA3, 'M', 'ɥ'),
- (0x1DA4, 'M', 'ɨ'),
- (0x1DA5, 'M', 'ɩ'),
- (0x1DA6, 'M', 'ɪ'),
- (0x1DA7, 'M', 'ᵻ'),
- (0x1DA8, 'M', 'ʝ'),
- (0x1DA9, 'M', 'ɭ'),
- (0x1DAA, 'M', 'ᶅ'),
- (0x1DAB, 'M', 'ʟ'),
- (0x1DAC, 'M', 'ɱ'),
- (0x1DAD, 'M', 'ɰ'),
- (0x1DAE, 'M', 'ɲ'),
- (0x1DAF, 'M', 'ɳ'),
- (0x1DB0, 'M', 'ɴ'),
- (0x1DB1, 'M', 'ɵ'),
- (0x1DB2, 'M', 'ɸ'),
- (0x1DB3, 'M', 'ʂ'),
- (0x1DB4, 'M', 'ʃ'),
- (0x1DB5, 'M', 'ƫ'),
- (0x1DB6, 'M', 'ʉ'),
- (0x1DB7, 'M', 'ʊ'),
- (0x1DB8, 'M', 'ᴜ'),
- (0x1DB9, 'M', 'ʋ'),
- (0x1DBA, 'M', 'ʌ'),
- (0x1DBB, 'M', 'z'),
- (0x1DBC, 'M', 'ʐ'),
- (0x1DBD, 'M', 'ʑ'),
- (0x1DBE, 'M', 'ʒ'),
- (0x1DBF, 'M', 'θ'),
- (0x1DC0, 'V'),
- (0x1E00, 'M', 'ḁ'),
- (0x1E01, 'V'),
- (0x1E02, 'M', 'ḃ'),
- (0x1E03, 'V'),
- (0x1E04, 'M', 'ḅ'),
- (0x1E05, 'V'),
- (0x1E06, 'M', 'ḇ'),
- (0x1E07, 'V'),
- (0x1E08, 'M', 'ḉ'),
- (0x1E09, 'V'),
- (0x1E0A, 'M', 'ḋ'),
- (0x1E0B, 'V'),
- (0x1E0C, 'M', 'ḍ'),
- (0x1E0D, 'V'),
- (0x1E0E, 'M', 'ḏ'),
- (0x1E0F, 'V'),
- (0x1E10, 'M', 'ḑ'),
- (0x1E11, 'V'),
- (0x1E12, 'M', 'ḓ'),
- (0x1E13, 'V'),
- (0x1E14, 'M', 'ḕ'),
- (0x1E15, 'V'),
- (0x1E16, 'M', 'ḗ'),
- (0x1E17, 'V'),
- (0x1E18, 'M', 'ḙ'),
- (0x1E19, 'V'),
- (0x1E1A, 'M', 'ḛ'),
- (0x1E1B, 'V'),
- (0x1E1C, 'M', 'ḝ'),
- (0x1E1D, 'V'),
- (0x1E1E, 'M', 'ḟ'),
- (0x1E1F, 'V'),
- (0x1E20, 'M', 'ḡ'),
- (0x1E21, 'V'),
- (0x1E22, 'M', 'ḣ'),
- (0x1E23, 'V'),
+ (0x1D54, "M", "ᴖ"),
+ (0x1D55, "M", "ᴗ"),
+ (0x1D56, "M", "p"),
+ (0x1D57, "M", "t"),
+ (0x1D58, "M", "u"),
+ (0x1D59, "M", "ᴝ"),
+ (0x1D5A, "M", "ɯ"),
+ (0x1D5B, "M", "v"),
+ (0x1D5C, "M", "ᴥ"),
+ (0x1D5D, "M", "β"),
+ (0x1D5E, "M", "γ"),
+ (0x1D5F, "M", "δ"),
+ (0x1D60, "M", "φ"),
+ (0x1D61, "M", "χ"),
+ (0x1D62, "M", "i"),
+ (0x1D63, "M", "r"),
+ (0x1D64, "M", "u"),
+ (0x1D65, "M", "v"),
+ (0x1D66, "M", "β"),
+ (0x1D67, "M", "γ"),
+ (0x1D68, "M", "ρ"),
+ (0x1D69, "M", "φ"),
+ (0x1D6A, "M", "χ"),
+ (0x1D6B, "V"),
+ (0x1D78, "M", "н"),
+ (0x1D79, "V"),
+ (0x1D9B, "M", "ɒ"),
+ (0x1D9C, "M", "c"),
+ (0x1D9D, "M", "ɕ"),
+ (0x1D9E, "M", "ð"),
+ (0x1D9F, "M", "ɜ"),
+ (0x1DA0, "M", "f"),
+ (0x1DA1, "M", "ɟ"),
+ (0x1DA2, "M", "ɡ"),
+ (0x1DA3, "M", "ɥ"),
+ (0x1DA4, "M", "ɨ"),
+ (0x1DA5, "M", "ɩ"),
+ (0x1DA6, "M", "ɪ"),
+ (0x1DA7, "M", "ᵻ"),
+ (0x1DA8, "M", "ʝ"),
+ (0x1DA9, "M", "ɭ"),
+ (0x1DAA, "M", "ᶅ"),
+ (0x1DAB, "M", "ʟ"),
+ (0x1DAC, "M", "ɱ"),
+ (0x1DAD, "M", "ɰ"),
+ (0x1DAE, "M", "ɲ"),
+ (0x1DAF, "M", "ɳ"),
+ (0x1DB0, "M", "ɴ"),
+ (0x1DB1, "M", "ɵ"),
+ (0x1DB2, "M", "ɸ"),
+ (0x1DB3, "M", "ʂ"),
+ (0x1DB4, "M", "ʃ"),
+ (0x1DB5, "M", "ƫ"),
+ (0x1DB6, "M", "ʉ"),
+ (0x1DB7, "M", "ʊ"),
+ (0x1DB8, "M", "ᴜ"),
+ (0x1DB9, "M", "ʋ"),
+ (0x1DBA, "M", "ʌ"),
+ (0x1DBB, "M", "z"),
+ (0x1DBC, "M", "ʐ"),
+ (0x1DBD, "M", "ʑ"),
+ (0x1DBE, "M", "ʒ"),
+ (0x1DBF, "M", "θ"),
+ (0x1DC0, "V"),
+ (0x1E00, "M", "ḁ"),
+ (0x1E01, "V"),
+ (0x1E02, "M", "ḃ"),
+ (0x1E03, "V"),
+ (0x1E04, "M", "ḅ"),
+ (0x1E05, "V"),
+ (0x1E06, "M", "ḇ"),
+ (0x1E07, "V"),
+ (0x1E08, "M", "ḉ"),
+ (0x1E09, "V"),
+ (0x1E0A, "M", "ḋ"),
+ (0x1E0B, "V"),
+ (0x1E0C, "M", "ḍ"),
+ (0x1E0D, "V"),
+ (0x1E0E, "M", "ḏ"),
+ (0x1E0F, "V"),
+ (0x1E10, "M", "ḑ"),
+ (0x1E11, "V"),
+ (0x1E12, "M", "ḓ"),
+ (0x1E13, "V"),
+ (0x1E14, "M", "ḕ"),
+ (0x1E15, "V"),
+ (0x1E16, "M", "ḗ"),
+ (0x1E17, "V"),
+ (0x1E18, "M", "ḙ"),
+ (0x1E19, "V"),
+ (0x1E1A, "M", "ḛ"),
+ (0x1E1B, "V"),
+ (0x1E1C, "M", "ḝ"),
+ (0x1E1D, "V"),
+ (0x1E1E, "M", "ḟ"),
+ (0x1E1F, "V"),
+ (0x1E20, "M", "ḡ"),
+ (0x1E21, "V"),
+ (0x1E22, "M", "ḣ"),
+ (0x1E23, "V"),
]
+
def _seg_17() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E24, 'M', 'ḥ'),
- (0x1E25, 'V'),
- (0x1E26, 'M', 'ḧ'),
- (0x1E27, 'V'),
- (0x1E28, 'M', 'ḩ'),
- (0x1E29, 'V'),
- (0x1E2A, 'M', 'ḫ'),
- (0x1E2B, 'V'),
- (0x1E2C, 'M', 'ḭ'),
- (0x1E2D, 'V'),
- (0x1E2E, 'M', 'ḯ'),
- (0x1E2F, 'V'),
- (0x1E30, 'M', 'ḱ'),
- (0x1E31, 'V'),
- (0x1E32, 'M', 'ḳ'),
- (0x1E33, 'V'),
- (0x1E34, 'M', 'ḵ'),
- (0x1E35, 'V'),
- (0x1E36, 'M', 'ḷ'),
- (0x1E37, 'V'),
- (0x1E38, 'M', 'ḹ'),
- (0x1E39, 'V'),
- (0x1E3A, 'M', 'ḻ'),
- (0x1E3B, 'V'),
- (0x1E3C, 'M', 'ḽ'),
- (0x1E3D, 'V'),
- (0x1E3E, 'M', 'ḿ'),
- (0x1E3F, 'V'),
- (0x1E40, 'M', 'ṁ'),
- (0x1E41, 'V'),
- (0x1E42, 'M', 'ṃ'),
- (0x1E43, 'V'),
- (0x1E44, 'M', 'ṅ'),
- (0x1E45, 'V'),
- (0x1E46, 'M', 'ṇ'),
- (0x1E47, 'V'),
- (0x1E48, 'M', 'ṉ'),
- (0x1E49, 'V'),
- (0x1E4A, 'M', 'ṋ'),
- (0x1E4B, 'V'),
- (0x1E4C, 'M', 'ṍ'),
- (0x1E4D, 'V'),
- (0x1E4E, 'M', 'ṏ'),
- (0x1E4F, 'V'),
- (0x1E50, 'M', 'ṑ'),
- (0x1E51, 'V'),
- (0x1E52, 'M', 'ṓ'),
- (0x1E53, 'V'),
- (0x1E54, 'M', 'ṕ'),
- (0x1E55, 'V'),
- (0x1E56, 'M', 'ṗ'),
- (0x1E57, 'V'),
- (0x1E58, 'M', 'ṙ'),
- (0x1E59, 'V'),
- (0x1E5A, 'M', 'ṛ'),
- (0x1E5B, 'V'),
- (0x1E5C, 'M', 'ṝ'),
- (0x1E5D, 'V'),
- (0x1E5E, 'M', 'ṟ'),
- (0x1E5F, 'V'),
- (0x1E60, 'M', 'ṡ'),
- (0x1E61, 'V'),
- (0x1E62, 'M', 'ṣ'),
- (0x1E63, 'V'),
- (0x1E64, 'M', 'ṥ'),
- (0x1E65, 'V'),
- (0x1E66, 'M', 'ṧ'),
- (0x1E67, 'V'),
- (0x1E68, 'M', 'ṩ'),
- (0x1E69, 'V'),
- (0x1E6A, 'M', 'ṫ'),
- (0x1E6B, 'V'),
- (0x1E6C, 'M', 'ṭ'),
- (0x1E6D, 'V'),
- (0x1E6E, 'M', 'ṯ'),
- (0x1E6F, 'V'),
- (0x1E70, 'M', 'ṱ'),
- (0x1E71, 'V'),
- (0x1E72, 'M', 'ṳ'),
- (0x1E73, 'V'),
- (0x1E74, 'M', 'ṵ'),
- (0x1E75, 'V'),
- (0x1E76, 'M', 'ṷ'),
- (0x1E77, 'V'),
- (0x1E78, 'M', 'ṹ'),
- (0x1E79, 'V'),
- (0x1E7A, 'M', 'ṻ'),
- (0x1E7B, 'V'),
- (0x1E7C, 'M', 'ṽ'),
- (0x1E7D, 'V'),
- (0x1E7E, 'M', 'ṿ'),
- (0x1E7F, 'V'),
- (0x1E80, 'M', 'ẁ'),
- (0x1E81, 'V'),
- (0x1E82, 'M', 'ẃ'),
- (0x1E83, 'V'),
- (0x1E84, 'M', 'ẅ'),
- (0x1E85, 'V'),
- (0x1E86, 'M', 'ẇ'),
- (0x1E87, 'V'),
+ (0x1E24, "M", "ḥ"),
+ (0x1E25, "V"),
+ (0x1E26, "M", "ḧ"),
+ (0x1E27, "V"),
+ (0x1E28, "M", "ḩ"),
+ (0x1E29, "V"),
+ (0x1E2A, "M", "ḫ"),
+ (0x1E2B, "V"),
+ (0x1E2C, "M", "ḭ"),
+ (0x1E2D, "V"),
+ (0x1E2E, "M", "ḯ"),
+ (0x1E2F, "V"),
+ (0x1E30, "M", "ḱ"),
+ (0x1E31, "V"),
+ (0x1E32, "M", "ḳ"),
+ (0x1E33, "V"),
+ (0x1E34, "M", "ḵ"),
+ (0x1E35, "V"),
+ (0x1E36, "M", "ḷ"),
+ (0x1E37, "V"),
+ (0x1E38, "M", "ḹ"),
+ (0x1E39, "V"),
+ (0x1E3A, "M", "ḻ"),
+ (0x1E3B, "V"),
+ (0x1E3C, "M", "ḽ"),
+ (0x1E3D, "V"),
+ (0x1E3E, "M", "ḿ"),
+ (0x1E3F, "V"),
+ (0x1E40, "M", "ṁ"),
+ (0x1E41, "V"),
+ (0x1E42, "M", "ṃ"),
+ (0x1E43, "V"),
+ (0x1E44, "M", "ṅ"),
+ (0x1E45, "V"),
+ (0x1E46, "M", "ṇ"),
+ (0x1E47, "V"),
+ (0x1E48, "M", "ṉ"),
+ (0x1E49, "V"),
+ (0x1E4A, "M", "ṋ"),
+ (0x1E4B, "V"),
+ (0x1E4C, "M", "ṍ"),
+ (0x1E4D, "V"),
+ (0x1E4E, "M", "ṏ"),
+ (0x1E4F, "V"),
+ (0x1E50, "M", "ṑ"),
+ (0x1E51, "V"),
+ (0x1E52, "M", "ṓ"),
+ (0x1E53, "V"),
+ (0x1E54, "M", "ṕ"),
+ (0x1E55, "V"),
+ (0x1E56, "M", "ṗ"),
+ (0x1E57, "V"),
+ (0x1E58, "M", "ṙ"),
+ (0x1E59, "V"),
+ (0x1E5A, "M", "ṛ"),
+ (0x1E5B, "V"),
+ (0x1E5C, "M", "ṝ"),
+ (0x1E5D, "V"),
+ (0x1E5E, "M", "ṟ"),
+ (0x1E5F, "V"),
+ (0x1E60, "M", "ṡ"),
+ (0x1E61, "V"),
+ (0x1E62, "M", "ṣ"),
+ (0x1E63, "V"),
+ (0x1E64, "M", "ṥ"),
+ (0x1E65, "V"),
+ (0x1E66, "M", "ṧ"),
+ (0x1E67, "V"),
+ (0x1E68, "M", "ṩ"),
+ (0x1E69, "V"),
+ (0x1E6A, "M", "ṫ"),
+ (0x1E6B, "V"),
+ (0x1E6C, "M", "ṭ"),
+ (0x1E6D, "V"),
+ (0x1E6E, "M", "ṯ"),
+ (0x1E6F, "V"),
+ (0x1E70, "M", "ṱ"),
+ (0x1E71, "V"),
+ (0x1E72, "M", "ṳ"),
+ (0x1E73, "V"),
+ (0x1E74, "M", "ṵ"),
+ (0x1E75, "V"),
+ (0x1E76, "M", "ṷ"),
+ (0x1E77, "V"),
+ (0x1E78, "M", "ṹ"),
+ (0x1E79, "V"),
+ (0x1E7A, "M", "ṻ"),
+ (0x1E7B, "V"),
+ (0x1E7C, "M", "ṽ"),
+ (0x1E7D, "V"),
+ (0x1E7E, "M", "ṿ"),
+ (0x1E7F, "V"),
+ (0x1E80, "M", "ẁ"),
+ (0x1E81, "V"),
+ (0x1E82, "M", "ẃ"),
+ (0x1E83, "V"),
+ (0x1E84, "M", "ẅ"),
+ (0x1E85, "V"),
+ (0x1E86, "M", "ẇ"),
+ (0x1E87, "V"),
]
+
def _seg_18() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E88, 'M', 'ẉ'),
- (0x1E89, 'V'),
- (0x1E8A, 'M', 'ẋ'),
- (0x1E8B, 'V'),
- (0x1E8C, 'M', 'ẍ'),
- (0x1E8D, 'V'),
- (0x1E8E, 'M', 'ẏ'),
- (0x1E8F, 'V'),
- (0x1E90, 'M', 'ẑ'),
- (0x1E91, 'V'),
- (0x1E92, 'M', 'ẓ'),
- (0x1E93, 'V'),
- (0x1E94, 'M', 'ẕ'),
- (0x1E95, 'V'),
- (0x1E9A, 'M', 'aʾ'),
- (0x1E9B, 'M', 'ṡ'),
- (0x1E9C, 'V'),
- (0x1E9E, 'M', 'ss'),
- (0x1E9F, 'V'),
- (0x1EA0, 'M', 'ạ'),
- (0x1EA1, 'V'),
- (0x1EA2, 'M', 'ả'),
- (0x1EA3, 'V'),
- (0x1EA4, 'M', 'ấ'),
- (0x1EA5, 'V'),
- (0x1EA6, 'M', 'ầ'),
- (0x1EA7, 'V'),
- (0x1EA8, 'M', 'ẩ'),
- (0x1EA9, 'V'),
- (0x1EAA, 'M', 'ẫ'),
- (0x1EAB, 'V'),
- (0x1EAC, 'M', 'ậ'),
- (0x1EAD, 'V'),
- (0x1EAE, 'M', 'ắ'),
- (0x1EAF, 'V'),
- (0x1EB0, 'M', 'ằ'),
- (0x1EB1, 'V'),
- (0x1EB2, 'M', 'ẳ'),
- (0x1EB3, 'V'),
- (0x1EB4, 'M', 'ẵ'),
- (0x1EB5, 'V'),
- (0x1EB6, 'M', 'ặ'),
- (0x1EB7, 'V'),
- (0x1EB8, 'M', 'ẹ'),
- (0x1EB9, 'V'),
- (0x1EBA, 'M', 'ẻ'),
- (0x1EBB, 'V'),
- (0x1EBC, 'M', 'ẽ'),
- (0x1EBD, 'V'),
- (0x1EBE, 'M', 'ế'),
- (0x1EBF, 'V'),
- (0x1EC0, 'M', 'ề'),
- (0x1EC1, 'V'),
- (0x1EC2, 'M', 'ể'),
- (0x1EC3, 'V'),
- (0x1EC4, 'M', 'ễ'),
- (0x1EC5, 'V'),
- (0x1EC6, 'M', 'ệ'),
- (0x1EC7, 'V'),
- (0x1EC8, 'M', 'ỉ'),
- (0x1EC9, 'V'),
- (0x1ECA, 'M', 'ị'),
- (0x1ECB, 'V'),
- (0x1ECC, 'M', 'ọ'),
- (0x1ECD, 'V'),
- (0x1ECE, 'M', 'ỏ'),
- (0x1ECF, 'V'),
- (0x1ED0, 'M', 'ố'),
- (0x1ED1, 'V'),
- (0x1ED2, 'M', 'ồ'),
- (0x1ED3, 'V'),
- (0x1ED4, 'M', 'ổ'),
- (0x1ED5, 'V'),
- (0x1ED6, 'M', 'ỗ'),
- (0x1ED7, 'V'),
- (0x1ED8, 'M', 'ộ'),
- (0x1ED9, 'V'),
- (0x1EDA, 'M', 'ớ'),
- (0x1EDB, 'V'),
- (0x1EDC, 'M', 'ờ'),
- (0x1EDD, 'V'),
- (0x1EDE, 'M', 'ở'),
- (0x1EDF, 'V'),
- (0x1EE0, 'M', 'ỡ'),
- (0x1EE1, 'V'),
- (0x1EE2, 'M', 'ợ'),
- (0x1EE3, 'V'),
- (0x1EE4, 'M', 'ụ'),
- (0x1EE5, 'V'),
- (0x1EE6, 'M', 'ủ'),
- (0x1EE7, 'V'),
- (0x1EE8, 'M', 'ứ'),
- (0x1EE9, 'V'),
- (0x1EEA, 'M', 'ừ'),
- (0x1EEB, 'V'),
- (0x1EEC, 'M', 'ử'),
- (0x1EED, 'V'),
- (0x1EEE, 'M', 'ữ'),
- (0x1EEF, 'V'),
- (0x1EF0, 'M', 'ự'),
+ (0x1E88, "M", "ẉ"),
+ (0x1E89, "V"),
+ (0x1E8A, "M", "ẋ"),
+ (0x1E8B, "V"),
+ (0x1E8C, "M", "ẍ"),
+ (0x1E8D, "V"),
+ (0x1E8E, "M", "ẏ"),
+ (0x1E8F, "V"),
+ (0x1E90, "M", "ẑ"),
+ (0x1E91, "V"),
+ (0x1E92, "M", "ẓ"),
+ (0x1E93, "V"),
+ (0x1E94, "M", "ẕ"),
+ (0x1E95, "V"),
+ (0x1E9A, "M", "aʾ"),
+ (0x1E9B, "M", "ṡ"),
+ (0x1E9C, "V"),
+ (0x1E9E, "M", "ß"),
+ (0x1E9F, "V"),
+ (0x1EA0, "M", "ạ"),
+ (0x1EA1, "V"),
+ (0x1EA2, "M", "ả"),
+ (0x1EA3, "V"),
+ (0x1EA4, "M", "ấ"),
+ (0x1EA5, "V"),
+ (0x1EA6, "M", "ầ"),
+ (0x1EA7, "V"),
+ (0x1EA8, "M", "ẩ"),
+ (0x1EA9, "V"),
+ (0x1EAA, "M", "ẫ"),
+ (0x1EAB, "V"),
+ (0x1EAC, "M", "ậ"),
+ (0x1EAD, "V"),
+ (0x1EAE, "M", "ắ"),
+ (0x1EAF, "V"),
+ (0x1EB0, "M", "ằ"),
+ (0x1EB1, "V"),
+ (0x1EB2, "M", "ẳ"),
+ (0x1EB3, "V"),
+ (0x1EB4, "M", "ẵ"),
+ (0x1EB5, "V"),
+ (0x1EB6, "M", "ặ"),
+ (0x1EB7, "V"),
+ (0x1EB8, "M", "ẹ"),
+ (0x1EB9, "V"),
+ (0x1EBA, "M", "ẻ"),
+ (0x1EBB, "V"),
+ (0x1EBC, "M", "ẽ"),
+ (0x1EBD, "V"),
+ (0x1EBE, "M", "ế"),
+ (0x1EBF, "V"),
+ (0x1EC0, "M", "ề"),
+ (0x1EC1, "V"),
+ (0x1EC2, "M", "ể"),
+ (0x1EC3, "V"),
+ (0x1EC4, "M", "ễ"),
+ (0x1EC5, "V"),
+ (0x1EC6, "M", "ệ"),
+ (0x1EC7, "V"),
+ (0x1EC8, "M", "ỉ"),
+ (0x1EC9, "V"),
+ (0x1ECA, "M", "ị"),
+ (0x1ECB, "V"),
+ (0x1ECC, "M", "ọ"),
+ (0x1ECD, "V"),
+ (0x1ECE, "M", "ỏ"),
+ (0x1ECF, "V"),
+ (0x1ED0, "M", "ố"),
+ (0x1ED1, "V"),
+ (0x1ED2, "M", "ồ"),
+ (0x1ED3, "V"),
+ (0x1ED4, "M", "ổ"),
+ (0x1ED5, "V"),
+ (0x1ED6, "M", "ỗ"),
+ (0x1ED7, "V"),
+ (0x1ED8, "M", "ộ"),
+ (0x1ED9, "V"),
+ (0x1EDA, "M", "ớ"),
+ (0x1EDB, "V"),
+ (0x1EDC, "M", "ờ"),
+ (0x1EDD, "V"),
+ (0x1EDE, "M", "ở"),
+ (0x1EDF, "V"),
+ (0x1EE0, "M", "ỡ"),
+ (0x1EE1, "V"),
+ (0x1EE2, "M", "ợ"),
+ (0x1EE3, "V"),
+ (0x1EE4, "M", "ụ"),
+ (0x1EE5, "V"),
+ (0x1EE6, "M", "ủ"),
+ (0x1EE7, "V"),
+ (0x1EE8, "M", "ứ"),
+ (0x1EE9, "V"),
+ (0x1EEA, "M", "ừ"),
+ (0x1EEB, "V"),
+ (0x1EEC, "M", "ử"),
+ (0x1EED, "V"),
+ (0x1EEE, "M", "ữ"),
+ (0x1EEF, "V"),
+ (0x1EF0, "M", "ự"),
]
+
def _seg_19() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EF1, 'V'),
- (0x1EF2, 'M', 'ỳ'),
- (0x1EF3, 'V'),
- (0x1EF4, 'M', 'ỵ'),
- (0x1EF5, 'V'),
- (0x1EF6, 'M', 'ỷ'),
- (0x1EF7, 'V'),
- (0x1EF8, 'M', 'ỹ'),
- (0x1EF9, 'V'),
- (0x1EFA, 'M', 'ỻ'),
- (0x1EFB, 'V'),
- (0x1EFC, 'M', 'ỽ'),
- (0x1EFD, 'V'),
- (0x1EFE, 'M', 'ỿ'),
- (0x1EFF, 'V'),
- (0x1F08, 'M', 'ἀ'),
- (0x1F09, 'M', 'ἁ'),
- (0x1F0A, 'M', 'ἂ'),
- (0x1F0B, 'M', 'ἃ'),
- (0x1F0C, 'M', 'ἄ'),
- (0x1F0D, 'M', 'ἅ'),
- (0x1F0E, 'M', 'ἆ'),
- (0x1F0F, 'M', 'ἇ'),
- (0x1F10, 'V'),
- (0x1F16, 'X'),
- (0x1F18, 'M', 'ἐ'),
- (0x1F19, 'M', 'ἑ'),
- (0x1F1A, 'M', 'ἒ'),
- (0x1F1B, 'M', 'ἓ'),
- (0x1F1C, 'M', 'ἔ'),
- (0x1F1D, 'M', 'ἕ'),
- (0x1F1E, 'X'),
- (0x1F20, 'V'),
- (0x1F28, 'M', 'ἠ'),
- (0x1F29, 'M', 'ἡ'),
- (0x1F2A, 'M', 'ἢ'),
- (0x1F2B, 'M', 'ἣ'),
- (0x1F2C, 'M', 'ἤ'),
- (0x1F2D, 'M', 'ἥ'),
- (0x1F2E, 'M', 'ἦ'),
- (0x1F2F, 'M', 'ἧ'),
- (0x1F30, 'V'),
- (0x1F38, 'M', 'ἰ'),
- (0x1F39, 'M', 'ἱ'),
- (0x1F3A, 'M', 'ἲ'),
- (0x1F3B, 'M', 'ἳ'),
- (0x1F3C, 'M', 'ἴ'),
- (0x1F3D, 'M', 'ἵ'),
- (0x1F3E, 'M', 'ἶ'),
- (0x1F3F, 'M', 'ἷ'),
- (0x1F40, 'V'),
- (0x1F46, 'X'),
- (0x1F48, 'M', 'ὀ'),
- (0x1F49, 'M', 'ὁ'),
- (0x1F4A, 'M', 'ὂ'),
- (0x1F4B, 'M', 'ὃ'),
- (0x1F4C, 'M', 'ὄ'),
- (0x1F4D, 'M', 'ὅ'),
- (0x1F4E, 'X'),
- (0x1F50, 'V'),
- (0x1F58, 'X'),
- (0x1F59, 'M', 'ὑ'),
- (0x1F5A, 'X'),
- (0x1F5B, 'M', 'ὓ'),
- (0x1F5C, 'X'),
- (0x1F5D, 'M', 'ὕ'),
- (0x1F5E, 'X'),
- (0x1F5F, 'M', 'ὗ'),
- (0x1F60, 'V'),
- (0x1F68, 'M', 'ὠ'),
- (0x1F69, 'M', 'ὡ'),
- (0x1F6A, 'M', 'ὢ'),
- (0x1F6B, 'M', 'ὣ'),
- (0x1F6C, 'M', 'ὤ'),
- (0x1F6D, 'M', 'ὥ'),
- (0x1F6E, 'M', 'ὦ'),
- (0x1F6F, 'M', 'ὧ'),
- (0x1F70, 'V'),
- (0x1F71, 'M', 'ά'),
- (0x1F72, 'V'),
- (0x1F73, 'M', 'έ'),
- (0x1F74, 'V'),
- (0x1F75, 'M', 'ή'),
- (0x1F76, 'V'),
- (0x1F77, 'M', 'ί'),
- (0x1F78, 'V'),
- (0x1F79, 'M', 'ό'),
- (0x1F7A, 'V'),
- (0x1F7B, 'M', 'ύ'),
- (0x1F7C, 'V'),
- (0x1F7D, 'M', 'ώ'),
- (0x1F7E, 'X'),
- (0x1F80, 'M', 'ἀι'),
- (0x1F81, 'M', 'ἁι'),
- (0x1F82, 'M', 'ἂι'),
- (0x1F83, 'M', 'ἃι'),
- (0x1F84, 'M', 'ἄι'),
- (0x1F85, 'M', 'ἅι'),
- (0x1F86, 'M', 'ἆι'),
- (0x1F87, 'M', 'ἇι'),
+ (0x1EF1, "V"),
+ (0x1EF2, "M", "ỳ"),
+ (0x1EF3, "V"),
+ (0x1EF4, "M", "ỵ"),
+ (0x1EF5, "V"),
+ (0x1EF6, "M", "ỷ"),
+ (0x1EF7, "V"),
+ (0x1EF8, "M", "ỹ"),
+ (0x1EF9, "V"),
+ (0x1EFA, "M", "ỻ"),
+ (0x1EFB, "V"),
+ (0x1EFC, "M", "ỽ"),
+ (0x1EFD, "V"),
+ (0x1EFE, "M", "ỿ"),
+ (0x1EFF, "V"),
+ (0x1F08, "M", "ἀ"),
+ (0x1F09, "M", "ἁ"),
+ (0x1F0A, "M", "ἂ"),
+ (0x1F0B, "M", "ἃ"),
+ (0x1F0C, "M", "ἄ"),
+ (0x1F0D, "M", "ἅ"),
+ (0x1F0E, "M", "ἆ"),
+ (0x1F0F, "M", "ἇ"),
+ (0x1F10, "V"),
+ (0x1F16, "X"),
+ (0x1F18, "M", "ἐ"),
+ (0x1F19, "M", "ἑ"),
+ (0x1F1A, "M", "ἒ"),
+ (0x1F1B, "M", "ἓ"),
+ (0x1F1C, "M", "ἔ"),
+ (0x1F1D, "M", "ἕ"),
+ (0x1F1E, "X"),
+ (0x1F20, "V"),
+ (0x1F28, "M", "ἠ"),
+ (0x1F29, "M", "ἡ"),
+ (0x1F2A, "M", "ἢ"),
+ (0x1F2B, "M", "ἣ"),
+ (0x1F2C, "M", "ἤ"),
+ (0x1F2D, "M", "ἥ"),
+ (0x1F2E, "M", "ἦ"),
+ (0x1F2F, "M", "ἧ"),
+ (0x1F30, "V"),
+ (0x1F38, "M", "ἰ"),
+ (0x1F39, "M", "ἱ"),
+ (0x1F3A, "M", "ἲ"),
+ (0x1F3B, "M", "ἳ"),
+ (0x1F3C, "M", "ἴ"),
+ (0x1F3D, "M", "ἵ"),
+ (0x1F3E, "M", "ἶ"),
+ (0x1F3F, "M", "ἷ"),
+ (0x1F40, "V"),
+ (0x1F46, "X"),
+ (0x1F48, "M", "ὀ"),
+ (0x1F49, "M", "ὁ"),
+ (0x1F4A, "M", "ὂ"),
+ (0x1F4B, "M", "ὃ"),
+ (0x1F4C, "M", "ὄ"),
+ (0x1F4D, "M", "ὅ"),
+ (0x1F4E, "X"),
+ (0x1F50, "V"),
+ (0x1F58, "X"),
+ (0x1F59, "M", "ὑ"),
+ (0x1F5A, "X"),
+ (0x1F5B, "M", "ὓ"),
+ (0x1F5C, "X"),
+ (0x1F5D, "M", "ὕ"),
+ (0x1F5E, "X"),
+ (0x1F5F, "M", "ὗ"),
+ (0x1F60, "V"),
+ (0x1F68, "M", "ὠ"),
+ (0x1F69, "M", "ὡ"),
+ (0x1F6A, "M", "ὢ"),
+ (0x1F6B, "M", "ὣ"),
+ (0x1F6C, "M", "ὤ"),
+ (0x1F6D, "M", "ὥ"),
+ (0x1F6E, "M", "ὦ"),
+ (0x1F6F, "M", "ὧ"),
+ (0x1F70, "V"),
+ (0x1F71, "M", "ά"),
+ (0x1F72, "V"),
+ (0x1F73, "M", "έ"),
+ (0x1F74, "V"),
+ (0x1F75, "M", "ή"),
+ (0x1F76, "V"),
+ (0x1F77, "M", "ί"),
+ (0x1F78, "V"),
+ (0x1F79, "M", "ό"),
+ (0x1F7A, "V"),
+ (0x1F7B, "M", "ύ"),
+ (0x1F7C, "V"),
+ (0x1F7D, "M", "ώ"),
+ (0x1F7E, "X"),
+ (0x1F80, "M", "ἀι"),
+ (0x1F81, "M", "ἁι"),
+ (0x1F82, "M", "ἂι"),
+ (0x1F83, "M", "ἃι"),
+ (0x1F84, "M", "ἄι"),
+ (0x1F85, "M", "ἅι"),
+ (0x1F86, "M", "ἆι"),
+ (0x1F87, "M", "ἇι"),
]
+
def _seg_20() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1F88, 'M', 'ἀι'),
- (0x1F89, 'M', 'ἁι'),
- (0x1F8A, 'M', 'ἂι'),
- (0x1F8B, 'M', 'ἃι'),
- (0x1F8C, 'M', 'ἄι'),
- (0x1F8D, 'M', 'ἅι'),
- (0x1F8E, 'M', 'ἆι'),
- (0x1F8F, 'M', 'ἇι'),
- (0x1F90, 'M', 'ἠι'),
- (0x1F91, 'M', 'ἡι'),
- (0x1F92, 'M', 'ἢι'),
- (0x1F93, 'M', 'ἣι'),
- (0x1F94, 'M', 'ἤι'),
- (0x1F95, 'M', 'ἥι'),
- (0x1F96, 'M', 'ἦι'),
- (0x1F97, 'M', 'ἧι'),
- (0x1F98, 'M', 'ἠι'),
- (0x1F99, 'M', 'ἡι'),
- (0x1F9A, 'M', 'ἢι'),
- (0x1F9B, 'M', 'ἣι'),
- (0x1F9C, 'M', 'ἤι'),
- (0x1F9D, 'M', 'ἥι'),
- (0x1F9E, 'M', 'ἦι'),
- (0x1F9F, 'M', 'ἧι'),
- (0x1FA0, 'M', 'ὠι'),
- (0x1FA1, 'M', 'ὡι'),
- (0x1FA2, 'M', 'ὢι'),
- (0x1FA3, 'M', 'ὣι'),
- (0x1FA4, 'M', 'ὤι'),
- (0x1FA5, 'M', 'ὥι'),
- (0x1FA6, 'M', 'ὦι'),
- (0x1FA7, 'M', 'ὧι'),
- (0x1FA8, 'M', 'ὠι'),
- (0x1FA9, 'M', 'ὡι'),
- (0x1FAA, 'M', 'ὢι'),
- (0x1FAB, 'M', 'ὣι'),
- (0x1FAC, 'M', 'ὤι'),
- (0x1FAD, 'M', 'ὥι'),
- (0x1FAE, 'M', 'ὦι'),
- (0x1FAF, 'M', 'ὧι'),
- (0x1FB0, 'V'),
- (0x1FB2, 'M', 'ὰι'),
- (0x1FB3, 'M', 'αι'),
- (0x1FB4, 'M', 'άι'),
- (0x1FB5, 'X'),
- (0x1FB6, 'V'),
- (0x1FB7, 'M', 'ᾶι'),
- (0x1FB8, 'M', 'ᾰ'),
- (0x1FB9, 'M', 'ᾱ'),
- (0x1FBA, 'M', 'ὰ'),
- (0x1FBB, 'M', 'ά'),
- (0x1FBC, 'M', 'αι'),
- (0x1FBD, '3', ' ̓'),
- (0x1FBE, 'M', 'ι'),
- (0x1FBF, '3', ' ̓'),
- (0x1FC0, '3', ' ͂'),
- (0x1FC1, '3', ' ̈͂'),
- (0x1FC2, 'M', 'ὴι'),
- (0x1FC3, 'M', 'ηι'),
- (0x1FC4, 'M', 'ήι'),
- (0x1FC5, 'X'),
- (0x1FC6, 'V'),
- (0x1FC7, 'M', 'ῆι'),
- (0x1FC8, 'M', 'ὲ'),
- (0x1FC9, 'M', 'έ'),
- (0x1FCA, 'M', 'ὴ'),
- (0x1FCB, 'M', 'ή'),
- (0x1FCC, 'M', 'ηι'),
- (0x1FCD, '3', ' ̓̀'),
- (0x1FCE, '3', ' ̓́'),
- (0x1FCF, '3', ' ̓͂'),
- (0x1FD0, 'V'),
- (0x1FD3, 'M', 'ΐ'),
- (0x1FD4, 'X'),
- (0x1FD6, 'V'),
- (0x1FD8, 'M', 'ῐ'),
- (0x1FD9, 'M', 'ῑ'),
- (0x1FDA, 'M', 'ὶ'),
- (0x1FDB, 'M', 'ί'),
- (0x1FDC, 'X'),
- (0x1FDD, '3', ' ̔̀'),
- (0x1FDE, '3', ' ̔́'),
- (0x1FDF, '3', ' ̔͂'),
- (0x1FE0, 'V'),
- (0x1FE3, 'M', 'ΰ'),
- (0x1FE4, 'V'),
- (0x1FE8, 'M', 'ῠ'),
- (0x1FE9, 'M', 'ῡ'),
- (0x1FEA, 'M', 'ὺ'),
- (0x1FEB, 'M', 'ύ'),
- (0x1FEC, 'M', 'ῥ'),
- (0x1FED, '3', ' ̈̀'),
- (0x1FEE, '3', ' ̈́'),
- (0x1FEF, '3', '`'),
- (0x1FF0, 'X'),
- (0x1FF2, 'M', 'ὼι'),
- (0x1FF3, 'M', 'ωι'),
- (0x1FF4, 'M', 'ώι'),
- (0x1FF5, 'X'),
- (0x1FF6, 'V'),
+ (0x1F88, "M", "ἀι"),
+ (0x1F89, "M", "ἁι"),
+ (0x1F8A, "M", "ἂι"),
+ (0x1F8B, "M", "ἃι"),
+ (0x1F8C, "M", "ἄι"),
+ (0x1F8D, "M", "ἅι"),
+ (0x1F8E, "M", "ἆι"),
+ (0x1F8F, "M", "ἇι"),
+ (0x1F90, "M", "ἠι"),
+ (0x1F91, "M", "ἡι"),
+ (0x1F92, "M", "ἢι"),
+ (0x1F93, "M", "ἣι"),
+ (0x1F94, "M", "ἤι"),
+ (0x1F95, "M", "ἥι"),
+ (0x1F96, "M", "ἦι"),
+ (0x1F97, "M", "ἧι"),
+ (0x1F98, "M", "ἠι"),
+ (0x1F99, "M", "ἡι"),
+ (0x1F9A, "M", "ἢι"),
+ (0x1F9B, "M", "ἣι"),
+ (0x1F9C, "M", "ἤι"),
+ (0x1F9D, "M", "ἥι"),
+ (0x1F9E, "M", "ἦι"),
+ (0x1F9F, "M", "ἧι"),
+ (0x1FA0, "M", "ὠι"),
+ (0x1FA1, "M", "ὡι"),
+ (0x1FA2, "M", "ὢι"),
+ (0x1FA3, "M", "ὣι"),
+ (0x1FA4, "M", "ὤι"),
+ (0x1FA5, "M", "ὥι"),
+ (0x1FA6, "M", "ὦι"),
+ (0x1FA7, "M", "ὧι"),
+ (0x1FA8, "M", "ὠι"),
+ (0x1FA9, "M", "ὡι"),
+ (0x1FAA, "M", "ὢι"),
+ (0x1FAB, "M", "ὣι"),
+ (0x1FAC, "M", "ὤι"),
+ (0x1FAD, "M", "ὥι"),
+ (0x1FAE, "M", "ὦι"),
+ (0x1FAF, "M", "ὧι"),
+ (0x1FB0, "V"),
+ (0x1FB2, "M", "ὰι"),
+ (0x1FB3, "M", "αι"),
+ (0x1FB4, "M", "άι"),
+ (0x1FB5, "X"),
+ (0x1FB6, "V"),
+ (0x1FB7, "M", "ᾶι"),
+ (0x1FB8, "M", "ᾰ"),
+ (0x1FB9, "M", "ᾱ"),
+ (0x1FBA, "M", "ὰ"),
+ (0x1FBB, "M", "ά"),
+ (0x1FBC, "M", "αι"),
+ (0x1FBD, "3", " ̓"),
+ (0x1FBE, "M", "ι"),
+ (0x1FBF, "3", " ̓"),
+ (0x1FC0, "3", " ͂"),
+ (0x1FC1, "3", " ̈͂"),
+ (0x1FC2, "M", "ὴι"),
+ (0x1FC3, "M", "ηι"),
+ (0x1FC4, "M", "ήι"),
+ (0x1FC5, "X"),
+ (0x1FC6, "V"),
+ (0x1FC7, "M", "ῆι"),
+ (0x1FC8, "M", "ὲ"),
+ (0x1FC9, "M", "έ"),
+ (0x1FCA, "M", "ὴ"),
+ (0x1FCB, "M", "ή"),
+ (0x1FCC, "M", "ηι"),
+ (0x1FCD, "3", " ̓̀"),
+ (0x1FCE, "3", " ̓́"),
+ (0x1FCF, "3", " ̓͂"),
+ (0x1FD0, "V"),
+ (0x1FD3, "M", "ΐ"),
+ (0x1FD4, "X"),
+ (0x1FD6, "V"),
+ (0x1FD8, "M", "ῐ"),
+ (0x1FD9, "M", "ῑ"),
+ (0x1FDA, "M", "ὶ"),
+ (0x1FDB, "M", "ί"),
+ (0x1FDC, "X"),
+ (0x1FDD, "3", " ̔̀"),
+ (0x1FDE, "3", " ̔́"),
+ (0x1FDF, "3", " ̔͂"),
+ (0x1FE0, "V"),
+ (0x1FE3, "M", "ΰ"),
+ (0x1FE4, "V"),
+ (0x1FE8, "M", "ῠ"),
+ (0x1FE9, "M", "ῡ"),
+ (0x1FEA, "M", "ὺ"),
+ (0x1FEB, "M", "ύ"),
+ (0x1FEC, "M", "ῥ"),
+ (0x1FED, "3", " ̈̀"),
+ (0x1FEE, "3", " ̈́"),
+ (0x1FEF, "3", "`"),
+ (0x1FF0, "X"),
+ (0x1FF2, "M", "ὼι"),
+ (0x1FF3, "M", "ωι"),
+ (0x1FF4, "M", "ώι"),
+ (0x1FF5, "X"),
+ (0x1FF6, "V"),
]
+
def _seg_21() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1FF7, 'M', 'ῶι'),
- (0x1FF8, 'M', 'ὸ'),
- (0x1FF9, 'M', 'ό'),
- (0x1FFA, 'M', 'ὼ'),
- (0x1FFB, 'M', 'ώ'),
- (0x1FFC, 'M', 'ωι'),
- (0x1FFD, '3', ' ́'),
- (0x1FFE, '3', ' ̔'),
- (0x1FFF, 'X'),
- (0x2000, '3', ' '),
- (0x200B, 'I'),
- (0x200C, 'D', ''),
- (0x200E, 'X'),
- (0x2010, 'V'),
- (0x2011, 'M', '‐'),
- (0x2012, 'V'),
- (0x2017, '3', ' ̳'),
- (0x2018, 'V'),
- (0x2024, 'X'),
- (0x2027, 'V'),
- (0x2028, 'X'),
- (0x202F, '3', ' '),
- (0x2030, 'V'),
- (0x2033, 'M', '′′'),
- (0x2034, 'M', '′′′'),
- (0x2035, 'V'),
- (0x2036, 'M', '‵‵'),
- (0x2037, 'M', '‵‵‵'),
- (0x2038, 'V'),
- (0x203C, '3', '!!'),
- (0x203D, 'V'),
- (0x203E, '3', ' ̅'),
- (0x203F, 'V'),
- (0x2047, '3', '??'),
- (0x2048, '3', '?!'),
- (0x2049, '3', '!?'),
- (0x204A, 'V'),
- (0x2057, 'M', '′′′′'),
- (0x2058, 'V'),
- (0x205F, '3', ' '),
- (0x2060, 'I'),
- (0x2061, 'X'),
- (0x2064, 'I'),
- (0x2065, 'X'),
- (0x2070, 'M', '0'),
- (0x2071, 'M', 'i'),
- (0x2072, 'X'),
- (0x2074, 'M', '4'),
- (0x2075, 'M', '5'),
- (0x2076, 'M', '6'),
- (0x2077, 'M', '7'),
- (0x2078, 'M', '8'),
- (0x2079, 'M', '9'),
- (0x207A, '3', '+'),
- (0x207B, 'M', '−'),
- (0x207C, '3', '='),
- (0x207D, '3', '('),
- (0x207E, '3', ')'),
- (0x207F, 'M', 'n'),
- (0x2080, 'M', '0'),
- (0x2081, 'M', '1'),
- (0x2082, 'M', '2'),
- (0x2083, 'M', '3'),
- (0x2084, 'M', '4'),
- (0x2085, 'M', '5'),
- (0x2086, 'M', '6'),
- (0x2087, 'M', '7'),
- (0x2088, 'M', '8'),
- (0x2089, 'M', '9'),
- (0x208A, '3', '+'),
- (0x208B, 'M', '−'),
- (0x208C, '3', '='),
- (0x208D, '3', '('),
- (0x208E, '3', ')'),
- (0x208F, 'X'),
- (0x2090, 'M', 'a'),
- (0x2091, 'M', 'e'),
- (0x2092, 'M', 'o'),
- (0x2093, 'M', 'x'),
- (0x2094, 'M', 'ə'),
- (0x2095, 'M', 'h'),
- (0x2096, 'M', 'k'),
- (0x2097, 'M', 'l'),
- (0x2098, 'M', 'm'),
- (0x2099, 'M', 'n'),
- (0x209A, 'M', 'p'),
- (0x209B, 'M', 's'),
- (0x209C, 'M', 't'),
- (0x209D, 'X'),
- (0x20A0, 'V'),
- (0x20A8, 'M', 'rs'),
- (0x20A9, 'V'),
- (0x20C1, 'X'),
- (0x20D0, 'V'),
- (0x20F1, 'X'),
- (0x2100, '3', 'a/c'),
- (0x2101, '3', 'a/s'),
- (0x2102, 'M', 'c'),
- (0x2103, 'M', '°c'),
- (0x2104, 'V'),
+ (0x1FF7, "M", "ῶι"),
+ (0x1FF8, "M", "ὸ"),
+ (0x1FF9, "M", "ό"),
+ (0x1FFA, "M", "ὼ"),
+ (0x1FFB, "M", "ώ"),
+ (0x1FFC, "M", "ωι"),
+ (0x1FFD, "3", " ́"),
+ (0x1FFE, "3", " ̔"),
+ (0x1FFF, "X"),
+ (0x2000, "3", " "),
+ (0x200B, "I"),
+ (0x200C, "D", ""),
+ (0x200E, "X"),
+ (0x2010, "V"),
+ (0x2011, "M", "‐"),
+ (0x2012, "V"),
+ (0x2017, "3", " ̳"),
+ (0x2018, "V"),
+ (0x2024, "X"),
+ (0x2027, "V"),
+ (0x2028, "X"),
+ (0x202F, "3", " "),
+ (0x2030, "V"),
+ (0x2033, "M", "′′"),
+ (0x2034, "M", "′′′"),
+ (0x2035, "V"),
+ (0x2036, "M", "‵‵"),
+ (0x2037, "M", "‵‵‵"),
+ (0x2038, "V"),
+ (0x203C, "3", "!!"),
+ (0x203D, "V"),
+ (0x203E, "3", " ̅"),
+ (0x203F, "V"),
+ (0x2047, "3", "??"),
+ (0x2048, "3", "?!"),
+ (0x2049, "3", "!?"),
+ (0x204A, "V"),
+ (0x2057, "M", "′′′′"),
+ (0x2058, "V"),
+ (0x205F, "3", " "),
+ (0x2060, "I"),
+ (0x2061, "X"),
+ (0x2064, "I"),
+ (0x2065, "X"),
+ (0x2070, "M", "0"),
+ (0x2071, "M", "i"),
+ (0x2072, "X"),
+ (0x2074, "M", "4"),
+ (0x2075, "M", "5"),
+ (0x2076, "M", "6"),
+ (0x2077, "M", "7"),
+ (0x2078, "M", "8"),
+ (0x2079, "M", "9"),
+ (0x207A, "3", "+"),
+ (0x207B, "M", "−"),
+ (0x207C, "3", "="),
+ (0x207D, "3", "("),
+ (0x207E, "3", ")"),
+ (0x207F, "M", "n"),
+ (0x2080, "M", "0"),
+ (0x2081, "M", "1"),
+ (0x2082, "M", "2"),
+ (0x2083, "M", "3"),
+ (0x2084, "M", "4"),
+ (0x2085, "M", "5"),
+ (0x2086, "M", "6"),
+ (0x2087, "M", "7"),
+ (0x2088, "M", "8"),
+ (0x2089, "M", "9"),
+ (0x208A, "3", "+"),
+ (0x208B, "M", "−"),
+ (0x208C, "3", "="),
+ (0x208D, "3", "("),
+ (0x208E, "3", ")"),
+ (0x208F, "X"),
+ (0x2090, "M", "a"),
+ (0x2091, "M", "e"),
+ (0x2092, "M", "o"),
+ (0x2093, "M", "x"),
+ (0x2094, "M", "ə"),
+ (0x2095, "M", "h"),
+ (0x2096, "M", "k"),
+ (0x2097, "M", "l"),
+ (0x2098, "M", "m"),
+ (0x2099, "M", "n"),
+ (0x209A, "M", "p"),
+ (0x209B, "M", "s"),
+ (0x209C, "M", "t"),
+ (0x209D, "X"),
+ (0x20A0, "V"),
+ (0x20A8, "M", "rs"),
+ (0x20A9, "V"),
+ (0x20C1, "X"),
+ (0x20D0, "V"),
+ (0x20F1, "X"),
+ (0x2100, "3", "a/c"),
+ (0x2101, "3", "a/s"),
+ (0x2102, "M", "c"),
+ (0x2103, "M", "°c"),
+ (0x2104, "V"),
]
+
def _seg_22() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2105, '3', 'c/o'),
- (0x2106, '3', 'c/u'),
- (0x2107, 'M', 'ɛ'),
- (0x2108, 'V'),
- (0x2109, 'M', '°f'),
- (0x210A, 'M', 'g'),
- (0x210B, 'M', 'h'),
- (0x210F, 'M', 'ħ'),
- (0x2110, 'M', 'i'),
- (0x2112, 'M', 'l'),
- (0x2114, 'V'),
- (0x2115, 'M', 'n'),
- (0x2116, 'M', 'no'),
- (0x2117, 'V'),
- (0x2119, 'M', 'p'),
- (0x211A, 'M', 'q'),
- (0x211B, 'M', 'r'),
- (0x211E, 'V'),
- (0x2120, 'M', 'sm'),
- (0x2121, 'M', 'tel'),
- (0x2122, 'M', 'tm'),
- (0x2123, 'V'),
- (0x2124, 'M', 'z'),
- (0x2125, 'V'),
- (0x2126, 'M', 'ω'),
- (0x2127, 'V'),
- (0x2128, 'M', 'z'),
- (0x2129, 'V'),
- (0x212A, 'M', 'k'),
- (0x212B, 'M', 'å'),
- (0x212C, 'M', 'b'),
- (0x212D, 'M', 'c'),
- (0x212E, 'V'),
- (0x212F, 'M', 'e'),
- (0x2131, 'M', 'f'),
- (0x2132, 'X'),
- (0x2133, 'M', 'm'),
- (0x2134, 'M', 'o'),
- (0x2135, 'M', 'א'),
- (0x2136, 'M', 'ב'),
- (0x2137, 'M', 'ג'),
- (0x2138, 'M', 'ד'),
- (0x2139, 'M', 'i'),
- (0x213A, 'V'),
- (0x213B, 'M', 'fax'),
- (0x213C, 'M', 'π'),
- (0x213D, 'M', 'γ'),
- (0x213F, 'M', 'π'),
- (0x2140, 'M', '∑'),
- (0x2141, 'V'),
- (0x2145, 'M', 'd'),
- (0x2147, 'M', 'e'),
- (0x2148, 'M', 'i'),
- (0x2149, 'M', 'j'),
- (0x214A, 'V'),
- (0x2150, 'M', '1⁄7'),
- (0x2151, 'M', '1⁄9'),
- (0x2152, 'M', '1⁄10'),
- (0x2153, 'M', '1⁄3'),
- (0x2154, 'M', '2⁄3'),
- (0x2155, 'M', '1⁄5'),
- (0x2156, 'M', '2⁄5'),
- (0x2157, 'M', '3⁄5'),
- (0x2158, 'M', '4⁄5'),
- (0x2159, 'M', '1⁄6'),
- (0x215A, 'M', '5⁄6'),
- (0x215B, 'M', '1⁄8'),
- (0x215C, 'M', '3⁄8'),
- (0x215D, 'M', '5⁄8'),
- (0x215E, 'M', '7⁄8'),
- (0x215F, 'M', '1⁄'),
- (0x2160, 'M', 'i'),
- (0x2161, 'M', 'ii'),
- (0x2162, 'M', 'iii'),
- (0x2163, 'M', 'iv'),
- (0x2164, 'M', 'v'),
- (0x2165, 'M', 'vi'),
- (0x2166, 'M', 'vii'),
- (0x2167, 'M', 'viii'),
- (0x2168, 'M', 'ix'),
- (0x2169, 'M', 'x'),
- (0x216A, 'M', 'xi'),
- (0x216B, 'M', 'xii'),
- (0x216C, 'M', 'l'),
- (0x216D, 'M', 'c'),
- (0x216E, 'M', 'd'),
- (0x216F, 'M', 'm'),
- (0x2170, 'M', 'i'),
- (0x2171, 'M', 'ii'),
- (0x2172, 'M', 'iii'),
- (0x2173, 'M', 'iv'),
- (0x2174, 'M', 'v'),
- (0x2175, 'M', 'vi'),
- (0x2176, 'M', 'vii'),
- (0x2177, 'M', 'viii'),
- (0x2178, 'M', 'ix'),
- (0x2179, 'M', 'x'),
- (0x217A, 'M', 'xi'),
- (0x217B, 'M', 'xii'),
- (0x217C, 'M', 'l'),
+ (0x2105, "3", "c/o"),
+ (0x2106, "3", "c/u"),
+ (0x2107, "M", "ɛ"),
+ (0x2108, "V"),
+ (0x2109, "M", "°f"),
+ (0x210A, "M", "g"),
+ (0x210B, "M", "h"),
+ (0x210F, "M", "ħ"),
+ (0x2110, "M", "i"),
+ (0x2112, "M", "l"),
+ (0x2114, "V"),
+ (0x2115, "M", "n"),
+ (0x2116, "M", "no"),
+ (0x2117, "V"),
+ (0x2119, "M", "p"),
+ (0x211A, "M", "q"),
+ (0x211B, "M", "r"),
+ (0x211E, "V"),
+ (0x2120, "M", "sm"),
+ (0x2121, "M", "tel"),
+ (0x2122, "M", "tm"),
+ (0x2123, "V"),
+ (0x2124, "M", "z"),
+ (0x2125, "V"),
+ (0x2126, "M", "ω"),
+ (0x2127, "V"),
+ (0x2128, "M", "z"),
+ (0x2129, "V"),
+ (0x212A, "M", "k"),
+ (0x212B, "M", "å"),
+ (0x212C, "M", "b"),
+ (0x212D, "M", "c"),
+ (0x212E, "V"),
+ (0x212F, "M", "e"),
+ (0x2131, "M", "f"),
+ (0x2132, "X"),
+ (0x2133, "M", "m"),
+ (0x2134, "M", "o"),
+ (0x2135, "M", "א"),
+ (0x2136, "M", "ב"),
+ (0x2137, "M", "ג"),
+ (0x2138, "M", "ד"),
+ (0x2139, "M", "i"),
+ (0x213A, "V"),
+ (0x213B, "M", "fax"),
+ (0x213C, "M", "π"),
+ (0x213D, "M", "γ"),
+ (0x213F, "M", "π"),
+ (0x2140, "M", "∑"),
+ (0x2141, "V"),
+ (0x2145, "M", "d"),
+ (0x2147, "M", "e"),
+ (0x2148, "M", "i"),
+ (0x2149, "M", "j"),
+ (0x214A, "V"),
+ (0x2150, "M", "1⁄7"),
+ (0x2151, "M", "1⁄9"),
+ (0x2152, "M", "1⁄10"),
+ (0x2153, "M", "1⁄3"),
+ (0x2154, "M", "2⁄3"),
+ (0x2155, "M", "1⁄5"),
+ (0x2156, "M", "2⁄5"),
+ (0x2157, "M", "3⁄5"),
+ (0x2158, "M", "4⁄5"),
+ (0x2159, "M", "1⁄6"),
+ (0x215A, "M", "5⁄6"),
+ (0x215B, "M", "1⁄8"),
+ (0x215C, "M", "3⁄8"),
+ (0x215D, "M", "5⁄8"),
+ (0x215E, "M", "7⁄8"),
+ (0x215F, "M", "1⁄"),
+ (0x2160, "M", "i"),
+ (0x2161, "M", "ii"),
+ (0x2162, "M", "iii"),
+ (0x2163, "M", "iv"),
+ (0x2164, "M", "v"),
+ (0x2165, "M", "vi"),
+ (0x2166, "M", "vii"),
+ (0x2167, "M", "viii"),
+ (0x2168, "M", "ix"),
+ (0x2169, "M", "x"),
+ (0x216A, "M", "xi"),
+ (0x216B, "M", "xii"),
+ (0x216C, "M", "l"),
+ (0x216D, "M", "c"),
+ (0x216E, "M", "d"),
+ (0x216F, "M", "m"),
+ (0x2170, "M", "i"),
+ (0x2171, "M", "ii"),
+ (0x2172, "M", "iii"),
+ (0x2173, "M", "iv"),
+ (0x2174, "M", "v"),
+ (0x2175, "M", "vi"),
+ (0x2176, "M", "vii"),
+ (0x2177, "M", "viii"),
+ (0x2178, "M", "ix"),
+ (0x2179, "M", "x"),
+ (0x217A, "M", "xi"),
+ (0x217B, "M", "xii"),
+ (0x217C, "M", "l"),
]
+
def _seg_23() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x217D, 'M', 'c'),
- (0x217E, 'M', 'd'),
- (0x217F, 'M', 'm'),
- (0x2180, 'V'),
- (0x2183, 'X'),
- (0x2184, 'V'),
- (0x2189, 'M', '0⁄3'),
- (0x218A, 'V'),
- (0x218C, 'X'),
- (0x2190, 'V'),
- (0x222C, 'M', '∫∫'),
- (0x222D, 'M', '∫∫∫'),
- (0x222E, 'V'),
- (0x222F, 'M', '∮∮'),
- (0x2230, 'M', '∮∮∮'),
- (0x2231, 'V'),
- (0x2260, '3'),
- (0x2261, 'V'),
- (0x226E, '3'),
- (0x2270, 'V'),
- (0x2329, 'M', '〈'),
- (0x232A, 'M', '〉'),
- (0x232B, 'V'),
- (0x2427, 'X'),
- (0x2440, 'V'),
- (0x244B, 'X'),
- (0x2460, 'M', '1'),
- (0x2461, 'M', '2'),
- (0x2462, 'M', '3'),
- (0x2463, 'M', '4'),
- (0x2464, 'M', '5'),
- (0x2465, 'M', '6'),
- (0x2466, 'M', '7'),
- (0x2467, 'M', '8'),
- (0x2468, 'M', '9'),
- (0x2469, 'M', '10'),
- (0x246A, 'M', '11'),
- (0x246B, 'M', '12'),
- (0x246C, 'M', '13'),
- (0x246D, 'M', '14'),
- (0x246E, 'M', '15'),
- (0x246F, 'M', '16'),
- (0x2470, 'M', '17'),
- (0x2471, 'M', '18'),
- (0x2472, 'M', '19'),
- (0x2473, 'M', '20'),
- (0x2474, '3', '(1)'),
- (0x2475, '3', '(2)'),
- (0x2476, '3', '(3)'),
- (0x2477, '3', '(4)'),
- (0x2478, '3', '(5)'),
- (0x2479, '3', '(6)'),
- (0x247A, '3', '(7)'),
- (0x247B, '3', '(8)'),
- (0x247C, '3', '(9)'),
- (0x247D, '3', '(10)'),
- (0x247E, '3', '(11)'),
- (0x247F, '3', '(12)'),
- (0x2480, '3', '(13)'),
- (0x2481, '3', '(14)'),
- (0x2482, '3', '(15)'),
- (0x2483, '3', '(16)'),
- (0x2484, '3', '(17)'),
- (0x2485, '3', '(18)'),
- (0x2486, '3', '(19)'),
- (0x2487, '3', '(20)'),
- (0x2488, 'X'),
- (0x249C, '3', '(a)'),
- (0x249D, '3', '(b)'),
- (0x249E, '3', '(c)'),
- (0x249F, '3', '(d)'),
- (0x24A0, '3', '(e)'),
- (0x24A1, '3', '(f)'),
- (0x24A2, '3', '(g)'),
- (0x24A3, '3', '(h)'),
- (0x24A4, '3', '(i)'),
- (0x24A5, '3', '(j)'),
- (0x24A6, '3', '(k)'),
- (0x24A7, '3', '(l)'),
- (0x24A8, '3', '(m)'),
- (0x24A9, '3', '(n)'),
- (0x24AA, '3', '(o)'),
- (0x24AB, '3', '(p)'),
- (0x24AC, '3', '(q)'),
- (0x24AD, '3', '(r)'),
- (0x24AE, '3', '(s)'),
- (0x24AF, '3', '(t)'),
- (0x24B0, '3', '(u)'),
- (0x24B1, '3', '(v)'),
- (0x24B2, '3', '(w)'),
- (0x24B3, '3', '(x)'),
- (0x24B4, '3', '(y)'),
- (0x24B5, '3', '(z)'),
- (0x24B6, 'M', 'a'),
- (0x24B7, 'M', 'b'),
- (0x24B8, 'M', 'c'),
- (0x24B9, 'M', 'd'),
- (0x24BA, 'M', 'e'),
- (0x24BB, 'M', 'f'),
- (0x24BC, 'M', 'g'),
+ (0x217D, "M", "c"),
+ (0x217E, "M", "d"),
+ (0x217F, "M", "m"),
+ (0x2180, "V"),
+ (0x2183, "X"),
+ (0x2184, "V"),
+ (0x2189, "M", "0⁄3"),
+ (0x218A, "V"),
+ (0x218C, "X"),
+ (0x2190, "V"),
+ (0x222C, "M", "∫∫"),
+ (0x222D, "M", "∫∫∫"),
+ (0x222E, "V"),
+ (0x222F, "M", "∮∮"),
+ (0x2230, "M", "∮∮∮"),
+ (0x2231, "V"),
+ (0x2329, "M", "〈"),
+ (0x232A, "M", "〉"),
+ (0x232B, "V"),
+ (0x2427, "X"),
+ (0x2440, "V"),
+ (0x244B, "X"),
+ (0x2460, "M", "1"),
+ (0x2461, "M", "2"),
+ (0x2462, "M", "3"),
+ (0x2463, "M", "4"),
+ (0x2464, "M", "5"),
+ (0x2465, "M", "6"),
+ (0x2466, "M", "7"),
+ (0x2467, "M", "8"),
+ (0x2468, "M", "9"),
+ (0x2469, "M", "10"),
+ (0x246A, "M", "11"),
+ (0x246B, "M", "12"),
+ (0x246C, "M", "13"),
+ (0x246D, "M", "14"),
+ (0x246E, "M", "15"),
+ (0x246F, "M", "16"),
+ (0x2470, "M", "17"),
+ (0x2471, "M", "18"),
+ (0x2472, "M", "19"),
+ (0x2473, "M", "20"),
+ (0x2474, "3", "(1)"),
+ (0x2475, "3", "(2)"),
+ (0x2476, "3", "(3)"),
+ (0x2477, "3", "(4)"),
+ (0x2478, "3", "(5)"),
+ (0x2479, "3", "(6)"),
+ (0x247A, "3", "(7)"),
+ (0x247B, "3", "(8)"),
+ (0x247C, "3", "(9)"),
+ (0x247D, "3", "(10)"),
+ (0x247E, "3", "(11)"),
+ (0x247F, "3", "(12)"),
+ (0x2480, "3", "(13)"),
+ (0x2481, "3", "(14)"),
+ (0x2482, "3", "(15)"),
+ (0x2483, "3", "(16)"),
+ (0x2484, "3", "(17)"),
+ (0x2485, "3", "(18)"),
+ (0x2486, "3", "(19)"),
+ (0x2487, "3", "(20)"),
+ (0x2488, "X"),
+ (0x249C, "3", "(a)"),
+ (0x249D, "3", "(b)"),
+ (0x249E, "3", "(c)"),
+ (0x249F, "3", "(d)"),
+ (0x24A0, "3", "(e)"),
+ (0x24A1, "3", "(f)"),
+ (0x24A2, "3", "(g)"),
+ (0x24A3, "3", "(h)"),
+ (0x24A4, "3", "(i)"),
+ (0x24A5, "3", "(j)"),
+ (0x24A6, "3", "(k)"),
+ (0x24A7, "3", "(l)"),
+ (0x24A8, "3", "(m)"),
+ (0x24A9, "3", "(n)"),
+ (0x24AA, "3", "(o)"),
+ (0x24AB, "3", "(p)"),
+ (0x24AC, "3", "(q)"),
+ (0x24AD, "3", "(r)"),
+ (0x24AE, "3", "(s)"),
+ (0x24AF, "3", "(t)"),
+ (0x24B0, "3", "(u)"),
+ (0x24B1, "3", "(v)"),
+ (0x24B2, "3", "(w)"),
+ (0x24B3, "3", "(x)"),
+ (0x24B4, "3", "(y)"),
+ (0x24B5, "3", "(z)"),
+ (0x24B6, "M", "a"),
+ (0x24B7, "M", "b"),
+ (0x24B8, "M", "c"),
+ (0x24B9, "M", "d"),
+ (0x24BA, "M", "e"),
+ (0x24BB, "M", "f"),
+ (0x24BC, "M", "g"),
+ (0x24BD, "M", "h"),
+ (0x24BE, "M", "i"),
+ (0x24BF, "M", "j"),
+ (0x24C0, "M", "k"),
]
+
def _seg_24() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x24BD, 'M', 'h'),
- (0x24BE, 'M', 'i'),
- (0x24BF, 'M', 'j'),
- (0x24C0, 'M', 'k'),
- (0x24C1, 'M', 'l'),
- (0x24C2, 'M', 'm'),
- (0x24C3, 'M', 'n'),
- (0x24C4, 'M', 'o'),
- (0x24C5, 'M', 'p'),
- (0x24C6, 'M', 'q'),
- (0x24C7, 'M', 'r'),
- (0x24C8, 'M', 's'),
- (0x24C9, 'M', 't'),
- (0x24CA, 'M', 'u'),
- (0x24CB, 'M', 'v'),
- (0x24CC, 'M', 'w'),
- (0x24CD, 'M', 'x'),
- (0x24CE, 'M', 'y'),
- (0x24CF, 'M', 'z'),
- (0x24D0, 'M', 'a'),
- (0x24D1, 'M', 'b'),
- (0x24D2, 'M', 'c'),
- (0x24D3, 'M', 'd'),
- (0x24D4, 'M', 'e'),
- (0x24D5, 'M', 'f'),
- (0x24D6, 'M', 'g'),
- (0x24D7, 'M', 'h'),
- (0x24D8, 'M', 'i'),
- (0x24D9, 'M', 'j'),
- (0x24DA, 'M', 'k'),
- (0x24DB, 'M', 'l'),
- (0x24DC, 'M', 'm'),
- (0x24DD, 'M', 'n'),
- (0x24DE, 'M', 'o'),
- (0x24DF, 'M', 'p'),
- (0x24E0, 'M', 'q'),
- (0x24E1, 'M', 'r'),
- (0x24E2, 'M', 's'),
- (0x24E3, 'M', 't'),
- (0x24E4, 'M', 'u'),
- (0x24E5, 'M', 'v'),
- (0x24E6, 'M', 'w'),
- (0x24E7, 'M', 'x'),
- (0x24E8, 'M', 'y'),
- (0x24E9, 'M', 'z'),
- (0x24EA, 'M', '0'),
- (0x24EB, 'V'),
- (0x2A0C, 'M', '∫∫∫∫'),
- (0x2A0D, 'V'),
- (0x2A74, '3', '::='),
- (0x2A75, '3', '=='),
- (0x2A76, '3', '==='),
- (0x2A77, 'V'),
- (0x2ADC, 'M', '⫝̸'),
- (0x2ADD, 'V'),
- (0x2B74, 'X'),
- (0x2B76, 'V'),
- (0x2B96, 'X'),
- (0x2B97, 'V'),
- (0x2C00, 'M', 'ⰰ'),
- (0x2C01, 'M', 'ⰱ'),
- (0x2C02, 'M', 'ⰲ'),
- (0x2C03, 'M', 'ⰳ'),
- (0x2C04, 'M', 'ⰴ'),
- (0x2C05, 'M', 'ⰵ'),
- (0x2C06, 'M', 'ⰶ'),
- (0x2C07, 'M', 'ⰷ'),
- (0x2C08, 'M', 'ⰸ'),
- (0x2C09, 'M', 'ⰹ'),
- (0x2C0A, 'M', 'ⰺ'),
- (0x2C0B, 'M', 'ⰻ'),
- (0x2C0C, 'M', 'ⰼ'),
- (0x2C0D, 'M', 'ⰽ'),
- (0x2C0E, 'M', 'ⰾ'),
- (0x2C0F, 'M', 'ⰿ'),
- (0x2C10, 'M', 'ⱀ'),
- (0x2C11, 'M', 'ⱁ'),
- (0x2C12, 'M', 'ⱂ'),
- (0x2C13, 'M', 'ⱃ'),
- (0x2C14, 'M', 'ⱄ'),
- (0x2C15, 'M', 'ⱅ'),
- (0x2C16, 'M', 'ⱆ'),
- (0x2C17, 'M', 'ⱇ'),
- (0x2C18, 'M', 'ⱈ'),
- (0x2C19, 'M', 'ⱉ'),
- (0x2C1A, 'M', 'ⱊ'),
- (0x2C1B, 'M', 'ⱋ'),
- (0x2C1C, 'M', 'ⱌ'),
- (0x2C1D, 'M', 'ⱍ'),
- (0x2C1E, 'M', 'ⱎ'),
- (0x2C1F, 'M', 'ⱏ'),
- (0x2C20, 'M', 'ⱐ'),
- (0x2C21, 'M', 'ⱑ'),
- (0x2C22, 'M', 'ⱒ'),
- (0x2C23, 'M', 'ⱓ'),
- (0x2C24, 'M', 'ⱔ'),
- (0x2C25, 'M', 'ⱕ'),
- (0x2C26, 'M', 'ⱖ'),
- (0x2C27, 'M', 'ⱗ'),
- (0x2C28, 'M', 'ⱘ'),
+ (0x24C1, "M", "l"),
+ (0x24C2, "M", "m"),
+ (0x24C3, "M", "n"),
+ (0x24C4, "M", "o"),
+ (0x24C5, "M", "p"),
+ (0x24C6, "M", "q"),
+ (0x24C7, "M", "r"),
+ (0x24C8, "M", "s"),
+ (0x24C9, "M", "t"),
+ (0x24CA, "M", "u"),
+ (0x24CB, "M", "v"),
+ (0x24CC, "M", "w"),
+ (0x24CD, "M", "x"),
+ (0x24CE, "M", "y"),
+ (0x24CF, "M", "z"),
+ (0x24D0, "M", "a"),
+ (0x24D1, "M", "b"),
+ (0x24D2, "M", "c"),
+ (0x24D3, "M", "d"),
+ (0x24D4, "M", "e"),
+ (0x24D5, "M", "f"),
+ (0x24D6, "M", "g"),
+ (0x24D7, "M", "h"),
+ (0x24D8, "M", "i"),
+ (0x24D9, "M", "j"),
+ (0x24DA, "M", "k"),
+ (0x24DB, "M", "l"),
+ (0x24DC, "M", "m"),
+ (0x24DD, "M", "n"),
+ (0x24DE, "M", "o"),
+ (0x24DF, "M", "p"),
+ (0x24E0, "M", "q"),
+ (0x24E1, "M", "r"),
+ (0x24E2, "M", "s"),
+ (0x24E3, "M", "t"),
+ (0x24E4, "M", "u"),
+ (0x24E5, "M", "v"),
+ (0x24E6, "M", "w"),
+ (0x24E7, "M", "x"),
+ (0x24E8, "M", "y"),
+ (0x24E9, "M", "z"),
+ (0x24EA, "M", "0"),
+ (0x24EB, "V"),
+ (0x2A0C, "M", "∫∫∫∫"),
+ (0x2A0D, "V"),
+ (0x2A74, "3", "::="),
+ (0x2A75, "3", "=="),
+ (0x2A76, "3", "==="),
+ (0x2A77, "V"),
+ (0x2ADC, "M", "⫝̸"),
+ (0x2ADD, "V"),
+ (0x2B74, "X"),
+ (0x2B76, "V"),
+ (0x2B96, "X"),
+ (0x2B97, "V"),
+ (0x2C00, "M", "ⰰ"),
+ (0x2C01, "M", "ⰱ"),
+ (0x2C02, "M", "ⰲ"),
+ (0x2C03, "M", "ⰳ"),
+ (0x2C04, "M", "ⰴ"),
+ (0x2C05, "M", "ⰵ"),
+ (0x2C06, "M", "ⰶ"),
+ (0x2C07, "M", "ⰷ"),
+ (0x2C08, "M", "ⰸ"),
+ (0x2C09, "M", "ⰹ"),
+ (0x2C0A, "M", "ⰺ"),
+ (0x2C0B, "M", "ⰻ"),
+ (0x2C0C, "M", "ⰼ"),
+ (0x2C0D, "M", "ⰽ"),
+ (0x2C0E, "M", "ⰾ"),
+ (0x2C0F, "M", "ⰿ"),
+ (0x2C10, "M", "ⱀ"),
+ (0x2C11, "M", "ⱁ"),
+ (0x2C12, "M", "ⱂ"),
+ (0x2C13, "M", "ⱃ"),
+ (0x2C14, "M", "ⱄ"),
+ (0x2C15, "M", "ⱅ"),
+ (0x2C16, "M", "ⱆ"),
+ (0x2C17, "M", "ⱇ"),
+ (0x2C18, "M", "ⱈ"),
+ (0x2C19, "M", "ⱉ"),
+ (0x2C1A, "M", "ⱊ"),
+ (0x2C1B, "M", "ⱋ"),
+ (0x2C1C, "M", "ⱌ"),
+ (0x2C1D, "M", "ⱍ"),
+ (0x2C1E, "M", "ⱎ"),
+ (0x2C1F, "M", "ⱏ"),
+ (0x2C20, "M", "ⱐ"),
+ (0x2C21, "M", "ⱑ"),
+ (0x2C22, "M", "ⱒ"),
+ (0x2C23, "M", "ⱓ"),
+ (0x2C24, "M", "ⱔ"),
+ (0x2C25, "M", "ⱕ"),
+ (0x2C26, "M", "ⱖ"),
+ (0x2C27, "M", "ⱗ"),
+ (0x2C28, "M", "ⱘ"),
+ (0x2C29, "M", "ⱙ"),
+ (0x2C2A, "M", "ⱚ"),
+ (0x2C2B, "M", "ⱛ"),
+ (0x2C2C, "M", "ⱜ"),
]
+
def _seg_25() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2C29, 'M', 'ⱙ'),
- (0x2C2A, 'M', 'ⱚ'),
- (0x2C2B, 'M', 'ⱛ'),
- (0x2C2C, 'M', 'ⱜ'),
- (0x2C2D, 'M', 'ⱝ'),
- (0x2C2E, 'M', 'ⱞ'),
- (0x2C2F, 'M', 'ⱟ'),
- (0x2C30, 'V'),
- (0x2C60, 'M', 'ⱡ'),
- (0x2C61, 'V'),
- (0x2C62, 'M', 'ɫ'),
- (0x2C63, 'M', 'ᵽ'),
- (0x2C64, 'M', 'ɽ'),
- (0x2C65, 'V'),
- (0x2C67, 'M', 'ⱨ'),
- (0x2C68, 'V'),
- (0x2C69, 'M', 'ⱪ'),
- (0x2C6A, 'V'),
- (0x2C6B, 'M', 'ⱬ'),
- (0x2C6C, 'V'),
- (0x2C6D, 'M', 'ɑ'),
- (0x2C6E, 'M', 'ɱ'),
- (0x2C6F, 'M', 'ɐ'),
- (0x2C70, 'M', 'ɒ'),
- (0x2C71, 'V'),
- (0x2C72, 'M', 'ⱳ'),
- (0x2C73, 'V'),
- (0x2C75, 'M', 'ⱶ'),
- (0x2C76, 'V'),
- (0x2C7C, 'M', 'j'),
- (0x2C7D, 'M', 'v'),
- (0x2C7E, 'M', 'ȿ'),
- (0x2C7F, 'M', 'ɀ'),
- (0x2C80, 'M', 'ⲁ'),
- (0x2C81, 'V'),
- (0x2C82, 'M', 'ⲃ'),
- (0x2C83, 'V'),
- (0x2C84, 'M', 'ⲅ'),
- (0x2C85, 'V'),
- (0x2C86, 'M', 'ⲇ'),
- (0x2C87, 'V'),
- (0x2C88, 'M', 'ⲉ'),
- (0x2C89, 'V'),
- (0x2C8A, 'M', 'ⲋ'),
- (0x2C8B, 'V'),
- (0x2C8C, 'M', 'ⲍ'),
- (0x2C8D, 'V'),
- (0x2C8E, 'M', 'ⲏ'),
- (0x2C8F, 'V'),
- (0x2C90, 'M', 'ⲑ'),
- (0x2C91, 'V'),
- (0x2C92, 'M', 'ⲓ'),
- (0x2C93, 'V'),
- (0x2C94, 'M', 'ⲕ'),
- (0x2C95, 'V'),
- (0x2C96, 'M', 'ⲗ'),
- (0x2C97, 'V'),
- (0x2C98, 'M', 'ⲙ'),
- (0x2C99, 'V'),
- (0x2C9A, 'M', 'ⲛ'),
- (0x2C9B, 'V'),
- (0x2C9C, 'M', 'ⲝ'),
- (0x2C9D, 'V'),
- (0x2C9E, 'M', 'ⲟ'),
- (0x2C9F, 'V'),
- (0x2CA0, 'M', 'ⲡ'),
- (0x2CA1, 'V'),
- (0x2CA2, 'M', 'ⲣ'),
- (0x2CA3, 'V'),
- (0x2CA4, 'M', 'ⲥ'),
- (0x2CA5, 'V'),
- (0x2CA6, 'M', 'ⲧ'),
- (0x2CA7, 'V'),
- (0x2CA8, 'M', 'ⲩ'),
- (0x2CA9, 'V'),
- (0x2CAA, 'M', 'ⲫ'),
- (0x2CAB, 'V'),
- (0x2CAC, 'M', 'ⲭ'),
- (0x2CAD, 'V'),
- (0x2CAE, 'M', 'ⲯ'),
- (0x2CAF, 'V'),
- (0x2CB0, 'M', 'ⲱ'),
- (0x2CB1, 'V'),
- (0x2CB2, 'M', 'ⲳ'),
- (0x2CB3, 'V'),
- (0x2CB4, 'M', 'ⲵ'),
- (0x2CB5, 'V'),
- (0x2CB6, 'M', 'ⲷ'),
- (0x2CB7, 'V'),
- (0x2CB8, 'M', 'ⲹ'),
- (0x2CB9, 'V'),
- (0x2CBA, 'M', 'ⲻ'),
- (0x2CBB, 'V'),
- (0x2CBC, 'M', 'ⲽ'),
- (0x2CBD, 'V'),
- (0x2CBE, 'M', 'ⲿ'),
- (0x2CBF, 'V'),
- (0x2CC0, 'M', 'ⳁ'),
- (0x2CC1, 'V'),
- (0x2CC2, 'M', 'ⳃ'),
+ (0x2C2D, "M", "ⱝ"),
+ (0x2C2E, "M", "ⱞ"),
+ (0x2C2F, "M", "ⱟ"),
+ (0x2C30, "V"),
+ (0x2C60, "M", "ⱡ"),
+ (0x2C61, "V"),
+ (0x2C62, "M", "ɫ"),
+ (0x2C63, "M", "ᵽ"),
+ (0x2C64, "M", "ɽ"),
+ (0x2C65, "V"),
+ (0x2C67, "M", "ⱨ"),
+ (0x2C68, "V"),
+ (0x2C69, "M", "ⱪ"),
+ (0x2C6A, "V"),
+ (0x2C6B, "M", "ⱬ"),
+ (0x2C6C, "V"),
+ (0x2C6D, "M", "ɑ"),
+ (0x2C6E, "M", "ɱ"),
+ (0x2C6F, "M", "ɐ"),
+ (0x2C70, "M", "ɒ"),
+ (0x2C71, "V"),
+ (0x2C72, "M", "ⱳ"),
+ (0x2C73, "V"),
+ (0x2C75, "M", "ⱶ"),
+ (0x2C76, "V"),
+ (0x2C7C, "M", "j"),
+ (0x2C7D, "M", "v"),
+ (0x2C7E, "M", "ȿ"),
+ (0x2C7F, "M", "ɀ"),
+ (0x2C80, "M", "ⲁ"),
+ (0x2C81, "V"),
+ (0x2C82, "M", "ⲃ"),
+ (0x2C83, "V"),
+ (0x2C84, "M", "ⲅ"),
+ (0x2C85, "V"),
+ (0x2C86, "M", "ⲇ"),
+ (0x2C87, "V"),
+ (0x2C88, "M", "ⲉ"),
+ (0x2C89, "V"),
+ (0x2C8A, "M", "ⲋ"),
+ (0x2C8B, "V"),
+ (0x2C8C, "M", "ⲍ"),
+ (0x2C8D, "V"),
+ (0x2C8E, "M", "ⲏ"),
+ (0x2C8F, "V"),
+ (0x2C90, "M", "ⲑ"),
+ (0x2C91, "V"),
+ (0x2C92, "M", "ⲓ"),
+ (0x2C93, "V"),
+ (0x2C94, "M", "ⲕ"),
+ (0x2C95, "V"),
+ (0x2C96, "M", "ⲗ"),
+ (0x2C97, "V"),
+ (0x2C98, "M", "ⲙ"),
+ (0x2C99, "V"),
+ (0x2C9A, "M", "ⲛ"),
+ (0x2C9B, "V"),
+ (0x2C9C, "M", "ⲝ"),
+ (0x2C9D, "V"),
+ (0x2C9E, "M", "ⲟ"),
+ (0x2C9F, "V"),
+ (0x2CA0, "M", "ⲡ"),
+ (0x2CA1, "V"),
+ (0x2CA2, "M", "ⲣ"),
+ (0x2CA3, "V"),
+ (0x2CA4, "M", "ⲥ"),
+ (0x2CA5, "V"),
+ (0x2CA6, "M", "ⲧ"),
+ (0x2CA7, "V"),
+ (0x2CA8, "M", "ⲩ"),
+ (0x2CA9, "V"),
+ (0x2CAA, "M", "ⲫ"),
+ (0x2CAB, "V"),
+ (0x2CAC, "M", "ⲭ"),
+ (0x2CAD, "V"),
+ (0x2CAE, "M", "ⲯ"),
+ (0x2CAF, "V"),
+ (0x2CB0, "M", "ⲱ"),
+ (0x2CB1, "V"),
+ (0x2CB2, "M", "ⲳ"),
+ (0x2CB3, "V"),
+ (0x2CB4, "M", "ⲵ"),
+ (0x2CB5, "V"),
+ (0x2CB6, "M", "ⲷ"),
+ (0x2CB7, "V"),
+ (0x2CB8, "M", "ⲹ"),
+ (0x2CB9, "V"),
+ (0x2CBA, "M", "ⲻ"),
+ (0x2CBB, "V"),
+ (0x2CBC, "M", "ⲽ"),
+ (0x2CBD, "V"),
+ (0x2CBE, "M", "ⲿ"),
+ (0x2CBF, "V"),
+ (0x2CC0, "M", "ⳁ"),
+ (0x2CC1, "V"),
+ (0x2CC2, "M", "ⳃ"),
+ (0x2CC3, "V"),
+ (0x2CC4, "M", "ⳅ"),
+ (0x2CC5, "V"),
+ (0x2CC6, "M", "ⳇ"),
]
+
def _seg_26() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2CC3, 'V'),
- (0x2CC4, 'M', 'ⳅ'),
- (0x2CC5, 'V'),
- (0x2CC6, 'M', 'ⳇ'),
- (0x2CC7, 'V'),
- (0x2CC8, 'M', 'ⳉ'),
- (0x2CC9, 'V'),
- (0x2CCA, 'M', 'ⳋ'),
- (0x2CCB, 'V'),
- (0x2CCC, 'M', 'ⳍ'),
- (0x2CCD, 'V'),
- (0x2CCE, 'M', 'ⳏ'),
- (0x2CCF, 'V'),
- (0x2CD0, 'M', 'ⳑ'),
- (0x2CD1, 'V'),
- (0x2CD2, 'M', 'ⳓ'),
- (0x2CD3, 'V'),
- (0x2CD4, 'M', 'ⳕ'),
- (0x2CD5, 'V'),
- (0x2CD6, 'M', 'ⳗ'),
- (0x2CD7, 'V'),
- (0x2CD8, 'M', 'ⳙ'),
- (0x2CD9, 'V'),
- (0x2CDA, 'M', 'ⳛ'),
- (0x2CDB, 'V'),
- (0x2CDC, 'M', 'ⳝ'),
- (0x2CDD, 'V'),
- (0x2CDE, 'M', 'ⳟ'),
- (0x2CDF, 'V'),
- (0x2CE0, 'M', 'ⳡ'),
- (0x2CE1, 'V'),
- (0x2CE2, 'M', 'ⳣ'),
- (0x2CE3, 'V'),
- (0x2CEB, 'M', 'ⳬ'),
- (0x2CEC, 'V'),
- (0x2CED, 'M', 'ⳮ'),
- (0x2CEE, 'V'),
- (0x2CF2, 'M', 'ⳳ'),
- (0x2CF3, 'V'),
- (0x2CF4, 'X'),
- (0x2CF9, 'V'),
- (0x2D26, 'X'),
- (0x2D27, 'V'),
- (0x2D28, 'X'),
- (0x2D2D, 'V'),
- (0x2D2E, 'X'),
- (0x2D30, 'V'),
- (0x2D68, 'X'),
- (0x2D6F, 'M', 'ⵡ'),
- (0x2D70, 'V'),
- (0x2D71, 'X'),
- (0x2D7F, 'V'),
- (0x2D97, 'X'),
- (0x2DA0, 'V'),
- (0x2DA7, 'X'),
- (0x2DA8, 'V'),
- (0x2DAF, 'X'),
- (0x2DB0, 'V'),
- (0x2DB7, 'X'),
- (0x2DB8, 'V'),
- (0x2DBF, 'X'),
- (0x2DC0, 'V'),
- (0x2DC7, 'X'),
- (0x2DC8, 'V'),
- (0x2DCF, 'X'),
- (0x2DD0, 'V'),
- (0x2DD7, 'X'),
- (0x2DD8, 'V'),
- (0x2DDF, 'X'),
- (0x2DE0, 'V'),
- (0x2E5E, 'X'),
- (0x2E80, 'V'),
- (0x2E9A, 'X'),
- (0x2E9B, 'V'),
- (0x2E9F, 'M', '母'),
- (0x2EA0, 'V'),
- (0x2EF3, 'M', '龟'),
- (0x2EF4, 'X'),
- (0x2F00, 'M', '一'),
- (0x2F01, 'M', '丨'),
- (0x2F02, 'M', '丶'),
- (0x2F03, 'M', '丿'),
- (0x2F04, 'M', '乙'),
- (0x2F05, 'M', '亅'),
- (0x2F06, 'M', '二'),
- (0x2F07, 'M', '亠'),
- (0x2F08, 'M', '人'),
- (0x2F09, 'M', '儿'),
- (0x2F0A, 'M', '入'),
- (0x2F0B, 'M', '八'),
- (0x2F0C, 'M', '冂'),
- (0x2F0D, 'M', '冖'),
- (0x2F0E, 'M', '冫'),
- (0x2F0F, 'M', '几'),
- (0x2F10, 'M', '凵'),
- (0x2F11, 'M', '刀'),
- (0x2F12, 'M', '力'),
- (0x2F13, 'M', '勹'),
- (0x2F14, 'M', '匕'),
- (0x2F15, 'M', '匚'),
+ (0x2CC7, "V"),
+ (0x2CC8, "M", "ⳉ"),
+ (0x2CC9, "V"),
+ (0x2CCA, "M", "ⳋ"),
+ (0x2CCB, "V"),
+ (0x2CCC, "M", "ⳍ"),
+ (0x2CCD, "V"),
+ (0x2CCE, "M", "ⳏ"),
+ (0x2CCF, "V"),
+ (0x2CD0, "M", "ⳑ"),
+ (0x2CD1, "V"),
+ (0x2CD2, "M", "ⳓ"),
+ (0x2CD3, "V"),
+ (0x2CD4, "M", "ⳕ"),
+ (0x2CD5, "V"),
+ (0x2CD6, "M", "ⳗ"),
+ (0x2CD7, "V"),
+ (0x2CD8, "M", "ⳙ"),
+ (0x2CD9, "V"),
+ (0x2CDA, "M", "ⳛ"),
+ (0x2CDB, "V"),
+ (0x2CDC, "M", "ⳝ"),
+ (0x2CDD, "V"),
+ (0x2CDE, "M", "ⳟ"),
+ (0x2CDF, "V"),
+ (0x2CE0, "M", "ⳡ"),
+ (0x2CE1, "V"),
+ (0x2CE2, "M", "ⳣ"),
+ (0x2CE3, "V"),
+ (0x2CEB, "M", "ⳬ"),
+ (0x2CEC, "V"),
+ (0x2CED, "M", "ⳮ"),
+ (0x2CEE, "V"),
+ (0x2CF2, "M", "ⳳ"),
+ (0x2CF3, "V"),
+ (0x2CF4, "X"),
+ (0x2CF9, "V"),
+ (0x2D26, "X"),
+ (0x2D27, "V"),
+ (0x2D28, "X"),
+ (0x2D2D, "V"),
+ (0x2D2E, "X"),
+ (0x2D30, "V"),
+ (0x2D68, "X"),
+ (0x2D6F, "M", "ⵡ"),
+ (0x2D70, "V"),
+ (0x2D71, "X"),
+ (0x2D7F, "V"),
+ (0x2D97, "X"),
+ (0x2DA0, "V"),
+ (0x2DA7, "X"),
+ (0x2DA8, "V"),
+ (0x2DAF, "X"),
+ (0x2DB0, "V"),
+ (0x2DB7, "X"),
+ (0x2DB8, "V"),
+ (0x2DBF, "X"),
+ (0x2DC0, "V"),
+ (0x2DC7, "X"),
+ (0x2DC8, "V"),
+ (0x2DCF, "X"),
+ (0x2DD0, "V"),
+ (0x2DD7, "X"),
+ (0x2DD8, "V"),
+ (0x2DDF, "X"),
+ (0x2DE0, "V"),
+ (0x2E5E, "X"),
+ (0x2E80, "V"),
+ (0x2E9A, "X"),
+ (0x2E9B, "V"),
+ (0x2E9F, "M", "母"),
+ (0x2EA0, "V"),
+ (0x2EF3, "M", "龟"),
+ (0x2EF4, "X"),
+ (0x2F00, "M", "一"),
+ (0x2F01, "M", "丨"),
+ (0x2F02, "M", "丶"),
+ (0x2F03, "M", "丿"),
+ (0x2F04, "M", "乙"),
+ (0x2F05, "M", "亅"),
+ (0x2F06, "M", "二"),
+ (0x2F07, "M", "亠"),
+ (0x2F08, "M", "人"),
+ (0x2F09, "M", "儿"),
+ (0x2F0A, "M", "入"),
+ (0x2F0B, "M", "八"),
+ (0x2F0C, "M", "冂"),
+ (0x2F0D, "M", "冖"),
+ (0x2F0E, "M", "冫"),
+ (0x2F0F, "M", "几"),
+ (0x2F10, "M", "凵"),
+ (0x2F11, "M", "刀"),
+ (0x2F12, "M", "力"),
+ (0x2F13, "M", "勹"),
+ (0x2F14, "M", "匕"),
+ (0x2F15, "M", "匚"),
+ (0x2F16, "M", "匸"),
+ (0x2F17, "M", "十"),
+ (0x2F18, "M", "卜"),
+ (0x2F19, "M", "卩"),
]
+
def _seg_27() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F16, 'M', '匸'),
- (0x2F17, 'M', '十'),
- (0x2F18, 'M', '卜'),
- (0x2F19, 'M', '卩'),
- (0x2F1A, 'M', '厂'),
- (0x2F1B, 'M', '厶'),
- (0x2F1C, 'M', '又'),
- (0x2F1D, 'M', '口'),
- (0x2F1E, 'M', '囗'),
- (0x2F1F, 'M', '土'),
- (0x2F20, 'M', '士'),
- (0x2F21, 'M', '夂'),
- (0x2F22, 'M', '夊'),
- (0x2F23, 'M', '夕'),
- (0x2F24, 'M', '大'),
- (0x2F25, 'M', '女'),
- (0x2F26, 'M', '子'),
- (0x2F27, 'M', '宀'),
- (0x2F28, 'M', '寸'),
- (0x2F29, 'M', '小'),
- (0x2F2A, 'M', '尢'),
- (0x2F2B, 'M', '尸'),
- (0x2F2C, 'M', '屮'),
- (0x2F2D, 'M', '山'),
- (0x2F2E, 'M', '巛'),
- (0x2F2F, 'M', '工'),
- (0x2F30, 'M', '己'),
- (0x2F31, 'M', '巾'),
- (0x2F32, 'M', '干'),
- (0x2F33, 'M', '幺'),
- (0x2F34, 'M', '广'),
- (0x2F35, 'M', '廴'),
- (0x2F36, 'M', '廾'),
- (0x2F37, 'M', '弋'),
- (0x2F38, 'M', '弓'),
- (0x2F39, 'M', '彐'),
- (0x2F3A, 'M', '彡'),
- (0x2F3B, 'M', '彳'),
- (0x2F3C, 'M', '心'),
- (0x2F3D, 'M', '戈'),
- (0x2F3E, 'M', '戶'),
- (0x2F3F, 'M', '手'),
- (0x2F40, 'M', '支'),
- (0x2F41, 'M', '攴'),
- (0x2F42, 'M', '文'),
- (0x2F43, 'M', '斗'),
- (0x2F44, 'M', '斤'),
- (0x2F45, 'M', '方'),
- (0x2F46, 'M', '无'),
- (0x2F47, 'M', '日'),
- (0x2F48, 'M', '曰'),
- (0x2F49, 'M', '月'),
- (0x2F4A, 'M', '木'),
- (0x2F4B, 'M', '欠'),
- (0x2F4C, 'M', '止'),
- (0x2F4D, 'M', '歹'),
- (0x2F4E, 'M', '殳'),
- (0x2F4F, 'M', '毋'),
- (0x2F50, 'M', '比'),
- (0x2F51, 'M', '毛'),
- (0x2F52, 'M', '氏'),
- (0x2F53, 'M', '气'),
- (0x2F54, 'M', '水'),
- (0x2F55, 'M', '火'),
- (0x2F56, 'M', '爪'),
- (0x2F57, 'M', '父'),
- (0x2F58, 'M', '爻'),
- (0x2F59, 'M', '爿'),
- (0x2F5A, 'M', '片'),
- (0x2F5B, 'M', '牙'),
- (0x2F5C, 'M', '牛'),
- (0x2F5D, 'M', '犬'),
- (0x2F5E, 'M', '玄'),
- (0x2F5F, 'M', '玉'),
- (0x2F60, 'M', '瓜'),
- (0x2F61, 'M', '瓦'),
- (0x2F62, 'M', '甘'),
- (0x2F63, 'M', '生'),
- (0x2F64, 'M', '用'),
- (0x2F65, 'M', '田'),
- (0x2F66, 'M', '疋'),
- (0x2F67, 'M', '疒'),
- (0x2F68, 'M', '癶'),
- (0x2F69, 'M', '白'),
- (0x2F6A, 'M', '皮'),
- (0x2F6B, 'M', '皿'),
- (0x2F6C, 'M', '目'),
- (0x2F6D, 'M', '矛'),
- (0x2F6E, 'M', '矢'),
- (0x2F6F, 'M', '石'),
- (0x2F70, 'M', '示'),
- (0x2F71, 'M', '禸'),
- (0x2F72, 'M', '禾'),
- (0x2F73, 'M', '穴'),
- (0x2F74, 'M', '立'),
- (0x2F75, 'M', '竹'),
- (0x2F76, 'M', '米'),
- (0x2F77, 'M', '糸'),
- (0x2F78, 'M', '缶'),
- (0x2F79, 'M', '网'),
+ (0x2F1A, "M", "厂"),
+ (0x2F1B, "M", "厶"),
+ (0x2F1C, "M", "又"),
+ (0x2F1D, "M", "口"),
+ (0x2F1E, "M", "囗"),
+ (0x2F1F, "M", "土"),
+ (0x2F20, "M", "士"),
+ (0x2F21, "M", "夂"),
+ (0x2F22, "M", "夊"),
+ (0x2F23, "M", "夕"),
+ (0x2F24, "M", "大"),
+ (0x2F25, "M", "女"),
+ (0x2F26, "M", "子"),
+ (0x2F27, "M", "宀"),
+ (0x2F28, "M", "寸"),
+ (0x2F29, "M", "小"),
+ (0x2F2A, "M", "尢"),
+ (0x2F2B, "M", "尸"),
+ (0x2F2C, "M", "屮"),
+ (0x2F2D, "M", "山"),
+ (0x2F2E, "M", "巛"),
+ (0x2F2F, "M", "工"),
+ (0x2F30, "M", "己"),
+ (0x2F31, "M", "巾"),
+ (0x2F32, "M", "干"),
+ (0x2F33, "M", "幺"),
+ (0x2F34, "M", "广"),
+ (0x2F35, "M", "廴"),
+ (0x2F36, "M", "廾"),
+ (0x2F37, "M", "弋"),
+ (0x2F38, "M", "弓"),
+ (0x2F39, "M", "彐"),
+ (0x2F3A, "M", "彡"),
+ (0x2F3B, "M", "彳"),
+ (0x2F3C, "M", "心"),
+ (0x2F3D, "M", "戈"),
+ (0x2F3E, "M", "戶"),
+ (0x2F3F, "M", "手"),
+ (0x2F40, "M", "支"),
+ (0x2F41, "M", "攴"),
+ (0x2F42, "M", "文"),
+ (0x2F43, "M", "斗"),
+ (0x2F44, "M", "斤"),
+ (0x2F45, "M", "方"),
+ (0x2F46, "M", "无"),
+ (0x2F47, "M", "日"),
+ (0x2F48, "M", "曰"),
+ (0x2F49, "M", "月"),
+ (0x2F4A, "M", "木"),
+ (0x2F4B, "M", "欠"),
+ (0x2F4C, "M", "止"),
+ (0x2F4D, "M", "歹"),
+ (0x2F4E, "M", "殳"),
+ (0x2F4F, "M", "毋"),
+ (0x2F50, "M", "比"),
+ (0x2F51, "M", "毛"),
+ (0x2F52, "M", "氏"),
+ (0x2F53, "M", "气"),
+ (0x2F54, "M", "水"),
+ (0x2F55, "M", "火"),
+ (0x2F56, "M", "爪"),
+ (0x2F57, "M", "父"),
+ (0x2F58, "M", "爻"),
+ (0x2F59, "M", "爿"),
+ (0x2F5A, "M", "片"),
+ (0x2F5B, "M", "牙"),
+ (0x2F5C, "M", "牛"),
+ (0x2F5D, "M", "犬"),
+ (0x2F5E, "M", "玄"),
+ (0x2F5F, "M", "玉"),
+ (0x2F60, "M", "瓜"),
+ (0x2F61, "M", "瓦"),
+ (0x2F62, "M", "甘"),
+ (0x2F63, "M", "生"),
+ (0x2F64, "M", "用"),
+ (0x2F65, "M", "田"),
+ (0x2F66, "M", "疋"),
+ (0x2F67, "M", "疒"),
+ (0x2F68, "M", "癶"),
+ (0x2F69, "M", "白"),
+ (0x2F6A, "M", "皮"),
+ (0x2F6B, "M", "皿"),
+ (0x2F6C, "M", "目"),
+ (0x2F6D, "M", "矛"),
+ (0x2F6E, "M", "矢"),
+ (0x2F6F, "M", "石"),
+ (0x2F70, "M", "示"),
+ (0x2F71, "M", "禸"),
+ (0x2F72, "M", "禾"),
+ (0x2F73, "M", "穴"),
+ (0x2F74, "M", "立"),
+ (0x2F75, "M", "竹"),
+ (0x2F76, "M", "米"),
+ (0x2F77, "M", "糸"),
+ (0x2F78, "M", "缶"),
+ (0x2F79, "M", "网"),
+ (0x2F7A, "M", "羊"),
+ (0x2F7B, "M", "羽"),
+ (0x2F7C, "M", "老"),
+ (0x2F7D, "M", "而"),
]
+
def _seg_28() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F7A, 'M', '羊'),
- (0x2F7B, 'M', '羽'),
- (0x2F7C, 'M', '老'),
- (0x2F7D, 'M', '而'),
- (0x2F7E, 'M', '耒'),
- (0x2F7F, 'M', '耳'),
- (0x2F80, 'M', '聿'),
- (0x2F81, 'M', '肉'),
- (0x2F82, 'M', '臣'),
- (0x2F83, 'M', '自'),
- (0x2F84, 'M', '至'),
- (0x2F85, 'M', '臼'),
- (0x2F86, 'M', '舌'),
- (0x2F87, 'M', '舛'),
- (0x2F88, 'M', '舟'),
- (0x2F89, 'M', '艮'),
- (0x2F8A, 'M', '色'),
- (0x2F8B, 'M', '艸'),
- (0x2F8C, 'M', '虍'),
- (0x2F8D, 'M', '虫'),
- (0x2F8E, 'M', '血'),
- (0x2F8F, 'M', '行'),
- (0x2F90, 'M', '衣'),
- (0x2F91, 'M', '襾'),
- (0x2F92, 'M', '見'),
- (0x2F93, 'M', '角'),
- (0x2F94, 'M', '言'),
- (0x2F95, 'M', '谷'),
- (0x2F96, 'M', '豆'),
- (0x2F97, 'M', '豕'),
- (0x2F98, 'M', '豸'),
- (0x2F99, 'M', '貝'),
- (0x2F9A, 'M', '赤'),
- (0x2F9B, 'M', '走'),
- (0x2F9C, 'M', '足'),
- (0x2F9D, 'M', '身'),
- (0x2F9E, 'M', '車'),
- (0x2F9F, 'M', '辛'),
- (0x2FA0, 'M', '辰'),
- (0x2FA1, 'M', '辵'),
- (0x2FA2, 'M', '邑'),
- (0x2FA3, 'M', '酉'),
- (0x2FA4, 'M', '釆'),
- (0x2FA5, 'M', '里'),
- (0x2FA6, 'M', '金'),
- (0x2FA7, 'M', '長'),
- (0x2FA8, 'M', '門'),
- (0x2FA9, 'M', '阜'),
- (0x2FAA, 'M', '隶'),
- (0x2FAB, 'M', '隹'),
- (0x2FAC, 'M', '雨'),
- (0x2FAD, 'M', '靑'),
- (0x2FAE, 'M', '非'),
- (0x2FAF, 'M', '面'),
- (0x2FB0, 'M', '革'),
- (0x2FB1, 'M', '韋'),
- (0x2FB2, 'M', '韭'),
- (0x2FB3, 'M', '音'),
- (0x2FB4, 'M', '頁'),
- (0x2FB5, 'M', '風'),
- (0x2FB6, 'M', '飛'),
- (0x2FB7, 'M', '食'),
- (0x2FB8, 'M', '首'),
- (0x2FB9, 'M', '香'),
- (0x2FBA, 'M', '馬'),
- (0x2FBB, 'M', '骨'),
- (0x2FBC, 'M', '高'),
- (0x2FBD, 'M', '髟'),
- (0x2FBE, 'M', '鬥'),
- (0x2FBF, 'M', '鬯'),
- (0x2FC0, 'M', '鬲'),
- (0x2FC1, 'M', '鬼'),
- (0x2FC2, 'M', '魚'),
- (0x2FC3, 'M', '鳥'),
- (0x2FC4, 'M', '鹵'),
- (0x2FC5, 'M', '鹿'),
- (0x2FC6, 'M', '麥'),
- (0x2FC7, 'M', '麻'),
- (0x2FC8, 'M', '黃'),
- (0x2FC9, 'M', '黍'),
- (0x2FCA, 'M', '黑'),
- (0x2FCB, 'M', '黹'),
- (0x2FCC, 'M', '黽'),
- (0x2FCD, 'M', '鼎'),
- (0x2FCE, 'M', '鼓'),
- (0x2FCF, 'M', '鼠'),
- (0x2FD0, 'M', '鼻'),
- (0x2FD1, 'M', '齊'),
- (0x2FD2, 'M', '齒'),
- (0x2FD3, 'M', '龍'),
- (0x2FD4, 'M', '龜'),
- (0x2FD5, 'M', '龠'),
- (0x2FD6, 'X'),
- (0x3000, '3', ' '),
- (0x3001, 'V'),
- (0x3002, 'M', '.'),
- (0x3003, 'V'),
- (0x3036, 'M', '〒'),
- (0x3037, 'V'),
- (0x3038, 'M', '十'),
+ (0x2F7E, "M", "耒"),
+ (0x2F7F, "M", "耳"),
+ (0x2F80, "M", "聿"),
+ (0x2F81, "M", "肉"),
+ (0x2F82, "M", "臣"),
+ (0x2F83, "M", "自"),
+ (0x2F84, "M", "至"),
+ (0x2F85, "M", "臼"),
+ (0x2F86, "M", "舌"),
+ (0x2F87, "M", "舛"),
+ (0x2F88, "M", "舟"),
+ (0x2F89, "M", "艮"),
+ (0x2F8A, "M", "色"),
+ (0x2F8B, "M", "艸"),
+ (0x2F8C, "M", "虍"),
+ (0x2F8D, "M", "虫"),
+ (0x2F8E, "M", "血"),
+ (0x2F8F, "M", "行"),
+ (0x2F90, "M", "衣"),
+ (0x2F91, "M", "襾"),
+ (0x2F92, "M", "見"),
+ (0x2F93, "M", "角"),
+ (0x2F94, "M", "言"),
+ (0x2F95, "M", "谷"),
+ (0x2F96, "M", "豆"),
+ (0x2F97, "M", "豕"),
+ (0x2F98, "M", "豸"),
+ (0x2F99, "M", "貝"),
+ (0x2F9A, "M", "赤"),
+ (0x2F9B, "M", "走"),
+ (0x2F9C, "M", "足"),
+ (0x2F9D, "M", "身"),
+ (0x2F9E, "M", "車"),
+ (0x2F9F, "M", "辛"),
+ (0x2FA0, "M", "辰"),
+ (0x2FA1, "M", "辵"),
+ (0x2FA2, "M", "邑"),
+ (0x2FA3, "M", "酉"),
+ (0x2FA4, "M", "釆"),
+ (0x2FA5, "M", "里"),
+ (0x2FA6, "M", "金"),
+ (0x2FA7, "M", "長"),
+ (0x2FA8, "M", "門"),
+ (0x2FA9, "M", "阜"),
+ (0x2FAA, "M", "隶"),
+ (0x2FAB, "M", "隹"),
+ (0x2FAC, "M", "雨"),
+ (0x2FAD, "M", "靑"),
+ (0x2FAE, "M", "非"),
+ (0x2FAF, "M", "面"),
+ (0x2FB0, "M", "革"),
+ (0x2FB1, "M", "韋"),
+ (0x2FB2, "M", "韭"),
+ (0x2FB3, "M", "音"),
+ (0x2FB4, "M", "頁"),
+ (0x2FB5, "M", "風"),
+ (0x2FB6, "M", "飛"),
+ (0x2FB7, "M", "食"),
+ (0x2FB8, "M", "首"),
+ (0x2FB9, "M", "香"),
+ (0x2FBA, "M", "馬"),
+ (0x2FBB, "M", "骨"),
+ (0x2FBC, "M", "高"),
+ (0x2FBD, "M", "髟"),
+ (0x2FBE, "M", "鬥"),
+ (0x2FBF, "M", "鬯"),
+ (0x2FC0, "M", "鬲"),
+ (0x2FC1, "M", "鬼"),
+ (0x2FC2, "M", "魚"),
+ (0x2FC3, "M", "鳥"),
+ (0x2FC4, "M", "鹵"),
+ (0x2FC5, "M", "鹿"),
+ (0x2FC6, "M", "麥"),
+ (0x2FC7, "M", "麻"),
+ (0x2FC8, "M", "黃"),
+ (0x2FC9, "M", "黍"),
+ (0x2FCA, "M", "黑"),
+ (0x2FCB, "M", "黹"),
+ (0x2FCC, "M", "黽"),
+ (0x2FCD, "M", "鼎"),
+ (0x2FCE, "M", "鼓"),
+ (0x2FCF, "M", "鼠"),
+ (0x2FD0, "M", "鼻"),
+ (0x2FD1, "M", "齊"),
+ (0x2FD2, "M", "齒"),
+ (0x2FD3, "M", "龍"),
+ (0x2FD4, "M", "龜"),
+ (0x2FD5, "M", "龠"),
+ (0x2FD6, "X"),
+ (0x3000, "3", " "),
+ (0x3001, "V"),
+ (0x3002, "M", "."),
+ (0x3003, "V"),
+ (0x3036, "M", "〒"),
+ (0x3037, "V"),
+ (0x3038, "M", "十"),
+ (0x3039, "M", "卄"),
+ (0x303A, "M", "卅"),
+ (0x303B, "V"),
+ (0x3040, "X"),
]
+
def _seg_29() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3039, 'M', '卄'),
- (0x303A, 'M', '卅'),
- (0x303B, 'V'),
- (0x3040, 'X'),
- (0x3041, 'V'),
- (0x3097, 'X'),
- (0x3099, 'V'),
- (0x309B, '3', ' ゙'),
- (0x309C, '3', ' ゚'),
- (0x309D, 'V'),
- (0x309F, 'M', 'より'),
- (0x30A0, 'V'),
- (0x30FF, 'M', 'コト'),
- (0x3100, 'X'),
- (0x3105, 'V'),
- (0x3130, 'X'),
- (0x3131, 'M', 'ᄀ'),
- (0x3132, 'M', 'ᄁ'),
- (0x3133, 'M', 'ᆪ'),
- (0x3134, 'M', 'ᄂ'),
- (0x3135, 'M', 'ᆬ'),
- (0x3136, 'M', 'ᆭ'),
- (0x3137, 'M', 'ᄃ'),
- (0x3138, 'M', 'ᄄ'),
- (0x3139, 'M', 'ᄅ'),
- (0x313A, 'M', 'ᆰ'),
- (0x313B, 'M', 'ᆱ'),
- (0x313C, 'M', 'ᆲ'),
- (0x313D, 'M', 'ᆳ'),
- (0x313E, 'M', 'ᆴ'),
- (0x313F, 'M', 'ᆵ'),
- (0x3140, 'M', 'ᄚ'),
- (0x3141, 'M', 'ᄆ'),
- (0x3142, 'M', 'ᄇ'),
- (0x3143, 'M', 'ᄈ'),
- (0x3144, 'M', 'ᄡ'),
- (0x3145, 'M', 'ᄉ'),
- (0x3146, 'M', 'ᄊ'),
- (0x3147, 'M', 'ᄋ'),
- (0x3148, 'M', 'ᄌ'),
- (0x3149, 'M', 'ᄍ'),
- (0x314A, 'M', 'ᄎ'),
- (0x314B, 'M', 'ᄏ'),
- (0x314C, 'M', 'ᄐ'),
- (0x314D, 'M', 'ᄑ'),
- (0x314E, 'M', 'ᄒ'),
- (0x314F, 'M', 'ᅡ'),
- (0x3150, 'M', 'ᅢ'),
- (0x3151, 'M', 'ᅣ'),
- (0x3152, 'M', 'ᅤ'),
- (0x3153, 'M', 'ᅥ'),
- (0x3154, 'M', 'ᅦ'),
- (0x3155, 'M', 'ᅧ'),
- (0x3156, 'M', 'ᅨ'),
- (0x3157, 'M', 'ᅩ'),
- (0x3158, 'M', 'ᅪ'),
- (0x3159, 'M', 'ᅫ'),
- (0x315A, 'M', 'ᅬ'),
- (0x315B, 'M', 'ᅭ'),
- (0x315C, 'M', 'ᅮ'),
- (0x315D, 'M', 'ᅯ'),
- (0x315E, 'M', 'ᅰ'),
- (0x315F, 'M', 'ᅱ'),
- (0x3160, 'M', 'ᅲ'),
- (0x3161, 'M', 'ᅳ'),
- (0x3162, 'M', 'ᅴ'),
- (0x3163, 'M', 'ᅵ'),
- (0x3164, 'X'),
- (0x3165, 'M', 'ᄔ'),
- (0x3166, 'M', 'ᄕ'),
- (0x3167, 'M', 'ᇇ'),
- (0x3168, 'M', 'ᇈ'),
- (0x3169, 'M', 'ᇌ'),
- (0x316A, 'M', 'ᇎ'),
- (0x316B, 'M', 'ᇓ'),
- (0x316C, 'M', 'ᇗ'),
- (0x316D, 'M', 'ᇙ'),
- (0x316E, 'M', 'ᄜ'),
- (0x316F, 'M', 'ᇝ'),
- (0x3170, 'M', 'ᇟ'),
- (0x3171, 'M', 'ᄝ'),
- (0x3172, 'M', 'ᄞ'),
- (0x3173, 'M', 'ᄠ'),
- (0x3174, 'M', 'ᄢ'),
- (0x3175, 'M', 'ᄣ'),
- (0x3176, 'M', 'ᄧ'),
- (0x3177, 'M', 'ᄩ'),
- (0x3178, 'M', 'ᄫ'),
- (0x3179, 'M', 'ᄬ'),
- (0x317A, 'M', 'ᄭ'),
- (0x317B, 'M', 'ᄮ'),
- (0x317C, 'M', 'ᄯ'),
- (0x317D, 'M', 'ᄲ'),
- (0x317E, 'M', 'ᄶ'),
- (0x317F, 'M', 'ᅀ'),
- (0x3180, 'M', 'ᅇ'),
- (0x3181, 'M', 'ᅌ'),
- (0x3182, 'M', 'ᇱ'),
- (0x3183, 'M', 'ᇲ'),
- (0x3184, 'M', 'ᅗ'),
+ (0x3041, "V"),
+ (0x3097, "X"),
+ (0x3099, "V"),
+ (0x309B, "3", " ゙"),
+ (0x309C, "3", " ゚"),
+ (0x309D, "V"),
+ (0x309F, "M", "より"),
+ (0x30A0, "V"),
+ (0x30FF, "M", "コト"),
+ (0x3100, "X"),
+ (0x3105, "V"),
+ (0x3130, "X"),
+ (0x3131, "M", "ᄀ"),
+ (0x3132, "M", "ᄁ"),
+ (0x3133, "M", "ᆪ"),
+ (0x3134, "M", "ᄂ"),
+ (0x3135, "M", "ᆬ"),
+ (0x3136, "M", "ᆭ"),
+ (0x3137, "M", "ᄃ"),
+ (0x3138, "M", "ᄄ"),
+ (0x3139, "M", "ᄅ"),
+ (0x313A, "M", "ᆰ"),
+ (0x313B, "M", "ᆱ"),
+ (0x313C, "M", "ᆲ"),
+ (0x313D, "M", "ᆳ"),
+ (0x313E, "M", "ᆴ"),
+ (0x313F, "M", "ᆵ"),
+ (0x3140, "M", "ᄚ"),
+ (0x3141, "M", "ᄆ"),
+ (0x3142, "M", "ᄇ"),
+ (0x3143, "M", "ᄈ"),
+ (0x3144, "M", "ᄡ"),
+ (0x3145, "M", "ᄉ"),
+ (0x3146, "M", "ᄊ"),
+ (0x3147, "M", "ᄋ"),
+ (0x3148, "M", "ᄌ"),
+ (0x3149, "M", "ᄍ"),
+ (0x314A, "M", "ᄎ"),
+ (0x314B, "M", "ᄏ"),
+ (0x314C, "M", "ᄐ"),
+ (0x314D, "M", "ᄑ"),
+ (0x314E, "M", "ᄒ"),
+ (0x314F, "M", "ᅡ"),
+ (0x3150, "M", "ᅢ"),
+ (0x3151, "M", "ᅣ"),
+ (0x3152, "M", "ᅤ"),
+ (0x3153, "M", "ᅥ"),
+ (0x3154, "M", "ᅦ"),
+ (0x3155, "M", "ᅧ"),
+ (0x3156, "M", "ᅨ"),
+ (0x3157, "M", "ᅩ"),
+ (0x3158, "M", "ᅪ"),
+ (0x3159, "M", "ᅫ"),
+ (0x315A, "M", "ᅬ"),
+ (0x315B, "M", "ᅭ"),
+ (0x315C, "M", "ᅮ"),
+ (0x315D, "M", "ᅯ"),
+ (0x315E, "M", "ᅰ"),
+ (0x315F, "M", "ᅱ"),
+ (0x3160, "M", "ᅲ"),
+ (0x3161, "M", "ᅳ"),
+ (0x3162, "M", "ᅴ"),
+ (0x3163, "M", "ᅵ"),
+ (0x3164, "X"),
+ (0x3165, "M", "ᄔ"),
+ (0x3166, "M", "ᄕ"),
+ (0x3167, "M", "ᇇ"),
+ (0x3168, "M", "ᇈ"),
+ (0x3169, "M", "ᇌ"),
+ (0x316A, "M", "ᇎ"),
+ (0x316B, "M", "ᇓ"),
+ (0x316C, "M", "ᇗ"),
+ (0x316D, "M", "ᇙ"),
+ (0x316E, "M", "ᄜ"),
+ (0x316F, "M", "ᇝ"),
+ (0x3170, "M", "ᇟ"),
+ (0x3171, "M", "ᄝ"),
+ (0x3172, "M", "ᄞ"),
+ (0x3173, "M", "ᄠ"),
+ (0x3174, "M", "ᄢ"),
+ (0x3175, "M", "ᄣ"),
+ (0x3176, "M", "ᄧ"),
+ (0x3177, "M", "ᄩ"),
+ (0x3178, "M", "ᄫ"),
+ (0x3179, "M", "ᄬ"),
+ (0x317A, "M", "ᄭ"),
+ (0x317B, "M", "ᄮ"),
+ (0x317C, "M", "ᄯ"),
+ (0x317D, "M", "ᄲ"),
+ (0x317E, "M", "ᄶ"),
+ (0x317F, "M", "ᅀ"),
+ (0x3180, "M", "ᅇ"),
+ (0x3181, "M", "ᅌ"),
+ (0x3182, "M", "ᇱ"),
+ (0x3183, "M", "ᇲ"),
+ (0x3184, "M", "ᅗ"),
+ (0x3185, "M", "ᅘ"),
+ (0x3186, "M", "ᅙ"),
+ (0x3187, "M", "ᆄ"),
+ (0x3188, "M", "ᆅ"),
]
+
def _seg_30() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3185, 'M', 'ᅘ'),
- (0x3186, 'M', 'ᅙ'),
- (0x3187, 'M', 'ᆄ'),
- (0x3188, 'M', 'ᆅ'),
- (0x3189, 'M', 'ᆈ'),
- (0x318A, 'M', 'ᆑ'),
- (0x318B, 'M', 'ᆒ'),
- (0x318C, 'M', 'ᆔ'),
- (0x318D, 'M', 'ᆞ'),
- (0x318E, 'M', 'ᆡ'),
- (0x318F, 'X'),
- (0x3190, 'V'),
- (0x3192, 'M', '一'),
- (0x3193, 'M', '二'),
- (0x3194, 'M', '三'),
- (0x3195, 'M', '四'),
- (0x3196, 'M', '上'),
- (0x3197, 'M', '中'),
- (0x3198, 'M', '下'),
- (0x3199, 'M', '甲'),
- (0x319A, 'M', '乙'),
- (0x319B, 'M', '丙'),
- (0x319C, 'M', '丁'),
- (0x319D, 'M', '天'),
- (0x319E, 'M', '地'),
- (0x319F, 'M', '人'),
- (0x31A0, 'V'),
- (0x31E4, 'X'),
- (0x31F0, 'V'),
- (0x3200, '3', '(ᄀ)'),
- (0x3201, '3', '(ᄂ)'),
- (0x3202, '3', '(ᄃ)'),
- (0x3203, '3', '(ᄅ)'),
- (0x3204, '3', '(ᄆ)'),
- (0x3205, '3', '(ᄇ)'),
- (0x3206, '3', '(ᄉ)'),
- (0x3207, '3', '(ᄋ)'),
- (0x3208, '3', '(ᄌ)'),
- (0x3209, '3', '(ᄎ)'),
- (0x320A, '3', '(ᄏ)'),
- (0x320B, '3', '(ᄐ)'),
- (0x320C, '3', '(ᄑ)'),
- (0x320D, '3', '(ᄒ)'),
- (0x320E, '3', '(가)'),
- (0x320F, '3', '(나)'),
- (0x3210, '3', '(다)'),
- (0x3211, '3', '(라)'),
- (0x3212, '3', '(마)'),
- (0x3213, '3', '(바)'),
- (0x3214, '3', '(사)'),
- (0x3215, '3', '(아)'),
- (0x3216, '3', '(자)'),
- (0x3217, '3', '(차)'),
- (0x3218, '3', '(카)'),
- (0x3219, '3', '(타)'),
- (0x321A, '3', '(파)'),
- (0x321B, '3', '(하)'),
- (0x321C, '3', '(주)'),
- (0x321D, '3', '(오전)'),
- (0x321E, '3', '(오후)'),
- (0x321F, 'X'),
- (0x3220, '3', '(一)'),
- (0x3221, '3', '(二)'),
- (0x3222, '3', '(三)'),
- (0x3223, '3', '(四)'),
- (0x3224, '3', '(五)'),
- (0x3225, '3', '(六)'),
- (0x3226, '3', '(七)'),
- (0x3227, '3', '(八)'),
- (0x3228, '3', '(九)'),
- (0x3229, '3', '(十)'),
- (0x322A, '3', '(月)'),
- (0x322B, '3', '(火)'),
- (0x322C, '3', '(水)'),
- (0x322D, '3', '(木)'),
- (0x322E, '3', '(金)'),
- (0x322F, '3', '(土)'),
- (0x3230, '3', '(日)'),
- (0x3231, '3', '(株)'),
- (0x3232, '3', '(有)'),
- (0x3233, '3', '(社)'),
- (0x3234, '3', '(名)'),
- (0x3235, '3', '(特)'),
- (0x3236, '3', '(財)'),
- (0x3237, '3', '(祝)'),
- (0x3238, '3', '(労)'),
- (0x3239, '3', '(代)'),
- (0x323A, '3', '(呼)'),
- (0x323B, '3', '(学)'),
- (0x323C, '3', '(監)'),
- (0x323D, '3', '(企)'),
- (0x323E, '3', '(資)'),
- (0x323F, '3', '(協)'),
- (0x3240, '3', '(祭)'),
- (0x3241, '3', '(休)'),
- (0x3242, '3', '(自)'),
- (0x3243, '3', '(至)'),
- (0x3244, 'M', '問'),
- (0x3245, 'M', '幼'),
- (0x3246, 'M', '文'),
+ (0x3189, "M", "ᆈ"),
+ (0x318A, "M", "ᆑ"),
+ (0x318B, "M", "ᆒ"),
+ (0x318C, "M", "ᆔ"),
+ (0x318D, "M", "ᆞ"),
+ (0x318E, "M", "ᆡ"),
+ (0x318F, "X"),
+ (0x3190, "V"),
+ (0x3192, "M", "一"),
+ (0x3193, "M", "二"),
+ (0x3194, "M", "三"),
+ (0x3195, "M", "四"),
+ (0x3196, "M", "上"),
+ (0x3197, "M", "中"),
+ (0x3198, "M", "下"),
+ (0x3199, "M", "甲"),
+ (0x319A, "M", "乙"),
+ (0x319B, "M", "丙"),
+ (0x319C, "M", "丁"),
+ (0x319D, "M", "天"),
+ (0x319E, "M", "地"),
+ (0x319F, "M", "人"),
+ (0x31A0, "V"),
+ (0x31E4, "X"),
+ (0x31F0, "V"),
+ (0x3200, "3", "(ᄀ)"),
+ (0x3201, "3", "(ᄂ)"),
+ (0x3202, "3", "(ᄃ)"),
+ (0x3203, "3", "(ᄅ)"),
+ (0x3204, "3", "(ᄆ)"),
+ (0x3205, "3", "(ᄇ)"),
+ (0x3206, "3", "(ᄉ)"),
+ (0x3207, "3", "(ᄋ)"),
+ (0x3208, "3", "(ᄌ)"),
+ (0x3209, "3", "(ᄎ)"),
+ (0x320A, "3", "(ᄏ)"),
+ (0x320B, "3", "(ᄐ)"),
+ (0x320C, "3", "(ᄑ)"),
+ (0x320D, "3", "(ᄒ)"),
+ (0x320E, "3", "(가)"),
+ (0x320F, "3", "(나)"),
+ (0x3210, "3", "(다)"),
+ (0x3211, "3", "(라)"),
+ (0x3212, "3", "(마)"),
+ (0x3213, "3", "(바)"),
+ (0x3214, "3", "(사)"),
+ (0x3215, "3", "(아)"),
+ (0x3216, "3", "(자)"),
+ (0x3217, "3", "(차)"),
+ (0x3218, "3", "(카)"),
+ (0x3219, "3", "(타)"),
+ (0x321A, "3", "(파)"),
+ (0x321B, "3", "(하)"),
+ (0x321C, "3", "(주)"),
+ (0x321D, "3", "(오전)"),
+ (0x321E, "3", "(오후)"),
+ (0x321F, "X"),
+ (0x3220, "3", "(一)"),
+ (0x3221, "3", "(二)"),
+ (0x3222, "3", "(三)"),
+ (0x3223, "3", "(四)"),
+ (0x3224, "3", "(五)"),
+ (0x3225, "3", "(六)"),
+ (0x3226, "3", "(七)"),
+ (0x3227, "3", "(八)"),
+ (0x3228, "3", "(九)"),
+ (0x3229, "3", "(十)"),
+ (0x322A, "3", "(月)"),
+ (0x322B, "3", "(火)"),
+ (0x322C, "3", "(水)"),
+ (0x322D, "3", "(木)"),
+ (0x322E, "3", "(金)"),
+ (0x322F, "3", "(土)"),
+ (0x3230, "3", "(日)"),
+ (0x3231, "3", "(株)"),
+ (0x3232, "3", "(有)"),
+ (0x3233, "3", "(社)"),
+ (0x3234, "3", "(名)"),
+ (0x3235, "3", "(特)"),
+ (0x3236, "3", "(財)"),
+ (0x3237, "3", "(祝)"),
+ (0x3238, "3", "(労)"),
+ (0x3239, "3", "(代)"),
+ (0x323A, "3", "(呼)"),
+ (0x323B, "3", "(学)"),
+ (0x323C, "3", "(監)"),
+ (0x323D, "3", "(企)"),
+ (0x323E, "3", "(資)"),
+ (0x323F, "3", "(協)"),
+ (0x3240, "3", "(祭)"),
+ (0x3241, "3", "(休)"),
+ (0x3242, "3", "(自)"),
+ (0x3243, "3", "(至)"),
+ (0x3244, "M", "問"),
+ (0x3245, "M", "幼"),
+ (0x3246, "M", "文"),
+ (0x3247, "M", "箏"),
+ (0x3248, "V"),
+ (0x3250, "M", "pte"),
+ (0x3251, "M", "21"),
]
+
def _seg_31() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3247, 'M', '箏'),
- (0x3248, 'V'),
- (0x3250, 'M', 'pte'),
- (0x3251, 'M', '21'),
- (0x3252, 'M', '22'),
- (0x3253, 'M', '23'),
- (0x3254, 'M', '24'),
- (0x3255, 'M', '25'),
- (0x3256, 'M', '26'),
- (0x3257, 'M', '27'),
- (0x3258, 'M', '28'),
- (0x3259, 'M', '29'),
- (0x325A, 'M', '30'),
- (0x325B, 'M', '31'),
- (0x325C, 'M', '32'),
- (0x325D, 'M', '33'),
- (0x325E, 'M', '34'),
- (0x325F, 'M', '35'),
- (0x3260, 'M', 'ᄀ'),
- (0x3261, 'M', 'ᄂ'),
- (0x3262, 'M', 'ᄃ'),
- (0x3263, 'M', 'ᄅ'),
- (0x3264, 'M', 'ᄆ'),
- (0x3265, 'M', 'ᄇ'),
- (0x3266, 'M', 'ᄉ'),
- (0x3267, 'M', 'ᄋ'),
- (0x3268, 'M', 'ᄌ'),
- (0x3269, 'M', 'ᄎ'),
- (0x326A, 'M', 'ᄏ'),
- (0x326B, 'M', 'ᄐ'),
- (0x326C, 'M', 'ᄑ'),
- (0x326D, 'M', 'ᄒ'),
- (0x326E, 'M', '가'),
- (0x326F, 'M', '나'),
- (0x3270, 'M', '다'),
- (0x3271, 'M', '라'),
- (0x3272, 'M', '마'),
- (0x3273, 'M', '바'),
- (0x3274, 'M', '사'),
- (0x3275, 'M', '아'),
- (0x3276, 'M', '자'),
- (0x3277, 'M', '차'),
- (0x3278, 'M', '카'),
- (0x3279, 'M', '타'),
- (0x327A, 'M', '파'),
- (0x327B, 'M', '하'),
- (0x327C, 'M', '참고'),
- (0x327D, 'M', '주의'),
- (0x327E, 'M', '우'),
- (0x327F, 'V'),
- (0x3280, 'M', '一'),
- (0x3281, 'M', '二'),
- (0x3282, 'M', '三'),
- (0x3283, 'M', '四'),
- (0x3284, 'M', '五'),
- (0x3285, 'M', '六'),
- (0x3286, 'M', '七'),
- (0x3287, 'M', '八'),
- (0x3288, 'M', '九'),
- (0x3289, 'M', '十'),
- (0x328A, 'M', '月'),
- (0x328B, 'M', '火'),
- (0x328C, 'M', '水'),
- (0x328D, 'M', '木'),
- (0x328E, 'M', '金'),
- (0x328F, 'M', '土'),
- (0x3290, 'M', '日'),
- (0x3291, 'M', '株'),
- (0x3292, 'M', '有'),
- (0x3293, 'M', '社'),
- (0x3294, 'M', '名'),
- (0x3295, 'M', '特'),
- (0x3296, 'M', '財'),
- (0x3297, 'M', '祝'),
- (0x3298, 'M', '労'),
- (0x3299, 'M', '秘'),
- (0x329A, 'M', '男'),
- (0x329B, 'M', '女'),
- (0x329C, 'M', '適'),
- (0x329D, 'M', '優'),
- (0x329E, 'M', '印'),
- (0x329F, 'M', '注'),
- (0x32A0, 'M', '項'),
- (0x32A1, 'M', '休'),
- (0x32A2, 'M', '写'),
- (0x32A3, 'M', '正'),
- (0x32A4, 'M', '上'),
- (0x32A5, 'M', '中'),
- (0x32A6, 'M', '下'),
- (0x32A7, 'M', '左'),
- (0x32A8, 'M', '右'),
- (0x32A9, 'M', '医'),
- (0x32AA, 'M', '宗'),
- (0x32AB, 'M', '学'),
- (0x32AC, 'M', '監'),
- (0x32AD, 'M', '企'),
- (0x32AE, 'M', '資'),
- (0x32AF, 'M', '協'),
- (0x32B0, 'M', '夜'),
- (0x32B1, 'M', '36'),
+ (0x3252, "M", "22"),
+ (0x3253, "M", "23"),
+ (0x3254, "M", "24"),
+ (0x3255, "M", "25"),
+ (0x3256, "M", "26"),
+ (0x3257, "M", "27"),
+ (0x3258, "M", "28"),
+ (0x3259, "M", "29"),
+ (0x325A, "M", "30"),
+ (0x325B, "M", "31"),
+ (0x325C, "M", "32"),
+ (0x325D, "M", "33"),
+ (0x325E, "M", "34"),
+ (0x325F, "M", "35"),
+ (0x3260, "M", "ᄀ"),
+ (0x3261, "M", "ᄂ"),
+ (0x3262, "M", "ᄃ"),
+ (0x3263, "M", "ᄅ"),
+ (0x3264, "M", "ᄆ"),
+ (0x3265, "M", "ᄇ"),
+ (0x3266, "M", "ᄉ"),
+ (0x3267, "M", "ᄋ"),
+ (0x3268, "M", "ᄌ"),
+ (0x3269, "M", "ᄎ"),
+ (0x326A, "M", "ᄏ"),
+ (0x326B, "M", "ᄐ"),
+ (0x326C, "M", "ᄑ"),
+ (0x326D, "M", "ᄒ"),
+ (0x326E, "M", "가"),
+ (0x326F, "M", "나"),
+ (0x3270, "M", "다"),
+ (0x3271, "M", "라"),
+ (0x3272, "M", "마"),
+ (0x3273, "M", "바"),
+ (0x3274, "M", "사"),
+ (0x3275, "M", "아"),
+ (0x3276, "M", "자"),
+ (0x3277, "M", "차"),
+ (0x3278, "M", "카"),
+ (0x3279, "M", "타"),
+ (0x327A, "M", "파"),
+ (0x327B, "M", "하"),
+ (0x327C, "M", "참고"),
+ (0x327D, "M", "주의"),
+ (0x327E, "M", "우"),
+ (0x327F, "V"),
+ (0x3280, "M", "一"),
+ (0x3281, "M", "二"),
+ (0x3282, "M", "三"),
+ (0x3283, "M", "四"),
+ (0x3284, "M", "五"),
+ (0x3285, "M", "六"),
+ (0x3286, "M", "七"),
+ (0x3287, "M", "八"),
+ (0x3288, "M", "九"),
+ (0x3289, "M", "十"),
+ (0x328A, "M", "月"),
+ (0x328B, "M", "火"),
+ (0x328C, "M", "水"),
+ (0x328D, "M", "木"),
+ (0x328E, "M", "金"),
+ (0x328F, "M", "土"),
+ (0x3290, "M", "日"),
+ (0x3291, "M", "株"),
+ (0x3292, "M", "有"),
+ (0x3293, "M", "社"),
+ (0x3294, "M", "名"),
+ (0x3295, "M", "特"),
+ (0x3296, "M", "財"),
+ (0x3297, "M", "祝"),
+ (0x3298, "M", "労"),
+ (0x3299, "M", "秘"),
+ (0x329A, "M", "男"),
+ (0x329B, "M", "女"),
+ (0x329C, "M", "適"),
+ (0x329D, "M", "優"),
+ (0x329E, "M", "印"),
+ (0x329F, "M", "注"),
+ (0x32A0, "M", "項"),
+ (0x32A1, "M", "休"),
+ (0x32A2, "M", "写"),
+ (0x32A3, "M", "正"),
+ (0x32A4, "M", "上"),
+ (0x32A5, "M", "中"),
+ (0x32A6, "M", "下"),
+ (0x32A7, "M", "左"),
+ (0x32A8, "M", "右"),
+ (0x32A9, "M", "医"),
+ (0x32AA, "M", "宗"),
+ (0x32AB, "M", "学"),
+ (0x32AC, "M", "監"),
+ (0x32AD, "M", "企"),
+ (0x32AE, "M", "資"),
+ (0x32AF, "M", "協"),
+ (0x32B0, "M", "夜"),
+ (0x32B1, "M", "36"),
+ (0x32B2, "M", "37"),
+ (0x32B3, "M", "38"),
+ (0x32B4, "M", "39"),
+ (0x32B5, "M", "40"),
]
+
def _seg_32() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x32B2, 'M', '37'),
- (0x32B3, 'M', '38'),
- (0x32B4, 'M', '39'),
- (0x32B5, 'M', '40'),
- (0x32B6, 'M', '41'),
- (0x32B7, 'M', '42'),
- (0x32B8, 'M', '43'),
- (0x32B9, 'M', '44'),
- (0x32BA, 'M', '45'),
- (0x32BB, 'M', '46'),
- (0x32BC, 'M', '47'),
- (0x32BD, 'M', '48'),
- (0x32BE, 'M', '49'),
- (0x32BF, 'M', '50'),
- (0x32C0, 'M', '1月'),
- (0x32C1, 'M', '2月'),
- (0x32C2, 'M', '3月'),
- (0x32C3, 'M', '4月'),
- (0x32C4, 'M', '5月'),
- (0x32C5, 'M', '6月'),
- (0x32C6, 'M', '7月'),
- (0x32C7, 'M', '8月'),
- (0x32C8, 'M', '9月'),
- (0x32C9, 'M', '10月'),
- (0x32CA, 'M', '11月'),
- (0x32CB, 'M', '12月'),
- (0x32CC, 'M', 'hg'),
- (0x32CD, 'M', 'erg'),
- (0x32CE, 'M', 'ev'),
- (0x32CF, 'M', 'ltd'),
- (0x32D0, 'M', 'ア'),
- (0x32D1, 'M', 'イ'),
- (0x32D2, 'M', 'ウ'),
- (0x32D3, 'M', 'エ'),
- (0x32D4, 'M', 'オ'),
- (0x32D5, 'M', 'カ'),
- (0x32D6, 'M', 'キ'),
- (0x32D7, 'M', 'ク'),
- (0x32D8, 'M', 'ケ'),
- (0x32D9, 'M', 'コ'),
- (0x32DA, 'M', 'サ'),
- (0x32DB, 'M', 'シ'),
- (0x32DC, 'M', 'ス'),
- (0x32DD, 'M', 'セ'),
- (0x32DE, 'M', 'ソ'),
- (0x32DF, 'M', 'タ'),
- (0x32E0, 'M', 'チ'),
- (0x32E1, 'M', 'ツ'),
- (0x32E2, 'M', 'テ'),
- (0x32E3, 'M', 'ト'),
- (0x32E4, 'M', 'ナ'),
- (0x32E5, 'M', 'ニ'),
- (0x32E6, 'M', 'ヌ'),
- (0x32E7, 'M', 'ネ'),
- (0x32E8, 'M', 'ノ'),
- (0x32E9, 'M', 'ハ'),
- (0x32EA, 'M', 'ヒ'),
- (0x32EB, 'M', 'フ'),
- (0x32EC, 'M', 'ヘ'),
- (0x32ED, 'M', 'ホ'),
- (0x32EE, 'M', 'マ'),
- (0x32EF, 'M', 'ミ'),
- (0x32F0, 'M', 'ム'),
- (0x32F1, 'M', 'メ'),
- (0x32F2, 'M', 'モ'),
- (0x32F3, 'M', 'ヤ'),
- (0x32F4, 'M', 'ユ'),
- (0x32F5, 'M', 'ヨ'),
- (0x32F6, 'M', 'ラ'),
- (0x32F7, 'M', 'リ'),
- (0x32F8, 'M', 'ル'),
- (0x32F9, 'M', 'レ'),
- (0x32FA, 'M', 'ロ'),
- (0x32FB, 'M', 'ワ'),
- (0x32FC, 'M', 'ヰ'),
- (0x32FD, 'M', 'ヱ'),
- (0x32FE, 'M', 'ヲ'),
- (0x32FF, 'M', '令和'),
- (0x3300, 'M', 'アパート'),
- (0x3301, 'M', 'アルファ'),
- (0x3302, 'M', 'アンペア'),
- (0x3303, 'M', 'アール'),
- (0x3304, 'M', 'イニング'),
- (0x3305, 'M', 'インチ'),
- (0x3306, 'M', 'ウォン'),
- (0x3307, 'M', 'エスクード'),
- (0x3308, 'M', 'エーカー'),
- (0x3309, 'M', 'オンス'),
- (0x330A, 'M', 'オーム'),
- (0x330B, 'M', 'カイリ'),
- (0x330C, 'M', 'カラット'),
- (0x330D, 'M', 'カロリー'),
- (0x330E, 'M', 'ガロン'),
- (0x330F, 'M', 'ガンマ'),
- (0x3310, 'M', 'ギガ'),
- (0x3311, 'M', 'ギニー'),
- (0x3312, 'M', 'キュリー'),
- (0x3313, 'M', 'ギルダー'),
- (0x3314, 'M', 'キロ'),
- (0x3315, 'M', 'キログラム'),
+ (0x32B6, "M", "41"),
+ (0x32B7, "M", "42"),
+ (0x32B8, "M", "43"),
+ (0x32B9, "M", "44"),
+ (0x32BA, "M", "45"),
+ (0x32BB, "M", "46"),
+ (0x32BC, "M", "47"),
+ (0x32BD, "M", "48"),
+ (0x32BE, "M", "49"),
+ (0x32BF, "M", "50"),
+ (0x32C0, "M", "1月"),
+ (0x32C1, "M", "2月"),
+ (0x32C2, "M", "3月"),
+ (0x32C3, "M", "4月"),
+ (0x32C4, "M", "5月"),
+ (0x32C5, "M", "6月"),
+ (0x32C6, "M", "7月"),
+ (0x32C7, "M", "8月"),
+ (0x32C8, "M", "9月"),
+ (0x32C9, "M", "10月"),
+ (0x32CA, "M", "11月"),
+ (0x32CB, "M", "12月"),
+ (0x32CC, "M", "hg"),
+ (0x32CD, "M", "erg"),
+ (0x32CE, "M", "ev"),
+ (0x32CF, "M", "ltd"),
+ (0x32D0, "M", "ア"),
+ (0x32D1, "M", "イ"),
+ (0x32D2, "M", "ウ"),
+ (0x32D3, "M", "エ"),
+ (0x32D4, "M", "オ"),
+ (0x32D5, "M", "カ"),
+ (0x32D6, "M", "キ"),
+ (0x32D7, "M", "ク"),
+ (0x32D8, "M", "ケ"),
+ (0x32D9, "M", "コ"),
+ (0x32DA, "M", "サ"),
+ (0x32DB, "M", "シ"),
+ (0x32DC, "M", "ス"),
+ (0x32DD, "M", "セ"),
+ (0x32DE, "M", "ソ"),
+ (0x32DF, "M", "タ"),
+ (0x32E0, "M", "チ"),
+ (0x32E1, "M", "ツ"),
+ (0x32E2, "M", "テ"),
+ (0x32E3, "M", "ト"),
+ (0x32E4, "M", "ナ"),
+ (0x32E5, "M", "ニ"),
+ (0x32E6, "M", "ヌ"),
+ (0x32E7, "M", "ネ"),
+ (0x32E8, "M", "ノ"),
+ (0x32E9, "M", "ハ"),
+ (0x32EA, "M", "ヒ"),
+ (0x32EB, "M", "フ"),
+ (0x32EC, "M", "ヘ"),
+ (0x32ED, "M", "ホ"),
+ (0x32EE, "M", "マ"),
+ (0x32EF, "M", "ミ"),
+ (0x32F0, "M", "ム"),
+ (0x32F1, "M", "メ"),
+ (0x32F2, "M", "モ"),
+ (0x32F3, "M", "ヤ"),
+ (0x32F4, "M", "ユ"),
+ (0x32F5, "M", "ヨ"),
+ (0x32F6, "M", "ラ"),
+ (0x32F7, "M", "リ"),
+ (0x32F8, "M", "ル"),
+ (0x32F9, "M", "レ"),
+ (0x32FA, "M", "ロ"),
+ (0x32FB, "M", "ワ"),
+ (0x32FC, "M", "ヰ"),
+ (0x32FD, "M", "ヱ"),
+ (0x32FE, "M", "ヲ"),
+ (0x32FF, "M", "令和"),
+ (0x3300, "M", "アパート"),
+ (0x3301, "M", "アルファ"),
+ (0x3302, "M", "アンペア"),
+ (0x3303, "M", "アール"),
+ (0x3304, "M", "イニング"),
+ (0x3305, "M", "インチ"),
+ (0x3306, "M", "ウォン"),
+ (0x3307, "M", "エスクード"),
+ (0x3308, "M", "エーカー"),
+ (0x3309, "M", "オンス"),
+ (0x330A, "M", "オーム"),
+ (0x330B, "M", "カイリ"),
+ (0x330C, "M", "カラット"),
+ (0x330D, "M", "カロリー"),
+ (0x330E, "M", "ガロン"),
+ (0x330F, "M", "ガンマ"),
+ (0x3310, "M", "ギガ"),
+ (0x3311, "M", "ギニー"),
+ (0x3312, "M", "キュリー"),
+ (0x3313, "M", "ギルダー"),
+ (0x3314, "M", "キロ"),
+ (0x3315, "M", "キログラム"),
+ (0x3316, "M", "キロメートル"),
+ (0x3317, "M", "キロワット"),
+ (0x3318, "M", "グラム"),
+ (0x3319, "M", "グラムトン"),
]
+
def _seg_33() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x3316, 'M', 'キロメートル'),
- (0x3317, 'M', 'キロワット'),
- (0x3318, 'M', 'グラム'),
- (0x3319, 'M', 'グラムトン'),
- (0x331A, 'M', 'クルゼイロ'),
- (0x331B, 'M', 'クローネ'),
- (0x331C, 'M', 'ケース'),
- (0x331D, 'M', 'コルナ'),
- (0x331E, 'M', 'コーポ'),
- (0x331F, 'M', 'サイクル'),
- (0x3320, 'M', 'サンチーム'),
- (0x3321, 'M', 'シリング'),
- (0x3322, 'M', 'センチ'),
- (0x3323, 'M', 'セント'),
- (0x3324, 'M', 'ダース'),
- (0x3325, 'M', 'デシ'),
- (0x3326, 'M', 'ドル'),
- (0x3327, 'M', 'トン'),
- (0x3328, 'M', 'ナノ'),
- (0x3329, 'M', 'ノット'),
- (0x332A, 'M', 'ハイツ'),
- (0x332B, 'M', 'パーセント'),
- (0x332C, 'M', 'パーツ'),
- (0x332D, 'M', 'バーレル'),
- (0x332E, 'M', 'ピアストル'),
- (0x332F, 'M', 'ピクル'),
- (0x3330, 'M', 'ピコ'),
- (0x3331, 'M', 'ビル'),
- (0x3332, 'M', 'ファラッド'),
- (0x3333, 'M', 'フィート'),
- (0x3334, 'M', 'ブッシェル'),
- (0x3335, 'M', 'フラン'),
- (0x3336, 'M', 'ヘクタール'),
- (0x3337, 'M', 'ペソ'),
- (0x3338, 'M', 'ペニヒ'),
- (0x3339, 'M', 'ヘルツ'),
- (0x333A, 'M', 'ペンス'),
- (0x333B, 'M', 'ページ'),
- (0x333C, 'M', 'ベータ'),
- (0x333D, 'M', 'ポイント'),
- (0x333E, 'M', 'ボルト'),
- (0x333F, 'M', 'ホン'),
- (0x3340, 'M', 'ポンド'),
- (0x3341, 'M', 'ホール'),
- (0x3342, 'M', 'ホーン'),
- (0x3343, 'M', 'マイクロ'),
- (0x3344, 'M', 'マイル'),
- (0x3345, 'M', 'マッハ'),
- (0x3346, 'M', 'マルク'),
- (0x3347, 'M', 'マンション'),
- (0x3348, 'M', 'ミクロン'),
- (0x3349, 'M', 'ミリ'),
- (0x334A, 'M', 'ミリバール'),
- (0x334B, 'M', 'メガ'),
- (0x334C, 'M', 'メガトン'),
- (0x334D, 'M', 'メートル'),
- (0x334E, 'M', 'ヤード'),
- (0x334F, 'M', 'ヤール'),
- (0x3350, 'M', 'ユアン'),
- (0x3351, 'M', 'リットル'),
- (0x3352, 'M', 'リラ'),
- (0x3353, 'M', 'ルピー'),
- (0x3354, 'M', 'ルーブル'),
- (0x3355, 'M', 'レム'),
- (0x3356, 'M', 'レントゲン'),
- (0x3357, 'M', 'ワット'),
- (0x3358, 'M', '0点'),
- (0x3359, 'M', '1点'),
- (0x335A, 'M', '2点'),
- (0x335B, 'M', '3点'),
- (0x335C, 'M', '4点'),
- (0x335D, 'M', '5点'),
- (0x335E, 'M', '6点'),
- (0x335F, 'M', '7点'),
- (0x3360, 'M', '8点'),
- (0x3361, 'M', '9点'),
- (0x3362, 'M', '10点'),
- (0x3363, 'M', '11点'),
- (0x3364, 'M', '12点'),
- (0x3365, 'M', '13点'),
- (0x3366, 'M', '14点'),
- (0x3367, 'M', '15点'),
- (0x3368, 'M', '16点'),
- (0x3369, 'M', '17点'),
- (0x336A, 'M', '18点'),
- (0x336B, 'M', '19点'),
- (0x336C, 'M', '20点'),
- (0x336D, 'M', '21点'),
- (0x336E, 'M', '22点'),
- (0x336F, 'M', '23点'),
- (0x3370, 'M', '24点'),
- (0x3371, 'M', 'hpa'),
- (0x3372, 'M', 'da'),
- (0x3373, 'M', 'au'),
- (0x3374, 'M', 'bar'),
- (0x3375, 'M', 'ov'),
- (0x3376, 'M', 'pc'),
- (0x3377, 'M', 'dm'),
- (0x3378, 'M', 'dm2'),
- (0x3379, 'M', 'dm3'),
+ (0x331A, "M", "クルゼイロ"),
+ (0x331B, "M", "クローネ"),
+ (0x331C, "M", "ケース"),
+ (0x331D, "M", "コルナ"),
+ (0x331E, "M", "コーポ"),
+ (0x331F, "M", "サイクル"),
+ (0x3320, "M", "サンチーム"),
+ (0x3321, "M", "シリング"),
+ (0x3322, "M", "センチ"),
+ (0x3323, "M", "セント"),
+ (0x3324, "M", "ダース"),
+ (0x3325, "M", "デシ"),
+ (0x3326, "M", "ドル"),
+ (0x3327, "M", "トン"),
+ (0x3328, "M", "ナノ"),
+ (0x3329, "M", "ノット"),
+ (0x332A, "M", "ハイツ"),
+ (0x332B, "M", "パーセント"),
+ (0x332C, "M", "パーツ"),
+ (0x332D, "M", "バーレル"),
+ (0x332E, "M", "ピアストル"),
+ (0x332F, "M", "ピクル"),
+ (0x3330, "M", "ピコ"),
+ (0x3331, "M", "ビル"),
+ (0x3332, "M", "ファラッド"),
+ (0x3333, "M", "フィート"),
+ (0x3334, "M", "ブッシェル"),
+ (0x3335, "M", "フラン"),
+ (0x3336, "M", "ヘクタール"),
+ (0x3337, "M", "ペソ"),
+ (0x3338, "M", "ペニヒ"),
+ (0x3339, "M", "ヘルツ"),
+ (0x333A, "M", "ペンス"),
+ (0x333B, "M", "ページ"),
+ (0x333C, "M", "ベータ"),
+ (0x333D, "M", "ポイント"),
+ (0x333E, "M", "ボルト"),
+ (0x333F, "M", "ホン"),
+ (0x3340, "M", "ポンド"),
+ (0x3341, "M", "ホール"),
+ (0x3342, "M", "ホーン"),
+ (0x3343, "M", "マイクロ"),
+ (0x3344, "M", "マイル"),
+ (0x3345, "M", "マッハ"),
+ (0x3346, "M", "マルク"),
+ (0x3347, "M", "マンション"),
+ (0x3348, "M", "ミクロン"),
+ (0x3349, "M", "ミリ"),
+ (0x334A, "M", "ミリバール"),
+ (0x334B, "M", "メガ"),
+ (0x334C, "M", "メガトン"),
+ (0x334D, "M", "メートル"),
+ (0x334E, "M", "ヤード"),
+ (0x334F, "M", "ヤール"),
+ (0x3350, "M", "ユアン"),
+ (0x3351, "M", "リットル"),
+ (0x3352, "M", "リラ"),
+ (0x3353, "M", "ルピー"),
+ (0x3354, "M", "ルーブル"),
+ (0x3355, "M", "レム"),
+ (0x3356, "M", "レントゲン"),
+ (0x3357, "M", "ワット"),
+ (0x3358, "M", "0点"),
+ (0x3359, "M", "1点"),
+ (0x335A, "M", "2点"),
+ (0x335B, "M", "3点"),
+ (0x335C, "M", "4点"),
+ (0x335D, "M", "5点"),
+ (0x335E, "M", "6点"),
+ (0x335F, "M", "7点"),
+ (0x3360, "M", "8点"),
+ (0x3361, "M", "9点"),
+ (0x3362, "M", "10点"),
+ (0x3363, "M", "11点"),
+ (0x3364, "M", "12点"),
+ (0x3365, "M", "13点"),
+ (0x3366, "M", "14点"),
+ (0x3367, "M", "15点"),
+ (0x3368, "M", "16点"),
+ (0x3369, "M", "17点"),
+ (0x336A, "M", "18点"),
+ (0x336B, "M", "19点"),
+ (0x336C, "M", "20点"),
+ (0x336D, "M", "21点"),
+ (0x336E, "M", "22点"),
+ (0x336F, "M", "23点"),
+ (0x3370, "M", "24点"),
+ (0x3371, "M", "hpa"),
+ (0x3372, "M", "da"),
+ (0x3373, "M", "au"),
+ (0x3374, "M", "bar"),
+ (0x3375, "M", "ov"),
+ (0x3376, "M", "pc"),
+ (0x3377, "M", "dm"),
+ (0x3378, "M", "dm2"),
+ (0x3379, "M", "dm3"),
+ (0x337A, "M", "iu"),
+ (0x337B, "M", "平成"),
+ (0x337C, "M", "昭和"),
+ (0x337D, "M", "大正"),
]
+
def _seg_34() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x337A, 'M', 'iu'),
- (0x337B, 'M', '平成'),
- (0x337C, 'M', '昭和'),
- (0x337D, 'M', '大正'),
- (0x337E, 'M', '明治'),
- (0x337F, 'M', '株式会社'),
- (0x3380, 'M', 'pa'),
- (0x3381, 'M', 'na'),
- (0x3382, 'M', 'μa'),
- (0x3383, 'M', 'ma'),
- (0x3384, 'M', 'ka'),
- (0x3385, 'M', 'kb'),
- (0x3386, 'M', 'mb'),
- (0x3387, 'M', 'gb'),
- (0x3388, 'M', 'cal'),
- (0x3389, 'M', 'kcal'),
- (0x338A, 'M', 'pf'),
- (0x338B, 'M', 'nf'),
- (0x338C, 'M', 'μf'),
- (0x338D, 'M', 'μg'),
- (0x338E, 'M', 'mg'),
- (0x338F, 'M', 'kg'),
- (0x3390, 'M', 'hz'),
- (0x3391, 'M', 'khz'),
- (0x3392, 'M', 'mhz'),
- (0x3393, 'M', 'ghz'),
- (0x3394, 'M', 'thz'),
- (0x3395, 'M', 'μl'),
- (0x3396, 'M', 'ml'),
- (0x3397, 'M', 'dl'),
- (0x3398, 'M', 'kl'),
- (0x3399, 'M', 'fm'),
- (0x339A, 'M', 'nm'),
- (0x339B, 'M', 'μm'),
- (0x339C, 'M', 'mm'),
- (0x339D, 'M', 'cm'),
- (0x339E, 'M', 'km'),
- (0x339F, 'M', 'mm2'),
- (0x33A0, 'M', 'cm2'),
- (0x33A1, 'M', 'm2'),
- (0x33A2, 'M', 'km2'),
- (0x33A3, 'M', 'mm3'),
- (0x33A4, 'M', 'cm3'),
- (0x33A5, 'M', 'm3'),
- (0x33A6, 'M', 'km3'),
- (0x33A7, 'M', 'm∕s'),
- (0x33A8, 'M', 'm∕s2'),
- (0x33A9, 'M', 'pa'),
- (0x33AA, 'M', 'kpa'),
- (0x33AB, 'M', 'mpa'),
- (0x33AC, 'M', 'gpa'),
- (0x33AD, 'M', 'rad'),
- (0x33AE, 'M', 'rad∕s'),
- (0x33AF, 'M', 'rad∕s2'),
- (0x33B0, 'M', 'ps'),
- (0x33B1, 'M', 'ns'),
- (0x33B2, 'M', 'μs'),
- (0x33B3, 'M', 'ms'),
- (0x33B4, 'M', 'pv'),
- (0x33B5, 'M', 'nv'),
- (0x33B6, 'M', 'μv'),
- (0x33B7, 'M', 'mv'),
- (0x33B8, 'M', 'kv'),
- (0x33B9, 'M', 'mv'),
- (0x33BA, 'M', 'pw'),
- (0x33BB, 'M', 'nw'),
- (0x33BC, 'M', 'μw'),
- (0x33BD, 'M', 'mw'),
- (0x33BE, 'M', 'kw'),
- (0x33BF, 'M', 'mw'),
- (0x33C0, 'M', 'kω'),
- (0x33C1, 'M', 'mω'),
- (0x33C2, 'X'),
- (0x33C3, 'M', 'bq'),
- (0x33C4, 'M', 'cc'),
- (0x33C5, 'M', 'cd'),
- (0x33C6, 'M', 'c∕kg'),
- (0x33C7, 'X'),
- (0x33C8, 'M', 'db'),
- (0x33C9, 'M', 'gy'),
- (0x33CA, 'M', 'ha'),
- (0x33CB, 'M', 'hp'),
- (0x33CC, 'M', 'in'),
- (0x33CD, 'M', 'kk'),
- (0x33CE, 'M', 'km'),
- (0x33CF, 'M', 'kt'),
- (0x33D0, 'M', 'lm'),
- (0x33D1, 'M', 'ln'),
- (0x33D2, 'M', 'log'),
- (0x33D3, 'M', 'lx'),
- (0x33D4, 'M', 'mb'),
- (0x33D5, 'M', 'mil'),
- (0x33D6, 'M', 'mol'),
- (0x33D7, 'M', 'ph'),
- (0x33D8, 'X'),
- (0x33D9, 'M', 'ppm'),
- (0x33DA, 'M', 'pr'),
- (0x33DB, 'M', 'sr'),
- (0x33DC, 'M', 'sv'),
- (0x33DD, 'M', 'wb'),
+ (0x337E, "M", "明治"),
+ (0x337F, "M", "株式会社"),
+ (0x3380, "M", "pa"),
+ (0x3381, "M", "na"),
+ (0x3382, "M", "μa"),
+ (0x3383, "M", "ma"),
+ (0x3384, "M", "ka"),
+ (0x3385, "M", "kb"),
+ (0x3386, "M", "mb"),
+ (0x3387, "M", "gb"),
+ (0x3388, "M", "cal"),
+ (0x3389, "M", "kcal"),
+ (0x338A, "M", "pf"),
+ (0x338B, "M", "nf"),
+ (0x338C, "M", "μf"),
+ (0x338D, "M", "μg"),
+ (0x338E, "M", "mg"),
+ (0x338F, "M", "kg"),
+ (0x3390, "M", "hz"),
+ (0x3391, "M", "khz"),
+ (0x3392, "M", "mhz"),
+ (0x3393, "M", "ghz"),
+ (0x3394, "M", "thz"),
+ (0x3395, "M", "μl"),
+ (0x3396, "M", "ml"),
+ (0x3397, "M", "dl"),
+ (0x3398, "M", "kl"),
+ (0x3399, "M", "fm"),
+ (0x339A, "M", "nm"),
+ (0x339B, "M", "μm"),
+ (0x339C, "M", "mm"),
+ (0x339D, "M", "cm"),
+ (0x339E, "M", "km"),
+ (0x339F, "M", "mm2"),
+ (0x33A0, "M", "cm2"),
+ (0x33A1, "M", "m2"),
+ (0x33A2, "M", "km2"),
+ (0x33A3, "M", "mm3"),
+ (0x33A4, "M", "cm3"),
+ (0x33A5, "M", "m3"),
+ (0x33A6, "M", "km3"),
+ (0x33A7, "M", "m∕s"),
+ (0x33A8, "M", "m∕s2"),
+ (0x33A9, "M", "pa"),
+ (0x33AA, "M", "kpa"),
+ (0x33AB, "M", "mpa"),
+ (0x33AC, "M", "gpa"),
+ (0x33AD, "M", "rad"),
+ (0x33AE, "M", "rad∕s"),
+ (0x33AF, "M", "rad∕s2"),
+ (0x33B0, "M", "ps"),
+ (0x33B1, "M", "ns"),
+ (0x33B2, "M", "μs"),
+ (0x33B3, "M", "ms"),
+ (0x33B4, "M", "pv"),
+ (0x33B5, "M", "nv"),
+ (0x33B6, "M", "μv"),
+ (0x33B7, "M", "mv"),
+ (0x33B8, "M", "kv"),
+ (0x33B9, "M", "mv"),
+ (0x33BA, "M", "pw"),
+ (0x33BB, "M", "nw"),
+ (0x33BC, "M", "μw"),
+ (0x33BD, "M", "mw"),
+ (0x33BE, "M", "kw"),
+ (0x33BF, "M", "mw"),
+ (0x33C0, "M", "kω"),
+ (0x33C1, "M", "mω"),
+ (0x33C2, "X"),
+ (0x33C3, "M", "bq"),
+ (0x33C4, "M", "cc"),
+ (0x33C5, "M", "cd"),
+ (0x33C6, "M", "c∕kg"),
+ (0x33C7, "X"),
+ (0x33C8, "M", "db"),
+ (0x33C9, "M", "gy"),
+ (0x33CA, "M", "ha"),
+ (0x33CB, "M", "hp"),
+ (0x33CC, "M", "in"),
+ (0x33CD, "M", "kk"),
+ (0x33CE, "M", "km"),
+ (0x33CF, "M", "kt"),
+ (0x33D0, "M", "lm"),
+ (0x33D1, "M", "ln"),
+ (0x33D2, "M", "log"),
+ (0x33D3, "M", "lx"),
+ (0x33D4, "M", "mb"),
+ (0x33D5, "M", "mil"),
+ (0x33D6, "M", "mol"),
+ (0x33D7, "M", "ph"),
+ (0x33D8, "X"),
+ (0x33D9, "M", "ppm"),
+ (0x33DA, "M", "pr"),
+ (0x33DB, "M", "sr"),
+ (0x33DC, "M", "sv"),
+ (0x33DD, "M", "wb"),
+ (0x33DE, "M", "v∕m"),
+ (0x33DF, "M", "a∕m"),
+ (0x33E0, "M", "1日"),
+ (0x33E1, "M", "2日"),
]
+
def _seg_35() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x33DE, 'M', 'v∕m'),
- (0x33DF, 'M', 'a∕m'),
- (0x33E0, 'M', '1日'),
- (0x33E1, 'M', '2日'),
- (0x33E2, 'M', '3日'),
- (0x33E3, 'M', '4日'),
- (0x33E4, 'M', '5日'),
- (0x33E5, 'M', '6日'),
- (0x33E6, 'M', '7日'),
- (0x33E7, 'M', '8日'),
- (0x33E8, 'M', '9日'),
- (0x33E9, 'M', '10日'),
- (0x33EA, 'M', '11日'),
- (0x33EB, 'M', '12日'),
- (0x33EC, 'M', '13日'),
- (0x33ED, 'M', '14日'),
- (0x33EE, 'M', '15日'),
- (0x33EF, 'M', '16日'),
- (0x33F0, 'M', '17日'),
- (0x33F1, 'M', '18日'),
- (0x33F2, 'M', '19日'),
- (0x33F3, 'M', '20日'),
- (0x33F4, 'M', '21日'),
- (0x33F5, 'M', '22日'),
- (0x33F6, 'M', '23日'),
- (0x33F7, 'M', '24日'),
- (0x33F8, 'M', '25日'),
- (0x33F9, 'M', '26日'),
- (0x33FA, 'M', '27日'),
- (0x33FB, 'M', '28日'),
- (0x33FC, 'M', '29日'),
- (0x33FD, 'M', '30日'),
- (0x33FE, 'M', '31日'),
- (0x33FF, 'M', 'gal'),
- (0x3400, 'V'),
- (0xA48D, 'X'),
- (0xA490, 'V'),
- (0xA4C7, 'X'),
- (0xA4D0, 'V'),
- (0xA62C, 'X'),
- (0xA640, 'M', 'ꙁ'),
- (0xA641, 'V'),
- (0xA642, 'M', 'ꙃ'),
- (0xA643, 'V'),
- (0xA644, 'M', 'ꙅ'),
- (0xA645, 'V'),
- (0xA646, 'M', 'ꙇ'),
- (0xA647, 'V'),
- (0xA648, 'M', 'ꙉ'),
- (0xA649, 'V'),
- (0xA64A, 'M', 'ꙋ'),
- (0xA64B, 'V'),
- (0xA64C, 'M', 'ꙍ'),
- (0xA64D, 'V'),
- (0xA64E, 'M', 'ꙏ'),
- (0xA64F, 'V'),
- (0xA650, 'M', 'ꙑ'),
- (0xA651, 'V'),
- (0xA652, 'M', 'ꙓ'),
- (0xA653, 'V'),
- (0xA654, 'M', 'ꙕ'),
- (0xA655, 'V'),
- (0xA656, 'M', 'ꙗ'),
- (0xA657, 'V'),
- (0xA658, 'M', 'ꙙ'),
- (0xA659, 'V'),
- (0xA65A, 'M', 'ꙛ'),
- (0xA65B, 'V'),
- (0xA65C, 'M', 'ꙝ'),
- (0xA65D, 'V'),
- (0xA65E, 'M', 'ꙟ'),
- (0xA65F, 'V'),
- (0xA660, 'M', 'ꙡ'),
- (0xA661, 'V'),
- (0xA662, 'M', 'ꙣ'),
- (0xA663, 'V'),
- (0xA664, 'M', 'ꙥ'),
- (0xA665, 'V'),
- (0xA666, 'M', 'ꙧ'),
- (0xA667, 'V'),
- (0xA668, 'M', 'ꙩ'),
- (0xA669, 'V'),
- (0xA66A, 'M', 'ꙫ'),
- (0xA66B, 'V'),
- (0xA66C, 'M', 'ꙭ'),
- (0xA66D, 'V'),
- (0xA680, 'M', 'ꚁ'),
- (0xA681, 'V'),
- (0xA682, 'M', 'ꚃ'),
- (0xA683, 'V'),
- (0xA684, 'M', 'ꚅ'),
- (0xA685, 'V'),
- (0xA686, 'M', 'ꚇ'),
- (0xA687, 'V'),
- (0xA688, 'M', 'ꚉ'),
- (0xA689, 'V'),
- (0xA68A, 'M', 'ꚋ'),
- (0xA68B, 'V'),
- (0xA68C, 'M', 'ꚍ'),
- (0xA68D, 'V'),
+ (0x33E2, "M", "3日"),
+ (0x33E3, "M", "4日"),
+ (0x33E4, "M", "5日"),
+ (0x33E5, "M", "6日"),
+ (0x33E6, "M", "7日"),
+ (0x33E7, "M", "8日"),
+ (0x33E8, "M", "9日"),
+ (0x33E9, "M", "10日"),
+ (0x33EA, "M", "11日"),
+ (0x33EB, "M", "12日"),
+ (0x33EC, "M", "13日"),
+ (0x33ED, "M", "14日"),
+ (0x33EE, "M", "15日"),
+ (0x33EF, "M", "16日"),
+ (0x33F0, "M", "17日"),
+ (0x33F1, "M", "18日"),
+ (0x33F2, "M", "19日"),
+ (0x33F3, "M", "20日"),
+ (0x33F4, "M", "21日"),
+ (0x33F5, "M", "22日"),
+ (0x33F6, "M", "23日"),
+ (0x33F7, "M", "24日"),
+ (0x33F8, "M", "25日"),
+ (0x33F9, "M", "26日"),
+ (0x33FA, "M", "27日"),
+ (0x33FB, "M", "28日"),
+ (0x33FC, "M", "29日"),
+ (0x33FD, "M", "30日"),
+ (0x33FE, "M", "31日"),
+ (0x33FF, "M", "gal"),
+ (0x3400, "V"),
+ (0xA48D, "X"),
+ (0xA490, "V"),
+ (0xA4C7, "X"),
+ (0xA4D0, "V"),
+ (0xA62C, "X"),
+ (0xA640, "M", "ꙁ"),
+ (0xA641, "V"),
+ (0xA642, "M", "ꙃ"),
+ (0xA643, "V"),
+ (0xA644, "M", "ꙅ"),
+ (0xA645, "V"),
+ (0xA646, "M", "ꙇ"),
+ (0xA647, "V"),
+ (0xA648, "M", "ꙉ"),
+ (0xA649, "V"),
+ (0xA64A, "M", "ꙋ"),
+ (0xA64B, "V"),
+ (0xA64C, "M", "ꙍ"),
+ (0xA64D, "V"),
+ (0xA64E, "M", "ꙏ"),
+ (0xA64F, "V"),
+ (0xA650, "M", "ꙑ"),
+ (0xA651, "V"),
+ (0xA652, "M", "ꙓ"),
+ (0xA653, "V"),
+ (0xA654, "M", "ꙕ"),
+ (0xA655, "V"),
+ (0xA656, "M", "ꙗ"),
+ (0xA657, "V"),
+ (0xA658, "M", "ꙙ"),
+ (0xA659, "V"),
+ (0xA65A, "M", "ꙛ"),
+ (0xA65B, "V"),
+ (0xA65C, "M", "ꙝ"),
+ (0xA65D, "V"),
+ (0xA65E, "M", "ꙟ"),
+ (0xA65F, "V"),
+ (0xA660, "M", "ꙡ"),
+ (0xA661, "V"),
+ (0xA662, "M", "ꙣ"),
+ (0xA663, "V"),
+ (0xA664, "M", "ꙥ"),
+ (0xA665, "V"),
+ (0xA666, "M", "ꙧ"),
+ (0xA667, "V"),
+ (0xA668, "M", "ꙩ"),
+ (0xA669, "V"),
+ (0xA66A, "M", "ꙫ"),
+ (0xA66B, "V"),
+ (0xA66C, "M", "ꙭ"),
+ (0xA66D, "V"),
+ (0xA680, "M", "ꚁ"),
+ (0xA681, "V"),
+ (0xA682, "M", "ꚃ"),
+ (0xA683, "V"),
+ (0xA684, "M", "ꚅ"),
+ (0xA685, "V"),
+ (0xA686, "M", "ꚇ"),
+ (0xA687, "V"),
+ (0xA688, "M", "ꚉ"),
+ (0xA689, "V"),
+ (0xA68A, "M", "ꚋ"),
+ (0xA68B, "V"),
+ (0xA68C, "M", "ꚍ"),
+ (0xA68D, "V"),
+ (0xA68E, "M", "ꚏ"),
+ (0xA68F, "V"),
+ (0xA690, "M", "ꚑ"),
+ (0xA691, "V"),
]
+
def _seg_36() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA68E, 'M', 'ꚏ'),
- (0xA68F, 'V'),
- (0xA690, 'M', 'ꚑ'),
- (0xA691, 'V'),
- (0xA692, 'M', 'ꚓ'),
- (0xA693, 'V'),
- (0xA694, 'M', 'ꚕ'),
- (0xA695, 'V'),
- (0xA696, 'M', 'ꚗ'),
- (0xA697, 'V'),
- (0xA698, 'M', 'ꚙ'),
- (0xA699, 'V'),
- (0xA69A, 'M', 'ꚛ'),
- (0xA69B, 'V'),
- (0xA69C, 'M', 'ъ'),
- (0xA69D, 'M', 'ь'),
- (0xA69E, 'V'),
- (0xA6F8, 'X'),
- (0xA700, 'V'),
- (0xA722, 'M', 'ꜣ'),
- (0xA723, 'V'),
- (0xA724, 'M', 'ꜥ'),
- (0xA725, 'V'),
- (0xA726, 'M', 'ꜧ'),
- (0xA727, 'V'),
- (0xA728, 'M', 'ꜩ'),
- (0xA729, 'V'),
- (0xA72A, 'M', 'ꜫ'),
- (0xA72B, 'V'),
- (0xA72C, 'M', 'ꜭ'),
- (0xA72D, 'V'),
- (0xA72E, 'M', 'ꜯ'),
- (0xA72F, 'V'),
- (0xA732, 'M', 'ꜳ'),
- (0xA733, 'V'),
- (0xA734, 'M', 'ꜵ'),
- (0xA735, 'V'),
- (0xA736, 'M', 'ꜷ'),
- (0xA737, 'V'),
- (0xA738, 'M', 'ꜹ'),
- (0xA739, 'V'),
- (0xA73A, 'M', 'ꜻ'),
- (0xA73B, 'V'),
- (0xA73C, 'M', 'ꜽ'),
- (0xA73D, 'V'),
- (0xA73E, 'M', 'ꜿ'),
- (0xA73F, 'V'),
- (0xA740, 'M', 'ꝁ'),
- (0xA741, 'V'),
- (0xA742, 'M', 'ꝃ'),
- (0xA743, 'V'),
- (0xA744, 'M', 'ꝅ'),
- (0xA745, 'V'),
- (0xA746, 'M', 'ꝇ'),
- (0xA747, 'V'),
- (0xA748, 'M', 'ꝉ'),
- (0xA749, 'V'),
- (0xA74A, 'M', 'ꝋ'),
- (0xA74B, 'V'),
- (0xA74C, 'M', 'ꝍ'),
- (0xA74D, 'V'),
- (0xA74E, 'M', 'ꝏ'),
- (0xA74F, 'V'),
- (0xA750, 'M', 'ꝑ'),
- (0xA751, 'V'),
- (0xA752, 'M', 'ꝓ'),
- (0xA753, 'V'),
- (0xA754, 'M', 'ꝕ'),
- (0xA755, 'V'),
- (0xA756, 'M', 'ꝗ'),
- (0xA757, 'V'),
- (0xA758, 'M', 'ꝙ'),
- (0xA759, 'V'),
- (0xA75A, 'M', 'ꝛ'),
- (0xA75B, 'V'),
- (0xA75C, 'M', 'ꝝ'),
- (0xA75D, 'V'),
- (0xA75E, 'M', 'ꝟ'),
- (0xA75F, 'V'),
- (0xA760, 'M', 'ꝡ'),
- (0xA761, 'V'),
- (0xA762, 'M', 'ꝣ'),
- (0xA763, 'V'),
- (0xA764, 'M', 'ꝥ'),
- (0xA765, 'V'),
- (0xA766, 'M', 'ꝧ'),
- (0xA767, 'V'),
- (0xA768, 'M', 'ꝩ'),
- (0xA769, 'V'),
- (0xA76A, 'M', 'ꝫ'),
- (0xA76B, 'V'),
- (0xA76C, 'M', 'ꝭ'),
- (0xA76D, 'V'),
- (0xA76E, 'M', 'ꝯ'),
- (0xA76F, 'V'),
- (0xA770, 'M', 'ꝯ'),
- (0xA771, 'V'),
- (0xA779, 'M', 'ꝺ'),
- (0xA77A, 'V'),
- (0xA77B, 'M', 'ꝼ'),
+ (0xA692, "M", "ꚓ"),
+ (0xA693, "V"),
+ (0xA694, "M", "ꚕ"),
+ (0xA695, "V"),
+ (0xA696, "M", "ꚗ"),
+ (0xA697, "V"),
+ (0xA698, "M", "ꚙ"),
+ (0xA699, "V"),
+ (0xA69A, "M", "ꚛ"),
+ (0xA69B, "V"),
+ (0xA69C, "M", "ъ"),
+ (0xA69D, "M", "ь"),
+ (0xA69E, "V"),
+ (0xA6F8, "X"),
+ (0xA700, "V"),
+ (0xA722, "M", "ꜣ"),
+ (0xA723, "V"),
+ (0xA724, "M", "ꜥ"),
+ (0xA725, "V"),
+ (0xA726, "M", "ꜧ"),
+ (0xA727, "V"),
+ (0xA728, "M", "ꜩ"),
+ (0xA729, "V"),
+ (0xA72A, "M", "ꜫ"),
+ (0xA72B, "V"),
+ (0xA72C, "M", "ꜭ"),
+ (0xA72D, "V"),
+ (0xA72E, "M", "ꜯ"),
+ (0xA72F, "V"),
+ (0xA732, "M", "ꜳ"),
+ (0xA733, "V"),
+ (0xA734, "M", "ꜵ"),
+ (0xA735, "V"),
+ (0xA736, "M", "ꜷ"),
+ (0xA737, "V"),
+ (0xA738, "M", "ꜹ"),
+ (0xA739, "V"),
+ (0xA73A, "M", "ꜻ"),
+ (0xA73B, "V"),
+ (0xA73C, "M", "ꜽ"),
+ (0xA73D, "V"),
+ (0xA73E, "M", "ꜿ"),
+ (0xA73F, "V"),
+ (0xA740, "M", "ꝁ"),
+ (0xA741, "V"),
+ (0xA742, "M", "ꝃ"),
+ (0xA743, "V"),
+ (0xA744, "M", "ꝅ"),
+ (0xA745, "V"),
+ (0xA746, "M", "ꝇ"),
+ (0xA747, "V"),
+ (0xA748, "M", "ꝉ"),
+ (0xA749, "V"),
+ (0xA74A, "M", "ꝋ"),
+ (0xA74B, "V"),
+ (0xA74C, "M", "ꝍ"),
+ (0xA74D, "V"),
+ (0xA74E, "M", "ꝏ"),
+ (0xA74F, "V"),
+ (0xA750, "M", "ꝑ"),
+ (0xA751, "V"),
+ (0xA752, "M", "ꝓ"),
+ (0xA753, "V"),
+ (0xA754, "M", "ꝕ"),
+ (0xA755, "V"),
+ (0xA756, "M", "ꝗ"),
+ (0xA757, "V"),
+ (0xA758, "M", "ꝙ"),
+ (0xA759, "V"),
+ (0xA75A, "M", "ꝛ"),
+ (0xA75B, "V"),
+ (0xA75C, "M", "ꝝ"),
+ (0xA75D, "V"),
+ (0xA75E, "M", "ꝟ"),
+ (0xA75F, "V"),
+ (0xA760, "M", "ꝡ"),
+ (0xA761, "V"),
+ (0xA762, "M", "ꝣ"),
+ (0xA763, "V"),
+ (0xA764, "M", "ꝥ"),
+ (0xA765, "V"),
+ (0xA766, "M", "ꝧ"),
+ (0xA767, "V"),
+ (0xA768, "M", "ꝩ"),
+ (0xA769, "V"),
+ (0xA76A, "M", "ꝫ"),
+ (0xA76B, "V"),
+ (0xA76C, "M", "ꝭ"),
+ (0xA76D, "V"),
+ (0xA76E, "M", "ꝯ"),
+ (0xA76F, "V"),
+ (0xA770, "M", "ꝯ"),
+ (0xA771, "V"),
+ (0xA779, "M", "ꝺ"),
+ (0xA77A, "V"),
+ (0xA77B, "M", "ꝼ"),
+ (0xA77C, "V"),
+ (0xA77D, "M", "ᵹ"),
+ (0xA77E, "M", "ꝿ"),
+ (0xA77F, "V"),
]
+
def _seg_37() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA77C, 'V'),
- (0xA77D, 'M', 'ᵹ'),
- (0xA77E, 'M', 'ꝿ'),
- (0xA77F, 'V'),
- (0xA780, 'M', 'ꞁ'),
- (0xA781, 'V'),
- (0xA782, 'M', 'ꞃ'),
- (0xA783, 'V'),
- (0xA784, 'M', 'ꞅ'),
- (0xA785, 'V'),
- (0xA786, 'M', 'ꞇ'),
- (0xA787, 'V'),
- (0xA78B, 'M', 'ꞌ'),
- (0xA78C, 'V'),
- (0xA78D, 'M', 'ɥ'),
- (0xA78E, 'V'),
- (0xA790, 'M', 'ꞑ'),
- (0xA791, 'V'),
- (0xA792, 'M', 'ꞓ'),
- (0xA793, 'V'),
- (0xA796, 'M', 'ꞗ'),
- (0xA797, 'V'),
- (0xA798, 'M', 'ꞙ'),
- (0xA799, 'V'),
- (0xA79A, 'M', 'ꞛ'),
- (0xA79B, 'V'),
- (0xA79C, 'M', 'ꞝ'),
- (0xA79D, 'V'),
- (0xA79E, 'M', 'ꞟ'),
- (0xA79F, 'V'),
- (0xA7A0, 'M', 'ꞡ'),
- (0xA7A1, 'V'),
- (0xA7A2, 'M', 'ꞣ'),
- (0xA7A3, 'V'),
- (0xA7A4, 'M', 'ꞥ'),
- (0xA7A5, 'V'),
- (0xA7A6, 'M', 'ꞧ'),
- (0xA7A7, 'V'),
- (0xA7A8, 'M', 'ꞩ'),
- (0xA7A9, 'V'),
- (0xA7AA, 'M', 'ɦ'),
- (0xA7AB, 'M', 'ɜ'),
- (0xA7AC, 'M', 'ɡ'),
- (0xA7AD, 'M', 'ɬ'),
- (0xA7AE, 'M', 'ɪ'),
- (0xA7AF, 'V'),
- (0xA7B0, 'M', 'ʞ'),
- (0xA7B1, 'M', 'ʇ'),
- (0xA7B2, 'M', 'ʝ'),
- (0xA7B3, 'M', 'ꭓ'),
- (0xA7B4, 'M', 'ꞵ'),
- (0xA7B5, 'V'),
- (0xA7B6, 'M', 'ꞷ'),
- (0xA7B7, 'V'),
- (0xA7B8, 'M', 'ꞹ'),
- (0xA7B9, 'V'),
- (0xA7BA, 'M', 'ꞻ'),
- (0xA7BB, 'V'),
- (0xA7BC, 'M', 'ꞽ'),
- (0xA7BD, 'V'),
- (0xA7BE, 'M', 'ꞿ'),
- (0xA7BF, 'V'),
- (0xA7C0, 'M', 'ꟁ'),
- (0xA7C1, 'V'),
- (0xA7C2, 'M', 'ꟃ'),
- (0xA7C3, 'V'),
- (0xA7C4, 'M', 'ꞔ'),
- (0xA7C5, 'M', 'ʂ'),
- (0xA7C6, 'M', 'ᶎ'),
- (0xA7C7, 'M', 'ꟈ'),
- (0xA7C8, 'V'),
- (0xA7C9, 'M', 'ꟊ'),
- (0xA7CA, 'V'),
- (0xA7CB, 'X'),
- (0xA7D0, 'M', 'ꟑ'),
- (0xA7D1, 'V'),
- (0xA7D2, 'X'),
- (0xA7D3, 'V'),
- (0xA7D4, 'X'),
- (0xA7D5, 'V'),
- (0xA7D6, 'M', 'ꟗ'),
- (0xA7D7, 'V'),
- (0xA7D8, 'M', 'ꟙ'),
- (0xA7D9, 'V'),
- (0xA7DA, 'X'),
- (0xA7F2, 'M', 'c'),
- (0xA7F3, 'M', 'f'),
- (0xA7F4, 'M', 'q'),
- (0xA7F5, 'M', 'ꟶ'),
- (0xA7F6, 'V'),
- (0xA7F8, 'M', 'ħ'),
- (0xA7F9, 'M', 'œ'),
- (0xA7FA, 'V'),
- (0xA82D, 'X'),
- (0xA830, 'V'),
- (0xA83A, 'X'),
- (0xA840, 'V'),
- (0xA878, 'X'),
- (0xA880, 'V'),
- (0xA8C6, 'X'),
+ (0xA780, "M", "ꞁ"),
+ (0xA781, "V"),
+ (0xA782, "M", "ꞃ"),
+ (0xA783, "V"),
+ (0xA784, "M", "ꞅ"),
+ (0xA785, "V"),
+ (0xA786, "M", "ꞇ"),
+ (0xA787, "V"),
+ (0xA78B, "M", "ꞌ"),
+ (0xA78C, "V"),
+ (0xA78D, "M", "ɥ"),
+ (0xA78E, "V"),
+ (0xA790, "M", "ꞑ"),
+ (0xA791, "V"),
+ (0xA792, "M", "ꞓ"),
+ (0xA793, "V"),
+ (0xA796, "M", "ꞗ"),
+ (0xA797, "V"),
+ (0xA798, "M", "ꞙ"),
+ (0xA799, "V"),
+ (0xA79A, "M", "ꞛ"),
+ (0xA79B, "V"),
+ (0xA79C, "M", "ꞝ"),
+ (0xA79D, "V"),
+ (0xA79E, "M", "ꞟ"),
+ (0xA79F, "V"),
+ (0xA7A0, "M", "ꞡ"),
+ (0xA7A1, "V"),
+ (0xA7A2, "M", "ꞣ"),
+ (0xA7A3, "V"),
+ (0xA7A4, "M", "ꞥ"),
+ (0xA7A5, "V"),
+ (0xA7A6, "M", "ꞧ"),
+ (0xA7A7, "V"),
+ (0xA7A8, "M", "ꞩ"),
+ (0xA7A9, "V"),
+ (0xA7AA, "M", "ɦ"),
+ (0xA7AB, "M", "ɜ"),
+ (0xA7AC, "M", "ɡ"),
+ (0xA7AD, "M", "ɬ"),
+ (0xA7AE, "M", "ɪ"),
+ (0xA7AF, "V"),
+ (0xA7B0, "M", "ʞ"),
+ (0xA7B1, "M", "ʇ"),
+ (0xA7B2, "M", "ʝ"),
+ (0xA7B3, "M", "ꭓ"),
+ (0xA7B4, "M", "ꞵ"),
+ (0xA7B5, "V"),
+ (0xA7B6, "M", "ꞷ"),
+ (0xA7B7, "V"),
+ (0xA7B8, "M", "ꞹ"),
+ (0xA7B9, "V"),
+ (0xA7BA, "M", "ꞻ"),
+ (0xA7BB, "V"),
+ (0xA7BC, "M", "ꞽ"),
+ (0xA7BD, "V"),
+ (0xA7BE, "M", "ꞿ"),
+ (0xA7BF, "V"),
+ (0xA7C0, "M", "ꟁ"),
+ (0xA7C1, "V"),
+ (0xA7C2, "M", "ꟃ"),
+ (0xA7C3, "V"),
+ (0xA7C4, "M", "ꞔ"),
+ (0xA7C5, "M", "ʂ"),
+ (0xA7C6, "M", "ᶎ"),
+ (0xA7C7, "M", "ꟈ"),
+ (0xA7C8, "V"),
+ (0xA7C9, "M", "ꟊ"),
+ (0xA7CA, "V"),
+ (0xA7CB, "X"),
+ (0xA7D0, "M", "ꟑ"),
+ (0xA7D1, "V"),
+ (0xA7D2, "X"),
+ (0xA7D3, "V"),
+ (0xA7D4, "X"),
+ (0xA7D5, "V"),
+ (0xA7D6, "M", "ꟗ"),
+ (0xA7D7, "V"),
+ (0xA7D8, "M", "ꟙ"),
+ (0xA7D9, "V"),
+ (0xA7DA, "X"),
+ (0xA7F2, "M", "c"),
+ (0xA7F3, "M", "f"),
+ (0xA7F4, "M", "q"),
+ (0xA7F5, "M", "ꟶ"),
+ (0xA7F6, "V"),
+ (0xA7F8, "M", "ħ"),
+ (0xA7F9, "M", "œ"),
+ (0xA7FA, "V"),
+ (0xA82D, "X"),
+ (0xA830, "V"),
+ (0xA83A, "X"),
+ (0xA840, "V"),
+ (0xA878, "X"),
+ (0xA880, "V"),
+ (0xA8C6, "X"),
+ (0xA8CE, "V"),
+ (0xA8DA, "X"),
+ (0xA8E0, "V"),
+ (0xA954, "X"),
]
+
def _seg_38() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xA8CE, 'V'),
- (0xA8DA, 'X'),
- (0xA8E0, 'V'),
- (0xA954, 'X'),
- (0xA95F, 'V'),
- (0xA97D, 'X'),
- (0xA980, 'V'),
- (0xA9CE, 'X'),
- (0xA9CF, 'V'),
- (0xA9DA, 'X'),
- (0xA9DE, 'V'),
- (0xA9FF, 'X'),
- (0xAA00, 'V'),
- (0xAA37, 'X'),
- (0xAA40, 'V'),
- (0xAA4E, 'X'),
- (0xAA50, 'V'),
- (0xAA5A, 'X'),
- (0xAA5C, 'V'),
- (0xAAC3, 'X'),
- (0xAADB, 'V'),
- (0xAAF7, 'X'),
- (0xAB01, 'V'),
- (0xAB07, 'X'),
- (0xAB09, 'V'),
- (0xAB0F, 'X'),
- (0xAB11, 'V'),
- (0xAB17, 'X'),
- (0xAB20, 'V'),
- (0xAB27, 'X'),
- (0xAB28, 'V'),
- (0xAB2F, 'X'),
- (0xAB30, 'V'),
- (0xAB5C, 'M', 'ꜧ'),
- (0xAB5D, 'M', 'ꬷ'),
- (0xAB5E, 'M', 'ɫ'),
- (0xAB5F, 'M', 'ꭒ'),
- (0xAB60, 'V'),
- (0xAB69, 'M', 'ʍ'),
- (0xAB6A, 'V'),
- (0xAB6C, 'X'),
- (0xAB70, 'M', 'Ꭰ'),
- (0xAB71, 'M', 'Ꭱ'),
- (0xAB72, 'M', 'Ꭲ'),
- (0xAB73, 'M', 'Ꭳ'),
- (0xAB74, 'M', 'Ꭴ'),
- (0xAB75, 'M', 'Ꭵ'),
- (0xAB76, 'M', 'Ꭶ'),
- (0xAB77, 'M', 'Ꭷ'),
- (0xAB78, 'M', 'Ꭸ'),
- (0xAB79, 'M', 'Ꭹ'),
- (0xAB7A, 'M', 'Ꭺ'),
- (0xAB7B, 'M', 'Ꭻ'),
- (0xAB7C, 'M', 'Ꭼ'),
- (0xAB7D, 'M', 'Ꭽ'),
- (0xAB7E, 'M', 'Ꭾ'),
- (0xAB7F, 'M', 'Ꭿ'),
- (0xAB80, 'M', 'Ꮀ'),
- (0xAB81, 'M', 'Ꮁ'),
- (0xAB82, 'M', 'Ꮂ'),
- (0xAB83, 'M', 'Ꮃ'),
- (0xAB84, 'M', 'Ꮄ'),
- (0xAB85, 'M', 'Ꮅ'),
- (0xAB86, 'M', 'Ꮆ'),
- (0xAB87, 'M', 'Ꮇ'),
- (0xAB88, 'M', 'Ꮈ'),
- (0xAB89, 'M', 'Ꮉ'),
- (0xAB8A, 'M', 'Ꮊ'),
- (0xAB8B, 'M', 'Ꮋ'),
- (0xAB8C, 'M', 'Ꮌ'),
- (0xAB8D, 'M', 'Ꮍ'),
- (0xAB8E, 'M', 'Ꮎ'),
- (0xAB8F, 'M', 'Ꮏ'),
- (0xAB90, 'M', 'Ꮐ'),
- (0xAB91, 'M', 'Ꮑ'),
- (0xAB92, 'M', 'Ꮒ'),
- (0xAB93, 'M', 'Ꮓ'),
- (0xAB94, 'M', 'Ꮔ'),
- (0xAB95, 'M', 'Ꮕ'),
- (0xAB96, 'M', 'Ꮖ'),
- (0xAB97, 'M', 'Ꮗ'),
- (0xAB98, 'M', 'Ꮘ'),
- (0xAB99, 'M', 'Ꮙ'),
- (0xAB9A, 'M', 'Ꮚ'),
- (0xAB9B, 'M', 'Ꮛ'),
- (0xAB9C, 'M', 'Ꮜ'),
- (0xAB9D, 'M', 'Ꮝ'),
- (0xAB9E, 'M', 'Ꮞ'),
- (0xAB9F, 'M', 'Ꮟ'),
- (0xABA0, 'M', 'Ꮠ'),
- (0xABA1, 'M', 'Ꮡ'),
- (0xABA2, 'M', 'Ꮢ'),
- (0xABA3, 'M', 'Ꮣ'),
- (0xABA4, 'M', 'Ꮤ'),
- (0xABA5, 'M', 'Ꮥ'),
- (0xABA6, 'M', 'Ꮦ'),
- (0xABA7, 'M', 'Ꮧ'),
- (0xABA8, 'M', 'Ꮨ'),
- (0xABA9, 'M', 'Ꮩ'),
- (0xABAA, 'M', 'Ꮪ'),
+ (0xA95F, "V"),
+ (0xA97D, "X"),
+ (0xA980, "V"),
+ (0xA9CE, "X"),
+ (0xA9CF, "V"),
+ (0xA9DA, "X"),
+ (0xA9DE, "V"),
+ (0xA9FF, "X"),
+ (0xAA00, "V"),
+ (0xAA37, "X"),
+ (0xAA40, "V"),
+ (0xAA4E, "X"),
+ (0xAA50, "V"),
+ (0xAA5A, "X"),
+ (0xAA5C, "V"),
+ (0xAAC3, "X"),
+ (0xAADB, "V"),
+ (0xAAF7, "X"),
+ (0xAB01, "V"),
+ (0xAB07, "X"),
+ (0xAB09, "V"),
+ (0xAB0F, "X"),
+ (0xAB11, "V"),
+ (0xAB17, "X"),
+ (0xAB20, "V"),
+ (0xAB27, "X"),
+ (0xAB28, "V"),
+ (0xAB2F, "X"),
+ (0xAB30, "V"),
+ (0xAB5C, "M", "ꜧ"),
+ (0xAB5D, "M", "ꬷ"),
+ (0xAB5E, "M", "ɫ"),
+ (0xAB5F, "M", "ꭒ"),
+ (0xAB60, "V"),
+ (0xAB69, "M", "ʍ"),
+ (0xAB6A, "V"),
+ (0xAB6C, "X"),
+ (0xAB70, "M", "Ꭰ"),
+ (0xAB71, "M", "Ꭱ"),
+ (0xAB72, "M", "Ꭲ"),
+ (0xAB73, "M", "Ꭳ"),
+ (0xAB74, "M", "Ꭴ"),
+ (0xAB75, "M", "Ꭵ"),
+ (0xAB76, "M", "Ꭶ"),
+ (0xAB77, "M", "Ꭷ"),
+ (0xAB78, "M", "Ꭸ"),
+ (0xAB79, "M", "Ꭹ"),
+ (0xAB7A, "M", "Ꭺ"),
+ (0xAB7B, "M", "Ꭻ"),
+ (0xAB7C, "M", "Ꭼ"),
+ (0xAB7D, "M", "Ꭽ"),
+ (0xAB7E, "M", "Ꭾ"),
+ (0xAB7F, "M", "Ꭿ"),
+ (0xAB80, "M", "Ꮀ"),
+ (0xAB81, "M", "Ꮁ"),
+ (0xAB82, "M", "Ꮂ"),
+ (0xAB83, "M", "Ꮃ"),
+ (0xAB84, "M", "Ꮄ"),
+ (0xAB85, "M", "Ꮅ"),
+ (0xAB86, "M", "Ꮆ"),
+ (0xAB87, "M", "Ꮇ"),
+ (0xAB88, "M", "Ꮈ"),
+ (0xAB89, "M", "Ꮉ"),
+ (0xAB8A, "M", "Ꮊ"),
+ (0xAB8B, "M", "Ꮋ"),
+ (0xAB8C, "M", "Ꮌ"),
+ (0xAB8D, "M", "Ꮍ"),
+ (0xAB8E, "M", "Ꮎ"),
+ (0xAB8F, "M", "Ꮏ"),
+ (0xAB90, "M", "Ꮐ"),
+ (0xAB91, "M", "Ꮑ"),
+ (0xAB92, "M", "Ꮒ"),
+ (0xAB93, "M", "Ꮓ"),
+ (0xAB94, "M", "Ꮔ"),
+ (0xAB95, "M", "Ꮕ"),
+ (0xAB96, "M", "Ꮖ"),
+ (0xAB97, "M", "Ꮗ"),
+ (0xAB98, "M", "Ꮘ"),
+ (0xAB99, "M", "Ꮙ"),
+ (0xAB9A, "M", "Ꮚ"),
+ (0xAB9B, "M", "Ꮛ"),
+ (0xAB9C, "M", "Ꮜ"),
+ (0xAB9D, "M", "Ꮝ"),
+ (0xAB9E, "M", "Ꮞ"),
+ (0xAB9F, "M", "Ꮟ"),
+ (0xABA0, "M", "Ꮠ"),
+ (0xABA1, "M", "Ꮡ"),
+ (0xABA2, "M", "Ꮢ"),
+ (0xABA3, "M", "Ꮣ"),
+ (0xABA4, "M", "Ꮤ"),
+ (0xABA5, "M", "Ꮥ"),
+ (0xABA6, "M", "Ꮦ"),
+ (0xABA7, "M", "Ꮧ"),
+ (0xABA8, "M", "Ꮨ"),
+ (0xABA9, "M", "Ꮩ"),
+ (0xABAA, "M", "Ꮪ"),
+ (0xABAB, "M", "Ꮫ"),
+ (0xABAC, "M", "Ꮬ"),
+ (0xABAD, "M", "Ꮭ"),
+ (0xABAE, "M", "Ꮮ"),
]
+
def _seg_39() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xABAB, 'M', 'Ꮫ'),
- (0xABAC, 'M', 'Ꮬ'),
- (0xABAD, 'M', 'Ꮭ'),
- (0xABAE, 'M', 'Ꮮ'),
- (0xABAF, 'M', 'Ꮯ'),
- (0xABB0, 'M', 'Ꮰ'),
- (0xABB1, 'M', 'Ꮱ'),
- (0xABB2, 'M', 'Ꮲ'),
- (0xABB3, 'M', 'Ꮳ'),
- (0xABB4, 'M', 'Ꮴ'),
- (0xABB5, 'M', 'Ꮵ'),
- (0xABB6, 'M', 'Ꮶ'),
- (0xABB7, 'M', 'Ꮷ'),
- (0xABB8, 'M', 'Ꮸ'),
- (0xABB9, 'M', 'Ꮹ'),
- (0xABBA, 'M', 'Ꮺ'),
- (0xABBB, 'M', 'Ꮻ'),
- (0xABBC, 'M', 'Ꮼ'),
- (0xABBD, 'M', 'Ꮽ'),
- (0xABBE, 'M', 'Ꮾ'),
- (0xABBF, 'M', 'Ꮿ'),
- (0xABC0, 'V'),
- (0xABEE, 'X'),
- (0xABF0, 'V'),
- (0xABFA, 'X'),
- (0xAC00, 'V'),
- (0xD7A4, 'X'),
- (0xD7B0, 'V'),
- (0xD7C7, 'X'),
- (0xD7CB, 'V'),
- (0xD7FC, 'X'),
- (0xF900, 'M', '豈'),
- (0xF901, 'M', '更'),
- (0xF902, 'M', '車'),
- (0xF903, 'M', '賈'),
- (0xF904, 'M', '滑'),
- (0xF905, 'M', '串'),
- (0xF906, 'M', '句'),
- (0xF907, 'M', '龜'),
- (0xF909, 'M', '契'),
- (0xF90A, 'M', '金'),
- (0xF90B, 'M', '喇'),
- (0xF90C, 'M', '奈'),
- (0xF90D, 'M', '懶'),
- (0xF90E, 'M', '癩'),
- (0xF90F, 'M', '羅'),
- (0xF910, 'M', '蘿'),
- (0xF911, 'M', '螺'),
- (0xF912, 'M', '裸'),
- (0xF913, 'M', '邏'),
- (0xF914, 'M', '樂'),
- (0xF915, 'M', '洛'),
- (0xF916, 'M', '烙'),
- (0xF917, 'M', '珞'),
- (0xF918, 'M', '落'),
- (0xF919, 'M', '酪'),
- (0xF91A, 'M', '駱'),
- (0xF91B, 'M', '亂'),
- (0xF91C, 'M', '卵'),
- (0xF91D, 'M', '欄'),
- (0xF91E, 'M', '爛'),
- (0xF91F, 'M', '蘭'),
- (0xF920, 'M', '鸞'),
- (0xF921, 'M', '嵐'),
- (0xF922, 'M', '濫'),
- (0xF923, 'M', '藍'),
- (0xF924, 'M', '襤'),
- (0xF925, 'M', '拉'),
- (0xF926, 'M', '臘'),
- (0xF927, 'M', '蠟'),
- (0xF928, 'M', '廊'),
- (0xF929, 'M', '朗'),
- (0xF92A, 'M', '浪'),
- (0xF92B, 'M', '狼'),
- (0xF92C, 'M', '郎'),
- (0xF92D, 'M', '來'),
- (0xF92E, 'M', '冷'),
- (0xF92F, 'M', '勞'),
- (0xF930, 'M', '擄'),
- (0xF931, 'M', '櫓'),
- (0xF932, 'M', '爐'),
- (0xF933, 'M', '盧'),
- (0xF934, 'M', '老'),
- (0xF935, 'M', '蘆'),
- (0xF936, 'M', '虜'),
- (0xF937, 'M', '路'),
- (0xF938, 'M', '露'),
- (0xF939, 'M', '魯'),
- (0xF93A, 'M', '鷺'),
- (0xF93B, 'M', '碌'),
- (0xF93C, 'M', '祿'),
- (0xF93D, 'M', '綠'),
- (0xF93E, 'M', '菉'),
- (0xF93F, 'M', '錄'),
- (0xF940, 'M', '鹿'),
- (0xF941, 'M', '論'),
- (0xF942, 'M', '壟'),
- (0xF943, 'M', '弄'),
- (0xF944, 'M', '籠'),
- (0xF945, 'M', '聾'),
+ (0xABAF, "M", "Ꮯ"),
+ (0xABB0, "M", "Ꮰ"),
+ (0xABB1, "M", "Ꮱ"),
+ (0xABB2, "M", "Ꮲ"),
+ (0xABB3, "M", "Ꮳ"),
+ (0xABB4, "M", "Ꮴ"),
+ (0xABB5, "M", "Ꮵ"),
+ (0xABB6, "M", "Ꮶ"),
+ (0xABB7, "M", "Ꮷ"),
+ (0xABB8, "M", "Ꮸ"),
+ (0xABB9, "M", "Ꮹ"),
+ (0xABBA, "M", "Ꮺ"),
+ (0xABBB, "M", "Ꮻ"),
+ (0xABBC, "M", "Ꮼ"),
+ (0xABBD, "M", "Ꮽ"),
+ (0xABBE, "M", "Ꮾ"),
+ (0xABBF, "M", "Ꮿ"),
+ (0xABC0, "V"),
+ (0xABEE, "X"),
+ (0xABF0, "V"),
+ (0xABFA, "X"),
+ (0xAC00, "V"),
+ (0xD7A4, "X"),
+ (0xD7B0, "V"),
+ (0xD7C7, "X"),
+ (0xD7CB, "V"),
+ (0xD7FC, "X"),
+ (0xF900, "M", "豈"),
+ (0xF901, "M", "更"),
+ (0xF902, "M", "車"),
+ (0xF903, "M", "賈"),
+ (0xF904, "M", "滑"),
+ (0xF905, "M", "串"),
+ (0xF906, "M", "句"),
+ (0xF907, "M", "龜"),
+ (0xF909, "M", "契"),
+ (0xF90A, "M", "金"),
+ (0xF90B, "M", "喇"),
+ (0xF90C, "M", "奈"),
+ (0xF90D, "M", "懶"),
+ (0xF90E, "M", "癩"),
+ (0xF90F, "M", "羅"),
+ (0xF910, "M", "蘿"),
+ (0xF911, "M", "螺"),
+ (0xF912, "M", "裸"),
+ (0xF913, "M", "邏"),
+ (0xF914, "M", "樂"),
+ (0xF915, "M", "洛"),
+ (0xF916, "M", "烙"),
+ (0xF917, "M", "珞"),
+ (0xF918, "M", "落"),
+ (0xF919, "M", "酪"),
+ (0xF91A, "M", "駱"),
+ (0xF91B, "M", "亂"),
+ (0xF91C, "M", "卵"),
+ (0xF91D, "M", "欄"),
+ (0xF91E, "M", "爛"),
+ (0xF91F, "M", "蘭"),
+ (0xF920, "M", "鸞"),
+ (0xF921, "M", "嵐"),
+ (0xF922, "M", "濫"),
+ (0xF923, "M", "藍"),
+ (0xF924, "M", "襤"),
+ (0xF925, "M", "拉"),
+ (0xF926, "M", "臘"),
+ (0xF927, "M", "蠟"),
+ (0xF928, "M", "廊"),
+ (0xF929, "M", "朗"),
+ (0xF92A, "M", "浪"),
+ (0xF92B, "M", "狼"),
+ (0xF92C, "M", "郎"),
+ (0xF92D, "M", "來"),
+ (0xF92E, "M", "冷"),
+ (0xF92F, "M", "勞"),
+ (0xF930, "M", "擄"),
+ (0xF931, "M", "櫓"),
+ (0xF932, "M", "爐"),
+ (0xF933, "M", "盧"),
+ (0xF934, "M", "老"),
+ (0xF935, "M", "蘆"),
+ (0xF936, "M", "虜"),
+ (0xF937, "M", "路"),
+ (0xF938, "M", "露"),
+ (0xF939, "M", "魯"),
+ (0xF93A, "M", "鷺"),
+ (0xF93B, "M", "碌"),
+ (0xF93C, "M", "祿"),
+ (0xF93D, "M", "綠"),
+ (0xF93E, "M", "菉"),
+ (0xF93F, "M", "錄"),
+ (0xF940, "M", "鹿"),
+ (0xF941, "M", "論"),
+ (0xF942, "M", "壟"),
+ (0xF943, "M", "弄"),
+ (0xF944, "M", "籠"),
+ (0xF945, "M", "聾"),
+ (0xF946, "M", "牢"),
+ (0xF947, "M", "磊"),
+ (0xF948, "M", "賂"),
+ (0xF949, "M", "雷"),
]
+
def _seg_40() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xF946, 'M', '牢'),
- (0xF947, 'M', '磊'),
- (0xF948, 'M', '賂'),
- (0xF949, 'M', '雷'),
- (0xF94A, 'M', '壘'),
- (0xF94B, 'M', '屢'),
- (0xF94C, 'M', '樓'),
- (0xF94D, 'M', '淚'),
- (0xF94E, 'M', '漏'),
- (0xF94F, 'M', '累'),
- (0xF950, 'M', '縷'),
- (0xF951, 'M', '陋'),
- (0xF952, 'M', '勒'),
- (0xF953, 'M', '肋'),
- (0xF954, 'M', '凜'),
- (0xF955, 'M', '凌'),
- (0xF956, 'M', '稜'),
- (0xF957, 'M', '綾'),
- (0xF958, 'M', '菱'),
- (0xF959, 'M', '陵'),
- (0xF95A, 'M', '讀'),
- (0xF95B, 'M', '拏'),
- (0xF95C, 'M', '樂'),
- (0xF95D, 'M', '諾'),
- (0xF95E, 'M', '丹'),
- (0xF95F, 'M', '寧'),
- (0xF960, 'M', '怒'),
- (0xF961, 'M', '率'),
- (0xF962, 'M', '異'),
- (0xF963, 'M', '北'),
- (0xF964, 'M', '磻'),
- (0xF965, 'M', '便'),
- (0xF966, 'M', '復'),
- (0xF967, 'M', '不'),
- (0xF968, 'M', '泌'),
- (0xF969, 'M', '數'),
- (0xF96A, 'M', '索'),
- (0xF96B, 'M', '參'),
- (0xF96C, 'M', '塞'),
- (0xF96D, 'M', '省'),
- (0xF96E, 'M', '葉'),
- (0xF96F, 'M', '說'),
- (0xF970, 'M', '殺'),
- (0xF971, 'M', '辰'),
- (0xF972, 'M', '沈'),
- (0xF973, 'M', '拾'),
- (0xF974, 'M', '若'),
- (0xF975, 'M', '掠'),
- (0xF976, 'M', '略'),
- (0xF977, 'M', '亮'),
- (0xF978, 'M', '兩'),
- (0xF979, 'M', '凉'),
- (0xF97A, 'M', '梁'),
- (0xF97B, 'M', '糧'),
- (0xF97C, 'M', '良'),
- (0xF97D, 'M', '諒'),
- (0xF97E, 'M', '量'),
- (0xF97F, 'M', '勵'),
- (0xF980, 'M', '呂'),
- (0xF981, 'M', '女'),
- (0xF982, 'M', '廬'),
- (0xF983, 'M', '旅'),
- (0xF984, 'M', '濾'),
- (0xF985, 'M', '礪'),
- (0xF986, 'M', '閭'),
- (0xF987, 'M', '驪'),
- (0xF988, 'M', '麗'),
- (0xF989, 'M', '黎'),
- (0xF98A, 'M', '力'),
- (0xF98B, 'M', '曆'),
- (0xF98C, 'M', '歷'),
- (0xF98D, 'M', '轢'),
- (0xF98E, 'M', '年'),
- (0xF98F, 'M', '憐'),
- (0xF990, 'M', '戀'),
- (0xF991, 'M', '撚'),
- (0xF992, 'M', '漣'),
- (0xF993, 'M', '煉'),
- (0xF994, 'M', '璉'),
- (0xF995, 'M', '秊'),
- (0xF996, 'M', '練'),
- (0xF997, 'M', '聯'),
- (0xF998, 'M', '輦'),
- (0xF999, 'M', '蓮'),
- (0xF99A, 'M', '連'),
- (0xF99B, 'M', '鍊'),
- (0xF99C, 'M', '列'),
- (0xF99D, 'M', '劣'),
- (0xF99E, 'M', '咽'),
- (0xF99F, 'M', '烈'),
- (0xF9A0, 'M', '裂'),
- (0xF9A1, 'M', '說'),
- (0xF9A2, 'M', '廉'),
- (0xF9A3, 'M', '念'),
- (0xF9A4, 'M', '捻'),
- (0xF9A5, 'M', '殮'),
- (0xF9A6, 'M', '簾'),
- (0xF9A7, 'M', '獵'),
- (0xF9A8, 'M', '令'),
- (0xF9A9, 'M', '囹'),
+ (0xF94A, "M", "壘"),
+ (0xF94B, "M", "屢"),
+ (0xF94C, "M", "樓"),
+ (0xF94D, "M", "淚"),
+ (0xF94E, "M", "漏"),
+ (0xF94F, "M", "累"),
+ (0xF950, "M", "縷"),
+ (0xF951, "M", "陋"),
+ (0xF952, "M", "勒"),
+ (0xF953, "M", "肋"),
+ (0xF954, "M", "凜"),
+ (0xF955, "M", "凌"),
+ (0xF956, "M", "稜"),
+ (0xF957, "M", "綾"),
+ (0xF958, "M", "菱"),
+ (0xF959, "M", "陵"),
+ (0xF95A, "M", "讀"),
+ (0xF95B, "M", "拏"),
+ (0xF95C, "M", "樂"),
+ (0xF95D, "M", "諾"),
+ (0xF95E, "M", "丹"),
+ (0xF95F, "M", "寧"),
+ (0xF960, "M", "怒"),
+ (0xF961, "M", "率"),
+ (0xF962, "M", "異"),
+ (0xF963, "M", "北"),
+ (0xF964, "M", "磻"),
+ (0xF965, "M", "便"),
+ (0xF966, "M", "復"),
+ (0xF967, "M", "不"),
+ (0xF968, "M", "泌"),
+ (0xF969, "M", "數"),
+ (0xF96A, "M", "索"),
+ (0xF96B, "M", "參"),
+ (0xF96C, "M", "塞"),
+ (0xF96D, "M", "省"),
+ (0xF96E, "M", "葉"),
+ (0xF96F, "M", "說"),
+ (0xF970, "M", "殺"),
+ (0xF971, "M", "辰"),
+ (0xF972, "M", "沈"),
+ (0xF973, "M", "拾"),
+ (0xF974, "M", "若"),
+ (0xF975, "M", "掠"),
+ (0xF976, "M", "略"),
+ (0xF977, "M", "亮"),
+ (0xF978, "M", "兩"),
+ (0xF979, "M", "凉"),
+ (0xF97A, "M", "梁"),
+ (0xF97B, "M", "糧"),
+ (0xF97C, "M", "良"),
+ (0xF97D, "M", "諒"),
+ (0xF97E, "M", "量"),
+ (0xF97F, "M", "勵"),
+ (0xF980, "M", "呂"),
+ (0xF981, "M", "女"),
+ (0xF982, "M", "廬"),
+ (0xF983, "M", "旅"),
+ (0xF984, "M", "濾"),
+ (0xF985, "M", "礪"),
+ (0xF986, "M", "閭"),
+ (0xF987, "M", "驪"),
+ (0xF988, "M", "麗"),
+ (0xF989, "M", "黎"),
+ (0xF98A, "M", "力"),
+ (0xF98B, "M", "曆"),
+ (0xF98C, "M", "歷"),
+ (0xF98D, "M", "轢"),
+ (0xF98E, "M", "年"),
+ (0xF98F, "M", "憐"),
+ (0xF990, "M", "戀"),
+ (0xF991, "M", "撚"),
+ (0xF992, "M", "漣"),
+ (0xF993, "M", "煉"),
+ (0xF994, "M", "璉"),
+ (0xF995, "M", "秊"),
+ (0xF996, "M", "練"),
+ (0xF997, "M", "聯"),
+ (0xF998, "M", "輦"),
+ (0xF999, "M", "蓮"),
+ (0xF99A, "M", "連"),
+ (0xF99B, "M", "鍊"),
+ (0xF99C, "M", "列"),
+ (0xF99D, "M", "劣"),
+ (0xF99E, "M", "咽"),
+ (0xF99F, "M", "烈"),
+ (0xF9A0, "M", "裂"),
+ (0xF9A1, "M", "說"),
+ (0xF9A2, "M", "廉"),
+ (0xF9A3, "M", "念"),
+ (0xF9A4, "M", "捻"),
+ (0xF9A5, "M", "殮"),
+ (0xF9A6, "M", "簾"),
+ (0xF9A7, "M", "獵"),
+ (0xF9A8, "M", "令"),
+ (0xF9A9, "M", "囹"),
+ (0xF9AA, "M", "寧"),
+ (0xF9AB, "M", "嶺"),
+ (0xF9AC, "M", "怜"),
+ (0xF9AD, "M", "玲"),
]
+
def _seg_41() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xF9AA, 'M', '寧'),
- (0xF9AB, 'M', '嶺'),
- (0xF9AC, 'M', '怜'),
- (0xF9AD, 'M', '玲'),
- (0xF9AE, 'M', '瑩'),
- (0xF9AF, 'M', '羚'),
- (0xF9B0, 'M', '聆'),
- (0xF9B1, 'M', '鈴'),
- (0xF9B2, 'M', '零'),
- (0xF9B3, 'M', '靈'),
- (0xF9B4, 'M', '領'),
- (0xF9B5, 'M', '例'),
- (0xF9B6, 'M', '禮'),
- (0xF9B7, 'M', '醴'),
- (0xF9B8, 'M', '隸'),
- (0xF9B9, 'M', '惡'),
- (0xF9BA, 'M', '了'),
- (0xF9BB, 'M', '僚'),
- (0xF9BC, 'M', '寮'),
- (0xF9BD, 'M', '尿'),
- (0xF9BE, 'M', '料'),
- (0xF9BF, 'M', '樂'),
- (0xF9C0, 'M', '燎'),
- (0xF9C1, 'M', '療'),
- (0xF9C2, 'M', '蓼'),
- (0xF9C3, 'M', '遼'),
- (0xF9C4, 'M', '龍'),
- (0xF9C5, 'M', '暈'),
- (0xF9C6, 'M', '阮'),
- (0xF9C7, 'M', '劉'),
- (0xF9C8, 'M', '杻'),
- (0xF9C9, 'M', '柳'),
- (0xF9CA, 'M', '流'),
- (0xF9CB, 'M', '溜'),
- (0xF9CC, 'M', '琉'),
- (0xF9CD, 'M', '留'),
- (0xF9CE, 'M', '硫'),
- (0xF9CF, 'M', '紐'),
- (0xF9D0, 'M', '類'),
- (0xF9D1, 'M', '六'),
- (0xF9D2, 'M', '戮'),
- (0xF9D3, 'M', '陸'),
- (0xF9D4, 'M', '倫'),
- (0xF9D5, 'M', '崙'),
- (0xF9D6, 'M', '淪'),
- (0xF9D7, 'M', '輪'),
- (0xF9D8, 'M', '律'),
- (0xF9D9, 'M', '慄'),
- (0xF9DA, 'M', '栗'),
- (0xF9DB, 'M', '率'),
- (0xF9DC, 'M', '隆'),
- (0xF9DD, 'M', '利'),
- (0xF9DE, 'M', '吏'),
- (0xF9DF, 'M', '履'),
- (0xF9E0, 'M', '易'),
- (0xF9E1, 'M', '李'),
- (0xF9E2, 'M', '梨'),
- (0xF9E3, 'M', '泥'),
- (0xF9E4, 'M', '理'),
- (0xF9E5, 'M', '痢'),
- (0xF9E6, 'M', '罹'),
- (0xF9E7, 'M', '裏'),
- (0xF9E8, 'M', '裡'),
- (0xF9E9, 'M', '里'),
- (0xF9EA, 'M', '離'),
- (0xF9EB, 'M', '匿'),
- (0xF9EC, 'M', '溺'),
- (0xF9ED, 'M', '吝'),
- (0xF9EE, 'M', '燐'),
- (0xF9EF, 'M', '璘'),
- (0xF9F0, 'M', '藺'),
- (0xF9F1, 'M', '隣'),
- (0xF9F2, 'M', '鱗'),
- (0xF9F3, 'M', '麟'),
- (0xF9F4, 'M', '林'),
- (0xF9F5, 'M', '淋'),
- (0xF9F6, 'M', '臨'),
- (0xF9F7, 'M', '立'),
- (0xF9F8, 'M', '笠'),
- (0xF9F9, 'M', '粒'),
- (0xF9FA, 'M', '狀'),
- (0xF9FB, 'M', '炙'),
- (0xF9FC, 'M', '識'),
- (0xF9FD, 'M', '什'),
- (0xF9FE, 'M', '茶'),
- (0xF9FF, 'M', '刺'),
- (0xFA00, 'M', '切'),
- (0xFA01, 'M', '度'),
- (0xFA02, 'M', '拓'),
- (0xFA03, 'M', '糖'),
- (0xFA04, 'M', '宅'),
- (0xFA05, 'M', '洞'),
- (0xFA06, 'M', '暴'),
- (0xFA07, 'M', '輻'),
- (0xFA08, 'M', '行'),
- (0xFA09, 'M', '降'),
- (0xFA0A, 'M', '見'),
- (0xFA0B, 'M', '廓'),
- (0xFA0C, 'M', '兀'),
- (0xFA0D, 'M', '嗀'),
+ (0xF9AE, "M", "瑩"),
+ (0xF9AF, "M", "羚"),
+ (0xF9B0, "M", "聆"),
+ (0xF9B1, "M", "鈴"),
+ (0xF9B2, "M", "零"),
+ (0xF9B3, "M", "靈"),
+ (0xF9B4, "M", "領"),
+ (0xF9B5, "M", "例"),
+ (0xF9B6, "M", "禮"),
+ (0xF9B7, "M", "醴"),
+ (0xF9B8, "M", "隸"),
+ (0xF9B9, "M", "惡"),
+ (0xF9BA, "M", "了"),
+ (0xF9BB, "M", "僚"),
+ (0xF9BC, "M", "寮"),
+ (0xF9BD, "M", "尿"),
+ (0xF9BE, "M", "料"),
+ (0xF9BF, "M", "樂"),
+ (0xF9C0, "M", "燎"),
+ (0xF9C1, "M", "療"),
+ (0xF9C2, "M", "蓼"),
+ (0xF9C3, "M", "遼"),
+ (0xF9C4, "M", "龍"),
+ (0xF9C5, "M", "暈"),
+ (0xF9C6, "M", "阮"),
+ (0xF9C7, "M", "劉"),
+ (0xF9C8, "M", "杻"),
+ (0xF9C9, "M", "柳"),
+ (0xF9CA, "M", "流"),
+ (0xF9CB, "M", "溜"),
+ (0xF9CC, "M", "琉"),
+ (0xF9CD, "M", "留"),
+ (0xF9CE, "M", "硫"),
+ (0xF9CF, "M", "紐"),
+ (0xF9D0, "M", "類"),
+ (0xF9D1, "M", "六"),
+ (0xF9D2, "M", "戮"),
+ (0xF9D3, "M", "陸"),
+ (0xF9D4, "M", "倫"),
+ (0xF9D5, "M", "崙"),
+ (0xF9D6, "M", "淪"),
+ (0xF9D7, "M", "輪"),
+ (0xF9D8, "M", "律"),
+ (0xF9D9, "M", "慄"),
+ (0xF9DA, "M", "栗"),
+ (0xF9DB, "M", "率"),
+ (0xF9DC, "M", "隆"),
+ (0xF9DD, "M", "利"),
+ (0xF9DE, "M", "吏"),
+ (0xF9DF, "M", "履"),
+ (0xF9E0, "M", "易"),
+ (0xF9E1, "M", "李"),
+ (0xF9E2, "M", "梨"),
+ (0xF9E3, "M", "泥"),
+ (0xF9E4, "M", "理"),
+ (0xF9E5, "M", "痢"),
+ (0xF9E6, "M", "罹"),
+ (0xF9E7, "M", "裏"),
+ (0xF9E8, "M", "裡"),
+ (0xF9E9, "M", "里"),
+ (0xF9EA, "M", "離"),
+ (0xF9EB, "M", "匿"),
+ (0xF9EC, "M", "溺"),
+ (0xF9ED, "M", "吝"),
+ (0xF9EE, "M", "燐"),
+ (0xF9EF, "M", "璘"),
+ (0xF9F0, "M", "藺"),
+ (0xF9F1, "M", "隣"),
+ (0xF9F2, "M", "鱗"),
+ (0xF9F3, "M", "麟"),
+ (0xF9F4, "M", "林"),
+ (0xF9F5, "M", "淋"),
+ (0xF9F6, "M", "臨"),
+ (0xF9F7, "M", "立"),
+ (0xF9F8, "M", "笠"),
+ (0xF9F9, "M", "粒"),
+ (0xF9FA, "M", "狀"),
+ (0xF9FB, "M", "炙"),
+ (0xF9FC, "M", "識"),
+ (0xF9FD, "M", "什"),
+ (0xF9FE, "M", "茶"),
+ (0xF9FF, "M", "刺"),
+ (0xFA00, "M", "切"),
+ (0xFA01, "M", "度"),
+ (0xFA02, "M", "拓"),
+ (0xFA03, "M", "糖"),
+ (0xFA04, "M", "宅"),
+ (0xFA05, "M", "洞"),
+ (0xFA06, "M", "暴"),
+ (0xFA07, "M", "輻"),
+ (0xFA08, "M", "行"),
+ (0xFA09, "M", "降"),
+ (0xFA0A, "M", "見"),
+ (0xFA0B, "M", "廓"),
+ (0xFA0C, "M", "兀"),
+ (0xFA0D, "M", "嗀"),
+ (0xFA0E, "V"),
+ (0xFA10, "M", "塚"),
+ (0xFA11, "V"),
+ (0xFA12, "M", "晴"),
]
+
def _seg_42() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFA0E, 'V'),
- (0xFA10, 'M', '塚'),
- (0xFA11, 'V'),
- (0xFA12, 'M', '晴'),
- (0xFA13, 'V'),
- (0xFA15, 'M', '凞'),
- (0xFA16, 'M', '猪'),
- (0xFA17, 'M', '益'),
- (0xFA18, 'M', '礼'),
- (0xFA19, 'M', '神'),
- (0xFA1A, 'M', '祥'),
- (0xFA1B, 'M', '福'),
- (0xFA1C, 'M', '靖'),
- (0xFA1D, 'M', '精'),
- (0xFA1E, 'M', '羽'),
- (0xFA1F, 'V'),
- (0xFA20, 'M', '蘒'),
- (0xFA21, 'V'),
- (0xFA22, 'M', '諸'),
- (0xFA23, 'V'),
- (0xFA25, 'M', '逸'),
- (0xFA26, 'M', '都'),
- (0xFA27, 'V'),
- (0xFA2A, 'M', '飯'),
- (0xFA2B, 'M', '飼'),
- (0xFA2C, 'M', '館'),
- (0xFA2D, 'M', '鶴'),
- (0xFA2E, 'M', '郞'),
- (0xFA2F, 'M', '隷'),
- (0xFA30, 'M', '侮'),
- (0xFA31, 'M', '僧'),
- (0xFA32, 'M', '免'),
- (0xFA33, 'M', '勉'),
- (0xFA34, 'M', '勤'),
- (0xFA35, 'M', '卑'),
- (0xFA36, 'M', '喝'),
- (0xFA37, 'M', '嘆'),
- (0xFA38, 'M', '器'),
- (0xFA39, 'M', '塀'),
- (0xFA3A, 'M', '墨'),
- (0xFA3B, 'M', '層'),
- (0xFA3C, 'M', '屮'),
- (0xFA3D, 'M', '悔'),
- (0xFA3E, 'M', '慨'),
- (0xFA3F, 'M', '憎'),
- (0xFA40, 'M', '懲'),
- (0xFA41, 'M', '敏'),
- (0xFA42, 'M', '既'),
- (0xFA43, 'M', '暑'),
- (0xFA44, 'M', '梅'),
- (0xFA45, 'M', '海'),
- (0xFA46, 'M', '渚'),
- (0xFA47, 'M', '漢'),
- (0xFA48, 'M', '煮'),
- (0xFA49, 'M', '爫'),
- (0xFA4A, 'M', '琢'),
- (0xFA4B, 'M', '碑'),
- (0xFA4C, 'M', '社'),
- (0xFA4D, 'M', '祉'),
- (0xFA4E, 'M', '祈'),
- (0xFA4F, 'M', '祐'),
- (0xFA50, 'M', '祖'),
- (0xFA51, 'M', '祝'),
- (0xFA52, 'M', '禍'),
- (0xFA53, 'M', '禎'),
- (0xFA54, 'M', '穀'),
- (0xFA55, 'M', '突'),
- (0xFA56, 'M', '節'),
- (0xFA57, 'M', '練'),
- (0xFA58, 'M', '縉'),
- (0xFA59, 'M', '繁'),
- (0xFA5A, 'M', '署'),
- (0xFA5B, 'M', '者'),
- (0xFA5C, 'M', '臭'),
- (0xFA5D, 'M', '艹'),
- (0xFA5F, 'M', '著'),
- (0xFA60, 'M', '褐'),
- (0xFA61, 'M', '視'),
- (0xFA62, 'M', '謁'),
- (0xFA63, 'M', '謹'),
- (0xFA64, 'M', '賓'),
- (0xFA65, 'M', '贈'),
- (0xFA66, 'M', '辶'),
- (0xFA67, 'M', '逸'),
- (0xFA68, 'M', '難'),
- (0xFA69, 'M', '響'),
- (0xFA6A, 'M', '頻'),
- (0xFA6B, 'M', '恵'),
- (0xFA6C, 'M', '𤋮'),
- (0xFA6D, 'M', '舘'),
- (0xFA6E, 'X'),
- (0xFA70, 'M', '並'),
- (0xFA71, 'M', '况'),
- (0xFA72, 'M', '全'),
- (0xFA73, 'M', '侀'),
- (0xFA74, 'M', '充'),
- (0xFA75, 'M', '冀'),
- (0xFA76, 'M', '勇'),
- (0xFA77, 'M', '勺'),
- (0xFA78, 'M', '喝'),
+ (0xFA13, "V"),
+ (0xFA15, "M", "凞"),
+ (0xFA16, "M", "猪"),
+ (0xFA17, "M", "益"),
+ (0xFA18, "M", "礼"),
+ (0xFA19, "M", "神"),
+ (0xFA1A, "M", "祥"),
+ (0xFA1B, "M", "福"),
+ (0xFA1C, "M", "靖"),
+ (0xFA1D, "M", "精"),
+ (0xFA1E, "M", "羽"),
+ (0xFA1F, "V"),
+ (0xFA20, "M", "蘒"),
+ (0xFA21, "V"),
+ (0xFA22, "M", "諸"),
+ (0xFA23, "V"),
+ (0xFA25, "M", "逸"),
+ (0xFA26, "M", "都"),
+ (0xFA27, "V"),
+ (0xFA2A, "M", "飯"),
+ (0xFA2B, "M", "飼"),
+ (0xFA2C, "M", "館"),
+ (0xFA2D, "M", "鶴"),
+ (0xFA2E, "M", "郞"),
+ (0xFA2F, "M", "隷"),
+ (0xFA30, "M", "侮"),
+ (0xFA31, "M", "僧"),
+ (0xFA32, "M", "免"),
+ (0xFA33, "M", "勉"),
+ (0xFA34, "M", "勤"),
+ (0xFA35, "M", "卑"),
+ (0xFA36, "M", "喝"),
+ (0xFA37, "M", "嘆"),
+ (0xFA38, "M", "器"),
+ (0xFA39, "M", "塀"),
+ (0xFA3A, "M", "墨"),
+ (0xFA3B, "M", "層"),
+ (0xFA3C, "M", "屮"),
+ (0xFA3D, "M", "悔"),
+ (0xFA3E, "M", "慨"),
+ (0xFA3F, "M", "憎"),
+ (0xFA40, "M", "懲"),
+ (0xFA41, "M", "敏"),
+ (0xFA42, "M", "既"),
+ (0xFA43, "M", "暑"),
+ (0xFA44, "M", "梅"),
+ (0xFA45, "M", "海"),
+ (0xFA46, "M", "渚"),
+ (0xFA47, "M", "漢"),
+ (0xFA48, "M", "煮"),
+ (0xFA49, "M", "爫"),
+ (0xFA4A, "M", "琢"),
+ (0xFA4B, "M", "碑"),
+ (0xFA4C, "M", "社"),
+ (0xFA4D, "M", "祉"),
+ (0xFA4E, "M", "祈"),
+ (0xFA4F, "M", "祐"),
+ (0xFA50, "M", "祖"),
+ (0xFA51, "M", "祝"),
+ (0xFA52, "M", "禍"),
+ (0xFA53, "M", "禎"),
+ (0xFA54, "M", "穀"),
+ (0xFA55, "M", "突"),
+ (0xFA56, "M", "節"),
+ (0xFA57, "M", "練"),
+ (0xFA58, "M", "縉"),
+ (0xFA59, "M", "繁"),
+ (0xFA5A, "M", "署"),
+ (0xFA5B, "M", "者"),
+ (0xFA5C, "M", "臭"),
+ (0xFA5D, "M", "艹"),
+ (0xFA5F, "M", "著"),
+ (0xFA60, "M", "褐"),
+ (0xFA61, "M", "視"),
+ (0xFA62, "M", "謁"),
+ (0xFA63, "M", "謹"),
+ (0xFA64, "M", "賓"),
+ (0xFA65, "M", "贈"),
+ (0xFA66, "M", "辶"),
+ (0xFA67, "M", "逸"),
+ (0xFA68, "M", "難"),
+ (0xFA69, "M", "響"),
+ (0xFA6A, "M", "頻"),
+ (0xFA6B, "M", "恵"),
+ (0xFA6C, "M", "𤋮"),
+ (0xFA6D, "M", "舘"),
+ (0xFA6E, "X"),
+ (0xFA70, "M", "並"),
+ (0xFA71, "M", "况"),
+ (0xFA72, "M", "全"),
+ (0xFA73, "M", "侀"),
+ (0xFA74, "M", "充"),
+ (0xFA75, "M", "冀"),
+ (0xFA76, "M", "勇"),
+ (0xFA77, "M", "勺"),
+ (0xFA78, "M", "喝"),
+ (0xFA79, "M", "啕"),
+ (0xFA7A, "M", "喙"),
+ (0xFA7B, "M", "嗢"),
+ (0xFA7C, "M", "塚"),
]
+
def _seg_43() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFA79, 'M', '啕'),
- (0xFA7A, 'M', '喙'),
- (0xFA7B, 'M', '嗢'),
- (0xFA7C, 'M', '塚'),
- (0xFA7D, 'M', '墳'),
- (0xFA7E, 'M', '奄'),
- (0xFA7F, 'M', '奔'),
- (0xFA80, 'M', '婢'),
- (0xFA81, 'M', '嬨'),
- (0xFA82, 'M', '廒'),
- (0xFA83, 'M', '廙'),
- (0xFA84, 'M', '彩'),
- (0xFA85, 'M', '徭'),
- (0xFA86, 'M', '惘'),
- (0xFA87, 'M', '慎'),
- (0xFA88, 'M', '愈'),
- (0xFA89, 'M', '憎'),
- (0xFA8A, 'M', '慠'),
- (0xFA8B, 'M', '懲'),
- (0xFA8C, 'M', '戴'),
- (0xFA8D, 'M', '揄'),
- (0xFA8E, 'M', '搜'),
- (0xFA8F, 'M', '摒'),
- (0xFA90, 'M', '敖'),
- (0xFA91, 'M', '晴'),
- (0xFA92, 'M', '朗'),
- (0xFA93, 'M', '望'),
- (0xFA94, 'M', '杖'),
- (0xFA95, 'M', '歹'),
- (0xFA96, 'M', '殺'),
- (0xFA97, 'M', '流'),
- (0xFA98, 'M', '滛'),
- (0xFA99, 'M', '滋'),
- (0xFA9A, 'M', '漢'),
- (0xFA9B, 'M', '瀞'),
- (0xFA9C, 'M', '煮'),
- (0xFA9D, 'M', '瞧'),
- (0xFA9E, 'M', '爵'),
- (0xFA9F, 'M', '犯'),
- (0xFAA0, 'M', '猪'),
- (0xFAA1, 'M', '瑱'),
- (0xFAA2, 'M', '甆'),
- (0xFAA3, 'M', '画'),
- (0xFAA4, 'M', '瘝'),
- (0xFAA5, 'M', '瘟'),
- (0xFAA6, 'M', '益'),
- (0xFAA7, 'M', '盛'),
- (0xFAA8, 'M', '直'),
- (0xFAA9, 'M', '睊'),
- (0xFAAA, 'M', '着'),
- (0xFAAB, 'M', '磌'),
- (0xFAAC, 'M', '窱'),
- (0xFAAD, 'M', '節'),
- (0xFAAE, 'M', '类'),
- (0xFAAF, 'M', '絛'),
- (0xFAB0, 'M', '練'),
- (0xFAB1, 'M', '缾'),
- (0xFAB2, 'M', '者'),
- (0xFAB3, 'M', '荒'),
- (0xFAB4, 'M', '華'),
- (0xFAB5, 'M', '蝹'),
- (0xFAB6, 'M', '襁'),
- (0xFAB7, 'M', '覆'),
- (0xFAB8, 'M', '視'),
- (0xFAB9, 'M', '調'),
- (0xFABA, 'M', '諸'),
- (0xFABB, 'M', '請'),
- (0xFABC, 'M', '謁'),
- (0xFABD, 'M', '諾'),
- (0xFABE, 'M', '諭'),
- (0xFABF, 'M', '謹'),
- (0xFAC0, 'M', '變'),
- (0xFAC1, 'M', '贈'),
- (0xFAC2, 'M', '輸'),
- (0xFAC3, 'M', '遲'),
- (0xFAC4, 'M', '醙'),
- (0xFAC5, 'M', '鉶'),
- (0xFAC6, 'M', '陼'),
- (0xFAC7, 'M', '難'),
- (0xFAC8, 'M', '靖'),
- (0xFAC9, 'M', '韛'),
- (0xFACA, 'M', '響'),
- (0xFACB, 'M', '頋'),
- (0xFACC, 'M', '頻'),
- (0xFACD, 'M', '鬒'),
- (0xFACE, 'M', '龜'),
- (0xFACF, 'M', '𢡊'),
- (0xFAD0, 'M', '𢡄'),
- (0xFAD1, 'M', '𣏕'),
- (0xFAD2, 'M', '㮝'),
- (0xFAD3, 'M', '䀘'),
- (0xFAD4, 'M', '䀹'),
- (0xFAD5, 'M', '𥉉'),
- (0xFAD6, 'M', '𥳐'),
- (0xFAD7, 'M', '𧻓'),
- (0xFAD8, 'M', '齃'),
- (0xFAD9, 'M', '龎'),
- (0xFADA, 'X'),
- (0xFB00, 'M', 'ff'),
- (0xFB01, 'M', 'fi'),
+ (0xFA7D, "M", "墳"),
+ (0xFA7E, "M", "奄"),
+ (0xFA7F, "M", "奔"),
+ (0xFA80, "M", "婢"),
+ (0xFA81, "M", "嬨"),
+ (0xFA82, "M", "廒"),
+ (0xFA83, "M", "廙"),
+ (0xFA84, "M", "彩"),
+ (0xFA85, "M", "徭"),
+ (0xFA86, "M", "惘"),
+ (0xFA87, "M", "慎"),
+ (0xFA88, "M", "愈"),
+ (0xFA89, "M", "憎"),
+ (0xFA8A, "M", "慠"),
+ (0xFA8B, "M", "懲"),
+ (0xFA8C, "M", "戴"),
+ (0xFA8D, "M", "揄"),
+ (0xFA8E, "M", "搜"),
+ (0xFA8F, "M", "摒"),
+ (0xFA90, "M", "敖"),
+ (0xFA91, "M", "晴"),
+ (0xFA92, "M", "朗"),
+ (0xFA93, "M", "望"),
+ (0xFA94, "M", "杖"),
+ (0xFA95, "M", "歹"),
+ (0xFA96, "M", "殺"),
+ (0xFA97, "M", "流"),
+ (0xFA98, "M", "滛"),
+ (0xFA99, "M", "滋"),
+ (0xFA9A, "M", "漢"),
+ (0xFA9B, "M", "瀞"),
+ (0xFA9C, "M", "煮"),
+ (0xFA9D, "M", "瞧"),
+ (0xFA9E, "M", "爵"),
+ (0xFA9F, "M", "犯"),
+ (0xFAA0, "M", "猪"),
+ (0xFAA1, "M", "瑱"),
+ (0xFAA2, "M", "甆"),
+ (0xFAA3, "M", "画"),
+ (0xFAA4, "M", "瘝"),
+ (0xFAA5, "M", "瘟"),
+ (0xFAA6, "M", "益"),
+ (0xFAA7, "M", "盛"),
+ (0xFAA8, "M", "直"),
+ (0xFAA9, "M", "睊"),
+ (0xFAAA, "M", "着"),
+ (0xFAAB, "M", "磌"),
+ (0xFAAC, "M", "窱"),
+ (0xFAAD, "M", "節"),
+ (0xFAAE, "M", "类"),
+ (0xFAAF, "M", "絛"),
+ (0xFAB0, "M", "練"),
+ (0xFAB1, "M", "缾"),
+ (0xFAB2, "M", "者"),
+ (0xFAB3, "M", "荒"),
+ (0xFAB4, "M", "華"),
+ (0xFAB5, "M", "蝹"),
+ (0xFAB6, "M", "襁"),
+ (0xFAB7, "M", "覆"),
+ (0xFAB8, "M", "視"),
+ (0xFAB9, "M", "調"),
+ (0xFABA, "M", "諸"),
+ (0xFABB, "M", "請"),
+ (0xFABC, "M", "謁"),
+ (0xFABD, "M", "諾"),
+ (0xFABE, "M", "諭"),
+ (0xFABF, "M", "謹"),
+ (0xFAC0, "M", "變"),
+ (0xFAC1, "M", "贈"),
+ (0xFAC2, "M", "輸"),
+ (0xFAC3, "M", "遲"),
+ (0xFAC4, "M", "醙"),
+ (0xFAC5, "M", "鉶"),
+ (0xFAC6, "M", "陼"),
+ (0xFAC7, "M", "難"),
+ (0xFAC8, "M", "靖"),
+ (0xFAC9, "M", "韛"),
+ (0xFACA, "M", "響"),
+ (0xFACB, "M", "頋"),
+ (0xFACC, "M", "頻"),
+ (0xFACD, "M", "鬒"),
+ (0xFACE, "M", "龜"),
+ (0xFACF, "M", "𢡊"),
+ (0xFAD0, "M", "𢡄"),
+ (0xFAD1, "M", "𣏕"),
+ (0xFAD2, "M", "㮝"),
+ (0xFAD3, "M", "䀘"),
+ (0xFAD4, "M", "䀹"),
+ (0xFAD5, "M", "𥉉"),
+ (0xFAD6, "M", "𥳐"),
+ (0xFAD7, "M", "𧻓"),
+ (0xFAD8, "M", "齃"),
+ (0xFAD9, "M", "龎"),
+ (0xFADA, "X"),
+ (0xFB00, "M", "ff"),
+ (0xFB01, "M", "fi"),
+ (0xFB02, "M", "fl"),
+ (0xFB03, "M", "ffi"),
+ (0xFB04, "M", "ffl"),
+ (0xFB05, "M", "st"),
]
+
def _seg_44() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFB02, 'M', 'fl'),
- (0xFB03, 'M', 'ffi'),
- (0xFB04, 'M', 'ffl'),
- (0xFB05, 'M', 'st'),
- (0xFB07, 'X'),
- (0xFB13, 'M', 'մն'),
- (0xFB14, 'M', 'մե'),
- (0xFB15, 'M', 'մի'),
- (0xFB16, 'M', 'վն'),
- (0xFB17, 'M', 'մխ'),
- (0xFB18, 'X'),
- (0xFB1D, 'M', 'יִ'),
- (0xFB1E, 'V'),
- (0xFB1F, 'M', 'ײַ'),
- (0xFB20, 'M', 'ע'),
- (0xFB21, 'M', 'א'),
- (0xFB22, 'M', 'ד'),
- (0xFB23, 'M', 'ה'),
- (0xFB24, 'M', 'כ'),
- (0xFB25, 'M', 'ל'),
- (0xFB26, 'M', 'ם'),
- (0xFB27, 'M', 'ר'),
- (0xFB28, 'M', 'ת'),
- (0xFB29, '3', '+'),
- (0xFB2A, 'M', 'שׁ'),
- (0xFB2B, 'M', 'שׂ'),
- (0xFB2C, 'M', 'שּׁ'),
- (0xFB2D, 'M', 'שּׂ'),
- (0xFB2E, 'M', 'אַ'),
- (0xFB2F, 'M', 'אָ'),
- (0xFB30, 'M', 'אּ'),
- (0xFB31, 'M', 'בּ'),
- (0xFB32, 'M', 'גּ'),
- (0xFB33, 'M', 'דּ'),
- (0xFB34, 'M', 'הּ'),
- (0xFB35, 'M', 'וּ'),
- (0xFB36, 'M', 'זּ'),
- (0xFB37, 'X'),
- (0xFB38, 'M', 'טּ'),
- (0xFB39, 'M', 'יּ'),
- (0xFB3A, 'M', 'ךּ'),
- (0xFB3B, 'M', 'כּ'),
- (0xFB3C, 'M', 'לּ'),
- (0xFB3D, 'X'),
- (0xFB3E, 'M', 'מּ'),
- (0xFB3F, 'X'),
- (0xFB40, 'M', 'נּ'),
- (0xFB41, 'M', 'סּ'),
- (0xFB42, 'X'),
- (0xFB43, 'M', 'ףּ'),
- (0xFB44, 'M', 'פּ'),
- (0xFB45, 'X'),
- (0xFB46, 'M', 'צּ'),
- (0xFB47, 'M', 'קּ'),
- (0xFB48, 'M', 'רּ'),
- (0xFB49, 'M', 'שּ'),
- (0xFB4A, 'M', 'תּ'),
- (0xFB4B, 'M', 'וֹ'),
- (0xFB4C, 'M', 'בֿ'),
- (0xFB4D, 'M', 'כֿ'),
- (0xFB4E, 'M', 'פֿ'),
- (0xFB4F, 'M', 'אל'),
- (0xFB50, 'M', 'ٱ'),
- (0xFB52, 'M', 'ٻ'),
- (0xFB56, 'M', 'پ'),
- (0xFB5A, 'M', 'ڀ'),
- (0xFB5E, 'M', 'ٺ'),
- (0xFB62, 'M', 'ٿ'),
- (0xFB66, 'M', 'ٹ'),
- (0xFB6A, 'M', 'ڤ'),
- (0xFB6E, 'M', 'ڦ'),
- (0xFB72, 'M', 'ڄ'),
- (0xFB76, 'M', 'ڃ'),
- (0xFB7A, 'M', 'چ'),
- (0xFB7E, 'M', 'ڇ'),
- (0xFB82, 'M', 'ڍ'),
- (0xFB84, 'M', 'ڌ'),
- (0xFB86, 'M', 'ڎ'),
- (0xFB88, 'M', 'ڈ'),
- (0xFB8A, 'M', 'ژ'),
- (0xFB8C, 'M', 'ڑ'),
- (0xFB8E, 'M', 'ک'),
- (0xFB92, 'M', 'گ'),
- (0xFB96, 'M', 'ڳ'),
- (0xFB9A, 'M', 'ڱ'),
- (0xFB9E, 'M', 'ں'),
- (0xFBA0, 'M', 'ڻ'),
- (0xFBA4, 'M', 'ۀ'),
- (0xFBA6, 'M', 'ہ'),
- (0xFBAA, 'M', 'ھ'),
- (0xFBAE, 'M', 'ے'),
- (0xFBB0, 'M', 'ۓ'),
- (0xFBB2, 'V'),
- (0xFBC3, 'X'),
- (0xFBD3, 'M', 'ڭ'),
- (0xFBD7, 'M', 'ۇ'),
- (0xFBD9, 'M', 'ۆ'),
- (0xFBDB, 'M', 'ۈ'),
- (0xFBDD, 'M', 'ۇٴ'),
- (0xFBDE, 'M', 'ۋ'),
+ (0xFB07, "X"),
+ (0xFB13, "M", "մն"),
+ (0xFB14, "M", "մե"),
+ (0xFB15, "M", "մի"),
+ (0xFB16, "M", "վն"),
+ (0xFB17, "M", "մխ"),
+ (0xFB18, "X"),
+ (0xFB1D, "M", "יִ"),
+ (0xFB1E, "V"),
+ (0xFB1F, "M", "ײַ"),
+ (0xFB20, "M", "ע"),
+ (0xFB21, "M", "א"),
+ (0xFB22, "M", "ד"),
+ (0xFB23, "M", "ה"),
+ (0xFB24, "M", "כ"),
+ (0xFB25, "M", "ל"),
+ (0xFB26, "M", "ם"),
+ (0xFB27, "M", "ר"),
+ (0xFB28, "M", "ת"),
+ (0xFB29, "3", "+"),
+ (0xFB2A, "M", "שׁ"),
+ (0xFB2B, "M", "שׂ"),
+ (0xFB2C, "M", "שּׁ"),
+ (0xFB2D, "M", "שּׂ"),
+ (0xFB2E, "M", "אַ"),
+ (0xFB2F, "M", "אָ"),
+ (0xFB30, "M", "אּ"),
+ (0xFB31, "M", "בּ"),
+ (0xFB32, "M", "גּ"),
+ (0xFB33, "M", "דּ"),
+ (0xFB34, "M", "הּ"),
+ (0xFB35, "M", "וּ"),
+ (0xFB36, "M", "זּ"),
+ (0xFB37, "X"),
+ (0xFB38, "M", "טּ"),
+ (0xFB39, "M", "יּ"),
+ (0xFB3A, "M", "ךּ"),
+ (0xFB3B, "M", "כּ"),
+ (0xFB3C, "M", "לּ"),
+ (0xFB3D, "X"),
+ (0xFB3E, "M", "מּ"),
+ (0xFB3F, "X"),
+ (0xFB40, "M", "נּ"),
+ (0xFB41, "M", "סּ"),
+ (0xFB42, "X"),
+ (0xFB43, "M", "ףּ"),
+ (0xFB44, "M", "פּ"),
+ (0xFB45, "X"),
+ (0xFB46, "M", "צּ"),
+ (0xFB47, "M", "קּ"),
+ (0xFB48, "M", "רּ"),
+ (0xFB49, "M", "שּ"),
+ (0xFB4A, "M", "תּ"),
+ (0xFB4B, "M", "וֹ"),
+ (0xFB4C, "M", "בֿ"),
+ (0xFB4D, "M", "כֿ"),
+ (0xFB4E, "M", "פֿ"),
+ (0xFB4F, "M", "אל"),
+ (0xFB50, "M", "ٱ"),
+ (0xFB52, "M", "ٻ"),
+ (0xFB56, "M", "پ"),
+ (0xFB5A, "M", "ڀ"),
+ (0xFB5E, "M", "ٺ"),
+ (0xFB62, "M", "ٿ"),
+ (0xFB66, "M", "ٹ"),
+ (0xFB6A, "M", "ڤ"),
+ (0xFB6E, "M", "ڦ"),
+ (0xFB72, "M", "ڄ"),
+ (0xFB76, "M", "ڃ"),
+ (0xFB7A, "M", "چ"),
+ (0xFB7E, "M", "ڇ"),
+ (0xFB82, "M", "ڍ"),
+ (0xFB84, "M", "ڌ"),
+ (0xFB86, "M", "ڎ"),
+ (0xFB88, "M", "ڈ"),
+ (0xFB8A, "M", "ژ"),
+ (0xFB8C, "M", "ڑ"),
+ (0xFB8E, "M", "ک"),
+ (0xFB92, "M", "گ"),
+ (0xFB96, "M", "ڳ"),
+ (0xFB9A, "M", "ڱ"),
+ (0xFB9E, "M", "ں"),
+ (0xFBA0, "M", "ڻ"),
+ (0xFBA4, "M", "ۀ"),
+ (0xFBA6, "M", "ہ"),
+ (0xFBAA, "M", "ھ"),
+ (0xFBAE, "M", "ے"),
+ (0xFBB0, "M", "ۓ"),
+ (0xFBB2, "V"),
+ (0xFBC3, "X"),
+ (0xFBD3, "M", "ڭ"),
+ (0xFBD7, "M", "ۇ"),
+ (0xFBD9, "M", "ۆ"),
+ (0xFBDB, "M", "ۈ"),
+ (0xFBDD, "M", "ۇٴ"),
+ (0xFBDE, "M", "ۋ"),
+ (0xFBE0, "M", "ۅ"),
+ (0xFBE2, "M", "ۉ"),
+ (0xFBE4, "M", "ې"),
+ (0xFBE8, "M", "ى"),
]
+
def _seg_45() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFBE0, 'M', 'ۅ'),
- (0xFBE2, 'M', 'ۉ'),
- (0xFBE4, 'M', 'ې'),
- (0xFBE8, 'M', 'ى'),
- (0xFBEA, 'M', 'ئا'),
- (0xFBEC, 'M', 'ئە'),
- (0xFBEE, 'M', 'ئو'),
- (0xFBF0, 'M', 'ئۇ'),
- (0xFBF2, 'M', 'ئۆ'),
- (0xFBF4, 'M', 'ئۈ'),
- (0xFBF6, 'M', 'ئې'),
- (0xFBF9, 'M', 'ئى'),
- (0xFBFC, 'M', 'ی'),
- (0xFC00, 'M', 'ئج'),
- (0xFC01, 'M', 'ئح'),
- (0xFC02, 'M', 'ئم'),
- (0xFC03, 'M', 'ئى'),
- (0xFC04, 'M', 'ئي'),
- (0xFC05, 'M', 'بج'),
- (0xFC06, 'M', 'بح'),
- (0xFC07, 'M', 'بخ'),
- (0xFC08, 'M', 'بم'),
- (0xFC09, 'M', 'بى'),
- (0xFC0A, 'M', 'بي'),
- (0xFC0B, 'M', 'تج'),
- (0xFC0C, 'M', 'تح'),
- (0xFC0D, 'M', 'تخ'),
- (0xFC0E, 'M', 'تم'),
- (0xFC0F, 'M', 'تى'),
- (0xFC10, 'M', 'تي'),
- (0xFC11, 'M', 'ثج'),
- (0xFC12, 'M', 'ثم'),
- (0xFC13, 'M', 'ثى'),
- (0xFC14, 'M', 'ثي'),
- (0xFC15, 'M', 'جح'),
- (0xFC16, 'M', 'جم'),
- (0xFC17, 'M', 'حج'),
- (0xFC18, 'M', 'حم'),
- (0xFC19, 'M', 'خج'),
- (0xFC1A, 'M', 'خح'),
- (0xFC1B, 'M', 'خم'),
- (0xFC1C, 'M', 'سج'),
- (0xFC1D, 'M', 'سح'),
- (0xFC1E, 'M', 'سخ'),
- (0xFC1F, 'M', 'سم'),
- (0xFC20, 'M', 'صح'),
- (0xFC21, 'M', 'صم'),
- (0xFC22, 'M', 'ضج'),
- (0xFC23, 'M', 'ضح'),
- (0xFC24, 'M', 'ضخ'),
- (0xFC25, 'M', 'ضم'),
- (0xFC26, 'M', 'طح'),
- (0xFC27, 'M', 'طم'),
- (0xFC28, 'M', 'ظم'),
- (0xFC29, 'M', 'عج'),
- (0xFC2A, 'M', 'عم'),
- (0xFC2B, 'M', 'غج'),
- (0xFC2C, 'M', 'غم'),
- (0xFC2D, 'M', 'فج'),
- (0xFC2E, 'M', 'فح'),
- (0xFC2F, 'M', 'فخ'),
- (0xFC30, 'M', 'فم'),
- (0xFC31, 'M', 'فى'),
- (0xFC32, 'M', 'في'),
- (0xFC33, 'M', 'قح'),
- (0xFC34, 'M', 'قم'),
- (0xFC35, 'M', 'قى'),
- (0xFC36, 'M', 'قي'),
- (0xFC37, 'M', 'كا'),
- (0xFC38, 'M', 'كج'),
- (0xFC39, 'M', 'كح'),
- (0xFC3A, 'M', 'كخ'),
- (0xFC3B, 'M', 'كل'),
- (0xFC3C, 'M', 'كم'),
- (0xFC3D, 'M', 'كى'),
- (0xFC3E, 'M', 'كي'),
- (0xFC3F, 'M', 'لج'),
- (0xFC40, 'M', 'لح'),
- (0xFC41, 'M', 'لخ'),
- (0xFC42, 'M', 'لم'),
- (0xFC43, 'M', 'لى'),
- (0xFC44, 'M', 'لي'),
- (0xFC45, 'M', 'مج'),
- (0xFC46, 'M', 'مح'),
- (0xFC47, 'M', 'مخ'),
- (0xFC48, 'M', 'مم'),
- (0xFC49, 'M', 'مى'),
- (0xFC4A, 'M', 'مي'),
- (0xFC4B, 'M', 'نج'),
- (0xFC4C, 'M', 'نح'),
- (0xFC4D, 'M', 'نخ'),
- (0xFC4E, 'M', 'نم'),
- (0xFC4F, 'M', 'نى'),
- (0xFC50, 'M', 'ني'),
- (0xFC51, 'M', 'هج'),
- (0xFC52, 'M', 'هم'),
- (0xFC53, 'M', 'هى'),
- (0xFC54, 'M', 'هي'),
- (0xFC55, 'M', 'يج'),
- (0xFC56, 'M', 'يح'),
+ (0xFBEA, "M", "ئا"),
+ (0xFBEC, "M", "ئە"),
+ (0xFBEE, "M", "ئو"),
+ (0xFBF0, "M", "ئۇ"),
+ (0xFBF2, "M", "ئۆ"),
+ (0xFBF4, "M", "ئۈ"),
+ (0xFBF6, "M", "ئې"),
+ (0xFBF9, "M", "ئى"),
+ (0xFBFC, "M", "ی"),
+ (0xFC00, "M", "ئج"),
+ (0xFC01, "M", "ئح"),
+ (0xFC02, "M", "ئم"),
+ (0xFC03, "M", "ئى"),
+ (0xFC04, "M", "ئي"),
+ (0xFC05, "M", "بج"),
+ (0xFC06, "M", "بح"),
+ (0xFC07, "M", "بخ"),
+ (0xFC08, "M", "بم"),
+ (0xFC09, "M", "بى"),
+ (0xFC0A, "M", "بي"),
+ (0xFC0B, "M", "تج"),
+ (0xFC0C, "M", "تح"),
+ (0xFC0D, "M", "تخ"),
+ (0xFC0E, "M", "تم"),
+ (0xFC0F, "M", "تى"),
+ (0xFC10, "M", "تي"),
+ (0xFC11, "M", "ثج"),
+ (0xFC12, "M", "ثم"),
+ (0xFC13, "M", "ثى"),
+ (0xFC14, "M", "ثي"),
+ (0xFC15, "M", "جح"),
+ (0xFC16, "M", "جم"),
+ (0xFC17, "M", "حج"),
+ (0xFC18, "M", "حم"),
+ (0xFC19, "M", "خج"),
+ (0xFC1A, "M", "خح"),
+ (0xFC1B, "M", "خم"),
+ (0xFC1C, "M", "سج"),
+ (0xFC1D, "M", "سح"),
+ (0xFC1E, "M", "سخ"),
+ (0xFC1F, "M", "سم"),
+ (0xFC20, "M", "صح"),
+ (0xFC21, "M", "صم"),
+ (0xFC22, "M", "ضج"),
+ (0xFC23, "M", "ضح"),
+ (0xFC24, "M", "ضخ"),
+ (0xFC25, "M", "ضم"),
+ (0xFC26, "M", "طح"),
+ (0xFC27, "M", "طم"),
+ (0xFC28, "M", "ظم"),
+ (0xFC29, "M", "عج"),
+ (0xFC2A, "M", "عم"),
+ (0xFC2B, "M", "غج"),
+ (0xFC2C, "M", "غم"),
+ (0xFC2D, "M", "فج"),
+ (0xFC2E, "M", "فح"),
+ (0xFC2F, "M", "فخ"),
+ (0xFC30, "M", "فم"),
+ (0xFC31, "M", "فى"),
+ (0xFC32, "M", "في"),
+ (0xFC33, "M", "قح"),
+ (0xFC34, "M", "قم"),
+ (0xFC35, "M", "قى"),
+ (0xFC36, "M", "قي"),
+ (0xFC37, "M", "كا"),
+ (0xFC38, "M", "كج"),
+ (0xFC39, "M", "كح"),
+ (0xFC3A, "M", "كخ"),
+ (0xFC3B, "M", "كل"),
+ (0xFC3C, "M", "كم"),
+ (0xFC3D, "M", "كى"),
+ (0xFC3E, "M", "كي"),
+ (0xFC3F, "M", "لج"),
+ (0xFC40, "M", "لح"),
+ (0xFC41, "M", "لخ"),
+ (0xFC42, "M", "لم"),
+ (0xFC43, "M", "لى"),
+ (0xFC44, "M", "لي"),
+ (0xFC45, "M", "مج"),
+ (0xFC46, "M", "مح"),
+ (0xFC47, "M", "مخ"),
+ (0xFC48, "M", "مم"),
+ (0xFC49, "M", "مى"),
+ (0xFC4A, "M", "مي"),
+ (0xFC4B, "M", "نج"),
+ (0xFC4C, "M", "نح"),
+ (0xFC4D, "M", "نخ"),
+ (0xFC4E, "M", "نم"),
+ (0xFC4F, "M", "نى"),
+ (0xFC50, "M", "ني"),
+ (0xFC51, "M", "هج"),
+ (0xFC52, "M", "هم"),
+ (0xFC53, "M", "هى"),
+ (0xFC54, "M", "هي"),
+ (0xFC55, "M", "يج"),
+ (0xFC56, "M", "يح"),
+ (0xFC57, "M", "يخ"),
+ (0xFC58, "M", "يم"),
+ (0xFC59, "M", "يى"),
+ (0xFC5A, "M", "يي"),
]
+
def _seg_46() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFC57, 'M', 'يخ'),
- (0xFC58, 'M', 'يم'),
- (0xFC59, 'M', 'يى'),
- (0xFC5A, 'M', 'يي'),
- (0xFC5B, 'M', 'ذٰ'),
- (0xFC5C, 'M', 'رٰ'),
- (0xFC5D, 'M', 'ىٰ'),
- (0xFC5E, '3', ' ٌّ'),
- (0xFC5F, '3', ' ٍّ'),
- (0xFC60, '3', ' َّ'),
- (0xFC61, '3', ' ُّ'),
- (0xFC62, '3', ' ِّ'),
- (0xFC63, '3', ' ّٰ'),
- (0xFC64, 'M', 'ئر'),
- (0xFC65, 'M', 'ئز'),
- (0xFC66, 'M', 'ئم'),
- (0xFC67, 'M', 'ئن'),
- (0xFC68, 'M', 'ئى'),
- (0xFC69, 'M', 'ئي'),
- (0xFC6A, 'M', 'بر'),
- (0xFC6B, 'M', 'بز'),
- (0xFC6C, 'M', 'بم'),
- (0xFC6D, 'M', 'بن'),
- (0xFC6E, 'M', 'بى'),
- (0xFC6F, 'M', 'بي'),
- (0xFC70, 'M', 'تر'),
- (0xFC71, 'M', 'تز'),
- (0xFC72, 'M', 'تم'),
- (0xFC73, 'M', 'تن'),
- (0xFC74, 'M', 'تى'),
- (0xFC75, 'M', 'تي'),
- (0xFC76, 'M', 'ثر'),
- (0xFC77, 'M', 'ثز'),
- (0xFC78, 'M', 'ثم'),
- (0xFC79, 'M', 'ثن'),
- (0xFC7A, 'M', 'ثى'),
- (0xFC7B, 'M', 'ثي'),
- (0xFC7C, 'M', 'فى'),
- (0xFC7D, 'M', 'في'),
- (0xFC7E, 'M', 'قى'),
- (0xFC7F, 'M', 'قي'),
- (0xFC80, 'M', 'كا'),
- (0xFC81, 'M', 'كل'),
- (0xFC82, 'M', 'كم'),
- (0xFC83, 'M', 'كى'),
- (0xFC84, 'M', 'كي'),
- (0xFC85, 'M', 'لم'),
- (0xFC86, 'M', 'لى'),
- (0xFC87, 'M', 'لي'),
- (0xFC88, 'M', 'ما'),
- (0xFC89, 'M', 'مم'),
- (0xFC8A, 'M', 'نر'),
- (0xFC8B, 'M', 'نز'),
- (0xFC8C, 'M', 'نم'),
- (0xFC8D, 'M', 'نن'),
- (0xFC8E, 'M', 'نى'),
- (0xFC8F, 'M', 'ني'),
- (0xFC90, 'M', 'ىٰ'),
- (0xFC91, 'M', 'ير'),
- (0xFC92, 'M', 'يز'),
- (0xFC93, 'M', 'يم'),
- (0xFC94, 'M', 'ين'),
- (0xFC95, 'M', 'يى'),
- (0xFC96, 'M', 'يي'),
- (0xFC97, 'M', 'ئج'),
- (0xFC98, 'M', 'ئح'),
- (0xFC99, 'M', 'ئخ'),
- (0xFC9A, 'M', 'ئم'),
- (0xFC9B, 'M', 'ئه'),
- (0xFC9C, 'M', 'بج'),
- (0xFC9D, 'M', 'بح'),
- (0xFC9E, 'M', 'بخ'),
- (0xFC9F, 'M', 'بم'),
- (0xFCA0, 'M', 'به'),
- (0xFCA1, 'M', 'تج'),
- (0xFCA2, 'M', 'تح'),
- (0xFCA3, 'M', 'تخ'),
- (0xFCA4, 'M', 'تم'),
- (0xFCA5, 'M', 'ته'),
- (0xFCA6, 'M', 'ثم'),
- (0xFCA7, 'M', 'جح'),
- (0xFCA8, 'M', 'جم'),
- (0xFCA9, 'M', 'حج'),
- (0xFCAA, 'M', 'حم'),
- (0xFCAB, 'M', 'خج'),
- (0xFCAC, 'M', 'خم'),
- (0xFCAD, 'M', 'سج'),
- (0xFCAE, 'M', 'سح'),
- (0xFCAF, 'M', 'سخ'),
- (0xFCB0, 'M', 'سم'),
- (0xFCB1, 'M', 'صح'),
- (0xFCB2, 'M', 'صخ'),
- (0xFCB3, 'M', 'صم'),
- (0xFCB4, 'M', 'ضج'),
- (0xFCB5, 'M', 'ضح'),
- (0xFCB6, 'M', 'ضخ'),
- (0xFCB7, 'M', 'ضم'),
- (0xFCB8, 'M', 'طح'),
- (0xFCB9, 'M', 'ظم'),
- (0xFCBA, 'M', 'عج'),
+ (0xFC5B, "M", "ذٰ"),
+ (0xFC5C, "M", "رٰ"),
+ (0xFC5D, "M", "ىٰ"),
+ (0xFC5E, "3", " ٌّ"),
+ (0xFC5F, "3", " ٍّ"),
+ (0xFC60, "3", " َّ"),
+ (0xFC61, "3", " ُّ"),
+ (0xFC62, "3", " ِّ"),
+ (0xFC63, "3", " ّٰ"),
+ (0xFC64, "M", "ئر"),
+ (0xFC65, "M", "ئز"),
+ (0xFC66, "M", "ئم"),
+ (0xFC67, "M", "ئن"),
+ (0xFC68, "M", "ئى"),
+ (0xFC69, "M", "ئي"),
+ (0xFC6A, "M", "بر"),
+ (0xFC6B, "M", "بز"),
+ (0xFC6C, "M", "بم"),
+ (0xFC6D, "M", "بن"),
+ (0xFC6E, "M", "بى"),
+ (0xFC6F, "M", "بي"),
+ (0xFC70, "M", "تر"),
+ (0xFC71, "M", "تز"),
+ (0xFC72, "M", "تم"),
+ (0xFC73, "M", "تن"),
+ (0xFC74, "M", "تى"),
+ (0xFC75, "M", "تي"),
+ (0xFC76, "M", "ثر"),
+ (0xFC77, "M", "ثز"),
+ (0xFC78, "M", "ثم"),
+ (0xFC79, "M", "ثن"),
+ (0xFC7A, "M", "ثى"),
+ (0xFC7B, "M", "ثي"),
+ (0xFC7C, "M", "فى"),
+ (0xFC7D, "M", "في"),
+ (0xFC7E, "M", "قى"),
+ (0xFC7F, "M", "قي"),
+ (0xFC80, "M", "كا"),
+ (0xFC81, "M", "كل"),
+ (0xFC82, "M", "كم"),
+ (0xFC83, "M", "كى"),
+ (0xFC84, "M", "كي"),
+ (0xFC85, "M", "لم"),
+ (0xFC86, "M", "لى"),
+ (0xFC87, "M", "لي"),
+ (0xFC88, "M", "ما"),
+ (0xFC89, "M", "مم"),
+ (0xFC8A, "M", "نر"),
+ (0xFC8B, "M", "نز"),
+ (0xFC8C, "M", "نم"),
+ (0xFC8D, "M", "نن"),
+ (0xFC8E, "M", "نى"),
+ (0xFC8F, "M", "ني"),
+ (0xFC90, "M", "ىٰ"),
+ (0xFC91, "M", "ير"),
+ (0xFC92, "M", "يز"),
+ (0xFC93, "M", "يم"),
+ (0xFC94, "M", "ين"),
+ (0xFC95, "M", "يى"),
+ (0xFC96, "M", "يي"),
+ (0xFC97, "M", "ئج"),
+ (0xFC98, "M", "ئح"),
+ (0xFC99, "M", "ئخ"),
+ (0xFC9A, "M", "ئم"),
+ (0xFC9B, "M", "ئه"),
+ (0xFC9C, "M", "بج"),
+ (0xFC9D, "M", "بح"),
+ (0xFC9E, "M", "بخ"),
+ (0xFC9F, "M", "بم"),
+ (0xFCA0, "M", "به"),
+ (0xFCA1, "M", "تج"),
+ (0xFCA2, "M", "تح"),
+ (0xFCA3, "M", "تخ"),
+ (0xFCA4, "M", "تم"),
+ (0xFCA5, "M", "ته"),
+ (0xFCA6, "M", "ثم"),
+ (0xFCA7, "M", "جح"),
+ (0xFCA8, "M", "جم"),
+ (0xFCA9, "M", "حج"),
+ (0xFCAA, "M", "حم"),
+ (0xFCAB, "M", "خج"),
+ (0xFCAC, "M", "خم"),
+ (0xFCAD, "M", "سج"),
+ (0xFCAE, "M", "سح"),
+ (0xFCAF, "M", "سخ"),
+ (0xFCB0, "M", "سم"),
+ (0xFCB1, "M", "صح"),
+ (0xFCB2, "M", "صخ"),
+ (0xFCB3, "M", "صم"),
+ (0xFCB4, "M", "ضج"),
+ (0xFCB5, "M", "ضح"),
+ (0xFCB6, "M", "ضخ"),
+ (0xFCB7, "M", "ضم"),
+ (0xFCB8, "M", "طح"),
+ (0xFCB9, "M", "ظم"),
+ (0xFCBA, "M", "عج"),
+ (0xFCBB, "M", "عم"),
+ (0xFCBC, "M", "غج"),
+ (0xFCBD, "M", "غم"),
+ (0xFCBE, "M", "فج"),
]
+
def _seg_47() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFCBB, 'M', 'عم'),
- (0xFCBC, 'M', 'غج'),
- (0xFCBD, 'M', 'غم'),
- (0xFCBE, 'M', 'فج'),
- (0xFCBF, 'M', 'فح'),
- (0xFCC0, 'M', 'فخ'),
- (0xFCC1, 'M', 'فم'),
- (0xFCC2, 'M', 'قح'),
- (0xFCC3, 'M', 'قم'),
- (0xFCC4, 'M', 'كج'),
- (0xFCC5, 'M', 'كح'),
- (0xFCC6, 'M', 'كخ'),
- (0xFCC7, 'M', 'كل'),
- (0xFCC8, 'M', 'كم'),
- (0xFCC9, 'M', 'لج'),
- (0xFCCA, 'M', 'لح'),
- (0xFCCB, 'M', 'لخ'),
- (0xFCCC, 'M', 'لم'),
- (0xFCCD, 'M', 'له'),
- (0xFCCE, 'M', 'مج'),
- (0xFCCF, 'M', 'مح'),
- (0xFCD0, 'M', 'مخ'),
- (0xFCD1, 'M', 'مم'),
- (0xFCD2, 'M', 'نج'),
- (0xFCD3, 'M', 'نح'),
- (0xFCD4, 'M', 'نخ'),
- (0xFCD5, 'M', 'نم'),
- (0xFCD6, 'M', 'نه'),
- (0xFCD7, 'M', 'هج'),
- (0xFCD8, 'M', 'هم'),
- (0xFCD9, 'M', 'هٰ'),
- (0xFCDA, 'M', 'يج'),
- (0xFCDB, 'M', 'يح'),
- (0xFCDC, 'M', 'يخ'),
- (0xFCDD, 'M', 'يم'),
- (0xFCDE, 'M', 'يه'),
- (0xFCDF, 'M', 'ئم'),
- (0xFCE0, 'M', 'ئه'),
- (0xFCE1, 'M', 'بم'),
- (0xFCE2, 'M', 'به'),
- (0xFCE3, 'M', 'تم'),
- (0xFCE4, 'M', 'ته'),
- (0xFCE5, 'M', 'ثم'),
- (0xFCE6, 'M', 'ثه'),
- (0xFCE7, 'M', 'سم'),
- (0xFCE8, 'M', 'سه'),
- (0xFCE9, 'M', 'شم'),
- (0xFCEA, 'M', 'شه'),
- (0xFCEB, 'M', 'كل'),
- (0xFCEC, 'M', 'كم'),
- (0xFCED, 'M', 'لم'),
- (0xFCEE, 'M', 'نم'),
- (0xFCEF, 'M', 'نه'),
- (0xFCF0, 'M', 'يم'),
- (0xFCF1, 'M', 'يه'),
- (0xFCF2, 'M', 'ـَّ'),
- (0xFCF3, 'M', 'ـُّ'),
- (0xFCF4, 'M', 'ـِّ'),
- (0xFCF5, 'M', 'طى'),
- (0xFCF6, 'M', 'طي'),
- (0xFCF7, 'M', 'عى'),
- (0xFCF8, 'M', 'عي'),
- (0xFCF9, 'M', 'غى'),
- (0xFCFA, 'M', 'غي'),
- (0xFCFB, 'M', 'سى'),
- (0xFCFC, 'M', 'سي'),
- (0xFCFD, 'M', 'شى'),
- (0xFCFE, 'M', 'شي'),
- (0xFCFF, 'M', 'حى'),
- (0xFD00, 'M', 'حي'),
- (0xFD01, 'M', 'جى'),
- (0xFD02, 'M', 'جي'),
- (0xFD03, 'M', 'خى'),
- (0xFD04, 'M', 'خي'),
- (0xFD05, 'M', 'صى'),
- (0xFD06, 'M', 'صي'),
- (0xFD07, 'M', 'ضى'),
- (0xFD08, 'M', 'ضي'),
- (0xFD09, 'M', 'شج'),
- (0xFD0A, 'M', 'شح'),
- (0xFD0B, 'M', 'شخ'),
- (0xFD0C, 'M', 'شم'),
- (0xFD0D, 'M', 'شر'),
- (0xFD0E, 'M', 'سر'),
- (0xFD0F, 'M', 'صر'),
- (0xFD10, 'M', 'ضر'),
- (0xFD11, 'M', 'طى'),
- (0xFD12, 'M', 'طي'),
- (0xFD13, 'M', 'عى'),
- (0xFD14, 'M', 'عي'),
- (0xFD15, 'M', 'غى'),
- (0xFD16, 'M', 'غي'),
- (0xFD17, 'M', 'سى'),
- (0xFD18, 'M', 'سي'),
- (0xFD19, 'M', 'شى'),
- (0xFD1A, 'M', 'شي'),
- (0xFD1B, 'M', 'حى'),
- (0xFD1C, 'M', 'حي'),
- (0xFD1D, 'M', 'جى'),
- (0xFD1E, 'M', 'جي'),
+ (0xFCBF, "M", "فح"),
+ (0xFCC0, "M", "فخ"),
+ (0xFCC1, "M", "فم"),
+ (0xFCC2, "M", "قح"),
+ (0xFCC3, "M", "قم"),
+ (0xFCC4, "M", "كج"),
+ (0xFCC5, "M", "كح"),
+ (0xFCC6, "M", "كخ"),
+ (0xFCC7, "M", "كل"),
+ (0xFCC8, "M", "كم"),
+ (0xFCC9, "M", "لج"),
+ (0xFCCA, "M", "لح"),
+ (0xFCCB, "M", "لخ"),
+ (0xFCCC, "M", "لم"),
+ (0xFCCD, "M", "له"),
+ (0xFCCE, "M", "مج"),
+ (0xFCCF, "M", "مح"),
+ (0xFCD0, "M", "مخ"),
+ (0xFCD1, "M", "مم"),
+ (0xFCD2, "M", "نج"),
+ (0xFCD3, "M", "نح"),
+ (0xFCD4, "M", "نخ"),
+ (0xFCD5, "M", "نم"),
+ (0xFCD6, "M", "نه"),
+ (0xFCD7, "M", "هج"),
+ (0xFCD8, "M", "هم"),
+ (0xFCD9, "M", "هٰ"),
+ (0xFCDA, "M", "يج"),
+ (0xFCDB, "M", "يح"),
+ (0xFCDC, "M", "يخ"),
+ (0xFCDD, "M", "يم"),
+ (0xFCDE, "M", "يه"),
+ (0xFCDF, "M", "ئم"),
+ (0xFCE0, "M", "ئه"),
+ (0xFCE1, "M", "بم"),
+ (0xFCE2, "M", "به"),
+ (0xFCE3, "M", "تم"),
+ (0xFCE4, "M", "ته"),
+ (0xFCE5, "M", "ثم"),
+ (0xFCE6, "M", "ثه"),
+ (0xFCE7, "M", "سم"),
+ (0xFCE8, "M", "سه"),
+ (0xFCE9, "M", "شم"),
+ (0xFCEA, "M", "شه"),
+ (0xFCEB, "M", "كل"),
+ (0xFCEC, "M", "كم"),
+ (0xFCED, "M", "لم"),
+ (0xFCEE, "M", "نم"),
+ (0xFCEF, "M", "نه"),
+ (0xFCF0, "M", "يم"),
+ (0xFCF1, "M", "يه"),
+ (0xFCF2, "M", "ـَّ"),
+ (0xFCF3, "M", "ـُّ"),
+ (0xFCF4, "M", "ـِّ"),
+ (0xFCF5, "M", "طى"),
+ (0xFCF6, "M", "طي"),
+ (0xFCF7, "M", "عى"),
+ (0xFCF8, "M", "عي"),
+ (0xFCF9, "M", "غى"),
+ (0xFCFA, "M", "غي"),
+ (0xFCFB, "M", "سى"),
+ (0xFCFC, "M", "سي"),
+ (0xFCFD, "M", "شى"),
+ (0xFCFE, "M", "شي"),
+ (0xFCFF, "M", "حى"),
+ (0xFD00, "M", "حي"),
+ (0xFD01, "M", "جى"),
+ (0xFD02, "M", "جي"),
+ (0xFD03, "M", "خى"),
+ (0xFD04, "M", "خي"),
+ (0xFD05, "M", "صى"),
+ (0xFD06, "M", "صي"),
+ (0xFD07, "M", "ضى"),
+ (0xFD08, "M", "ضي"),
+ (0xFD09, "M", "شج"),
+ (0xFD0A, "M", "شح"),
+ (0xFD0B, "M", "شخ"),
+ (0xFD0C, "M", "شم"),
+ (0xFD0D, "M", "شر"),
+ (0xFD0E, "M", "سر"),
+ (0xFD0F, "M", "صر"),
+ (0xFD10, "M", "ضر"),
+ (0xFD11, "M", "طى"),
+ (0xFD12, "M", "طي"),
+ (0xFD13, "M", "عى"),
+ (0xFD14, "M", "عي"),
+ (0xFD15, "M", "غى"),
+ (0xFD16, "M", "غي"),
+ (0xFD17, "M", "سى"),
+ (0xFD18, "M", "سي"),
+ (0xFD19, "M", "شى"),
+ (0xFD1A, "M", "شي"),
+ (0xFD1B, "M", "حى"),
+ (0xFD1C, "M", "حي"),
+ (0xFD1D, "M", "جى"),
+ (0xFD1E, "M", "جي"),
+ (0xFD1F, "M", "خى"),
+ (0xFD20, "M", "خي"),
+ (0xFD21, "M", "صى"),
+ (0xFD22, "M", "صي"),
]
+
def _seg_48() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFD1F, 'M', 'خى'),
- (0xFD20, 'M', 'خي'),
- (0xFD21, 'M', 'صى'),
- (0xFD22, 'M', 'صي'),
- (0xFD23, 'M', 'ضى'),
- (0xFD24, 'M', 'ضي'),
- (0xFD25, 'M', 'شج'),
- (0xFD26, 'M', 'شح'),
- (0xFD27, 'M', 'شخ'),
- (0xFD28, 'M', 'شم'),
- (0xFD29, 'M', 'شر'),
- (0xFD2A, 'M', 'سر'),
- (0xFD2B, 'M', 'صر'),
- (0xFD2C, 'M', 'ضر'),
- (0xFD2D, 'M', 'شج'),
- (0xFD2E, 'M', 'شح'),
- (0xFD2F, 'M', 'شخ'),
- (0xFD30, 'M', 'شم'),
- (0xFD31, 'M', 'سه'),
- (0xFD32, 'M', 'شه'),
- (0xFD33, 'M', 'طم'),
- (0xFD34, 'M', 'سج'),
- (0xFD35, 'M', 'سح'),
- (0xFD36, 'M', 'سخ'),
- (0xFD37, 'M', 'شج'),
- (0xFD38, 'M', 'شح'),
- (0xFD39, 'M', 'شخ'),
- (0xFD3A, 'M', 'طم'),
- (0xFD3B, 'M', 'ظم'),
- (0xFD3C, 'M', 'اً'),
- (0xFD3E, 'V'),
- (0xFD50, 'M', 'تجم'),
- (0xFD51, 'M', 'تحج'),
- (0xFD53, 'M', 'تحم'),
- (0xFD54, 'M', 'تخم'),
- (0xFD55, 'M', 'تمج'),
- (0xFD56, 'M', 'تمح'),
- (0xFD57, 'M', 'تمخ'),
- (0xFD58, 'M', 'جمح'),
- (0xFD5A, 'M', 'حمي'),
- (0xFD5B, 'M', 'حمى'),
- (0xFD5C, 'M', 'سحج'),
- (0xFD5D, 'M', 'سجح'),
- (0xFD5E, 'M', 'سجى'),
- (0xFD5F, 'M', 'سمح'),
- (0xFD61, 'M', 'سمج'),
- (0xFD62, 'M', 'سمم'),
- (0xFD64, 'M', 'صحح'),
- (0xFD66, 'M', 'صمم'),
- (0xFD67, 'M', 'شحم'),
- (0xFD69, 'M', 'شجي'),
- (0xFD6A, 'M', 'شمخ'),
- (0xFD6C, 'M', 'شمم'),
- (0xFD6E, 'M', 'ضحى'),
- (0xFD6F, 'M', 'ضخم'),
- (0xFD71, 'M', 'طمح'),
- (0xFD73, 'M', 'طمم'),
- (0xFD74, 'M', 'طمي'),
- (0xFD75, 'M', 'عجم'),
- (0xFD76, 'M', 'عمم'),
- (0xFD78, 'M', 'عمى'),
- (0xFD79, 'M', 'غمم'),
- (0xFD7A, 'M', 'غمي'),
- (0xFD7B, 'M', 'غمى'),
- (0xFD7C, 'M', 'فخم'),
- (0xFD7E, 'M', 'قمح'),
- (0xFD7F, 'M', 'قمم'),
- (0xFD80, 'M', 'لحم'),
- (0xFD81, 'M', 'لحي'),
- (0xFD82, 'M', 'لحى'),
- (0xFD83, 'M', 'لجج'),
- (0xFD85, 'M', 'لخم'),
- (0xFD87, 'M', 'لمح'),
- (0xFD89, 'M', 'محج'),
- (0xFD8A, 'M', 'محم'),
- (0xFD8B, 'M', 'محي'),
- (0xFD8C, 'M', 'مجح'),
- (0xFD8D, 'M', 'مجم'),
- (0xFD8E, 'M', 'مخج'),
- (0xFD8F, 'M', 'مخم'),
- (0xFD90, 'X'),
- (0xFD92, 'M', 'مجخ'),
- (0xFD93, 'M', 'همج'),
- (0xFD94, 'M', 'همم'),
- (0xFD95, 'M', 'نحم'),
- (0xFD96, 'M', 'نحى'),
- (0xFD97, 'M', 'نجم'),
- (0xFD99, 'M', 'نجى'),
- (0xFD9A, 'M', 'نمي'),
- (0xFD9B, 'M', 'نمى'),
- (0xFD9C, 'M', 'يمم'),
- (0xFD9E, 'M', 'بخي'),
- (0xFD9F, 'M', 'تجي'),
- (0xFDA0, 'M', 'تجى'),
- (0xFDA1, 'M', 'تخي'),
- (0xFDA2, 'M', 'تخى'),
- (0xFDA3, 'M', 'تمي'),
- (0xFDA4, 'M', 'تمى'),
- (0xFDA5, 'M', 'جمي'),
- (0xFDA6, 'M', 'جحى'),
+ (0xFD23, "M", "ضى"),
+ (0xFD24, "M", "ضي"),
+ (0xFD25, "M", "شج"),
+ (0xFD26, "M", "شح"),
+ (0xFD27, "M", "شخ"),
+ (0xFD28, "M", "شم"),
+ (0xFD29, "M", "شر"),
+ (0xFD2A, "M", "سر"),
+ (0xFD2B, "M", "صر"),
+ (0xFD2C, "M", "ضر"),
+ (0xFD2D, "M", "شج"),
+ (0xFD2E, "M", "شح"),
+ (0xFD2F, "M", "شخ"),
+ (0xFD30, "M", "شم"),
+ (0xFD31, "M", "سه"),
+ (0xFD32, "M", "شه"),
+ (0xFD33, "M", "طم"),
+ (0xFD34, "M", "سج"),
+ (0xFD35, "M", "سح"),
+ (0xFD36, "M", "سخ"),
+ (0xFD37, "M", "شج"),
+ (0xFD38, "M", "شح"),
+ (0xFD39, "M", "شخ"),
+ (0xFD3A, "M", "طم"),
+ (0xFD3B, "M", "ظم"),
+ (0xFD3C, "M", "اً"),
+ (0xFD3E, "V"),
+ (0xFD50, "M", "تجم"),
+ (0xFD51, "M", "تحج"),
+ (0xFD53, "M", "تحم"),
+ (0xFD54, "M", "تخم"),
+ (0xFD55, "M", "تمج"),
+ (0xFD56, "M", "تمح"),
+ (0xFD57, "M", "تمخ"),
+ (0xFD58, "M", "جمح"),
+ (0xFD5A, "M", "حمي"),
+ (0xFD5B, "M", "حمى"),
+ (0xFD5C, "M", "سحج"),
+ (0xFD5D, "M", "سجح"),
+ (0xFD5E, "M", "سجى"),
+ (0xFD5F, "M", "سمح"),
+ (0xFD61, "M", "سمج"),
+ (0xFD62, "M", "سمم"),
+ (0xFD64, "M", "صحح"),
+ (0xFD66, "M", "صمم"),
+ (0xFD67, "M", "شحم"),
+ (0xFD69, "M", "شجي"),
+ (0xFD6A, "M", "شمخ"),
+ (0xFD6C, "M", "شمم"),
+ (0xFD6E, "M", "ضحى"),
+ (0xFD6F, "M", "ضخم"),
+ (0xFD71, "M", "طمح"),
+ (0xFD73, "M", "طمم"),
+ (0xFD74, "M", "طمي"),
+ (0xFD75, "M", "عجم"),
+ (0xFD76, "M", "عمم"),
+ (0xFD78, "M", "عمى"),
+ (0xFD79, "M", "غمم"),
+ (0xFD7A, "M", "غمي"),
+ (0xFD7B, "M", "غمى"),
+ (0xFD7C, "M", "فخم"),
+ (0xFD7E, "M", "قمح"),
+ (0xFD7F, "M", "قمم"),
+ (0xFD80, "M", "لحم"),
+ (0xFD81, "M", "لحي"),
+ (0xFD82, "M", "لحى"),
+ (0xFD83, "M", "لجج"),
+ (0xFD85, "M", "لخم"),
+ (0xFD87, "M", "لمح"),
+ (0xFD89, "M", "محج"),
+ (0xFD8A, "M", "محم"),
+ (0xFD8B, "M", "محي"),
+ (0xFD8C, "M", "مجح"),
+ (0xFD8D, "M", "مجم"),
+ (0xFD8E, "M", "مخج"),
+ (0xFD8F, "M", "مخم"),
+ (0xFD90, "X"),
+ (0xFD92, "M", "مجخ"),
+ (0xFD93, "M", "همج"),
+ (0xFD94, "M", "همم"),
+ (0xFD95, "M", "نحم"),
+ (0xFD96, "M", "نحى"),
+ (0xFD97, "M", "نجم"),
+ (0xFD99, "M", "نجى"),
+ (0xFD9A, "M", "نمي"),
+ (0xFD9B, "M", "نمى"),
+ (0xFD9C, "M", "يمم"),
+ (0xFD9E, "M", "بخي"),
+ (0xFD9F, "M", "تجي"),
+ (0xFDA0, "M", "تجى"),
+ (0xFDA1, "M", "تخي"),
+ (0xFDA2, "M", "تخى"),
+ (0xFDA3, "M", "تمي"),
+ (0xFDA4, "M", "تمى"),
+ (0xFDA5, "M", "جمي"),
+ (0xFDA6, "M", "جحى"),
+ (0xFDA7, "M", "جمى"),
+ (0xFDA8, "M", "سخى"),
+ (0xFDA9, "M", "صحي"),
+ (0xFDAA, "M", "شحي"),
]
+
def _seg_49() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFDA7, 'M', 'جمى'),
- (0xFDA8, 'M', 'سخى'),
- (0xFDA9, 'M', 'صحي'),
- (0xFDAA, 'M', 'شحي'),
- (0xFDAB, 'M', 'ضحي'),
- (0xFDAC, 'M', 'لجي'),
- (0xFDAD, 'M', 'لمي'),
- (0xFDAE, 'M', 'يحي'),
- (0xFDAF, 'M', 'يجي'),
- (0xFDB0, 'M', 'يمي'),
- (0xFDB1, 'M', 'ممي'),
- (0xFDB2, 'M', 'قمي'),
- (0xFDB3, 'M', 'نحي'),
- (0xFDB4, 'M', 'قمح'),
- (0xFDB5, 'M', 'لحم'),
- (0xFDB6, 'M', 'عمي'),
- (0xFDB7, 'M', 'كمي'),
- (0xFDB8, 'M', 'نجح'),
- (0xFDB9, 'M', 'مخي'),
- (0xFDBA, 'M', 'لجم'),
- (0xFDBB, 'M', 'كمم'),
- (0xFDBC, 'M', 'لجم'),
- (0xFDBD, 'M', 'نجح'),
- (0xFDBE, 'M', 'جحي'),
- (0xFDBF, 'M', 'حجي'),
- (0xFDC0, 'M', 'مجي'),
- (0xFDC1, 'M', 'فمي'),
- (0xFDC2, 'M', 'بحي'),
- (0xFDC3, 'M', 'كمم'),
- (0xFDC4, 'M', 'عجم'),
- (0xFDC5, 'M', 'صمم'),
- (0xFDC6, 'M', 'سخي'),
- (0xFDC7, 'M', 'نجي'),
- (0xFDC8, 'X'),
- (0xFDCF, 'V'),
- (0xFDD0, 'X'),
- (0xFDF0, 'M', 'صلے'),
- (0xFDF1, 'M', 'قلے'),
- (0xFDF2, 'M', 'الله'),
- (0xFDF3, 'M', 'اكبر'),
- (0xFDF4, 'M', 'محمد'),
- (0xFDF5, 'M', 'صلعم'),
- (0xFDF6, 'M', 'رسول'),
- (0xFDF7, 'M', 'عليه'),
- (0xFDF8, 'M', 'وسلم'),
- (0xFDF9, 'M', 'صلى'),
- (0xFDFA, '3', 'صلى الله عليه وسلم'),
- (0xFDFB, '3', 'جل جلاله'),
- (0xFDFC, 'M', 'ریال'),
- (0xFDFD, 'V'),
- (0xFE00, 'I'),
- (0xFE10, '3', ','),
- (0xFE11, 'M', '、'),
- (0xFE12, 'X'),
- (0xFE13, '3', ':'),
- (0xFE14, '3', ';'),
- (0xFE15, '3', '!'),
- (0xFE16, '3', '?'),
- (0xFE17, 'M', '〖'),
- (0xFE18, 'M', '〗'),
- (0xFE19, 'X'),
- (0xFE20, 'V'),
- (0xFE30, 'X'),
- (0xFE31, 'M', '—'),
- (0xFE32, 'M', '–'),
- (0xFE33, '3', '_'),
- (0xFE35, '3', '('),
- (0xFE36, '3', ')'),
- (0xFE37, '3', '{'),
- (0xFE38, '3', '}'),
- (0xFE39, 'M', '〔'),
- (0xFE3A, 'M', '〕'),
- (0xFE3B, 'M', '【'),
- (0xFE3C, 'M', '】'),
- (0xFE3D, 'M', '《'),
- (0xFE3E, 'M', '》'),
- (0xFE3F, 'M', '〈'),
- (0xFE40, 'M', '〉'),
- (0xFE41, 'M', '「'),
- (0xFE42, 'M', '」'),
- (0xFE43, 'M', '『'),
- (0xFE44, 'M', '』'),
- (0xFE45, 'V'),
- (0xFE47, '3', '['),
- (0xFE48, '3', ']'),
- (0xFE49, '3', ' ̅'),
- (0xFE4D, '3', '_'),
- (0xFE50, '3', ','),
- (0xFE51, 'M', '、'),
- (0xFE52, 'X'),
- (0xFE54, '3', ';'),
- (0xFE55, '3', ':'),
- (0xFE56, '3', '?'),
- (0xFE57, '3', '!'),
- (0xFE58, 'M', '—'),
- (0xFE59, '3', '('),
- (0xFE5A, '3', ')'),
- (0xFE5B, '3', '{'),
- (0xFE5C, '3', '}'),
- (0xFE5D, 'M', '〔'),
+ (0xFDAB, "M", "ضحي"),
+ (0xFDAC, "M", "لجي"),
+ (0xFDAD, "M", "لمي"),
+ (0xFDAE, "M", "يحي"),
+ (0xFDAF, "M", "يجي"),
+ (0xFDB0, "M", "يمي"),
+ (0xFDB1, "M", "ممي"),
+ (0xFDB2, "M", "قمي"),
+ (0xFDB3, "M", "نحي"),
+ (0xFDB4, "M", "قمح"),
+ (0xFDB5, "M", "لحم"),
+ (0xFDB6, "M", "عمي"),
+ (0xFDB7, "M", "كمي"),
+ (0xFDB8, "M", "نجح"),
+ (0xFDB9, "M", "مخي"),
+ (0xFDBA, "M", "لجم"),
+ (0xFDBB, "M", "كمم"),
+ (0xFDBC, "M", "لجم"),
+ (0xFDBD, "M", "نجح"),
+ (0xFDBE, "M", "جحي"),
+ (0xFDBF, "M", "حجي"),
+ (0xFDC0, "M", "مجي"),
+ (0xFDC1, "M", "فمي"),
+ (0xFDC2, "M", "بحي"),
+ (0xFDC3, "M", "كمم"),
+ (0xFDC4, "M", "عجم"),
+ (0xFDC5, "M", "صمم"),
+ (0xFDC6, "M", "سخي"),
+ (0xFDC7, "M", "نجي"),
+ (0xFDC8, "X"),
+ (0xFDCF, "V"),
+ (0xFDD0, "X"),
+ (0xFDF0, "M", "صلے"),
+ (0xFDF1, "M", "قلے"),
+ (0xFDF2, "M", "الله"),
+ (0xFDF3, "M", "اكبر"),
+ (0xFDF4, "M", "محمد"),
+ (0xFDF5, "M", "صلعم"),
+ (0xFDF6, "M", "رسول"),
+ (0xFDF7, "M", "عليه"),
+ (0xFDF8, "M", "وسلم"),
+ (0xFDF9, "M", "صلى"),
+ (0xFDFA, "3", "صلى الله عليه وسلم"),
+ (0xFDFB, "3", "جل جلاله"),
+ (0xFDFC, "M", "ریال"),
+ (0xFDFD, "V"),
+ (0xFE00, "I"),
+ (0xFE10, "3", ","),
+ (0xFE11, "M", "、"),
+ (0xFE12, "X"),
+ (0xFE13, "3", ":"),
+ (0xFE14, "3", ";"),
+ (0xFE15, "3", "!"),
+ (0xFE16, "3", "?"),
+ (0xFE17, "M", "〖"),
+ (0xFE18, "M", "〗"),
+ (0xFE19, "X"),
+ (0xFE20, "V"),
+ (0xFE30, "X"),
+ (0xFE31, "M", "—"),
+ (0xFE32, "M", "–"),
+ (0xFE33, "3", "_"),
+ (0xFE35, "3", "("),
+ (0xFE36, "3", ")"),
+ (0xFE37, "3", "{"),
+ (0xFE38, "3", "}"),
+ (0xFE39, "M", "〔"),
+ (0xFE3A, "M", "〕"),
+ (0xFE3B, "M", "【"),
+ (0xFE3C, "M", "】"),
+ (0xFE3D, "M", "《"),
+ (0xFE3E, "M", "》"),
+ (0xFE3F, "M", "〈"),
+ (0xFE40, "M", "〉"),
+ (0xFE41, "M", "「"),
+ (0xFE42, "M", "」"),
+ (0xFE43, "M", "『"),
+ (0xFE44, "M", "』"),
+ (0xFE45, "V"),
+ (0xFE47, "3", "["),
+ (0xFE48, "3", "]"),
+ (0xFE49, "3", " ̅"),
+ (0xFE4D, "3", "_"),
+ (0xFE50, "3", ","),
+ (0xFE51, "M", "、"),
+ (0xFE52, "X"),
+ (0xFE54, "3", ";"),
+ (0xFE55, "3", ":"),
+ (0xFE56, "3", "?"),
+ (0xFE57, "3", "!"),
+ (0xFE58, "M", "—"),
+ (0xFE59, "3", "("),
+ (0xFE5A, "3", ")"),
+ (0xFE5B, "3", "{"),
+ (0xFE5C, "3", "}"),
+ (0xFE5D, "M", "〔"),
+ (0xFE5E, "M", "〕"),
+ (0xFE5F, "3", "#"),
+ (0xFE60, "3", "&"),
+ (0xFE61, "3", "*"),
]
+
def _seg_50() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFE5E, 'M', '〕'),
- (0xFE5F, '3', '#'),
- (0xFE60, '3', '&'),
- (0xFE61, '3', '*'),
- (0xFE62, '3', '+'),
- (0xFE63, 'M', '-'),
- (0xFE64, '3', '<'),
- (0xFE65, '3', '>'),
- (0xFE66, '3', '='),
- (0xFE67, 'X'),
- (0xFE68, '3', '\\'),
- (0xFE69, '3', '$'),
- (0xFE6A, '3', '%'),
- (0xFE6B, '3', '@'),
- (0xFE6C, 'X'),
- (0xFE70, '3', ' ً'),
- (0xFE71, 'M', 'ـً'),
- (0xFE72, '3', ' ٌ'),
- (0xFE73, 'V'),
- (0xFE74, '3', ' ٍ'),
- (0xFE75, 'X'),
- (0xFE76, '3', ' َ'),
- (0xFE77, 'M', 'ـَ'),
- (0xFE78, '3', ' ُ'),
- (0xFE79, 'M', 'ـُ'),
- (0xFE7A, '3', ' ِ'),
- (0xFE7B, 'M', 'ـِ'),
- (0xFE7C, '3', ' ّ'),
- (0xFE7D, 'M', 'ـّ'),
- (0xFE7E, '3', ' ْ'),
- (0xFE7F, 'M', 'ـْ'),
- (0xFE80, 'M', 'ء'),
- (0xFE81, 'M', 'آ'),
- (0xFE83, 'M', 'أ'),
- (0xFE85, 'M', 'ؤ'),
- (0xFE87, 'M', 'إ'),
- (0xFE89, 'M', 'ئ'),
- (0xFE8D, 'M', 'ا'),
- (0xFE8F, 'M', 'ب'),
- (0xFE93, 'M', 'ة'),
- (0xFE95, 'M', 'ت'),
- (0xFE99, 'M', 'ث'),
- (0xFE9D, 'M', 'ج'),
- (0xFEA1, 'M', 'ح'),
- (0xFEA5, 'M', 'خ'),
- (0xFEA9, 'M', 'د'),
- (0xFEAB, 'M', 'ذ'),
- (0xFEAD, 'M', 'ر'),
- (0xFEAF, 'M', 'ز'),
- (0xFEB1, 'M', 'س'),
- (0xFEB5, 'M', 'ش'),
- (0xFEB9, 'M', 'ص'),
- (0xFEBD, 'M', 'ض'),
- (0xFEC1, 'M', 'ط'),
- (0xFEC5, 'M', 'ظ'),
- (0xFEC9, 'M', 'ع'),
- (0xFECD, 'M', 'غ'),
- (0xFED1, 'M', 'ف'),
- (0xFED5, 'M', 'ق'),
- (0xFED9, 'M', 'ك'),
- (0xFEDD, 'M', 'ل'),
- (0xFEE1, 'M', 'م'),
- (0xFEE5, 'M', 'ن'),
- (0xFEE9, 'M', 'ه'),
- (0xFEED, 'M', 'و'),
- (0xFEEF, 'M', 'ى'),
- (0xFEF1, 'M', 'ي'),
- (0xFEF5, 'M', 'لآ'),
- (0xFEF7, 'M', 'لأ'),
- (0xFEF9, 'M', 'لإ'),
- (0xFEFB, 'M', 'لا'),
- (0xFEFD, 'X'),
- (0xFEFF, 'I'),
- (0xFF00, 'X'),
- (0xFF01, '3', '!'),
- (0xFF02, '3', '"'),
- (0xFF03, '3', '#'),
- (0xFF04, '3', '$'),
- (0xFF05, '3', '%'),
- (0xFF06, '3', '&'),
- (0xFF07, '3', '\''),
- (0xFF08, '3', '('),
- (0xFF09, '3', ')'),
- (0xFF0A, '3', '*'),
- (0xFF0B, '3', '+'),
- (0xFF0C, '3', ','),
- (0xFF0D, 'M', '-'),
- (0xFF0E, 'M', '.'),
- (0xFF0F, '3', '/'),
- (0xFF10, 'M', '0'),
- (0xFF11, 'M', '1'),
- (0xFF12, 'M', '2'),
- (0xFF13, 'M', '3'),
- (0xFF14, 'M', '4'),
- (0xFF15, 'M', '5'),
- (0xFF16, 'M', '6'),
- (0xFF17, 'M', '7'),
- (0xFF18, 'M', '8'),
- (0xFF19, 'M', '9'),
- (0xFF1A, '3', ':'),
+ (0xFE62, "3", "+"),
+ (0xFE63, "M", "-"),
+ (0xFE64, "3", "<"),
+ (0xFE65, "3", ">"),
+ (0xFE66, "3", "="),
+ (0xFE67, "X"),
+ (0xFE68, "3", "\\"),
+ (0xFE69, "3", "$"),
+ (0xFE6A, "3", "%"),
+ (0xFE6B, "3", "@"),
+ (0xFE6C, "X"),
+ (0xFE70, "3", " ً"),
+ (0xFE71, "M", "ـً"),
+ (0xFE72, "3", " ٌ"),
+ (0xFE73, "V"),
+ (0xFE74, "3", " ٍ"),
+ (0xFE75, "X"),
+ (0xFE76, "3", " َ"),
+ (0xFE77, "M", "ـَ"),
+ (0xFE78, "3", " ُ"),
+ (0xFE79, "M", "ـُ"),
+ (0xFE7A, "3", " ِ"),
+ (0xFE7B, "M", "ـِ"),
+ (0xFE7C, "3", " ّ"),
+ (0xFE7D, "M", "ـّ"),
+ (0xFE7E, "3", " ْ"),
+ (0xFE7F, "M", "ـْ"),
+ (0xFE80, "M", "ء"),
+ (0xFE81, "M", "آ"),
+ (0xFE83, "M", "أ"),
+ (0xFE85, "M", "ؤ"),
+ (0xFE87, "M", "إ"),
+ (0xFE89, "M", "ئ"),
+ (0xFE8D, "M", "ا"),
+ (0xFE8F, "M", "ب"),
+ (0xFE93, "M", "ة"),
+ (0xFE95, "M", "ت"),
+ (0xFE99, "M", "ث"),
+ (0xFE9D, "M", "ج"),
+ (0xFEA1, "M", "ح"),
+ (0xFEA5, "M", "خ"),
+ (0xFEA9, "M", "د"),
+ (0xFEAB, "M", "ذ"),
+ (0xFEAD, "M", "ر"),
+ (0xFEAF, "M", "ز"),
+ (0xFEB1, "M", "س"),
+ (0xFEB5, "M", "ش"),
+ (0xFEB9, "M", "ص"),
+ (0xFEBD, "M", "ض"),
+ (0xFEC1, "M", "ط"),
+ (0xFEC5, "M", "ظ"),
+ (0xFEC9, "M", "ع"),
+ (0xFECD, "M", "غ"),
+ (0xFED1, "M", "ف"),
+ (0xFED5, "M", "ق"),
+ (0xFED9, "M", "ك"),
+ (0xFEDD, "M", "ل"),
+ (0xFEE1, "M", "م"),
+ (0xFEE5, "M", "ن"),
+ (0xFEE9, "M", "ه"),
+ (0xFEED, "M", "و"),
+ (0xFEEF, "M", "ى"),
+ (0xFEF1, "M", "ي"),
+ (0xFEF5, "M", "لآ"),
+ (0xFEF7, "M", "لأ"),
+ (0xFEF9, "M", "لإ"),
+ (0xFEFB, "M", "لا"),
+ (0xFEFD, "X"),
+ (0xFEFF, "I"),
+ (0xFF00, "X"),
+ (0xFF01, "3", "!"),
+ (0xFF02, "3", '"'),
+ (0xFF03, "3", "#"),
+ (0xFF04, "3", "$"),
+ (0xFF05, "3", "%"),
+ (0xFF06, "3", "&"),
+ (0xFF07, "3", "'"),
+ (0xFF08, "3", "("),
+ (0xFF09, "3", ")"),
+ (0xFF0A, "3", "*"),
+ (0xFF0B, "3", "+"),
+ (0xFF0C, "3", ","),
+ (0xFF0D, "M", "-"),
+ (0xFF0E, "M", "."),
+ (0xFF0F, "3", "/"),
+ (0xFF10, "M", "0"),
+ (0xFF11, "M", "1"),
+ (0xFF12, "M", "2"),
+ (0xFF13, "M", "3"),
+ (0xFF14, "M", "4"),
+ (0xFF15, "M", "5"),
+ (0xFF16, "M", "6"),
+ (0xFF17, "M", "7"),
+ (0xFF18, "M", "8"),
+ (0xFF19, "M", "9"),
+ (0xFF1A, "3", ":"),
+ (0xFF1B, "3", ";"),
+ (0xFF1C, "3", "<"),
+ (0xFF1D, "3", "="),
+ (0xFF1E, "3", ">"),
]
+
def _seg_51() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFF1B, '3', ';'),
- (0xFF1C, '3', '<'),
- (0xFF1D, '3', '='),
- (0xFF1E, '3', '>'),
- (0xFF1F, '3', '?'),
- (0xFF20, '3', '@'),
- (0xFF21, 'M', 'a'),
- (0xFF22, 'M', 'b'),
- (0xFF23, 'M', 'c'),
- (0xFF24, 'M', 'd'),
- (0xFF25, 'M', 'e'),
- (0xFF26, 'M', 'f'),
- (0xFF27, 'M', 'g'),
- (0xFF28, 'M', 'h'),
- (0xFF29, 'M', 'i'),
- (0xFF2A, 'M', 'j'),
- (0xFF2B, 'M', 'k'),
- (0xFF2C, 'M', 'l'),
- (0xFF2D, 'M', 'm'),
- (0xFF2E, 'M', 'n'),
- (0xFF2F, 'M', 'o'),
- (0xFF30, 'M', 'p'),
- (0xFF31, 'M', 'q'),
- (0xFF32, 'M', 'r'),
- (0xFF33, 'M', 's'),
- (0xFF34, 'M', 't'),
- (0xFF35, 'M', 'u'),
- (0xFF36, 'M', 'v'),
- (0xFF37, 'M', 'w'),
- (0xFF38, 'M', 'x'),
- (0xFF39, 'M', 'y'),
- (0xFF3A, 'M', 'z'),
- (0xFF3B, '3', '['),
- (0xFF3C, '3', '\\'),
- (0xFF3D, '3', ']'),
- (0xFF3E, '3', '^'),
- (0xFF3F, '3', '_'),
- (0xFF40, '3', '`'),
- (0xFF41, 'M', 'a'),
- (0xFF42, 'M', 'b'),
- (0xFF43, 'M', 'c'),
- (0xFF44, 'M', 'd'),
- (0xFF45, 'M', 'e'),
- (0xFF46, 'M', 'f'),
- (0xFF47, 'M', 'g'),
- (0xFF48, 'M', 'h'),
- (0xFF49, 'M', 'i'),
- (0xFF4A, 'M', 'j'),
- (0xFF4B, 'M', 'k'),
- (0xFF4C, 'M', 'l'),
- (0xFF4D, 'M', 'm'),
- (0xFF4E, 'M', 'n'),
- (0xFF4F, 'M', 'o'),
- (0xFF50, 'M', 'p'),
- (0xFF51, 'M', 'q'),
- (0xFF52, 'M', 'r'),
- (0xFF53, 'M', 's'),
- (0xFF54, 'M', 't'),
- (0xFF55, 'M', 'u'),
- (0xFF56, 'M', 'v'),
- (0xFF57, 'M', 'w'),
- (0xFF58, 'M', 'x'),
- (0xFF59, 'M', 'y'),
- (0xFF5A, 'M', 'z'),
- (0xFF5B, '3', '{'),
- (0xFF5C, '3', '|'),
- (0xFF5D, '3', '}'),
- (0xFF5E, '3', '~'),
- (0xFF5F, 'M', '⦅'),
- (0xFF60, 'M', '⦆'),
- (0xFF61, 'M', '.'),
- (0xFF62, 'M', '「'),
- (0xFF63, 'M', '」'),
- (0xFF64, 'M', '、'),
- (0xFF65, 'M', '・'),
- (0xFF66, 'M', 'ヲ'),
- (0xFF67, 'M', 'ァ'),
- (0xFF68, 'M', 'ィ'),
- (0xFF69, 'M', 'ゥ'),
- (0xFF6A, 'M', 'ェ'),
- (0xFF6B, 'M', 'ォ'),
- (0xFF6C, 'M', 'ャ'),
- (0xFF6D, 'M', 'ュ'),
- (0xFF6E, 'M', 'ョ'),
- (0xFF6F, 'M', 'ッ'),
- (0xFF70, 'M', 'ー'),
- (0xFF71, 'M', 'ア'),
- (0xFF72, 'M', 'イ'),
- (0xFF73, 'M', 'ウ'),
- (0xFF74, 'M', 'エ'),
- (0xFF75, 'M', 'オ'),
- (0xFF76, 'M', 'カ'),
- (0xFF77, 'M', 'キ'),
- (0xFF78, 'M', 'ク'),
- (0xFF79, 'M', 'ケ'),
- (0xFF7A, 'M', 'コ'),
- (0xFF7B, 'M', 'サ'),
- (0xFF7C, 'M', 'シ'),
- (0xFF7D, 'M', 'ス'),
- (0xFF7E, 'M', 'セ'),
+ (0xFF1F, "3", "?"),
+ (0xFF20, "3", "@"),
+ (0xFF21, "M", "a"),
+ (0xFF22, "M", "b"),
+ (0xFF23, "M", "c"),
+ (0xFF24, "M", "d"),
+ (0xFF25, "M", "e"),
+ (0xFF26, "M", "f"),
+ (0xFF27, "M", "g"),
+ (0xFF28, "M", "h"),
+ (0xFF29, "M", "i"),
+ (0xFF2A, "M", "j"),
+ (0xFF2B, "M", "k"),
+ (0xFF2C, "M", "l"),
+ (0xFF2D, "M", "m"),
+ (0xFF2E, "M", "n"),
+ (0xFF2F, "M", "o"),
+ (0xFF30, "M", "p"),
+ (0xFF31, "M", "q"),
+ (0xFF32, "M", "r"),
+ (0xFF33, "M", "s"),
+ (0xFF34, "M", "t"),
+ (0xFF35, "M", "u"),
+ (0xFF36, "M", "v"),
+ (0xFF37, "M", "w"),
+ (0xFF38, "M", "x"),
+ (0xFF39, "M", "y"),
+ (0xFF3A, "M", "z"),
+ (0xFF3B, "3", "["),
+ (0xFF3C, "3", "\\"),
+ (0xFF3D, "3", "]"),
+ (0xFF3E, "3", "^"),
+ (0xFF3F, "3", "_"),
+ (0xFF40, "3", "`"),
+ (0xFF41, "M", "a"),
+ (0xFF42, "M", "b"),
+ (0xFF43, "M", "c"),
+ (0xFF44, "M", "d"),
+ (0xFF45, "M", "e"),
+ (0xFF46, "M", "f"),
+ (0xFF47, "M", "g"),
+ (0xFF48, "M", "h"),
+ (0xFF49, "M", "i"),
+ (0xFF4A, "M", "j"),
+ (0xFF4B, "M", "k"),
+ (0xFF4C, "M", "l"),
+ (0xFF4D, "M", "m"),
+ (0xFF4E, "M", "n"),
+ (0xFF4F, "M", "o"),
+ (0xFF50, "M", "p"),
+ (0xFF51, "M", "q"),
+ (0xFF52, "M", "r"),
+ (0xFF53, "M", "s"),
+ (0xFF54, "M", "t"),
+ (0xFF55, "M", "u"),
+ (0xFF56, "M", "v"),
+ (0xFF57, "M", "w"),
+ (0xFF58, "M", "x"),
+ (0xFF59, "M", "y"),
+ (0xFF5A, "M", "z"),
+ (0xFF5B, "3", "{"),
+ (0xFF5C, "3", "|"),
+ (0xFF5D, "3", "}"),
+ (0xFF5E, "3", "~"),
+ (0xFF5F, "M", "⦅"),
+ (0xFF60, "M", "⦆"),
+ (0xFF61, "M", "."),
+ (0xFF62, "M", "「"),
+ (0xFF63, "M", "」"),
+ (0xFF64, "M", "、"),
+ (0xFF65, "M", "・"),
+ (0xFF66, "M", "ヲ"),
+ (0xFF67, "M", "ァ"),
+ (0xFF68, "M", "ィ"),
+ (0xFF69, "M", "ゥ"),
+ (0xFF6A, "M", "ェ"),
+ (0xFF6B, "M", "ォ"),
+ (0xFF6C, "M", "ャ"),
+ (0xFF6D, "M", "ュ"),
+ (0xFF6E, "M", "ョ"),
+ (0xFF6F, "M", "ッ"),
+ (0xFF70, "M", "ー"),
+ (0xFF71, "M", "ア"),
+ (0xFF72, "M", "イ"),
+ (0xFF73, "M", "ウ"),
+ (0xFF74, "M", "エ"),
+ (0xFF75, "M", "オ"),
+ (0xFF76, "M", "カ"),
+ (0xFF77, "M", "キ"),
+ (0xFF78, "M", "ク"),
+ (0xFF79, "M", "ケ"),
+ (0xFF7A, "M", "コ"),
+ (0xFF7B, "M", "サ"),
+ (0xFF7C, "M", "シ"),
+ (0xFF7D, "M", "ス"),
+ (0xFF7E, "M", "セ"),
+ (0xFF7F, "M", "ソ"),
+ (0xFF80, "M", "タ"),
+ (0xFF81, "M", "チ"),
+ (0xFF82, "M", "ツ"),
]
+
def _seg_52() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFF7F, 'M', 'ソ'),
- (0xFF80, 'M', 'タ'),
- (0xFF81, 'M', 'チ'),
- (0xFF82, 'M', 'ツ'),
- (0xFF83, 'M', 'テ'),
- (0xFF84, 'M', 'ト'),
- (0xFF85, 'M', 'ナ'),
- (0xFF86, 'M', 'ニ'),
- (0xFF87, 'M', 'ヌ'),
- (0xFF88, 'M', 'ネ'),
- (0xFF89, 'M', 'ノ'),
- (0xFF8A, 'M', 'ハ'),
- (0xFF8B, 'M', 'ヒ'),
- (0xFF8C, 'M', 'フ'),
- (0xFF8D, 'M', 'ヘ'),
- (0xFF8E, 'M', 'ホ'),
- (0xFF8F, 'M', 'マ'),
- (0xFF90, 'M', 'ミ'),
- (0xFF91, 'M', 'ム'),
- (0xFF92, 'M', 'メ'),
- (0xFF93, 'M', 'モ'),
- (0xFF94, 'M', 'ヤ'),
- (0xFF95, 'M', 'ユ'),
- (0xFF96, 'M', 'ヨ'),
- (0xFF97, 'M', 'ラ'),
- (0xFF98, 'M', 'リ'),
- (0xFF99, 'M', 'ル'),
- (0xFF9A, 'M', 'レ'),
- (0xFF9B, 'M', 'ロ'),
- (0xFF9C, 'M', 'ワ'),
- (0xFF9D, 'M', 'ン'),
- (0xFF9E, 'M', '゙'),
- (0xFF9F, 'M', '゚'),
- (0xFFA0, 'X'),
- (0xFFA1, 'M', 'ᄀ'),
- (0xFFA2, 'M', 'ᄁ'),
- (0xFFA3, 'M', 'ᆪ'),
- (0xFFA4, 'M', 'ᄂ'),
- (0xFFA5, 'M', 'ᆬ'),
- (0xFFA6, 'M', 'ᆭ'),
- (0xFFA7, 'M', 'ᄃ'),
- (0xFFA8, 'M', 'ᄄ'),
- (0xFFA9, 'M', 'ᄅ'),
- (0xFFAA, 'M', 'ᆰ'),
- (0xFFAB, 'M', 'ᆱ'),
- (0xFFAC, 'M', 'ᆲ'),
- (0xFFAD, 'M', 'ᆳ'),
- (0xFFAE, 'M', 'ᆴ'),
- (0xFFAF, 'M', 'ᆵ'),
- (0xFFB0, 'M', 'ᄚ'),
- (0xFFB1, 'M', 'ᄆ'),
- (0xFFB2, 'M', 'ᄇ'),
- (0xFFB3, 'M', 'ᄈ'),
- (0xFFB4, 'M', 'ᄡ'),
- (0xFFB5, 'M', 'ᄉ'),
- (0xFFB6, 'M', 'ᄊ'),
- (0xFFB7, 'M', 'ᄋ'),
- (0xFFB8, 'M', 'ᄌ'),
- (0xFFB9, 'M', 'ᄍ'),
- (0xFFBA, 'M', 'ᄎ'),
- (0xFFBB, 'M', 'ᄏ'),
- (0xFFBC, 'M', 'ᄐ'),
- (0xFFBD, 'M', 'ᄑ'),
- (0xFFBE, 'M', 'ᄒ'),
- (0xFFBF, 'X'),
- (0xFFC2, 'M', 'ᅡ'),
- (0xFFC3, 'M', 'ᅢ'),
- (0xFFC4, 'M', 'ᅣ'),
- (0xFFC5, 'M', 'ᅤ'),
- (0xFFC6, 'M', 'ᅥ'),
- (0xFFC7, 'M', 'ᅦ'),
- (0xFFC8, 'X'),
- (0xFFCA, 'M', 'ᅧ'),
- (0xFFCB, 'M', 'ᅨ'),
- (0xFFCC, 'M', 'ᅩ'),
- (0xFFCD, 'M', 'ᅪ'),
- (0xFFCE, 'M', 'ᅫ'),
- (0xFFCF, 'M', 'ᅬ'),
- (0xFFD0, 'X'),
- (0xFFD2, 'M', 'ᅭ'),
- (0xFFD3, 'M', 'ᅮ'),
- (0xFFD4, 'M', 'ᅯ'),
- (0xFFD5, 'M', 'ᅰ'),
- (0xFFD6, 'M', 'ᅱ'),
- (0xFFD7, 'M', 'ᅲ'),
- (0xFFD8, 'X'),
- (0xFFDA, 'M', 'ᅳ'),
- (0xFFDB, 'M', 'ᅴ'),
- (0xFFDC, 'M', 'ᅵ'),
- (0xFFDD, 'X'),
- (0xFFE0, 'M', '¢'),
- (0xFFE1, 'M', '£'),
- (0xFFE2, 'M', '¬'),
- (0xFFE3, '3', ' ̄'),
- (0xFFE4, 'M', '¦'),
- (0xFFE5, 'M', '¥'),
- (0xFFE6, 'M', '₩'),
- (0xFFE7, 'X'),
- (0xFFE8, 'M', '│'),
- (0xFFE9, 'M', '←'),
+ (0xFF83, "M", "テ"),
+ (0xFF84, "M", "ト"),
+ (0xFF85, "M", "ナ"),
+ (0xFF86, "M", "ニ"),
+ (0xFF87, "M", "ヌ"),
+ (0xFF88, "M", "ネ"),
+ (0xFF89, "M", "ノ"),
+ (0xFF8A, "M", "ハ"),
+ (0xFF8B, "M", "ヒ"),
+ (0xFF8C, "M", "フ"),
+ (0xFF8D, "M", "ヘ"),
+ (0xFF8E, "M", "ホ"),
+ (0xFF8F, "M", "マ"),
+ (0xFF90, "M", "ミ"),
+ (0xFF91, "M", "ム"),
+ (0xFF92, "M", "メ"),
+ (0xFF93, "M", "モ"),
+ (0xFF94, "M", "ヤ"),
+ (0xFF95, "M", "ユ"),
+ (0xFF96, "M", "ヨ"),
+ (0xFF97, "M", "ラ"),
+ (0xFF98, "M", "リ"),
+ (0xFF99, "M", "ル"),
+ (0xFF9A, "M", "レ"),
+ (0xFF9B, "M", "ロ"),
+ (0xFF9C, "M", "ワ"),
+ (0xFF9D, "M", "ン"),
+ (0xFF9E, "M", "゙"),
+ (0xFF9F, "M", "゚"),
+ (0xFFA0, "X"),
+ (0xFFA1, "M", "ᄀ"),
+ (0xFFA2, "M", "ᄁ"),
+ (0xFFA3, "M", "ᆪ"),
+ (0xFFA4, "M", "ᄂ"),
+ (0xFFA5, "M", "ᆬ"),
+ (0xFFA6, "M", "ᆭ"),
+ (0xFFA7, "M", "ᄃ"),
+ (0xFFA8, "M", "ᄄ"),
+ (0xFFA9, "M", "ᄅ"),
+ (0xFFAA, "M", "ᆰ"),
+ (0xFFAB, "M", "ᆱ"),
+ (0xFFAC, "M", "ᆲ"),
+ (0xFFAD, "M", "ᆳ"),
+ (0xFFAE, "M", "ᆴ"),
+ (0xFFAF, "M", "ᆵ"),
+ (0xFFB0, "M", "ᄚ"),
+ (0xFFB1, "M", "ᄆ"),
+ (0xFFB2, "M", "ᄇ"),
+ (0xFFB3, "M", "ᄈ"),
+ (0xFFB4, "M", "ᄡ"),
+ (0xFFB5, "M", "ᄉ"),
+ (0xFFB6, "M", "ᄊ"),
+ (0xFFB7, "M", "ᄋ"),
+ (0xFFB8, "M", "ᄌ"),
+ (0xFFB9, "M", "ᄍ"),
+ (0xFFBA, "M", "ᄎ"),
+ (0xFFBB, "M", "ᄏ"),
+ (0xFFBC, "M", "ᄐ"),
+ (0xFFBD, "M", "ᄑ"),
+ (0xFFBE, "M", "ᄒ"),
+ (0xFFBF, "X"),
+ (0xFFC2, "M", "ᅡ"),
+ (0xFFC3, "M", "ᅢ"),
+ (0xFFC4, "M", "ᅣ"),
+ (0xFFC5, "M", "ᅤ"),
+ (0xFFC6, "M", "ᅥ"),
+ (0xFFC7, "M", "ᅦ"),
+ (0xFFC8, "X"),
+ (0xFFCA, "M", "ᅧ"),
+ (0xFFCB, "M", "ᅨ"),
+ (0xFFCC, "M", "ᅩ"),
+ (0xFFCD, "M", "ᅪ"),
+ (0xFFCE, "M", "ᅫ"),
+ (0xFFCF, "M", "ᅬ"),
+ (0xFFD0, "X"),
+ (0xFFD2, "M", "ᅭ"),
+ (0xFFD3, "M", "ᅮ"),
+ (0xFFD4, "M", "ᅯ"),
+ (0xFFD5, "M", "ᅰ"),
+ (0xFFD6, "M", "ᅱ"),
+ (0xFFD7, "M", "ᅲ"),
+ (0xFFD8, "X"),
+ (0xFFDA, "M", "ᅳ"),
+ (0xFFDB, "M", "ᅴ"),
+ (0xFFDC, "M", "ᅵ"),
+ (0xFFDD, "X"),
+ (0xFFE0, "M", "¢"),
+ (0xFFE1, "M", "£"),
+ (0xFFE2, "M", "¬"),
+ (0xFFE3, "3", " ̄"),
+ (0xFFE4, "M", "¦"),
+ (0xFFE5, "M", "¥"),
+ (0xFFE6, "M", "₩"),
+ (0xFFE7, "X"),
+ (0xFFE8, "M", "│"),
+ (0xFFE9, "M", "←"),
+ (0xFFEA, "M", "↑"),
+ (0xFFEB, "M", "→"),
+ (0xFFEC, "M", "↓"),
+ (0xFFED, "M", "■"),
]
+
def _seg_53() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0xFFEA, 'M', '↑'),
- (0xFFEB, 'M', '→'),
- (0xFFEC, 'M', '↓'),
- (0xFFED, 'M', '■'),
- (0xFFEE, 'M', '○'),
- (0xFFEF, 'X'),
- (0x10000, 'V'),
- (0x1000C, 'X'),
- (0x1000D, 'V'),
- (0x10027, 'X'),
- (0x10028, 'V'),
- (0x1003B, 'X'),
- (0x1003C, 'V'),
- (0x1003E, 'X'),
- (0x1003F, 'V'),
- (0x1004E, 'X'),
- (0x10050, 'V'),
- (0x1005E, 'X'),
- (0x10080, 'V'),
- (0x100FB, 'X'),
- (0x10100, 'V'),
- (0x10103, 'X'),
- (0x10107, 'V'),
- (0x10134, 'X'),
- (0x10137, 'V'),
- (0x1018F, 'X'),
- (0x10190, 'V'),
- (0x1019D, 'X'),
- (0x101A0, 'V'),
- (0x101A1, 'X'),
- (0x101D0, 'V'),
- (0x101FE, 'X'),
- (0x10280, 'V'),
- (0x1029D, 'X'),
- (0x102A0, 'V'),
- (0x102D1, 'X'),
- (0x102E0, 'V'),
- (0x102FC, 'X'),
- (0x10300, 'V'),
- (0x10324, 'X'),
- (0x1032D, 'V'),
- (0x1034B, 'X'),
- (0x10350, 'V'),
- (0x1037B, 'X'),
- (0x10380, 'V'),
- (0x1039E, 'X'),
- (0x1039F, 'V'),
- (0x103C4, 'X'),
- (0x103C8, 'V'),
- (0x103D6, 'X'),
- (0x10400, 'M', '𐐨'),
- (0x10401, 'M', '𐐩'),
- (0x10402, 'M', '𐐪'),
- (0x10403, 'M', '𐐫'),
- (0x10404, 'M', '𐐬'),
- (0x10405, 'M', '𐐭'),
- (0x10406, 'M', '𐐮'),
- (0x10407, 'M', '𐐯'),
- (0x10408, 'M', '𐐰'),
- (0x10409, 'M', '𐐱'),
- (0x1040A, 'M', '𐐲'),
- (0x1040B, 'M', '𐐳'),
- (0x1040C, 'M', '𐐴'),
- (0x1040D, 'M', '𐐵'),
- (0x1040E, 'M', '𐐶'),
- (0x1040F, 'M', '𐐷'),
- (0x10410, 'M', '𐐸'),
- (0x10411, 'M', '𐐹'),
- (0x10412, 'M', '𐐺'),
- (0x10413, 'M', '𐐻'),
- (0x10414, 'M', '𐐼'),
- (0x10415, 'M', '𐐽'),
- (0x10416, 'M', '𐐾'),
- (0x10417, 'M', '𐐿'),
- (0x10418, 'M', '𐑀'),
- (0x10419, 'M', '𐑁'),
- (0x1041A, 'M', '𐑂'),
- (0x1041B, 'M', '𐑃'),
- (0x1041C, 'M', '𐑄'),
- (0x1041D, 'M', '𐑅'),
- (0x1041E, 'M', '𐑆'),
- (0x1041F, 'M', '𐑇'),
- (0x10420, 'M', '𐑈'),
- (0x10421, 'M', '𐑉'),
- (0x10422, 'M', '𐑊'),
- (0x10423, 'M', '𐑋'),
- (0x10424, 'M', '𐑌'),
- (0x10425, 'M', '𐑍'),
- (0x10426, 'M', '𐑎'),
- (0x10427, 'M', '𐑏'),
- (0x10428, 'V'),
- (0x1049E, 'X'),
- (0x104A0, 'V'),
- (0x104AA, 'X'),
- (0x104B0, 'M', '𐓘'),
- (0x104B1, 'M', '𐓙'),
- (0x104B2, 'M', '𐓚'),
- (0x104B3, 'M', '𐓛'),
- (0x104B4, 'M', '𐓜'),
- (0x104B5, 'M', '𐓝'),
+ (0xFFEE, "M", "○"),
+ (0xFFEF, "X"),
+ (0x10000, "V"),
+ (0x1000C, "X"),
+ (0x1000D, "V"),
+ (0x10027, "X"),
+ (0x10028, "V"),
+ (0x1003B, "X"),
+ (0x1003C, "V"),
+ (0x1003E, "X"),
+ (0x1003F, "V"),
+ (0x1004E, "X"),
+ (0x10050, "V"),
+ (0x1005E, "X"),
+ (0x10080, "V"),
+ (0x100FB, "X"),
+ (0x10100, "V"),
+ (0x10103, "X"),
+ (0x10107, "V"),
+ (0x10134, "X"),
+ (0x10137, "V"),
+ (0x1018F, "X"),
+ (0x10190, "V"),
+ (0x1019D, "X"),
+ (0x101A0, "V"),
+ (0x101A1, "X"),
+ (0x101D0, "V"),
+ (0x101FE, "X"),
+ (0x10280, "V"),
+ (0x1029D, "X"),
+ (0x102A0, "V"),
+ (0x102D1, "X"),
+ (0x102E0, "V"),
+ (0x102FC, "X"),
+ (0x10300, "V"),
+ (0x10324, "X"),
+ (0x1032D, "V"),
+ (0x1034B, "X"),
+ (0x10350, "V"),
+ (0x1037B, "X"),
+ (0x10380, "V"),
+ (0x1039E, "X"),
+ (0x1039F, "V"),
+ (0x103C4, "X"),
+ (0x103C8, "V"),
+ (0x103D6, "X"),
+ (0x10400, "M", "𐐨"),
+ (0x10401, "M", "𐐩"),
+ (0x10402, "M", "𐐪"),
+ (0x10403, "M", "𐐫"),
+ (0x10404, "M", "𐐬"),
+ (0x10405, "M", "𐐭"),
+ (0x10406, "M", "𐐮"),
+ (0x10407, "M", "𐐯"),
+ (0x10408, "M", "𐐰"),
+ (0x10409, "M", "𐐱"),
+ (0x1040A, "M", "𐐲"),
+ (0x1040B, "M", "𐐳"),
+ (0x1040C, "M", "𐐴"),
+ (0x1040D, "M", "𐐵"),
+ (0x1040E, "M", "𐐶"),
+ (0x1040F, "M", "𐐷"),
+ (0x10410, "M", "𐐸"),
+ (0x10411, "M", "𐐹"),
+ (0x10412, "M", "𐐺"),
+ (0x10413, "M", "𐐻"),
+ (0x10414, "M", "𐐼"),
+ (0x10415, "M", "𐐽"),
+ (0x10416, "M", "𐐾"),
+ (0x10417, "M", "𐐿"),
+ (0x10418, "M", "𐑀"),
+ (0x10419, "M", "𐑁"),
+ (0x1041A, "M", "𐑂"),
+ (0x1041B, "M", "𐑃"),
+ (0x1041C, "M", "𐑄"),
+ (0x1041D, "M", "𐑅"),
+ (0x1041E, "M", "𐑆"),
+ (0x1041F, "M", "𐑇"),
+ (0x10420, "M", "𐑈"),
+ (0x10421, "M", "𐑉"),
+ (0x10422, "M", "𐑊"),
+ (0x10423, "M", "𐑋"),
+ (0x10424, "M", "𐑌"),
+ (0x10425, "M", "𐑍"),
+ (0x10426, "M", "𐑎"),
+ (0x10427, "M", "𐑏"),
+ (0x10428, "V"),
+ (0x1049E, "X"),
+ (0x104A0, "V"),
+ (0x104AA, "X"),
+ (0x104B0, "M", "𐓘"),
+ (0x104B1, "M", "𐓙"),
+ (0x104B2, "M", "𐓚"),
+ (0x104B3, "M", "𐓛"),
+ (0x104B4, "M", "𐓜"),
+ (0x104B5, "M", "𐓝"),
+ (0x104B6, "M", "𐓞"),
+ (0x104B7, "M", "𐓟"),
+ (0x104B8, "M", "𐓠"),
+ (0x104B9, "M", "𐓡"),
]
+
def _seg_54() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x104B6, 'M', '𐓞'),
- (0x104B7, 'M', '𐓟'),
- (0x104B8, 'M', '𐓠'),
- (0x104B9, 'M', '𐓡'),
- (0x104BA, 'M', '𐓢'),
- (0x104BB, 'M', '𐓣'),
- (0x104BC, 'M', '𐓤'),
- (0x104BD, 'M', '𐓥'),
- (0x104BE, 'M', '𐓦'),
- (0x104BF, 'M', '𐓧'),
- (0x104C0, 'M', '𐓨'),
- (0x104C1, 'M', '𐓩'),
- (0x104C2, 'M', '𐓪'),
- (0x104C3, 'M', '𐓫'),
- (0x104C4, 'M', '𐓬'),
- (0x104C5, 'M', '𐓭'),
- (0x104C6, 'M', '𐓮'),
- (0x104C7, 'M', '𐓯'),
- (0x104C8, 'M', '𐓰'),
- (0x104C9, 'M', '𐓱'),
- (0x104CA, 'M', '𐓲'),
- (0x104CB, 'M', '𐓳'),
- (0x104CC, 'M', '𐓴'),
- (0x104CD, 'M', '𐓵'),
- (0x104CE, 'M', '𐓶'),
- (0x104CF, 'M', '𐓷'),
- (0x104D0, 'M', '𐓸'),
- (0x104D1, 'M', '𐓹'),
- (0x104D2, 'M', '𐓺'),
- (0x104D3, 'M', '𐓻'),
- (0x104D4, 'X'),
- (0x104D8, 'V'),
- (0x104FC, 'X'),
- (0x10500, 'V'),
- (0x10528, 'X'),
- (0x10530, 'V'),
- (0x10564, 'X'),
- (0x1056F, 'V'),
- (0x10570, 'M', '𐖗'),
- (0x10571, 'M', '𐖘'),
- (0x10572, 'M', '𐖙'),
- (0x10573, 'M', '𐖚'),
- (0x10574, 'M', '𐖛'),
- (0x10575, 'M', '𐖜'),
- (0x10576, 'M', '𐖝'),
- (0x10577, 'M', '𐖞'),
- (0x10578, 'M', '𐖟'),
- (0x10579, 'M', '𐖠'),
- (0x1057A, 'M', '𐖡'),
- (0x1057B, 'X'),
- (0x1057C, 'M', '𐖣'),
- (0x1057D, 'M', '𐖤'),
- (0x1057E, 'M', '𐖥'),
- (0x1057F, 'M', '𐖦'),
- (0x10580, 'M', '𐖧'),
- (0x10581, 'M', '𐖨'),
- (0x10582, 'M', '𐖩'),
- (0x10583, 'M', '𐖪'),
- (0x10584, 'M', '𐖫'),
- (0x10585, 'M', '𐖬'),
- (0x10586, 'M', '𐖭'),
- (0x10587, 'M', '𐖮'),
- (0x10588, 'M', '𐖯'),
- (0x10589, 'M', '𐖰'),
- (0x1058A, 'M', '𐖱'),
- (0x1058B, 'X'),
- (0x1058C, 'M', '𐖳'),
- (0x1058D, 'M', '𐖴'),
- (0x1058E, 'M', '𐖵'),
- (0x1058F, 'M', '𐖶'),
- (0x10590, 'M', '𐖷'),
- (0x10591, 'M', '𐖸'),
- (0x10592, 'M', '𐖹'),
- (0x10593, 'X'),
- (0x10594, 'M', '𐖻'),
- (0x10595, 'M', '𐖼'),
- (0x10596, 'X'),
- (0x10597, 'V'),
- (0x105A2, 'X'),
- (0x105A3, 'V'),
- (0x105B2, 'X'),
- (0x105B3, 'V'),
- (0x105BA, 'X'),
- (0x105BB, 'V'),
- (0x105BD, 'X'),
- (0x10600, 'V'),
- (0x10737, 'X'),
- (0x10740, 'V'),
- (0x10756, 'X'),
- (0x10760, 'V'),
- (0x10768, 'X'),
- (0x10780, 'V'),
- (0x10781, 'M', 'ː'),
- (0x10782, 'M', 'ˑ'),
- (0x10783, 'M', 'æ'),
- (0x10784, 'M', 'ʙ'),
- (0x10785, 'M', 'ɓ'),
- (0x10786, 'X'),
- (0x10787, 'M', 'ʣ'),
- (0x10788, 'M', 'ꭦ'),
+ (0x104BA, "M", "𐓢"),
+ (0x104BB, "M", "𐓣"),
+ (0x104BC, "M", "𐓤"),
+ (0x104BD, "M", "𐓥"),
+ (0x104BE, "M", "𐓦"),
+ (0x104BF, "M", "𐓧"),
+ (0x104C0, "M", "𐓨"),
+ (0x104C1, "M", "𐓩"),
+ (0x104C2, "M", "𐓪"),
+ (0x104C3, "M", "𐓫"),
+ (0x104C4, "M", "𐓬"),
+ (0x104C5, "M", "𐓭"),
+ (0x104C6, "M", "𐓮"),
+ (0x104C7, "M", "𐓯"),
+ (0x104C8, "M", "𐓰"),
+ (0x104C9, "M", "𐓱"),
+ (0x104CA, "M", "𐓲"),
+ (0x104CB, "M", "𐓳"),
+ (0x104CC, "M", "𐓴"),
+ (0x104CD, "M", "𐓵"),
+ (0x104CE, "M", "𐓶"),
+ (0x104CF, "M", "𐓷"),
+ (0x104D0, "M", "𐓸"),
+ (0x104D1, "M", "𐓹"),
+ (0x104D2, "M", "𐓺"),
+ (0x104D3, "M", "𐓻"),
+ (0x104D4, "X"),
+ (0x104D8, "V"),
+ (0x104FC, "X"),
+ (0x10500, "V"),
+ (0x10528, "X"),
+ (0x10530, "V"),
+ (0x10564, "X"),
+ (0x1056F, "V"),
+ (0x10570, "M", "𐖗"),
+ (0x10571, "M", "𐖘"),
+ (0x10572, "M", "𐖙"),
+ (0x10573, "M", "𐖚"),
+ (0x10574, "M", "𐖛"),
+ (0x10575, "M", "𐖜"),
+ (0x10576, "M", "𐖝"),
+ (0x10577, "M", "𐖞"),
+ (0x10578, "M", "𐖟"),
+ (0x10579, "M", "𐖠"),
+ (0x1057A, "M", "𐖡"),
+ (0x1057B, "X"),
+ (0x1057C, "M", "𐖣"),
+ (0x1057D, "M", "𐖤"),
+ (0x1057E, "M", "𐖥"),
+ (0x1057F, "M", "𐖦"),
+ (0x10580, "M", "𐖧"),
+ (0x10581, "M", "𐖨"),
+ (0x10582, "M", "𐖩"),
+ (0x10583, "M", "𐖪"),
+ (0x10584, "M", "𐖫"),
+ (0x10585, "M", "𐖬"),
+ (0x10586, "M", "𐖭"),
+ (0x10587, "M", "𐖮"),
+ (0x10588, "M", "𐖯"),
+ (0x10589, "M", "𐖰"),
+ (0x1058A, "M", "𐖱"),
+ (0x1058B, "X"),
+ (0x1058C, "M", "𐖳"),
+ (0x1058D, "M", "𐖴"),
+ (0x1058E, "M", "𐖵"),
+ (0x1058F, "M", "𐖶"),
+ (0x10590, "M", "𐖷"),
+ (0x10591, "M", "𐖸"),
+ (0x10592, "M", "𐖹"),
+ (0x10593, "X"),
+ (0x10594, "M", "𐖻"),
+ (0x10595, "M", "𐖼"),
+ (0x10596, "X"),
+ (0x10597, "V"),
+ (0x105A2, "X"),
+ (0x105A3, "V"),
+ (0x105B2, "X"),
+ (0x105B3, "V"),
+ (0x105BA, "X"),
+ (0x105BB, "V"),
+ (0x105BD, "X"),
+ (0x10600, "V"),
+ (0x10737, "X"),
+ (0x10740, "V"),
+ (0x10756, "X"),
+ (0x10760, "V"),
+ (0x10768, "X"),
+ (0x10780, "V"),
+ (0x10781, "M", "ː"),
+ (0x10782, "M", "ˑ"),
+ (0x10783, "M", "æ"),
+ (0x10784, "M", "ʙ"),
+ (0x10785, "M", "ɓ"),
+ (0x10786, "X"),
+ (0x10787, "M", "ʣ"),
+ (0x10788, "M", "ꭦ"),
+ (0x10789, "M", "ʥ"),
+ (0x1078A, "M", "ʤ"),
+ (0x1078B, "M", "ɖ"),
+ (0x1078C, "M", "ɗ"),
]
+
def _seg_55() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x10789, 'M', 'ʥ'),
- (0x1078A, 'M', 'ʤ'),
- (0x1078B, 'M', 'ɖ'),
- (0x1078C, 'M', 'ɗ'),
- (0x1078D, 'M', 'ᶑ'),
- (0x1078E, 'M', 'ɘ'),
- (0x1078F, 'M', 'ɞ'),
- (0x10790, 'M', 'ʩ'),
- (0x10791, 'M', 'ɤ'),
- (0x10792, 'M', 'ɢ'),
- (0x10793, 'M', 'ɠ'),
- (0x10794, 'M', 'ʛ'),
- (0x10795, 'M', 'ħ'),
- (0x10796, 'M', 'ʜ'),
- (0x10797, 'M', 'ɧ'),
- (0x10798, 'M', 'ʄ'),
- (0x10799, 'M', 'ʪ'),
- (0x1079A, 'M', 'ʫ'),
- (0x1079B, 'M', 'ɬ'),
- (0x1079C, 'M', '𝼄'),
- (0x1079D, 'M', 'ꞎ'),
- (0x1079E, 'M', 'ɮ'),
- (0x1079F, 'M', '𝼅'),
- (0x107A0, 'M', 'ʎ'),
- (0x107A1, 'M', '𝼆'),
- (0x107A2, 'M', 'ø'),
- (0x107A3, 'M', 'ɶ'),
- (0x107A4, 'M', 'ɷ'),
- (0x107A5, 'M', 'q'),
- (0x107A6, 'M', 'ɺ'),
- (0x107A7, 'M', '𝼈'),
- (0x107A8, 'M', 'ɽ'),
- (0x107A9, 'M', 'ɾ'),
- (0x107AA, 'M', 'ʀ'),
- (0x107AB, 'M', 'ʨ'),
- (0x107AC, 'M', 'ʦ'),
- (0x107AD, 'M', 'ꭧ'),
- (0x107AE, 'M', 'ʧ'),
- (0x107AF, 'M', 'ʈ'),
- (0x107B0, 'M', 'ⱱ'),
- (0x107B1, 'X'),
- (0x107B2, 'M', 'ʏ'),
- (0x107B3, 'M', 'ʡ'),
- (0x107B4, 'M', 'ʢ'),
- (0x107B5, 'M', 'ʘ'),
- (0x107B6, 'M', 'ǀ'),
- (0x107B7, 'M', 'ǁ'),
- (0x107B8, 'M', 'ǂ'),
- (0x107B9, 'M', '𝼊'),
- (0x107BA, 'M', '𝼞'),
- (0x107BB, 'X'),
- (0x10800, 'V'),
- (0x10806, 'X'),
- (0x10808, 'V'),
- (0x10809, 'X'),
- (0x1080A, 'V'),
- (0x10836, 'X'),
- (0x10837, 'V'),
- (0x10839, 'X'),
- (0x1083C, 'V'),
- (0x1083D, 'X'),
- (0x1083F, 'V'),
- (0x10856, 'X'),
- (0x10857, 'V'),
- (0x1089F, 'X'),
- (0x108A7, 'V'),
- (0x108B0, 'X'),
- (0x108E0, 'V'),
- (0x108F3, 'X'),
- (0x108F4, 'V'),
- (0x108F6, 'X'),
- (0x108FB, 'V'),
- (0x1091C, 'X'),
- (0x1091F, 'V'),
- (0x1093A, 'X'),
- (0x1093F, 'V'),
- (0x10940, 'X'),
- (0x10980, 'V'),
- (0x109B8, 'X'),
- (0x109BC, 'V'),
- (0x109D0, 'X'),
- (0x109D2, 'V'),
- (0x10A04, 'X'),
- (0x10A05, 'V'),
- (0x10A07, 'X'),
- (0x10A0C, 'V'),
- (0x10A14, 'X'),
- (0x10A15, 'V'),
- (0x10A18, 'X'),
- (0x10A19, 'V'),
- (0x10A36, 'X'),
- (0x10A38, 'V'),
- (0x10A3B, 'X'),
- (0x10A3F, 'V'),
- (0x10A49, 'X'),
- (0x10A50, 'V'),
- (0x10A59, 'X'),
- (0x10A60, 'V'),
- (0x10AA0, 'X'),
- (0x10AC0, 'V'),
+ (0x1078D, "M", "ᶑ"),
+ (0x1078E, "M", "ɘ"),
+ (0x1078F, "M", "ɞ"),
+ (0x10790, "M", "ʩ"),
+ (0x10791, "M", "ɤ"),
+ (0x10792, "M", "ɢ"),
+ (0x10793, "M", "ɠ"),
+ (0x10794, "M", "ʛ"),
+ (0x10795, "M", "ħ"),
+ (0x10796, "M", "ʜ"),
+ (0x10797, "M", "ɧ"),
+ (0x10798, "M", "ʄ"),
+ (0x10799, "M", "ʪ"),
+ (0x1079A, "M", "ʫ"),
+ (0x1079B, "M", "ɬ"),
+ (0x1079C, "M", "𝼄"),
+ (0x1079D, "M", "ꞎ"),
+ (0x1079E, "M", "ɮ"),
+ (0x1079F, "M", "𝼅"),
+ (0x107A0, "M", "ʎ"),
+ (0x107A1, "M", "𝼆"),
+ (0x107A2, "M", "ø"),
+ (0x107A3, "M", "ɶ"),
+ (0x107A4, "M", "ɷ"),
+ (0x107A5, "M", "q"),
+ (0x107A6, "M", "ɺ"),
+ (0x107A7, "M", "𝼈"),
+ (0x107A8, "M", "ɽ"),
+ (0x107A9, "M", "ɾ"),
+ (0x107AA, "M", "ʀ"),
+ (0x107AB, "M", "ʨ"),
+ (0x107AC, "M", "ʦ"),
+ (0x107AD, "M", "ꭧ"),
+ (0x107AE, "M", "ʧ"),
+ (0x107AF, "M", "ʈ"),
+ (0x107B0, "M", "ⱱ"),
+ (0x107B1, "X"),
+ (0x107B2, "M", "ʏ"),
+ (0x107B3, "M", "ʡ"),
+ (0x107B4, "M", "ʢ"),
+ (0x107B5, "M", "ʘ"),
+ (0x107B6, "M", "ǀ"),
+ (0x107B7, "M", "ǁ"),
+ (0x107B8, "M", "ǂ"),
+ (0x107B9, "M", "𝼊"),
+ (0x107BA, "M", "𝼞"),
+ (0x107BB, "X"),
+ (0x10800, "V"),
+ (0x10806, "X"),
+ (0x10808, "V"),
+ (0x10809, "X"),
+ (0x1080A, "V"),
+ (0x10836, "X"),
+ (0x10837, "V"),
+ (0x10839, "X"),
+ (0x1083C, "V"),
+ (0x1083D, "X"),
+ (0x1083F, "V"),
+ (0x10856, "X"),
+ (0x10857, "V"),
+ (0x1089F, "X"),
+ (0x108A7, "V"),
+ (0x108B0, "X"),
+ (0x108E0, "V"),
+ (0x108F3, "X"),
+ (0x108F4, "V"),
+ (0x108F6, "X"),
+ (0x108FB, "V"),
+ (0x1091C, "X"),
+ (0x1091F, "V"),
+ (0x1093A, "X"),
+ (0x1093F, "V"),
+ (0x10940, "X"),
+ (0x10980, "V"),
+ (0x109B8, "X"),
+ (0x109BC, "V"),
+ (0x109D0, "X"),
+ (0x109D2, "V"),
+ (0x10A04, "X"),
+ (0x10A05, "V"),
+ (0x10A07, "X"),
+ (0x10A0C, "V"),
+ (0x10A14, "X"),
+ (0x10A15, "V"),
+ (0x10A18, "X"),
+ (0x10A19, "V"),
+ (0x10A36, "X"),
+ (0x10A38, "V"),
+ (0x10A3B, "X"),
+ (0x10A3F, "V"),
+ (0x10A49, "X"),
+ (0x10A50, "V"),
+ (0x10A59, "X"),
+ (0x10A60, "V"),
+ (0x10AA0, "X"),
+ (0x10AC0, "V"),
+ (0x10AE7, "X"),
+ (0x10AEB, "V"),
+ (0x10AF7, "X"),
+ (0x10B00, "V"),
]
+
def _seg_56() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x10AE7, 'X'),
- (0x10AEB, 'V'),
- (0x10AF7, 'X'),
- (0x10B00, 'V'),
- (0x10B36, 'X'),
- (0x10B39, 'V'),
- (0x10B56, 'X'),
- (0x10B58, 'V'),
- (0x10B73, 'X'),
- (0x10B78, 'V'),
- (0x10B92, 'X'),
- (0x10B99, 'V'),
- (0x10B9D, 'X'),
- (0x10BA9, 'V'),
- (0x10BB0, 'X'),
- (0x10C00, 'V'),
- (0x10C49, 'X'),
- (0x10C80, 'M', '𐳀'),
- (0x10C81, 'M', '𐳁'),
- (0x10C82, 'M', '𐳂'),
- (0x10C83, 'M', '𐳃'),
- (0x10C84, 'M', '𐳄'),
- (0x10C85, 'M', '𐳅'),
- (0x10C86, 'M', '𐳆'),
- (0x10C87, 'M', '𐳇'),
- (0x10C88, 'M', '𐳈'),
- (0x10C89, 'M', '𐳉'),
- (0x10C8A, 'M', '𐳊'),
- (0x10C8B, 'M', '𐳋'),
- (0x10C8C, 'M', '𐳌'),
- (0x10C8D, 'M', '𐳍'),
- (0x10C8E, 'M', '𐳎'),
- (0x10C8F, 'M', '𐳏'),
- (0x10C90, 'M', '𐳐'),
- (0x10C91, 'M', '𐳑'),
- (0x10C92, 'M', '𐳒'),
- (0x10C93, 'M', '𐳓'),
- (0x10C94, 'M', '𐳔'),
- (0x10C95, 'M', '𐳕'),
- (0x10C96, 'M', '𐳖'),
- (0x10C97, 'M', '𐳗'),
- (0x10C98, 'M', '𐳘'),
- (0x10C99, 'M', '𐳙'),
- (0x10C9A, 'M', '𐳚'),
- (0x10C9B, 'M', '𐳛'),
- (0x10C9C, 'M', '𐳜'),
- (0x10C9D, 'M', '𐳝'),
- (0x10C9E, 'M', '𐳞'),
- (0x10C9F, 'M', '𐳟'),
- (0x10CA0, 'M', '𐳠'),
- (0x10CA1, 'M', '𐳡'),
- (0x10CA2, 'M', '𐳢'),
- (0x10CA3, 'M', '𐳣'),
- (0x10CA4, 'M', '𐳤'),
- (0x10CA5, 'M', '𐳥'),
- (0x10CA6, 'M', '𐳦'),
- (0x10CA7, 'M', '𐳧'),
- (0x10CA8, 'M', '𐳨'),
- (0x10CA9, 'M', '𐳩'),
- (0x10CAA, 'M', '𐳪'),
- (0x10CAB, 'M', '𐳫'),
- (0x10CAC, 'M', '𐳬'),
- (0x10CAD, 'M', '𐳭'),
- (0x10CAE, 'M', '𐳮'),
- (0x10CAF, 'M', '𐳯'),
- (0x10CB0, 'M', '𐳰'),
- (0x10CB1, 'M', '𐳱'),
- (0x10CB2, 'M', '𐳲'),
- (0x10CB3, 'X'),
- (0x10CC0, 'V'),
- (0x10CF3, 'X'),
- (0x10CFA, 'V'),
- (0x10D28, 'X'),
- (0x10D30, 'V'),
- (0x10D3A, 'X'),
- (0x10E60, 'V'),
- (0x10E7F, 'X'),
- (0x10E80, 'V'),
- (0x10EAA, 'X'),
- (0x10EAB, 'V'),
- (0x10EAE, 'X'),
- (0x10EB0, 'V'),
- (0x10EB2, 'X'),
- (0x10EFD, 'V'),
- (0x10F28, 'X'),
- (0x10F30, 'V'),
- (0x10F5A, 'X'),
- (0x10F70, 'V'),
- (0x10F8A, 'X'),
- (0x10FB0, 'V'),
- (0x10FCC, 'X'),
- (0x10FE0, 'V'),
- (0x10FF7, 'X'),
- (0x11000, 'V'),
- (0x1104E, 'X'),
- (0x11052, 'V'),
- (0x11076, 'X'),
- (0x1107F, 'V'),
- (0x110BD, 'X'),
- (0x110BE, 'V'),
+ (0x10B36, "X"),
+ (0x10B39, "V"),
+ (0x10B56, "X"),
+ (0x10B58, "V"),
+ (0x10B73, "X"),
+ (0x10B78, "V"),
+ (0x10B92, "X"),
+ (0x10B99, "V"),
+ (0x10B9D, "X"),
+ (0x10BA9, "V"),
+ (0x10BB0, "X"),
+ (0x10C00, "V"),
+ (0x10C49, "X"),
+ (0x10C80, "M", "𐳀"),
+ (0x10C81, "M", "𐳁"),
+ (0x10C82, "M", "𐳂"),
+ (0x10C83, "M", "𐳃"),
+ (0x10C84, "M", "𐳄"),
+ (0x10C85, "M", "𐳅"),
+ (0x10C86, "M", "𐳆"),
+ (0x10C87, "M", "𐳇"),
+ (0x10C88, "M", "𐳈"),
+ (0x10C89, "M", "𐳉"),
+ (0x10C8A, "M", "𐳊"),
+ (0x10C8B, "M", "𐳋"),
+ (0x10C8C, "M", "𐳌"),
+ (0x10C8D, "M", "𐳍"),
+ (0x10C8E, "M", "𐳎"),
+ (0x10C8F, "M", "𐳏"),
+ (0x10C90, "M", "𐳐"),
+ (0x10C91, "M", "𐳑"),
+ (0x10C92, "M", "𐳒"),
+ (0x10C93, "M", "𐳓"),
+ (0x10C94, "M", "𐳔"),
+ (0x10C95, "M", "𐳕"),
+ (0x10C96, "M", "𐳖"),
+ (0x10C97, "M", "𐳗"),
+ (0x10C98, "M", "𐳘"),
+ (0x10C99, "M", "𐳙"),
+ (0x10C9A, "M", "𐳚"),
+ (0x10C9B, "M", "𐳛"),
+ (0x10C9C, "M", "𐳜"),
+ (0x10C9D, "M", "𐳝"),
+ (0x10C9E, "M", "𐳞"),
+ (0x10C9F, "M", "𐳟"),
+ (0x10CA0, "M", "𐳠"),
+ (0x10CA1, "M", "𐳡"),
+ (0x10CA2, "M", "𐳢"),
+ (0x10CA3, "M", "𐳣"),
+ (0x10CA4, "M", "𐳤"),
+ (0x10CA5, "M", "𐳥"),
+ (0x10CA6, "M", "𐳦"),
+ (0x10CA7, "M", "𐳧"),
+ (0x10CA8, "M", "𐳨"),
+ (0x10CA9, "M", "𐳩"),
+ (0x10CAA, "M", "𐳪"),
+ (0x10CAB, "M", "𐳫"),
+ (0x10CAC, "M", "𐳬"),
+ (0x10CAD, "M", "𐳭"),
+ (0x10CAE, "M", "𐳮"),
+ (0x10CAF, "M", "𐳯"),
+ (0x10CB0, "M", "𐳰"),
+ (0x10CB1, "M", "𐳱"),
+ (0x10CB2, "M", "𐳲"),
+ (0x10CB3, "X"),
+ (0x10CC0, "V"),
+ (0x10CF3, "X"),
+ (0x10CFA, "V"),
+ (0x10D28, "X"),
+ (0x10D30, "V"),
+ (0x10D3A, "X"),
+ (0x10E60, "V"),
+ (0x10E7F, "X"),
+ (0x10E80, "V"),
+ (0x10EAA, "X"),
+ (0x10EAB, "V"),
+ (0x10EAE, "X"),
+ (0x10EB0, "V"),
+ (0x10EB2, "X"),
+ (0x10EFD, "V"),
+ (0x10F28, "X"),
+ (0x10F30, "V"),
+ (0x10F5A, "X"),
+ (0x10F70, "V"),
+ (0x10F8A, "X"),
+ (0x10FB0, "V"),
+ (0x10FCC, "X"),
+ (0x10FE0, "V"),
+ (0x10FF7, "X"),
+ (0x11000, "V"),
+ (0x1104E, "X"),
+ (0x11052, "V"),
+ (0x11076, "X"),
+ (0x1107F, "V"),
+ (0x110BD, "X"),
+ (0x110BE, "V"),
+ (0x110C3, "X"),
+ (0x110D0, "V"),
+ (0x110E9, "X"),
+ (0x110F0, "V"),
]
+
def _seg_57() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x110C3, 'X'),
- (0x110D0, 'V'),
- (0x110E9, 'X'),
- (0x110F0, 'V'),
- (0x110FA, 'X'),
- (0x11100, 'V'),
- (0x11135, 'X'),
- (0x11136, 'V'),
- (0x11148, 'X'),
- (0x11150, 'V'),
- (0x11177, 'X'),
- (0x11180, 'V'),
- (0x111E0, 'X'),
- (0x111E1, 'V'),
- (0x111F5, 'X'),
- (0x11200, 'V'),
- (0x11212, 'X'),
- (0x11213, 'V'),
- (0x11242, 'X'),
- (0x11280, 'V'),
- (0x11287, 'X'),
- (0x11288, 'V'),
- (0x11289, 'X'),
- (0x1128A, 'V'),
- (0x1128E, 'X'),
- (0x1128F, 'V'),
- (0x1129E, 'X'),
- (0x1129F, 'V'),
- (0x112AA, 'X'),
- (0x112B0, 'V'),
- (0x112EB, 'X'),
- (0x112F0, 'V'),
- (0x112FA, 'X'),
- (0x11300, 'V'),
- (0x11304, 'X'),
- (0x11305, 'V'),
- (0x1130D, 'X'),
- (0x1130F, 'V'),
- (0x11311, 'X'),
- (0x11313, 'V'),
- (0x11329, 'X'),
- (0x1132A, 'V'),
- (0x11331, 'X'),
- (0x11332, 'V'),
- (0x11334, 'X'),
- (0x11335, 'V'),
- (0x1133A, 'X'),
- (0x1133B, 'V'),
- (0x11345, 'X'),
- (0x11347, 'V'),
- (0x11349, 'X'),
- (0x1134B, 'V'),
- (0x1134E, 'X'),
- (0x11350, 'V'),
- (0x11351, 'X'),
- (0x11357, 'V'),
- (0x11358, 'X'),
- (0x1135D, 'V'),
- (0x11364, 'X'),
- (0x11366, 'V'),
- (0x1136D, 'X'),
- (0x11370, 'V'),
- (0x11375, 'X'),
- (0x11400, 'V'),
- (0x1145C, 'X'),
- (0x1145D, 'V'),
- (0x11462, 'X'),
- (0x11480, 'V'),
- (0x114C8, 'X'),
- (0x114D0, 'V'),
- (0x114DA, 'X'),
- (0x11580, 'V'),
- (0x115B6, 'X'),
- (0x115B8, 'V'),
- (0x115DE, 'X'),
- (0x11600, 'V'),
- (0x11645, 'X'),
- (0x11650, 'V'),
- (0x1165A, 'X'),
- (0x11660, 'V'),
- (0x1166D, 'X'),
- (0x11680, 'V'),
- (0x116BA, 'X'),
- (0x116C0, 'V'),
- (0x116CA, 'X'),
- (0x11700, 'V'),
- (0x1171B, 'X'),
- (0x1171D, 'V'),
- (0x1172C, 'X'),
- (0x11730, 'V'),
- (0x11747, 'X'),
- (0x11800, 'V'),
- (0x1183C, 'X'),
- (0x118A0, 'M', '𑣀'),
- (0x118A1, 'M', '𑣁'),
- (0x118A2, 'M', '𑣂'),
- (0x118A3, 'M', '𑣃'),
- (0x118A4, 'M', '𑣄'),
- (0x118A5, 'M', '𑣅'),
- (0x118A6, 'M', '𑣆'),
+ (0x110FA, "X"),
+ (0x11100, "V"),
+ (0x11135, "X"),
+ (0x11136, "V"),
+ (0x11148, "X"),
+ (0x11150, "V"),
+ (0x11177, "X"),
+ (0x11180, "V"),
+ (0x111E0, "X"),
+ (0x111E1, "V"),
+ (0x111F5, "X"),
+ (0x11200, "V"),
+ (0x11212, "X"),
+ (0x11213, "V"),
+ (0x11242, "X"),
+ (0x11280, "V"),
+ (0x11287, "X"),
+ (0x11288, "V"),
+ (0x11289, "X"),
+ (0x1128A, "V"),
+ (0x1128E, "X"),
+ (0x1128F, "V"),
+ (0x1129E, "X"),
+ (0x1129F, "V"),
+ (0x112AA, "X"),
+ (0x112B0, "V"),
+ (0x112EB, "X"),
+ (0x112F0, "V"),
+ (0x112FA, "X"),
+ (0x11300, "V"),
+ (0x11304, "X"),
+ (0x11305, "V"),
+ (0x1130D, "X"),
+ (0x1130F, "V"),
+ (0x11311, "X"),
+ (0x11313, "V"),
+ (0x11329, "X"),
+ (0x1132A, "V"),
+ (0x11331, "X"),
+ (0x11332, "V"),
+ (0x11334, "X"),
+ (0x11335, "V"),
+ (0x1133A, "X"),
+ (0x1133B, "V"),
+ (0x11345, "X"),
+ (0x11347, "V"),
+ (0x11349, "X"),
+ (0x1134B, "V"),
+ (0x1134E, "X"),
+ (0x11350, "V"),
+ (0x11351, "X"),
+ (0x11357, "V"),
+ (0x11358, "X"),
+ (0x1135D, "V"),
+ (0x11364, "X"),
+ (0x11366, "V"),
+ (0x1136D, "X"),
+ (0x11370, "V"),
+ (0x11375, "X"),
+ (0x11400, "V"),
+ (0x1145C, "X"),
+ (0x1145D, "V"),
+ (0x11462, "X"),
+ (0x11480, "V"),
+ (0x114C8, "X"),
+ (0x114D0, "V"),
+ (0x114DA, "X"),
+ (0x11580, "V"),
+ (0x115B6, "X"),
+ (0x115B8, "V"),
+ (0x115DE, "X"),
+ (0x11600, "V"),
+ (0x11645, "X"),
+ (0x11650, "V"),
+ (0x1165A, "X"),
+ (0x11660, "V"),
+ (0x1166D, "X"),
+ (0x11680, "V"),
+ (0x116BA, "X"),
+ (0x116C0, "V"),
+ (0x116CA, "X"),
+ (0x11700, "V"),
+ (0x1171B, "X"),
+ (0x1171D, "V"),
+ (0x1172C, "X"),
+ (0x11730, "V"),
+ (0x11747, "X"),
+ (0x11800, "V"),
+ (0x1183C, "X"),
+ (0x118A0, "M", "𑣀"),
+ (0x118A1, "M", "𑣁"),
+ (0x118A2, "M", "𑣂"),
+ (0x118A3, "M", "𑣃"),
+ (0x118A4, "M", "𑣄"),
+ (0x118A5, "M", "𑣅"),
+ (0x118A6, "M", "𑣆"),
+ (0x118A7, "M", "𑣇"),
+ (0x118A8, "M", "𑣈"),
+ (0x118A9, "M", "𑣉"),
+ (0x118AA, "M", "𑣊"),
]
+
def _seg_58() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x118A7, 'M', '𑣇'),
- (0x118A8, 'M', '𑣈'),
- (0x118A9, 'M', '𑣉'),
- (0x118AA, 'M', '𑣊'),
- (0x118AB, 'M', '𑣋'),
- (0x118AC, 'M', '𑣌'),
- (0x118AD, 'M', '𑣍'),
- (0x118AE, 'M', '𑣎'),
- (0x118AF, 'M', '𑣏'),
- (0x118B0, 'M', '𑣐'),
- (0x118B1, 'M', '𑣑'),
- (0x118B2, 'M', '𑣒'),
- (0x118B3, 'M', '𑣓'),
- (0x118B4, 'M', '𑣔'),
- (0x118B5, 'M', '𑣕'),
- (0x118B6, 'M', '𑣖'),
- (0x118B7, 'M', '𑣗'),
- (0x118B8, 'M', '𑣘'),
- (0x118B9, 'M', '𑣙'),
- (0x118BA, 'M', '𑣚'),
- (0x118BB, 'M', '𑣛'),
- (0x118BC, 'M', '𑣜'),
- (0x118BD, 'M', '𑣝'),
- (0x118BE, 'M', '𑣞'),
- (0x118BF, 'M', '𑣟'),
- (0x118C0, 'V'),
- (0x118F3, 'X'),
- (0x118FF, 'V'),
- (0x11907, 'X'),
- (0x11909, 'V'),
- (0x1190A, 'X'),
- (0x1190C, 'V'),
- (0x11914, 'X'),
- (0x11915, 'V'),
- (0x11917, 'X'),
- (0x11918, 'V'),
- (0x11936, 'X'),
- (0x11937, 'V'),
- (0x11939, 'X'),
- (0x1193B, 'V'),
- (0x11947, 'X'),
- (0x11950, 'V'),
- (0x1195A, 'X'),
- (0x119A0, 'V'),
- (0x119A8, 'X'),
- (0x119AA, 'V'),
- (0x119D8, 'X'),
- (0x119DA, 'V'),
- (0x119E5, 'X'),
- (0x11A00, 'V'),
- (0x11A48, 'X'),
- (0x11A50, 'V'),
- (0x11AA3, 'X'),
- (0x11AB0, 'V'),
- (0x11AF9, 'X'),
- (0x11B00, 'V'),
- (0x11B0A, 'X'),
- (0x11C00, 'V'),
- (0x11C09, 'X'),
- (0x11C0A, 'V'),
- (0x11C37, 'X'),
- (0x11C38, 'V'),
- (0x11C46, 'X'),
- (0x11C50, 'V'),
- (0x11C6D, 'X'),
- (0x11C70, 'V'),
- (0x11C90, 'X'),
- (0x11C92, 'V'),
- (0x11CA8, 'X'),
- (0x11CA9, 'V'),
- (0x11CB7, 'X'),
- (0x11D00, 'V'),
- (0x11D07, 'X'),
- (0x11D08, 'V'),
- (0x11D0A, 'X'),
- (0x11D0B, 'V'),
- (0x11D37, 'X'),
- (0x11D3A, 'V'),
- (0x11D3B, 'X'),
- (0x11D3C, 'V'),
- (0x11D3E, 'X'),
- (0x11D3F, 'V'),
- (0x11D48, 'X'),
- (0x11D50, 'V'),
- (0x11D5A, 'X'),
- (0x11D60, 'V'),
- (0x11D66, 'X'),
- (0x11D67, 'V'),
- (0x11D69, 'X'),
- (0x11D6A, 'V'),
- (0x11D8F, 'X'),
- (0x11D90, 'V'),
- (0x11D92, 'X'),
- (0x11D93, 'V'),
- (0x11D99, 'X'),
- (0x11DA0, 'V'),
- (0x11DAA, 'X'),
- (0x11EE0, 'V'),
- (0x11EF9, 'X'),
- (0x11F00, 'V'),
+ (0x118AB, "M", "𑣋"),
+ (0x118AC, "M", "𑣌"),
+ (0x118AD, "M", "𑣍"),
+ (0x118AE, "M", "𑣎"),
+ (0x118AF, "M", "𑣏"),
+ (0x118B0, "M", "𑣐"),
+ (0x118B1, "M", "𑣑"),
+ (0x118B2, "M", "𑣒"),
+ (0x118B3, "M", "𑣓"),
+ (0x118B4, "M", "𑣔"),
+ (0x118B5, "M", "𑣕"),
+ (0x118B6, "M", "𑣖"),
+ (0x118B7, "M", "𑣗"),
+ (0x118B8, "M", "𑣘"),
+ (0x118B9, "M", "𑣙"),
+ (0x118BA, "M", "𑣚"),
+ (0x118BB, "M", "𑣛"),
+ (0x118BC, "M", "𑣜"),
+ (0x118BD, "M", "𑣝"),
+ (0x118BE, "M", "𑣞"),
+ (0x118BF, "M", "𑣟"),
+ (0x118C0, "V"),
+ (0x118F3, "X"),
+ (0x118FF, "V"),
+ (0x11907, "X"),
+ (0x11909, "V"),
+ (0x1190A, "X"),
+ (0x1190C, "V"),
+ (0x11914, "X"),
+ (0x11915, "V"),
+ (0x11917, "X"),
+ (0x11918, "V"),
+ (0x11936, "X"),
+ (0x11937, "V"),
+ (0x11939, "X"),
+ (0x1193B, "V"),
+ (0x11947, "X"),
+ (0x11950, "V"),
+ (0x1195A, "X"),
+ (0x119A0, "V"),
+ (0x119A8, "X"),
+ (0x119AA, "V"),
+ (0x119D8, "X"),
+ (0x119DA, "V"),
+ (0x119E5, "X"),
+ (0x11A00, "V"),
+ (0x11A48, "X"),
+ (0x11A50, "V"),
+ (0x11AA3, "X"),
+ (0x11AB0, "V"),
+ (0x11AF9, "X"),
+ (0x11B00, "V"),
+ (0x11B0A, "X"),
+ (0x11C00, "V"),
+ (0x11C09, "X"),
+ (0x11C0A, "V"),
+ (0x11C37, "X"),
+ (0x11C38, "V"),
+ (0x11C46, "X"),
+ (0x11C50, "V"),
+ (0x11C6D, "X"),
+ (0x11C70, "V"),
+ (0x11C90, "X"),
+ (0x11C92, "V"),
+ (0x11CA8, "X"),
+ (0x11CA9, "V"),
+ (0x11CB7, "X"),
+ (0x11D00, "V"),
+ (0x11D07, "X"),
+ (0x11D08, "V"),
+ (0x11D0A, "X"),
+ (0x11D0B, "V"),
+ (0x11D37, "X"),
+ (0x11D3A, "V"),
+ (0x11D3B, "X"),
+ (0x11D3C, "V"),
+ (0x11D3E, "X"),
+ (0x11D3F, "V"),
+ (0x11D48, "X"),
+ (0x11D50, "V"),
+ (0x11D5A, "X"),
+ (0x11D60, "V"),
+ (0x11D66, "X"),
+ (0x11D67, "V"),
+ (0x11D69, "X"),
+ (0x11D6A, "V"),
+ (0x11D8F, "X"),
+ (0x11D90, "V"),
+ (0x11D92, "X"),
+ (0x11D93, "V"),
+ (0x11D99, "X"),
+ (0x11DA0, "V"),
+ (0x11DAA, "X"),
+ (0x11EE0, "V"),
+ (0x11EF9, "X"),
+ (0x11F00, "V"),
+ (0x11F11, "X"),
+ (0x11F12, "V"),
+ (0x11F3B, "X"),
+ (0x11F3E, "V"),
]
+
def _seg_59() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x11F11, 'X'),
- (0x11F12, 'V'),
- (0x11F3B, 'X'),
- (0x11F3E, 'V'),
- (0x11F5A, 'X'),
- (0x11FB0, 'V'),
- (0x11FB1, 'X'),
- (0x11FC0, 'V'),
- (0x11FF2, 'X'),
- (0x11FFF, 'V'),
- (0x1239A, 'X'),
- (0x12400, 'V'),
- (0x1246F, 'X'),
- (0x12470, 'V'),
- (0x12475, 'X'),
- (0x12480, 'V'),
- (0x12544, 'X'),
- (0x12F90, 'V'),
- (0x12FF3, 'X'),
- (0x13000, 'V'),
- (0x13430, 'X'),
- (0x13440, 'V'),
- (0x13456, 'X'),
- (0x14400, 'V'),
- (0x14647, 'X'),
- (0x16800, 'V'),
- (0x16A39, 'X'),
- (0x16A40, 'V'),
- (0x16A5F, 'X'),
- (0x16A60, 'V'),
- (0x16A6A, 'X'),
- (0x16A6E, 'V'),
- (0x16ABF, 'X'),
- (0x16AC0, 'V'),
- (0x16ACA, 'X'),
- (0x16AD0, 'V'),
- (0x16AEE, 'X'),
- (0x16AF0, 'V'),
- (0x16AF6, 'X'),
- (0x16B00, 'V'),
- (0x16B46, 'X'),
- (0x16B50, 'V'),
- (0x16B5A, 'X'),
- (0x16B5B, 'V'),
- (0x16B62, 'X'),
- (0x16B63, 'V'),
- (0x16B78, 'X'),
- (0x16B7D, 'V'),
- (0x16B90, 'X'),
- (0x16E40, 'M', '𖹠'),
- (0x16E41, 'M', '𖹡'),
- (0x16E42, 'M', '𖹢'),
- (0x16E43, 'M', '𖹣'),
- (0x16E44, 'M', '𖹤'),
- (0x16E45, 'M', '𖹥'),
- (0x16E46, 'M', '𖹦'),
- (0x16E47, 'M', '𖹧'),
- (0x16E48, 'M', '𖹨'),
- (0x16E49, 'M', '𖹩'),
- (0x16E4A, 'M', '𖹪'),
- (0x16E4B, 'M', '𖹫'),
- (0x16E4C, 'M', '𖹬'),
- (0x16E4D, 'M', '𖹭'),
- (0x16E4E, 'M', '𖹮'),
- (0x16E4F, 'M', '𖹯'),
- (0x16E50, 'M', '𖹰'),
- (0x16E51, 'M', '𖹱'),
- (0x16E52, 'M', '𖹲'),
- (0x16E53, 'M', '𖹳'),
- (0x16E54, 'M', '𖹴'),
- (0x16E55, 'M', '𖹵'),
- (0x16E56, 'M', '𖹶'),
- (0x16E57, 'M', '𖹷'),
- (0x16E58, 'M', '𖹸'),
- (0x16E59, 'M', '𖹹'),
- (0x16E5A, 'M', '𖹺'),
- (0x16E5B, 'M', '𖹻'),
- (0x16E5C, 'M', '𖹼'),
- (0x16E5D, 'M', '𖹽'),
- (0x16E5E, 'M', '𖹾'),
- (0x16E5F, 'M', '𖹿'),
- (0x16E60, 'V'),
- (0x16E9B, 'X'),
- (0x16F00, 'V'),
- (0x16F4B, 'X'),
- (0x16F4F, 'V'),
- (0x16F88, 'X'),
- (0x16F8F, 'V'),
- (0x16FA0, 'X'),
- (0x16FE0, 'V'),
- (0x16FE5, 'X'),
- (0x16FF0, 'V'),
- (0x16FF2, 'X'),
- (0x17000, 'V'),
- (0x187F8, 'X'),
- (0x18800, 'V'),
- (0x18CD6, 'X'),
- (0x18D00, 'V'),
- (0x18D09, 'X'),
- (0x1AFF0, 'V'),
+ (0x11F5A, "X"),
+ (0x11FB0, "V"),
+ (0x11FB1, "X"),
+ (0x11FC0, "V"),
+ (0x11FF2, "X"),
+ (0x11FFF, "V"),
+ (0x1239A, "X"),
+ (0x12400, "V"),
+ (0x1246F, "X"),
+ (0x12470, "V"),
+ (0x12475, "X"),
+ (0x12480, "V"),
+ (0x12544, "X"),
+ (0x12F90, "V"),
+ (0x12FF3, "X"),
+ (0x13000, "V"),
+ (0x13430, "X"),
+ (0x13440, "V"),
+ (0x13456, "X"),
+ (0x14400, "V"),
+ (0x14647, "X"),
+ (0x16800, "V"),
+ (0x16A39, "X"),
+ (0x16A40, "V"),
+ (0x16A5F, "X"),
+ (0x16A60, "V"),
+ (0x16A6A, "X"),
+ (0x16A6E, "V"),
+ (0x16ABF, "X"),
+ (0x16AC0, "V"),
+ (0x16ACA, "X"),
+ (0x16AD0, "V"),
+ (0x16AEE, "X"),
+ (0x16AF0, "V"),
+ (0x16AF6, "X"),
+ (0x16B00, "V"),
+ (0x16B46, "X"),
+ (0x16B50, "V"),
+ (0x16B5A, "X"),
+ (0x16B5B, "V"),
+ (0x16B62, "X"),
+ (0x16B63, "V"),
+ (0x16B78, "X"),
+ (0x16B7D, "V"),
+ (0x16B90, "X"),
+ (0x16E40, "M", "𖹠"),
+ (0x16E41, "M", "𖹡"),
+ (0x16E42, "M", "𖹢"),
+ (0x16E43, "M", "𖹣"),
+ (0x16E44, "M", "𖹤"),
+ (0x16E45, "M", "𖹥"),
+ (0x16E46, "M", "𖹦"),
+ (0x16E47, "M", "𖹧"),
+ (0x16E48, "M", "𖹨"),
+ (0x16E49, "M", "𖹩"),
+ (0x16E4A, "M", "𖹪"),
+ (0x16E4B, "M", "𖹫"),
+ (0x16E4C, "M", "𖹬"),
+ (0x16E4D, "M", "𖹭"),
+ (0x16E4E, "M", "𖹮"),
+ (0x16E4F, "M", "𖹯"),
+ (0x16E50, "M", "𖹰"),
+ (0x16E51, "M", "𖹱"),
+ (0x16E52, "M", "𖹲"),
+ (0x16E53, "M", "𖹳"),
+ (0x16E54, "M", "𖹴"),
+ (0x16E55, "M", "𖹵"),
+ (0x16E56, "M", "𖹶"),
+ (0x16E57, "M", "𖹷"),
+ (0x16E58, "M", "𖹸"),
+ (0x16E59, "M", "𖹹"),
+ (0x16E5A, "M", "𖹺"),
+ (0x16E5B, "M", "𖹻"),
+ (0x16E5C, "M", "𖹼"),
+ (0x16E5D, "M", "𖹽"),
+ (0x16E5E, "M", "𖹾"),
+ (0x16E5F, "M", "𖹿"),
+ (0x16E60, "V"),
+ (0x16E9B, "X"),
+ (0x16F00, "V"),
+ (0x16F4B, "X"),
+ (0x16F4F, "V"),
+ (0x16F88, "X"),
+ (0x16F8F, "V"),
+ (0x16FA0, "X"),
+ (0x16FE0, "V"),
+ (0x16FE5, "X"),
+ (0x16FF0, "V"),
+ (0x16FF2, "X"),
+ (0x17000, "V"),
+ (0x187F8, "X"),
+ (0x18800, "V"),
+ (0x18CD6, "X"),
+ (0x18D00, "V"),
+ (0x18D09, "X"),
+ (0x1AFF0, "V"),
+ (0x1AFF4, "X"),
+ (0x1AFF5, "V"),
+ (0x1AFFC, "X"),
+ (0x1AFFD, "V"),
]
+
def _seg_60() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1AFF4, 'X'),
- (0x1AFF5, 'V'),
- (0x1AFFC, 'X'),
- (0x1AFFD, 'V'),
- (0x1AFFF, 'X'),
- (0x1B000, 'V'),
- (0x1B123, 'X'),
- (0x1B132, 'V'),
- (0x1B133, 'X'),
- (0x1B150, 'V'),
- (0x1B153, 'X'),
- (0x1B155, 'V'),
- (0x1B156, 'X'),
- (0x1B164, 'V'),
- (0x1B168, 'X'),
- (0x1B170, 'V'),
- (0x1B2FC, 'X'),
- (0x1BC00, 'V'),
- (0x1BC6B, 'X'),
- (0x1BC70, 'V'),
- (0x1BC7D, 'X'),
- (0x1BC80, 'V'),
- (0x1BC89, 'X'),
- (0x1BC90, 'V'),
- (0x1BC9A, 'X'),
- (0x1BC9C, 'V'),
- (0x1BCA0, 'I'),
- (0x1BCA4, 'X'),
- (0x1CF00, 'V'),
- (0x1CF2E, 'X'),
- (0x1CF30, 'V'),
- (0x1CF47, 'X'),
- (0x1CF50, 'V'),
- (0x1CFC4, 'X'),
- (0x1D000, 'V'),
- (0x1D0F6, 'X'),
- (0x1D100, 'V'),
- (0x1D127, 'X'),
- (0x1D129, 'V'),
- (0x1D15E, 'M', '𝅗𝅥'),
- (0x1D15F, 'M', '𝅘𝅥'),
- (0x1D160, 'M', '𝅘𝅥𝅮'),
- (0x1D161, 'M', '𝅘𝅥𝅯'),
- (0x1D162, 'M', '𝅘𝅥𝅰'),
- (0x1D163, 'M', '𝅘𝅥𝅱'),
- (0x1D164, 'M', '𝅘𝅥𝅲'),
- (0x1D165, 'V'),
- (0x1D173, 'X'),
- (0x1D17B, 'V'),
- (0x1D1BB, 'M', '𝆹𝅥'),
- (0x1D1BC, 'M', '𝆺𝅥'),
- (0x1D1BD, 'M', '𝆹𝅥𝅮'),
- (0x1D1BE, 'M', '𝆺𝅥𝅮'),
- (0x1D1BF, 'M', '𝆹𝅥𝅯'),
- (0x1D1C0, 'M', '𝆺𝅥𝅯'),
- (0x1D1C1, 'V'),
- (0x1D1EB, 'X'),
- (0x1D200, 'V'),
- (0x1D246, 'X'),
- (0x1D2C0, 'V'),
- (0x1D2D4, 'X'),
- (0x1D2E0, 'V'),
- (0x1D2F4, 'X'),
- (0x1D300, 'V'),
- (0x1D357, 'X'),
- (0x1D360, 'V'),
- (0x1D379, 'X'),
- (0x1D400, 'M', 'a'),
- (0x1D401, 'M', 'b'),
- (0x1D402, 'M', 'c'),
- (0x1D403, 'M', 'd'),
- (0x1D404, 'M', 'e'),
- (0x1D405, 'M', 'f'),
- (0x1D406, 'M', 'g'),
- (0x1D407, 'M', 'h'),
- (0x1D408, 'M', 'i'),
- (0x1D409, 'M', 'j'),
- (0x1D40A, 'M', 'k'),
- (0x1D40B, 'M', 'l'),
- (0x1D40C, 'M', 'm'),
- (0x1D40D, 'M', 'n'),
- (0x1D40E, 'M', 'o'),
- (0x1D40F, 'M', 'p'),
- (0x1D410, 'M', 'q'),
- (0x1D411, 'M', 'r'),
- (0x1D412, 'M', 's'),
- (0x1D413, 'M', 't'),
- (0x1D414, 'M', 'u'),
- (0x1D415, 'M', 'v'),
- (0x1D416, 'M', 'w'),
- (0x1D417, 'M', 'x'),
- (0x1D418, 'M', 'y'),
- (0x1D419, 'M', 'z'),
- (0x1D41A, 'M', 'a'),
- (0x1D41B, 'M', 'b'),
- (0x1D41C, 'M', 'c'),
- (0x1D41D, 'M', 'd'),
- (0x1D41E, 'M', 'e'),
- (0x1D41F, 'M', 'f'),
- (0x1D420, 'M', 'g'),
+ (0x1AFFF, "X"),
+ (0x1B000, "V"),
+ (0x1B123, "X"),
+ (0x1B132, "V"),
+ (0x1B133, "X"),
+ (0x1B150, "V"),
+ (0x1B153, "X"),
+ (0x1B155, "V"),
+ (0x1B156, "X"),
+ (0x1B164, "V"),
+ (0x1B168, "X"),
+ (0x1B170, "V"),
+ (0x1B2FC, "X"),
+ (0x1BC00, "V"),
+ (0x1BC6B, "X"),
+ (0x1BC70, "V"),
+ (0x1BC7D, "X"),
+ (0x1BC80, "V"),
+ (0x1BC89, "X"),
+ (0x1BC90, "V"),
+ (0x1BC9A, "X"),
+ (0x1BC9C, "V"),
+ (0x1BCA0, "I"),
+ (0x1BCA4, "X"),
+ (0x1CF00, "V"),
+ (0x1CF2E, "X"),
+ (0x1CF30, "V"),
+ (0x1CF47, "X"),
+ (0x1CF50, "V"),
+ (0x1CFC4, "X"),
+ (0x1D000, "V"),
+ (0x1D0F6, "X"),
+ (0x1D100, "V"),
+ (0x1D127, "X"),
+ (0x1D129, "V"),
+ (0x1D15E, "M", "𝅗𝅥"),
+ (0x1D15F, "M", "𝅘𝅥"),
+ (0x1D160, "M", "𝅘𝅥𝅮"),
+ (0x1D161, "M", "𝅘𝅥𝅯"),
+ (0x1D162, "M", "𝅘𝅥𝅰"),
+ (0x1D163, "M", "𝅘𝅥𝅱"),
+ (0x1D164, "M", "𝅘𝅥𝅲"),
+ (0x1D165, "V"),
+ (0x1D173, "X"),
+ (0x1D17B, "V"),
+ (0x1D1BB, "M", "𝆹𝅥"),
+ (0x1D1BC, "M", "𝆺𝅥"),
+ (0x1D1BD, "M", "𝆹𝅥𝅮"),
+ (0x1D1BE, "M", "𝆺𝅥𝅮"),
+ (0x1D1BF, "M", "𝆹𝅥𝅯"),
+ (0x1D1C0, "M", "𝆺𝅥𝅯"),
+ (0x1D1C1, "V"),
+ (0x1D1EB, "X"),
+ (0x1D200, "V"),
+ (0x1D246, "X"),
+ (0x1D2C0, "V"),
+ (0x1D2D4, "X"),
+ (0x1D2E0, "V"),
+ (0x1D2F4, "X"),
+ (0x1D300, "V"),
+ (0x1D357, "X"),
+ (0x1D360, "V"),
+ (0x1D379, "X"),
+ (0x1D400, "M", "a"),
+ (0x1D401, "M", "b"),
+ (0x1D402, "M", "c"),
+ (0x1D403, "M", "d"),
+ (0x1D404, "M", "e"),
+ (0x1D405, "M", "f"),
+ (0x1D406, "M", "g"),
+ (0x1D407, "M", "h"),
+ (0x1D408, "M", "i"),
+ (0x1D409, "M", "j"),
+ (0x1D40A, "M", "k"),
+ (0x1D40B, "M", "l"),
+ (0x1D40C, "M", "m"),
+ (0x1D40D, "M", "n"),
+ (0x1D40E, "M", "o"),
+ (0x1D40F, "M", "p"),
+ (0x1D410, "M", "q"),
+ (0x1D411, "M", "r"),
+ (0x1D412, "M", "s"),
+ (0x1D413, "M", "t"),
+ (0x1D414, "M", "u"),
+ (0x1D415, "M", "v"),
+ (0x1D416, "M", "w"),
+ (0x1D417, "M", "x"),
+ (0x1D418, "M", "y"),
+ (0x1D419, "M", "z"),
+ (0x1D41A, "M", "a"),
+ (0x1D41B, "M", "b"),
+ (0x1D41C, "M", "c"),
+ (0x1D41D, "M", "d"),
+ (0x1D41E, "M", "e"),
+ (0x1D41F, "M", "f"),
+ (0x1D420, "M", "g"),
+ (0x1D421, "M", "h"),
+ (0x1D422, "M", "i"),
+ (0x1D423, "M", "j"),
+ (0x1D424, "M", "k"),
]
+
def _seg_61() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D421, 'M', 'h'),
- (0x1D422, 'M', 'i'),
- (0x1D423, 'M', 'j'),
- (0x1D424, 'M', 'k'),
- (0x1D425, 'M', 'l'),
- (0x1D426, 'M', 'm'),
- (0x1D427, 'M', 'n'),
- (0x1D428, 'M', 'o'),
- (0x1D429, 'M', 'p'),
- (0x1D42A, 'M', 'q'),
- (0x1D42B, 'M', 'r'),
- (0x1D42C, 'M', 's'),
- (0x1D42D, 'M', 't'),
- (0x1D42E, 'M', 'u'),
- (0x1D42F, 'M', 'v'),
- (0x1D430, 'M', 'w'),
- (0x1D431, 'M', 'x'),
- (0x1D432, 'M', 'y'),
- (0x1D433, 'M', 'z'),
- (0x1D434, 'M', 'a'),
- (0x1D435, 'M', 'b'),
- (0x1D436, 'M', 'c'),
- (0x1D437, 'M', 'd'),
- (0x1D438, 'M', 'e'),
- (0x1D439, 'M', 'f'),
- (0x1D43A, 'M', 'g'),
- (0x1D43B, 'M', 'h'),
- (0x1D43C, 'M', 'i'),
- (0x1D43D, 'M', 'j'),
- (0x1D43E, 'M', 'k'),
- (0x1D43F, 'M', 'l'),
- (0x1D440, 'M', 'm'),
- (0x1D441, 'M', 'n'),
- (0x1D442, 'M', 'o'),
- (0x1D443, 'M', 'p'),
- (0x1D444, 'M', 'q'),
- (0x1D445, 'M', 'r'),
- (0x1D446, 'M', 's'),
- (0x1D447, 'M', 't'),
- (0x1D448, 'M', 'u'),
- (0x1D449, 'M', 'v'),
- (0x1D44A, 'M', 'w'),
- (0x1D44B, 'M', 'x'),
- (0x1D44C, 'M', 'y'),
- (0x1D44D, 'M', 'z'),
- (0x1D44E, 'M', 'a'),
- (0x1D44F, 'M', 'b'),
- (0x1D450, 'M', 'c'),
- (0x1D451, 'M', 'd'),
- (0x1D452, 'M', 'e'),
- (0x1D453, 'M', 'f'),
- (0x1D454, 'M', 'g'),
- (0x1D455, 'X'),
- (0x1D456, 'M', 'i'),
- (0x1D457, 'M', 'j'),
- (0x1D458, 'M', 'k'),
- (0x1D459, 'M', 'l'),
- (0x1D45A, 'M', 'm'),
- (0x1D45B, 'M', 'n'),
- (0x1D45C, 'M', 'o'),
- (0x1D45D, 'M', 'p'),
- (0x1D45E, 'M', 'q'),
- (0x1D45F, 'M', 'r'),
- (0x1D460, 'M', 's'),
- (0x1D461, 'M', 't'),
- (0x1D462, 'M', 'u'),
- (0x1D463, 'M', 'v'),
- (0x1D464, 'M', 'w'),
- (0x1D465, 'M', 'x'),
- (0x1D466, 'M', 'y'),
- (0x1D467, 'M', 'z'),
- (0x1D468, 'M', 'a'),
- (0x1D469, 'M', 'b'),
- (0x1D46A, 'M', 'c'),
- (0x1D46B, 'M', 'd'),
- (0x1D46C, 'M', 'e'),
- (0x1D46D, 'M', 'f'),
- (0x1D46E, 'M', 'g'),
- (0x1D46F, 'M', 'h'),
- (0x1D470, 'M', 'i'),
- (0x1D471, 'M', 'j'),
- (0x1D472, 'M', 'k'),
- (0x1D473, 'M', 'l'),
- (0x1D474, 'M', 'm'),
- (0x1D475, 'M', 'n'),
- (0x1D476, 'M', 'o'),
- (0x1D477, 'M', 'p'),
- (0x1D478, 'M', 'q'),
- (0x1D479, 'M', 'r'),
- (0x1D47A, 'M', 's'),
- (0x1D47B, 'M', 't'),
- (0x1D47C, 'M', 'u'),
- (0x1D47D, 'M', 'v'),
- (0x1D47E, 'M', 'w'),
- (0x1D47F, 'M', 'x'),
- (0x1D480, 'M', 'y'),
- (0x1D481, 'M', 'z'),
- (0x1D482, 'M', 'a'),
- (0x1D483, 'M', 'b'),
- (0x1D484, 'M', 'c'),
+ (0x1D425, "M", "l"),
+ (0x1D426, "M", "m"),
+ (0x1D427, "M", "n"),
+ (0x1D428, "M", "o"),
+ (0x1D429, "M", "p"),
+ (0x1D42A, "M", "q"),
+ (0x1D42B, "M", "r"),
+ (0x1D42C, "M", "s"),
+ (0x1D42D, "M", "t"),
+ (0x1D42E, "M", "u"),
+ (0x1D42F, "M", "v"),
+ (0x1D430, "M", "w"),
+ (0x1D431, "M", "x"),
+ (0x1D432, "M", "y"),
+ (0x1D433, "M", "z"),
+ (0x1D434, "M", "a"),
+ (0x1D435, "M", "b"),
+ (0x1D436, "M", "c"),
+ (0x1D437, "M", "d"),
+ (0x1D438, "M", "e"),
+ (0x1D439, "M", "f"),
+ (0x1D43A, "M", "g"),
+ (0x1D43B, "M", "h"),
+ (0x1D43C, "M", "i"),
+ (0x1D43D, "M", "j"),
+ (0x1D43E, "M", "k"),
+ (0x1D43F, "M", "l"),
+ (0x1D440, "M", "m"),
+ (0x1D441, "M", "n"),
+ (0x1D442, "M", "o"),
+ (0x1D443, "M", "p"),
+ (0x1D444, "M", "q"),
+ (0x1D445, "M", "r"),
+ (0x1D446, "M", "s"),
+ (0x1D447, "M", "t"),
+ (0x1D448, "M", "u"),
+ (0x1D449, "M", "v"),
+ (0x1D44A, "M", "w"),
+ (0x1D44B, "M", "x"),
+ (0x1D44C, "M", "y"),
+ (0x1D44D, "M", "z"),
+ (0x1D44E, "M", "a"),
+ (0x1D44F, "M", "b"),
+ (0x1D450, "M", "c"),
+ (0x1D451, "M", "d"),
+ (0x1D452, "M", "e"),
+ (0x1D453, "M", "f"),
+ (0x1D454, "M", "g"),
+ (0x1D455, "X"),
+ (0x1D456, "M", "i"),
+ (0x1D457, "M", "j"),
+ (0x1D458, "M", "k"),
+ (0x1D459, "M", "l"),
+ (0x1D45A, "M", "m"),
+ (0x1D45B, "M", "n"),
+ (0x1D45C, "M", "o"),
+ (0x1D45D, "M", "p"),
+ (0x1D45E, "M", "q"),
+ (0x1D45F, "M", "r"),
+ (0x1D460, "M", "s"),
+ (0x1D461, "M", "t"),
+ (0x1D462, "M", "u"),
+ (0x1D463, "M", "v"),
+ (0x1D464, "M", "w"),
+ (0x1D465, "M", "x"),
+ (0x1D466, "M", "y"),
+ (0x1D467, "M", "z"),
+ (0x1D468, "M", "a"),
+ (0x1D469, "M", "b"),
+ (0x1D46A, "M", "c"),
+ (0x1D46B, "M", "d"),
+ (0x1D46C, "M", "e"),
+ (0x1D46D, "M", "f"),
+ (0x1D46E, "M", "g"),
+ (0x1D46F, "M", "h"),
+ (0x1D470, "M", "i"),
+ (0x1D471, "M", "j"),
+ (0x1D472, "M", "k"),
+ (0x1D473, "M", "l"),
+ (0x1D474, "M", "m"),
+ (0x1D475, "M", "n"),
+ (0x1D476, "M", "o"),
+ (0x1D477, "M", "p"),
+ (0x1D478, "M", "q"),
+ (0x1D479, "M", "r"),
+ (0x1D47A, "M", "s"),
+ (0x1D47B, "M", "t"),
+ (0x1D47C, "M", "u"),
+ (0x1D47D, "M", "v"),
+ (0x1D47E, "M", "w"),
+ (0x1D47F, "M", "x"),
+ (0x1D480, "M", "y"),
+ (0x1D481, "M", "z"),
+ (0x1D482, "M", "a"),
+ (0x1D483, "M", "b"),
+ (0x1D484, "M", "c"),
+ (0x1D485, "M", "d"),
+ (0x1D486, "M", "e"),
+ (0x1D487, "M", "f"),
+ (0x1D488, "M", "g"),
]
+
def _seg_62() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D485, 'M', 'd'),
- (0x1D486, 'M', 'e'),
- (0x1D487, 'M', 'f'),
- (0x1D488, 'M', 'g'),
- (0x1D489, 'M', 'h'),
- (0x1D48A, 'M', 'i'),
- (0x1D48B, 'M', 'j'),
- (0x1D48C, 'M', 'k'),
- (0x1D48D, 'M', 'l'),
- (0x1D48E, 'M', 'm'),
- (0x1D48F, 'M', 'n'),
- (0x1D490, 'M', 'o'),
- (0x1D491, 'M', 'p'),
- (0x1D492, 'M', 'q'),
- (0x1D493, 'M', 'r'),
- (0x1D494, 'M', 's'),
- (0x1D495, 'M', 't'),
- (0x1D496, 'M', 'u'),
- (0x1D497, 'M', 'v'),
- (0x1D498, 'M', 'w'),
- (0x1D499, 'M', 'x'),
- (0x1D49A, 'M', 'y'),
- (0x1D49B, 'M', 'z'),
- (0x1D49C, 'M', 'a'),
- (0x1D49D, 'X'),
- (0x1D49E, 'M', 'c'),
- (0x1D49F, 'M', 'd'),
- (0x1D4A0, 'X'),
- (0x1D4A2, 'M', 'g'),
- (0x1D4A3, 'X'),
- (0x1D4A5, 'M', 'j'),
- (0x1D4A6, 'M', 'k'),
- (0x1D4A7, 'X'),
- (0x1D4A9, 'M', 'n'),
- (0x1D4AA, 'M', 'o'),
- (0x1D4AB, 'M', 'p'),
- (0x1D4AC, 'M', 'q'),
- (0x1D4AD, 'X'),
- (0x1D4AE, 'M', 's'),
- (0x1D4AF, 'M', 't'),
- (0x1D4B0, 'M', 'u'),
- (0x1D4B1, 'M', 'v'),
- (0x1D4B2, 'M', 'w'),
- (0x1D4B3, 'M', 'x'),
- (0x1D4B4, 'M', 'y'),
- (0x1D4B5, 'M', 'z'),
- (0x1D4B6, 'M', 'a'),
- (0x1D4B7, 'M', 'b'),
- (0x1D4B8, 'M', 'c'),
- (0x1D4B9, 'M', 'd'),
- (0x1D4BA, 'X'),
- (0x1D4BB, 'M', 'f'),
- (0x1D4BC, 'X'),
- (0x1D4BD, 'M', 'h'),
- (0x1D4BE, 'M', 'i'),
- (0x1D4BF, 'M', 'j'),
- (0x1D4C0, 'M', 'k'),
- (0x1D4C1, 'M', 'l'),
- (0x1D4C2, 'M', 'm'),
- (0x1D4C3, 'M', 'n'),
- (0x1D4C4, 'X'),
- (0x1D4C5, 'M', 'p'),
- (0x1D4C6, 'M', 'q'),
- (0x1D4C7, 'M', 'r'),
- (0x1D4C8, 'M', 's'),
- (0x1D4C9, 'M', 't'),
- (0x1D4CA, 'M', 'u'),
- (0x1D4CB, 'M', 'v'),
- (0x1D4CC, 'M', 'w'),
- (0x1D4CD, 'M', 'x'),
- (0x1D4CE, 'M', 'y'),
- (0x1D4CF, 'M', 'z'),
- (0x1D4D0, 'M', 'a'),
- (0x1D4D1, 'M', 'b'),
- (0x1D4D2, 'M', 'c'),
- (0x1D4D3, 'M', 'd'),
- (0x1D4D4, 'M', 'e'),
- (0x1D4D5, 'M', 'f'),
- (0x1D4D6, 'M', 'g'),
- (0x1D4D7, 'M', 'h'),
- (0x1D4D8, 'M', 'i'),
- (0x1D4D9, 'M', 'j'),
- (0x1D4DA, 'M', 'k'),
- (0x1D4DB, 'M', 'l'),
- (0x1D4DC, 'M', 'm'),
- (0x1D4DD, 'M', 'n'),
- (0x1D4DE, 'M', 'o'),
- (0x1D4DF, 'M', 'p'),
- (0x1D4E0, 'M', 'q'),
- (0x1D4E1, 'M', 'r'),
- (0x1D4E2, 'M', 's'),
- (0x1D4E3, 'M', 't'),
- (0x1D4E4, 'M', 'u'),
- (0x1D4E5, 'M', 'v'),
- (0x1D4E6, 'M', 'w'),
- (0x1D4E7, 'M', 'x'),
- (0x1D4E8, 'M', 'y'),
- (0x1D4E9, 'M', 'z'),
- (0x1D4EA, 'M', 'a'),
- (0x1D4EB, 'M', 'b'),
+ (0x1D489, "M", "h"),
+ (0x1D48A, "M", "i"),
+ (0x1D48B, "M", "j"),
+ (0x1D48C, "M", "k"),
+ (0x1D48D, "M", "l"),
+ (0x1D48E, "M", "m"),
+ (0x1D48F, "M", "n"),
+ (0x1D490, "M", "o"),
+ (0x1D491, "M", "p"),
+ (0x1D492, "M", "q"),
+ (0x1D493, "M", "r"),
+ (0x1D494, "M", "s"),
+ (0x1D495, "M", "t"),
+ (0x1D496, "M", "u"),
+ (0x1D497, "M", "v"),
+ (0x1D498, "M", "w"),
+ (0x1D499, "M", "x"),
+ (0x1D49A, "M", "y"),
+ (0x1D49B, "M", "z"),
+ (0x1D49C, "M", "a"),
+ (0x1D49D, "X"),
+ (0x1D49E, "M", "c"),
+ (0x1D49F, "M", "d"),
+ (0x1D4A0, "X"),
+ (0x1D4A2, "M", "g"),
+ (0x1D4A3, "X"),
+ (0x1D4A5, "M", "j"),
+ (0x1D4A6, "M", "k"),
+ (0x1D4A7, "X"),
+ (0x1D4A9, "M", "n"),
+ (0x1D4AA, "M", "o"),
+ (0x1D4AB, "M", "p"),
+ (0x1D4AC, "M", "q"),
+ (0x1D4AD, "X"),
+ (0x1D4AE, "M", "s"),
+ (0x1D4AF, "M", "t"),
+ (0x1D4B0, "M", "u"),
+ (0x1D4B1, "M", "v"),
+ (0x1D4B2, "M", "w"),
+ (0x1D4B3, "M", "x"),
+ (0x1D4B4, "M", "y"),
+ (0x1D4B5, "M", "z"),
+ (0x1D4B6, "M", "a"),
+ (0x1D4B7, "M", "b"),
+ (0x1D4B8, "M", "c"),
+ (0x1D4B9, "M", "d"),
+ (0x1D4BA, "X"),
+ (0x1D4BB, "M", "f"),
+ (0x1D4BC, "X"),
+ (0x1D4BD, "M", "h"),
+ (0x1D4BE, "M", "i"),
+ (0x1D4BF, "M", "j"),
+ (0x1D4C0, "M", "k"),
+ (0x1D4C1, "M", "l"),
+ (0x1D4C2, "M", "m"),
+ (0x1D4C3, "M", "n"),
+ (0x1D4C4, "X"),
+ (0x1D4C5, "M", "p"),
+ (0x1D4C6, "M", "q"),
+ (0x1D4C7, "M", "r"),
+ (0x1D4C8, "M", "s"),
+ (0x1D4C9, "M", "t"),
+ (0x1D4CA, "M", "u"),
+ (0x1D4CB, "M", "v"),
+ (0x1D4CC, "M", "w"),
+ (0x1D4CD, "M", "x"),
+ (0x1D4CE, "M", "y"),
+ (0x1D4CF, "M", "z"),
+ (0x1D4D0, "M", "a"),
+ (0x1D4D1, "M", "b"),
+ (0x1D4D2, "M", "c"),
+ (0x1D4D3, "M", "d"),
+ (0x1D4D4, "M", "e"),
+ (0x1D4D5, "M", "f"),
+ (0x1D4D6, "M", "g"),
+ (0x1D4D7, "M", "h"),
+ (0x1D4D8, "M", "i"),
+ (0x1D4D9, "M", "j"),
+ (0x1D4DA, "M", "k"),
+ (0x1D4DB, "M", "l"),
+ (0x1D4DC, "M", "m"),
+ (0x1D4DD, "M", "n"),
+ (0x1D4DE, "M", "o"),
+ (0x1D4DF, "M", "p"),
+ (0x1D4E0, "M", "q"),
+ (0x1D4E1, "M", "r"),
+ (0x1D4E2, "M", "s"),
+ (0x1D4E3, "M", "t"),
+ (0x1D4E4, "M", "u"),
+ (0x1D4E5, "M", "v"),
+ (0x1D4E6, "M", "w"),
+ (0x1D4E7, "M", "x"),
+ (0x1D4E8, "M", "y"),
+ (0x1D4E9, "M", "z"),
+ (0x1D4EA, "M", "a"),
+ (0x1D4EB, "M", "b"),
+ (0x1D4EC, "M", "c"),
+ (0x1D4ED, "M", "d"),
+ (0x1D4EE, "M", "e"),
+ (0x1D4EF, "M", "f"),
]
+
def _seg_63() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D4EC, 'M', 'c'),
- (0x1D4ED, 'M', 'd'),
- (0x1D4EE, 'M', 'e'),
- (0x1D4EF, 'M', 'f'),
- (0x1D4F0, 'M', 'g'),
- (0x1D4F1, 'M', 'h'),
- (0x1D4F2, 'M', 'i'),
- (0x1D4F3, 'M', 'j'),
- (0x1D4F4, 'M', 'k'),
- (0x1D4F5, 'M', 'l'),
- (0x1D4F6, 'M', 'm'),
- (0x1D4F7, 'M', 'n'),
- (0x1D4F8, 'M', 'o'),
- (0x1D4F9, 'M', 'p'),
- (0x1D4FA, 'M', 'q'),
- (0x1D4FB, 'M', 'r'),
- (0x1D4FC, 'M', 's'),
- (0x1D4FD, 'M', 't'),
- (0x1D4FE, 'M', 'u'),
- (0x1D4FF, 'M', 'v'),
- (0x1D500, 'M', 'w'),
- (0x1D501, 'M', 'x'),
- (0x1D502, 'M', 'y'),
- (0x1D503, 'M', 'z'),
- (0x1D504, 'M', 'a'),
- (0x1D505, 'M', 'b'),
- (0x1D506, 'X'),
- (0x1D507, 'M', 'd'),
- (0x1D508, 'M', 'e'),
- (0x1D509, 'M', 'f'),
- (0x1D50A, 'M', 'g'),
- (0x1D50B, 'X'),
- (0x1D50D, 'M', 'j'),
- (0x1D50E, 'M', 'k'),
- (0x1D50F, 'M', 'l'),
- (0x1D510, 'M', 'm'),
- (0x1D511, 'M', 'n'),
- (0x1D512, 'M', 'o'),
- (0x1D513, 'M', 'p'),
- (0x1D514, 'M', 'q'),
- (0x1D515, 'X'),
- (0x1D516, 'M', 's'),
- (0x1D517, 'M', 't'),
- (0x1D518, 'M', 'u'),
- (0x1D519, 'M', 'v'),
- (0x1D51A, 'M', 'w'),
- (0x1D51B, 'M', 'x'),
- (0x1D51C, 'M', 'y'),
- (0x1D51D, 'X'),
- (0x1D51E, 'M', 'a'),
- (0x1D51F, 'M', 'b'),
- (0x1D520, 'M', 'c'),
- (0x1D521, 'M', 'd'),
- (0x1D522, 'M', 'e'),
- (0x1D523, 'M', 'f'),
- (0x1D524, 'M', 'g'),
- (0x1D525, 'M', 'h'),
- (0x1D526, 'M', 'i'),
- (0x1D527, 'M', 'j'),
- (0x1D528, 'M', 'k'),
- (0x1D529, 'M', 'l'),
- (0x1D52A, 'M', 'm'),
- (0x1D52B, 'M', 'n'),
- (0x1D52C, 'M', 'o'),
- (0x1D52D, 'M', 'p'),
- (0x1D52E, 'M', 'q'),
- (0x1D52F, 'M', 'r'),
- (0x1D530, 'M', 's'),
- (0x1D531, 'M', 't'),
- (0x1D532, 'M', 'u'),
- (0x1D533, 'M', 'v'),
- (0x1D534, 'M', 'w'),
- (0x1D535, 'M', 'x'),
- (0x1D536, 'M', 'y'),
- (0x1D537, 'M', 'z'),
- (0x1D538, 'M', 'a'),
- (0x1D539, 'M', 'b'),
- (0x1D53A, 'X'),
- (0x1D53B, 'M', 'd'),
- (0x1D53C, 'M', 'e'),
- (0x1D53D, 'M', 'f'),
- (0x1D53E, 'M', 'g'),
- (0x1D53F, 'X'),
- (0x1D540, 'M', 'i'),
- (0x1D541, 'M', 'j'),
- (0x1D542, 'M', 'k'),
- (0x1D543, 'M', 'l'),
- (0x1D544, 'M', 'm'),
- (0x1D545, 'X'),
- (0x1D546, 'M', 'o'),
- (0x1D547, 'X'),
- (0x1D54A, 'M', 's'),
- (0x1D54B, 'M', 't'),
- (0x1D54C, 'M', 'u'),
- (0x1D54D, 'M', 'v'),
- (0x1D54E, 'M', 'w'),
- (0x1D54F, 'M', 'x'),
- (0x1D550, 'M', 'y'),
- (0x1D551, 'X'),
- (0x1D552, 'M', 'a'),
+ (0x1D4F0, "M", "g"),
+ (0x1D4F1, "M", "h"),
+ (0x1D4F2, "M", "i"),
+ (0x1D4F3, "M", "j"),
+ (0x1D4F4, "M", "k"),
+ (0x1D4F5, "M", "l"),
+ (0x1D4F6, "M", "m"),
+ (0x1D4F7, "M", "n"),
+ (0x1D4F8, "M", "o"),
+ (0x1D4F9, "M", "p"),
+ (0x1D4FA, "M", "q"),
+ (0x1D4FB, "M", "r"),
+ (0x1D4FC, "M", "s"),
+ (0x1D4FD, "M", "t"),
+ (0x1D4FE, "M", "u"),
+ (0x1D4FF, "M", "v"),
+ (0x1D500, "M", "w"),
+ (0x1D501, "M", "x"),
+ (0x1D502, "M", "y"),
+ (0x1D503, "M", "z"),
+ (0x1D504, "M", "a"),
+ (0x1D505, "M", "b"),
+ (0x1D506, "X"),
+ (0x1D507, "M", "d"),
+ (0x1D508, "M", "e"),
+ (0x1D509, "M", "f"),
+ (0x1D50A, "M", "g"),
+ (0x1D50B, "X"),
+ (0x1D50D, "M", "j"),
+ (0x1D50E, "M", "k"),
+ (0x1D50F, "M", "l"),
+ (0x1D510, "M", "m"),
+ (0x1D511, "M", "n"),
+ (0x1D512, "M", "o"),
+ (0x1D513, "M", "p"),
+ (0x1D514, "M", "q"),
+ (0x1D515, "X"),
+ (0x1D516, "M", "s"),
+ (0x1D517, "M", "t"),
+ (0x1D518, "M", "u"),
+ (0x1D519, "M", "v"),
+ (0x1D51A, "M", "w"),
+ (0x1D51B, "M", "x"),
+ (0x1D51C, "M", "y"),
+ (0x1D51D, "X"),
+ (0x1D51E, "M", "a"),
+ (0x1D51F, "M", "b"),
+ (0x1D520, "M", "c"),
+ (0x1D521, "M", "d"),
+ (0x1D522, "M", "e"),
+ (0x1D523, "M", "f"),
+ (0x1D524, "M", "g"),
+ (0x1D525, "M", "h"),
+ (0x1D526, "M", "i"),
+ (0x1D527, "M", "j"),
+ (0x1D528, "M", "k"),
+ (0x1D529, "M", "l"),
+ (0x1D52A, "M", "m"),
+ (0x1D52B, "M", "n"),
+ (0x1D52C, "M", "o"),
+ (0x1D52D, "M", "p"),
+ (0x1D52E, "M", "q"),
+ (0x1D52F, "M", "r"),
+ (0x1D530, "M", "s"),
+ (0x1D531, "M", "t"),
+ (0x1D532, "M", "u"),
+ (0x1D533, "M", "v"),
+ (0x1D534, "M", "w"),
+ (0x1D535, "M", "x"),
+ (0x1D536, "M", "y"),
+ (0x1D537, "M", "z"),
+ (0x1D538, "M", "a"),
+ (0x1D539, "M", "b"),
+ (0x1D53A, "X"),
+ (0x1D53B, "M", "d"),
+ (0x1D53C, "M", "e"),
+ (0x1D53D, "M", "f"),
+ (0x1D53E, "M", "g"),
+ (0x1D53F, "X"),
+ (0x1D540, "M", "i"),
+ (0x1D541, "M", "j"),
+ (0x1D542, "M", "k"),
+ (0x1D543, "M", "l"),
+ (0x1D544, "M", "m"),
+ (0x1D545, "X"),
+ (0x1D546, "M", "o"),
+ (0x1D547, "X"),
+ (0x1D54A, "M", "s"),
+ (0x1D54B, "M", "t"),
+ (0x1D54C, "M", "u"),
+ (0x1D54D, "M", "v"),
+ (0x1D54E, "M", "w"),
+ (0x1D54F, "M", "x"),
+ (0x1D550, "M", "y"),
+ (0x1D551, "X"),
+ (0x1D552, "M", "a"),
+ (0x1D553, "M", "b"),
+ (0x1D554, "M", "c"),
+ (0x1D555, "M", "d"),
+ (0x1D556, "M", "e"),
]
+
def _seg_64() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D553, 'M', 'b'),
- (0x1D554, 'M', 'c'),
- (0x1D555, 'M', 'd'),
- (0x1D556, 'M', 'e'),
- (0x1D557, 'M', 'f'),
- (0x1D558, 'M', 'g'),
- (0x1D559, 'M', 'h'),
- (0x1D55A, 'M', 'i'),
- (0x1D55B, 'M', 'j'),
- (0x1D55C, 'M', 'k'),
- (0x1D55D, 'M', 'l'),
- (0x1D55E, 'M', 'm'),
- (0x1D55F, 'M', 'n'),
- (0x1D560, 'M', 'o'),
- (0x1D561, 'M', 'p'),
- (0x1D562, 'M', 'q'),
- (0x1D563, 'M', 'r'),
- (0x1D564, 'M', 's'),
- (0x1D565, 'M', 't'),
- (0x1D566, 'M', 'u'),
- (0x1D567, 'M', 'v'),
- (0x1D568, 'M', 'w'),
- (0x1D569, 'M', 'x'),
- (0x1D56A, 'M', 'y'),
- (0x1D56B, 'M', 'z'),
- (0x1D56C, 'M', 'a'),
- (0x1D56D, 'M', 'b'),
- (0x1D56E, 'M', 'c'),
- (0x1D56F, 'M', 'd'),
- (0x1D570, 'M', 'e'),
- (0x1D571, 'M', 'f'),
- (0x1D572, 'M', 'g'),
- (0x1D573, 'M', 'h'),
- (0x1D574, 'M', 'i'),
- (0x1D575, 'M', 'j'),
- (0x1D576, 'M', 'k'),
- (0x1D577, 'M', 'l'),
- (0x1D578, 'M', 'm'),
- (0x1D579, 'M', 'n'),
- (0x1D57A, 'M', 'o'),
- (0x1D57B, 'M', 'p'),
- (0x1D57C, 'M', 'q'),
- (0x1D57D, 'M', 'r'),
- (0x1D57E, 'M', 's'),
- (0x1D57F, 'M', 't'),
- (0x1D580, 'M', 'u'),
- (0x1D581, 'M', 'v'),
- (0x1D582, 'M', 'w'),
- (0x1D583, 'M', 'x'),
- (0x1D584, 'M', 'y'),
- (0x1D585, 'M', 'z'),
- (0x1D586, 'M', 'a'),
- (0x1D587, 'M', 'b'),
- (0x1D588, 'M', 'c'),
- (0x1D589, 'M', 'd'),
- (0x1D58A, 'M', 'e'),
- (0x1D58B, 'M', 'f'),
- (0x1D58C, 'M', 'g'),
- (0x1D58D, 'M', 'h'),
- (0x1D58E, 'M', 'i'),
- (0x1D58F, 'M', 'j'),
- (0x1D590, 'M', 'k'),
- (0x1D591, 'M', 'l'),
- (0x1D592, 'M', 'm'),
- (0x1D593, 'M', 'n'),
- (0x1D594, 'M', 'o'),
- (0x1D595, 'M', 'p'),
- (0x1D596, 'M', 'q'),
- (0x1D597, 'M', 'r'),
- (0x1D598, 'M', 's'),
- (0x1D599, 'M', 't'),
- (0x1D59A, 'M', 'u'),
- (0x1D59B, 'M', 'v'),
- (0x1D59C, 'M', 'w'),
- (0x1D59D, 'M', 'x'),
- (0x1D59E, 'M', 'y'),
- (0x1D59F, 'M', 'z'),
- (0x1D5A0, 'M', 'a'),
- (0x1D5A1, 'M', 'b'),
- (0x1D5A2, 'M', 'c'),
- (0x1D5A3, 'M', 'd'),
- (0x1D5A4, 'M', 'e'),
- (0x1D5A5, 'M', 'f'),
- (0x1D5A6, 'M', 'g'),
- (0x1D5A7, 'M', 'h'),
- (0x1D5A8, 'M', 'i'),
- (0x1D5A9, 'M', 'j'),
- (0x1D5AA, 'M', 'k'),
- (0x1D5AB, 'M', 'l'),
- (0x1D5AC, 'M', 'm'),
- (0x1D5AD, 'M', 'n'),
- (0x1D5AE, 'M', 'o'),
- (0x1D5AF, 'M', 'p'),
- (0x1D5B0, 'M', 'q'),
- (0x1D5B1, 'M', 'r'),
- (0x1D5B2, 'M', 's'),
- (0x1D5B3, 'M', 't'),
- (0x1D5B4, 'M', 'u'),
- (0x1D5B5, 'M', 'v'),
- (0x1D5B6, 'M', 'w'),
+ (0x1D557, "M", "f"),
+ (0x1D558, "M", "g"),
+ (0x1D559, "M", "h"),
+ (0x1D55A, "M", "i"),
+ (0x1D55B, "M", "j"),
+ (0x1D55C, "M", "k"),
+ (0x1D55D, "M", "l"),
+ (0x1D55E, "M", "m"),
+ (0x1D55F, "M", "n"),
+ (0x1D560, "M", "o"),
+ (0x1D561, "M", "p"),
+ (0x1D562, "M", "q"),
+ (0x1D563, "M", "r"),
+ (0x1D564, "M", "s"),
+ (0x1D565, "M", "t"),
+ (0x1D566, "M", "u"),
+ (0x1D567, "M", "v"),
+ (0x1D568, "M", "w"),
+ (0x1D569, "M", "x"),
+ (0x1D56A, "M", "y"),
+ (0x1D56B, "M", "z"),
+ (0x1D56C, "M", "a"),
+ (0x1D56D, "M", "b"),
+ (0x1D56E, "M", "c"),
+ (0x1D56F, "M", "d"),
+ (0x1D570, "M", "e"),
+ (0x1D571, "M", "f"),
+ (0x1D572, "M", "g"),
+ (0x1D573, "M", "h"),
+ (0x1D574, "M", "i"),
+ (0x1D575, "M", "j"),
+ (0x1D576, "M", "k"),
+ (0x1D577, "M", "l"),
+ (0x1D578, "M", "m"),
+ (0x1D579, "M", "n"),
+ (0x1D57A, "M", "o"),
+ (0x1D57B, "M", "p"),
+ (0x1D57C, "M", "q"),
+ (0x1D57D, "M", "r"),
+ (0x1D57E, "M", "s"),
+ (0x1D57F, "M", "t"),
+ (0x1D580, "M", "u"),
+ (0x1D581, "M", "v"),
+ (0x1D582, "M", "w"),
+ (0x1D583, "M", "x"),
+ (0x1D584, "M", "y"),
+ (0x1D585, "M", "z"),
+ (0x1D586, "M", "a"),
+ (0x1D587, "M", "b"),
+ (0x1D588, "M", "c"),
+ (0x1D589, "M", "d"),
+ (0x1D58A, "M", "e"),
+ (0x1D58B, "M", "f"),
+ (0x1D58C, "M", "g"),
+ (0x1D58D, "M", "h"),
+ (0x1D58E, "M", "i"),
+ (0x1D58F, "M", "j"),
+ (0x1D590, "M", "k"),
+ (0x1D591, "M", "l"),
+ (0x1D592, "M", "m"),
+ (0x1D593, "M", "n"),
+ (0x1D594, "M", "o"),
+ (0x1D595, "M", "p"),
+ (0x1D596, "M", "q"),
+ (0x1D597, "M", "r"),
+ (0x1D598, "M", "s"),
+ (0x1D599, "M", "t"),
+ (0x1D59A, "M", "u"),
+ (0x1D59B, "M", "v"),
+ (0x1D59C, "M", "w"),
+ (0x1D59D, "M", "x"),
+ (0x1D59E, "M", "y"),
+ (0x1D59F, "M", "z"),
+ (0x1D5A0, "M", "a"),
+ (0x1D5A1, "M", "b"),
+ (0x1D5A2, "M", "c"),
+ (0x1D5A3, "M", "d"),
+ (0x1D5A4, "M", "e"),
+ (0x1D5A5, "M", "f"),
+ (0x1D5A6, "M", "g"),
+ (0x1D5A7, "M", "h"),
+ (0x1D5A8, "M", "i"),
+ (0x1D5A9, "M", "j"),
+ (0x1D5AA, "M", "k"),
+ (0x1D5AB, "M", "l"),
+ (0x1D5AC, "M", "m"),
+ (0x1D5AD, "M", "n"),
+ (0x1D5AE, "M", "o"),
+ (0x1D5AF, "M", "p"),
+ (0x1D5B0, "M", "q"),
+ (0x1D5B1, "M", "r"),
+ (0x1D5B2, "M", "s"),
+ (0x1D5B3, "M", "t"),
+ (0x1D5B4, "M", "u"),
+ (0x1D5B5, "M", "v"),
+ (0x1D5B6, "M", "w"),
+ (0x1D5B7, "M", "x"),
+ (0x1D5B8, "M", "y"),
+ (0x1D5B9, "M", "z"),
+ (0x1D5BA, "M", "a"),
]
+
def _seg_65() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D5B7, 'M', 'x'),
- (0x1D5B8, 'M', 'y'),
- (0x1D5B9, 'M', 'z'),
- (0x1D5BA, 'M', 'a'),
- (0x1D5BB, 'M', 'b'),
- (0x1D5BC, 'M', 'c'),
- (0x1D5BD, 'M', 'd'),
- (0x1D5BE, 'M', 'e'),
- (0x1D5BF, 'M', 'f'),
- (0x1D5C0, 'M', 'g'),
- (0x1D5C1, 'M', 'h'),
- (0x1D5C2, 'M', 'i'),
- (0x1D5C3, 'M', 'j'),
- (0x1D5C4, 'M', 'k'),
- (0x1D5C5, 'M', 'l'),
- (0x1D5C6, 'M', 'm'),
- (0x1D5C7, 'M', 'n'),
- (0x1D5C8, 'M', 'o'),
- (0x1D5C9, 'M', 'p'),
- (0x1D5CA, 'M', 'q'),
- (0x1D5CB, 'M', 'r'),
- (0x1D5CC, 'M', 's'),
- (0x1D5CD, 'M', 't'),
- (0x1D5CE, 'M', 'u'),
- (0x1D5CF, 'M', 'v'),
- (0x1D5D0, 'M', 'w'),
- (0x1D5D1, 'M', 'x'),
- (0x1D5D2, 'M', 'y'),
- (0x1D5D3, 'M', 'z'),
- (0x1D5D4, 'M', 'a'),
- (0x1D5D5, 'M', 'b'),
- (0x1D5D6, 'M', 'c'),
- (0x1D5D7, 'M', 'd'),
- (0x1D5D8, 'M', 'e'),
- (0x1D5D9, 'M', 'f'),
- (0x1D5DA, 'M', 'g'),
- (0x1D5DB, 'M', 'h'),
- (0x1D5DC, 'M', 'i'),
- (0x1D5DD, 'M', 'j'),
- (0x1D5DE, 'M', 'k'),
- (0x1D5DF, 'M', 'l'),
- (0x1D5E0, 'M', 'm'),
- (0x1D5E1, 'M', 'n'),
- (0x1D5E2, 'M', 'o'),
- (0x1D5E3, 'M', 'p'),
- (0x1D5E4, 'M', 'q'),
- (0x1D5E5, 'M', 'r'),
- (0x1D5E6, 'M', 's'),
- (0x1D5E7, 'M', 't'),
- (0x1D5E8, 'M', 'u'),
- (0x1D5E9, 'M', 'v'),
- (0x1D5EA, 'M', 'w'),
- (0x1D5EB, 'M', 'x'),
- (0x1D5EC, 'M', 'y'),
- (0x1D5ED, 'M', 'z'),
- (0x1D5EE, 'M', 'a'),
- (0x1D5EF, 'M', 'b'),
- (0x1D5F0, 'M', 'c'),
- (0x1D5F1, 'M', 'd'),
- (0x1D5F2, 'M', 'e'),
- (0x1D5F3, 'M', 'f'),
- (0x1D5F4, 'M', 'g'),
- (0x1D5F5, 'M', 'h'),
- (0x1D5F6, 'M', 'i'),
- (0x1D5F7, 'M', 'j'),
- (0x1D5F8, 'M', 'k'),
- (0x1D5F9, 'M', 'l'),
- (0x1D5FA, 'M', 'm'),
- (0x1D5FB, 'M', 'n'),
- (0x1D5FC, 'M', 'o'),
- (0x1D5FD, 'M', 'p'),
- (0x1D5FE, 'M', 'q'),
- (0x1D5FF, 'M', 'r'),
- (0x1D600, 'M', 's'),
- (0x1D601, 'M', 't'),
- (0x1D602, 'M', 'u'),
- (0x1D603, 'M', 'v'),
- (0x1D604, 'M', 'w'),
- (0x1D605, 'M', 'x'),
- (0x1D606, 'M', 'y'),
- (0x1D607, 'M', 'z'),
- (0x1D608, 'M', 'a'),
- (0x1D609, 'M', 'b'),
- (0x1D60A, 'M', 'c'),
- (0x1D60B, 'M', 'd'),
- (0x1D60C, 'M', 'e'),
- (0x1D60D, 'M', 'f'),
- (0x1D60E, 'M', 'g'),
- (0x1D60F, 'M', 'h'),
- (0x1D610, 'M', 'i'),
- (0x1D611, 'M', 'j'),
- (0x1D612, 'M', 'k'),
- (0x1D613, 'M', 'l'),
- (0x1D614, 'M', 'm'),
- (0x1D615, 'M', 'n'),
- (0x1D616, 'M', 'o'),
- (0x1D617, 'M', 'p'),
- (0x1D618, 'M', 'q'),
- (0x1D619, 'M', 'r'),
- (0x1D61A, 'M', 's'),
+ (0x1D5BB, "M", "b"),
+ (0x1D5BC, "M", "c"),
+ (0x1D5BD, "M", "d"),
+ (0x1D5BE, "M", "e"),
+ (0x1D5BF, "M", "f"),
+ (0x1D5C0, "M", "g"),
+ (0x1D5C1, "M", "h"),
+ (0x1D5C2, "M", "i"),
+ (0x1D5C3, "M", "j"),
+ (0x1D5C4, "M", "k"),
+ (0x1D5C5, "M", "l"),
+ (0x1D5C6, "M", "m"),
+ (0x1D5C7, "M", "n"),
+ (0x1D5C8, "M", "o"),
+ (0x1D5C9, "M", "p"),
+ (0x1D5CA, "M", "q"),
+ (0x1D5CB, "M", "r"),
+ (0x1D5CC, "M", "s"),
+ (0x1D5CD, "M", "t"),
+ (0x1D5CE, "M", "u"),
+ (0x1D5CF, "M", "v"),
+ (0x1D5D0, "M", "w"),
+ (0x1D5D1, "M", "x"),
+ (0x1D5D2, "M", "y"),
+ (0x1D5D3, "M", "z"),
+ (0x1D5D4, "M", "a"),
+ (0x1D5D5, "M", "b"),
+ (0x1D5D6, "M", "c"),
+ (0x1D5D7, "M", "d"),
+ (0x1D5D8, "M", "e"),
+ (0x1D5D9, "M", "f"),
+ (0x1D5DA, "M", "g"),
+ (0x1D5DB, "M", "h"),
+ (0x1D5DC, "M", "i"),
+ (0x1D5DD, "M", "j"),
+ (0x1D5DE, "M", "k"),
+ (0x1D5DF, "M", "l"),
+ (0x1D5E0, "M", "m"),
+ (0x1D5E1, "M", "n"),
+ (0x1D5E2, "M", "o"),
+ (0x1D5E3, "M", "p"),
+ (0x1D5E4, "M", "q"),
+ (0x1D5E5, "M", "r"),
+ (0x1D5E6, "M", "s"),
+ (0x1D5E7, "M", "t"),
+ (0x1D5E8, "M", "u"),
+ (0x1D5E9, "M", "v"),
+ (0x1D5EA, "M", "w"),
+ (0x1D5EB, "M", "x"),
+ (0x1D5EC, "M", "y"),
+ (0x1D5ED, "M", "z"),
+ (0x1D5EE, "M", "a"),
+ (0x1D5EF, "M", "b"),
+ (0x1D5F0, "M", "c"),
+ (0x1D5F1, "M", "d"),
+ (0x1D5F2, "M", "e"),
+ (0x1D5F3, "M", "f"),
+ (0x1D5F4, "M", "g"),
+ (0x1D5F5, "M", "h"),
+ (0x1D5F6, "M", "i"),
+ (0x1D5F7, "M", "j"),
+ (0x1D5F8, "M", "k"),
+ (0x1D5F9, "M", "l"),
+ (0x1D5FA, "M", "m"),
+ (0x1D5FB, "M", "n"),
+ (0x1D5FC, "M", "o"),
+ (0x1D5FD, "M", "p"),
+ (0x1D5FE, "M", "q"),
+ (0x1D5FF, "M", "r"),
+ (0x1D600, "M", "s"),
+ (0x1D601, "M", "t"),
+ (0x1D602, "M", "u"),
+ (0x1D603, "M", "v"),
+ (0x1D604, "M", "w"),
+ (0x1D605, "M", "x"),
+ (0x1D606, "M", "y"),
+ (0x1D607, "M", "z"),
+ (0x1D608, "M", "a"),
+ (0x1D609, "M", "b"),
+ (0x1D60A, "M", "c"),
+ (0x1D60B, "M", "d"),
+ (0x1D60C, "M", "e"),
+ (0x1D60D, "M", "f"),
+ (0x1D60E, "M", "g"),
+ (0x1D60F, "M", "h"),
+ (0x1D610, "M", "i"),
+ (0x1D611, "M", "j"),
+ (0x1D612, "M", "k"),
+ (0x1D613, "M", "l"),
+ (0x1D614, "M", "m"),
+ (0x1D615, "M", "n"),
+ (0x1D616, "M", "o"),
+ (0x1D617, "M", "p"),
+ (0x1D618, "M", "q"),
+ (0x1D619, "M", "r"),
+ (0x1D61A, "M", "s"),
+ (0x1D61B, "M", "t"),
+ (0x1D61C, "M", "u"),
+ (0x1D61D, "M", "v"),
+ (0x1D61E, "M", "w"),
]
+
def _seg_66() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D61B, 'M', 't'),
- (0x1D61C, 'M', 'u'),
- (0x1D61D, 'M', 'v'),
- (0x1D61E, 'M', 'w'),
- (0x1D61F, 'M', 'x'),
- (0x1D620, 'M', 'y'),
- (0x1D621, 'M', 'z'),
- (0x1D622, 'M', 'a'),
- (0x1D623, 'M', 'b'),
- (0x1D624, 'M', 'c'),
- (0x1D625, 'M', 'd'),
- (0x1D626, 'M', 'e'),
- (0x1D627, 'M', 'f'),
- (0x1D628, 'M', 'g'),
- (0x1D629, 'M', 'h'),
- (0x1D62A, 'M', 'i'),
- (0x1D62B, 'M', 'j'),
- (0x1D62C, 'M', 'k'),
- (0x1D62D, 'M', 'l'),
- (0x1D62E, 'M', 'm'),
- (0x1D62F, 'M', 'n'),
- (0x1D630, 'M', 'o'),
- (0x1D631, 'M', 'p'),
- (0x1D632, 'M', 'q'),
- (0x1D633, 'M', 'r'),
- (0x1D634, 'M', 's'),
- (0x1D635, 'M', 't'),
- (0x1D636, 'M', 'u'),
- (0x1D637, 'M', 'v'),
- (0x1D638, 'M', 'w'),
- (0x1D639, 'M', 'x'),
- (0x1D63A, 'M', 'y'),
- (0x1D63B, 'M', 'z'),
- (0x1D63C, 'M', 'a'),
- (0x1D63D, 'M', 'b'),
- (0x1D63E, 'M', 'c'),
- (0x1D63F, 'M', 'd'),
- (0x1D640, 'M', 'e'),
- (0x1D641, 'M', 'f'),
- (0x1D642, 'M', 'g'),
- (0x1D643, 'M', 'h'),
- (0x1D644, 'M', 'i'),
- (0x1D645, 'M', 'j'),
- (0x1D646, 'M', 'k'),
- (0x1D647, 'M', 'l'),
- (0x1D648, 'M', 'm'),
- (0x1D649, 'M', 'n'),
- (0x1D64A, 'M', 'o'),
- (0x1D64B, 'M', 'p'),
- (0x1D64C, 'M', 'q'),
- (0x1D64D, 'M', 'r'),
- (0x1D64E, 'M', 's'),
- (0x1D64F, 'M', 't'),
- (0x1D650, 'M', 'u'),
- (0x1D651, 'M', 'v'),
- (0x1D652, 'M', 'w'),
- (0x1D653, 'M', 'x'),
- (0x1D654, 'M', 'y'),
- (0x1D655, 'M', 'z'),
- (0x1D656, 'M', 'a'),
- (0x1D657, 'M', 'b'),
- (0x1D658, 'M', 'c'),
- (0x1D659, 'M', 'd'),
- (0x1D65A, 'M', 'e'),
- (0x1D65B, 'M', 'f'),
- (0x1D65C, 'M', 'g'),
- (0x1D65D, 'M', 'h'),
- (0x1D65E, 'M', 'i'),
- (0x1D65F, 'M', 'j'),
- (0x1D660, 'M', 'k'),
- (0x1D661, 'M', 'l'),
- (0x1D662, 'M', 'm'),
- (0x1D663, 'M', 'n'),
- (0x1D664, 'M', 'o'),
- (0x1D665, 'M', 'p'),
- (0x1D666, 'M', 'q'),
- (0x1D667, 'M', 'r'),
- (0x1D668, 'M', 's'),
- (0x1D669, 'M', 't'),
- (0x1D66A, 'M', 'u'),
- (0x1D66B, 'M', 'v'),
- (0x1D66C, 'M', 'w'),
- (0x1D66D, 'M', 'x'),
- (0x1D66E, 'M', 'y'),
- (0x1D66F, 'M', 'z'),
- (0x1D670, 'M', 'a'),
- (0x1D671, 'M', 'b'),
- (0x1D672, 'M', 'c'),
- (0x1D673, 'M', 'd'),
- (0x1D674, 'M', 'e'),
- (0x1D675, 'M', 'f'),
- (0x1D676, 'M', 'g'),
- (0x1D677, 'M', 'h'),
- (0x1D678, 'M', 'i'),
- (0x1D679, 'M', 'j'),
- (0x1D67A, 'M', 'k'),
- (0x1D67B, 'M', 'l'),
- (0x1D67C, 'M', 'm'),
- (0x1D67D, 'M', 'n'),
- (0x1D67E, 'M', 'o'),
+ (0x1D61F, "M", "x"),
+ (0x1D620, "M", "y"),
+ (0x1D621, "M", "z"),
+ (0x1D622, "M", "a"),
+ (0x1D623, "M", "b"),
+ (0x1D624, "M", "c"),
+ (0x1D625, "M", "d"),
+ (0x1D626, "M", "e"),
+ (0x1D627, "M", "f"),
+ (0x1D628, "M", "g"),
+ (0x1D629, "M", "h"),
+ (0x1D62A, "M", "i"),
+ (0x1D62B, "M", "j"),
+ (0x1D62C, "M", "k"),
+ (0x1D62D, "M", "l"),
+ (0x1D62E, "M", "m"),
+ (0x1D62F, "M", "n"),
+ (0x1D630, "M", "o"),
+ (0x1D631, "M", "p"),
+ (0x1D632, "M", "q"),
+ (0x1D633, "M", "r"),
+ (0x1D634, "M", "s"),
+ (0x1D635, "M", "t"),
+ (0x1D636, "M", "u"),
+ (0x1D637, "M", "v"),
+ (0x1D638, "M", "w"),
+ (0x1D639, "M", "x"),
+ (0x1D63A, "M", "y"),
+ (0x1D63B, "M", "z"),
+ (0x1D63C, "M", "a"),
+ (0x1D63D, "M", "b"),
+ (0x1D63E, "M", "c"),
+ (0x1D63F, "M", "d"),
+ (0x1D640, "M", "e"),
+ (0x1D641, "M", "f"),
+ (0x1D642, "M", "g"),
+ (0x1D643, "M", "h"),
+ (0x1D644, "M", "i"),
+ (0x1D645, "M", "j"),
+ (0x1D646, "M", "k"),
+ (0x1D647, "M", "l"),
+ (0x1D648, "M", "m"),
+ (0x1D649, "M", "n"),
+ (0x1D64A, "M", "o"),
+ (0x1D64B, "M", "p"),
+ (0x1D64C, "M", "q"),
+ (0x1D64D, "M", "r"),
+ (0x1D64E, "M", "s"),
+ (0x1D64F, "M", "t"),
+ (0x1D650, "M", "u"),
+ (0x1D651, "M", "v"),
+ (0x1D652, "M", "w"),
+ (0x1D653, "M", "x"),
+ (0x1D654, "M", "y"),
+ (0x1D655, "M", "z"),
+ (0x1D656, "M", "a"),
+ (0x1D657, "M", "b"),
+ (0x1D658, "M", "c"),
+ (0x1D659, "M", "d"),
+ (0x1D65A, "M", "e"),
+ (0x1D65B, "M", "f"),
+ (0x1D65C, "M", "g"),
+ (0x1D65D, "M", "h"),
+ (0x1D65E, "M", "i"),
+ (0x1D65F, "M", "j"),
+ (0x1D660, "M", "k"),
+ (0x1D661, "M", "l"),
+ (0x1D662, "M", "m"),
+ (0x1D663, "M", "n"),
+ (0x1D664, "M", "o"),
+ (0x1D665, "M", "p"),
+ (0x1D666, "M", "q"),
+ (0x1D667, "M", "r"),
+ (0x1D668, "M", "s"),
+ (0x1D669, "M", "t"),
+ (0x1D66A, "M", "u"),
+ (0x1D66B, "M", "v"),
+ (0x1D66C, "M", "w"),
+ (0x1D66D, "M", "x"),
+ (0x1D66E, "M", "y"),
+ (0x1D66F, "M", "z"),
+ (0x1D670, "M", "a"),
+ (0x1D671, "M", "b"),
+ (0x1D672, "M", "c"),
+ (0x1D673, "M", "d"),
+ (0x1D674, "M", "e"),
+ (0x1D675, "M", "f"),
+ (0x1D676, "M", "g"),
+ (0x1D677, "M", "h"),
+ (0x1D678, "M", "i"),
+ (0x1D679, "M", "j"),
+ (0x1D67A, "M", "k"),
+ (0x1D67B, "M", "l"),
+ (0x1D67C, "M", "m"),
+ (0x1D67D, "M", "n"),
+ (0x1D67E, "M", "o"),
+ (0x1D67F, "M", "p"),
+ (0x1D680, "M", "q"),
+ (0x1D681, "M", "r"),
+ (0x1D682, "M", "s"),
]
+
def _seg_67() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D67F, 'M', 'p'),
- (0x1D680, 'M', 'q'),
- (0x1D681, 'M', 'r'),
- (0x1D682, 'M', 's'),
- (0x1D683, 'M', 't'),
- (0x1D684, 'M', 'u'),
- (0x1D685, 'M', 'v'),
- (0x1D686, 'M', 'w'),
- (0x1D687, 'M', 'x'),
- (0x1D688, 'M', 'y'),
- (0x1D689, 'M', 'z'),
- (0x1D68A, 'M', 'a'),
- (0x1D68B, 'M', 'b'),
- (0x1D68C, 'M', 'c'),
- (0x1D68D, 'M', 'd'),
- (0x1D68E, 'M', 'e'),
- (0x1D68F, 'M', 'f'),
- (0x1D690, 'M', 'g'),
- (0x1D691, 'M', 'h'),
- (0x1D692, 'M', 'i'),
- (0x1D693, 'M', 'j'),
- (0x1D694, 'M', 'k'),
- (0x1D695, 'M', 'l'),
- (0x1D696, 'M', 'm'),
- (0x1D697, 'M', 'n'),
- (0x1D698, 'M', 'o'),
- (0x1D699, 'M', 'p'),
- (0x1D69A, 'M', 'q'),
- (0x1D69B, 'M', 'r'),
- (0x1D69C, 'M', 's'),
- (0x1D69D, 'M', 't'),
- (0x1D69E, 'M', 'u'),
- (0x1D69F, 'M', 'v'),
- (0x1D6A0, 'M', 'w'),
- (0x1D6A1, 'M', 'x'),
- (0x1D6A2, 'M', 'y'),
- (0x1D6A3, 'M', 'z'),
- (0x1D6A4, 'M', 'ı'),
- (0x1D6A5, 'M', 'ȷ'),
- (0x1D6A6, 'X'),
- (0x1D6A8, 'M', 'α'),
- (0x1D6A9, 'M', 'β'),
- (0x1D6AA, 'M', 'γ'),
- (0x1D6AB, 'M', 'δ'),
- (0x1D6AC, 'M', 'ε'),
- (0x1D6AD, 'M', 'ζ'),
- (0x1D6AE, 'M', 'η'),
- (0x1D6AF, 'M', 'θ'),
- (0x1D6B0, 'M', 'ι'),
- (0x1D6B1, 'M', 'κ'),
- (0x1D6B2, 'M', 'λ'),
- (0x1D6B3, 'M', 'μ'),
- (0x1D6B4, 'M', 'ν'),
- (0x1D6B5, 'M', 'ξ'),
- (0x1D6B6, 'M', 'ο'),
- (0x1D6B7, 'M', 'π'),
- (0x1D6B8, 'M', 'ρ'),
- (0x1D6B9, 'M', 'θ'),
- (0x1D6BA, 'M', 'σ'),
- (0x1D6BB, 'M', 'τ'),
- (0x1D6BC, 'M', 'υ'),
- (0x1D6BD, 'M', 'φ'),
- (0x1D6BE, 'M', 'χ'),
- (0x1D6BF, 'M', 'ψ'),
- (0x1D6C0, 'M', 'ω'),
- (0x1D6C1, 'M', '∇'),
- (0x1D6C2, 'M', 'α'),
- (0x1D6C3, 'M', 'β'),
- (0x1D6C4, 'M', 'γ'),
- (0x1D6C5, 'M', 'δ'),
- (0x1D6C6, 'M', 'ε'),
- (0x1D6C7, 'M', 'ζ'),
- (0x1D6C8, 'M', 'η'),
- (0x1D6C9, 'M', 'θ'),
- (0x1D6CA, 'M', 'ι'),
- (0x1D6CB, 'M', 'κ'),
- (0x1D6CC, 'M', 'λ'),
- (0x1D6CD, 'M', 'μ'),
- (0x1D6CE, 'M', 'ν'),
- (0x1D6CF, 'M', 'ξ'),
- (0x1D6D0, 'M', 'ο'),
- (0x1D6D1, 'M', 'π'),
- (0x1D6D2, 'M', 'ρ'),
- (0x1D6D3, 'M', 'σ'),
- (0x1D6D5, 'M', 'τ'),
- (0x1D6D6, 'M', 'υ'),
- (0x1D6D7, 'M', 'φ'),
- (0x1D6D8, 'M', 'χ'),
- (0x1D6D9, 'M', 'ψ'),
- (0x1D6DA, 'M', 'ω'),
- (0x1D6DB, 'M', '∂'),
- (0x1D6DC, 'M', 'ε'),
- (0x1D6DD, 'M', 'θ'),
- (0x1D6DE, 'M', 'κ'),
- (0x1D6DF, 'M', 'φ'),
- (0x1D6E0, 'M', 'ρ'),
- (0x1D6E1, 'M', 'π'),
- (0x1D6E2, 'M', 'α'),
- (0x1D6E3, 'M', 'β'),
- (0x1D6E4, 'M', 'γ'),
+ (0x1D683, "M", "t"),
+ (0x1D684, "M", "u"),
+ (0x1D685, "M", "v"),
+ (0x1D686, "M", "w"),
+ (0x1D687, "M", "x"),
+ (0x1D688, "M", "y"),
+ (0x1D689, "M", "z"),
+ (0x1D68A, "M", "a"),
+ (0x1D68B, "M", "b"),
+ (0x1D68C, "M", "c"),
+ (0x1D68D, "M", "d"),
+ (0x1D68E, "M", "e"),
+ (0x1D68F, "M", "f"),
+ (0x1D690, "M", "g"),
+ (0x1D691, "M", "h"),
+ (0x1D692, "M", "i"),
+ (0x1D693, "M", "j"),
+ (0x1D694, "M", "k"),
+ (0x1D695, "M", "l"),
+ (0x1D696, "M", "m"),
+ (0x1D697, "M", "n"),
+ (0x1D698, "M", "o"),
+ (0x1D699, "M", "p"),
+ (0x1D69A, "M", "q"),
+ (0x1D69B, "M", "r"),
+ (0x1D69C, "M", "s"),
+ (0x1D69D, "M", "t"),
+ (0x1D69E, "M", "u"),
+ (0x1D69F, "M", "v"),
+ (0x1D6A0, "M", "w"),
+ (0x1D6A1, "M", "x"),
+ (0x1D6A2, "M", "y"),
+ (0x1D6A3, "M", "z"),
+ (0x1D6A4, "M", "ı"),
+ (0x1D6A5, "M", "ȷ"),
+ (0x1D6A6, "X"),
+ (0x1D6A8, "M", "α"),
+ (0x1D6A9, "M", "β"),
+ (0x1D6AA, "M", "γ"),
+ (0x1D6AB, "M", "δ"),
+ (0x1D6AC, "M", "ε"),
+ (0x1D6AD, "M", "ζ"),
+ (0x1D6AE, "M", "η"),
+ (0x1D6AF, "M", "θ"),
+ (0x1D6B0, "M", "ι"),
+ (0x1D6B1, "M", "κ"),
+ (0x1D6B2, "M", "λ"),
+ (0x1D6B3, "M", "μ"),
+ (0x1D6B4, "M", "ν"),
+ (0x1D6B5, "M", "ξ"),
+ (0x1D6B6, "M", "ο"),
+ (0x1D6B7, "M", "π"),
+ (0x1D6B8, "M", "ρ"),
+ (0x1D6B9, "M", "θ"),
+ (0x1D6BA, "M", "σ"),
+ (0x1D6BB, "M", "τ"),
+ (0x1D6BC, "M", "υ"),
+ (0x1D6BD, "M", "φ"),
+ (0x1D6BE, "M", "χ"),
+ (0x1D6BF, "M", "ψ"),
+ (0x1D6C0, "M", "ω"),
+ (0x1D6C1, "M", "∇"),
+ (0x1D6C2, "M", "α"),
+ (0x1D6C3, "M", "β"),
+ (0x1D6C4, "M", "γ"),
+ (0x1D6C5, "M", "δ"),
+ (0x1D6C6, "M", "ε"),
+ (0x1D6C7, "M", "ζ"),
+ (0x1D6C8, "M", "η"),
+ (0x1D6C9, "M", "θ"),
+ (0x1D6CA, "M", "ι"),
+ (0x1D6CB, "M", "κ"),
+ (0x1D6CC, "M", "λ"),
+ (0x1D6CD, "M", "μ"),
+ (0x1D6CE, "M", "ν"),
+ (0x1D6CF, "M", "ξ"),
+ (0x1D6D0, "M", "ο"),
+ (0x1D6D1, "M", "π"),
+ (0x1D6D2, "M", "ρ"),
+ (0x1D6D3, "M", "σ"),
+ (0x1D6D5, "M", "τ"),
+ (0x1D6D6, "M", "υ"),
+ (0x1D6D7, "M", "φ"),
+ (0x1D6D8, "M", "χ"),
+ (0x1D6D9, "M", "ψ"),
+ (0x1D6DA, "M", "ω"),
+ (0x1D6DB, "M", "∂"),
+ (0x1D6DC, "M", "ε"),
+ (0x1D6DD, "M", "θ"),
+ (0x1D6DE, "M", "κ"),
+ (0x1D6DF, "M", "φ"),
+ (0x1D6E0, "M", "ρ"),
+ (0x1D6E1, "M", "π"),
+ (0x1D6E2, "M", "α"),
+ (0x1D6E3, "M", "β"),
+ (0x1D6E4, "M", "γ"),
+ (0x1D6E5, "M", "δ"),
+ (0x1D6E6, "M", "ε"),
+ (0x1D6E7, "M", "ζ"),
+ (0x1D6E8, "M", "η"),
]
+
def _seg_68() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D6E5, 'M', 'δ'),
- (0x1D6E6, 'M', 'ε'),
- (0x1D6E7, 'M', 'ζ'),
- (0x1D6E8, 'M', 'η'),
- (0x1D6E9, 'M', 'θ'),
- (0x1D6EA, 'M', 'ι'),
- (0x1D6EB, 'M', 'κ'),
- (0x1D6EC, 'M', 'λ'),
- (0x1D6ED, 'M', 'μ'),
- (0x1D6EE, 'M', 'ν'),
- (0x1D6EF, 'M', 'ξ'),
- (0x1D6F0, 'M', 'ο'),
- (0x1D6F1, 'M', 'π'),
- (0x1D6F2, 'M', 'ρ'),
- (0x1D6F3, 'M', 'θ'),
- (0x1D6F4, 'M', 'σ'),
- (0x1D6F5, 'M', 'τ'),
- (0x1D6F6, 'M', 'υ'),
- (0x1D6F7, 'M', 'φ'),
- (0x1D6F8, 'M', 'χ'),
- (0x1D6F9, 'M', 'ψ'),
- (0x1D6FA, 'M', 'ω'),
- (0x1D6FB, 'M', '∇'),
- (0x1D6FC, 'M', 'α'),
- (0x1D6FD, 'M', 'β'),
- (0x1D6FE, 'M', 'γ'),
- (0x1D6FF, 'M', 'δ'),
- (0x1D700, 'M', 'ε'),
- (0x1D701, 'M', 'ζ'),
- (0x1D702, 'M', 'η'),
- (0x1D703, 'M', 'θ'),
- (0x1D704, 'M', 'ι'),
- (0x1D705, 'M', 'κ'),
- (0x1D706, 'M', 'λ'),
- (0x1D707, 'M', 'μ'),
- (0x1D708, 'M', 'ν'),
- (0x1D709, 'M', 'ξ'),
- (0x1D70A, 'M', 'ο'),
- (0x1D70B, 'M', 'π'),
- (0x1D70C, 'M', 'ρ'),
- (0x1D70D, 'M', 'σ'),
- (0x1D70F, 'M', 'τ'),
- (0x1D710, 'M', 'υ'),
- (0x1D711, 'M', 'φ'),
- (0x1D712, 'M', 'χ'),
- (0x1D713, 'M', 'ψ'),
- (0x1D714, 'M', 'ω'),
- (0x1D715, 'M', '∂'),
- (0x1D716, 'M', 'ε'),
- (0x1D717, 'M', 'θ'),
- (0x1D718, 'M', 'κ'),
- (0x1D719, 'M', 'φ'),
- (0x1D71A, 'M', 'ρ'),
- (0x1D71B, 'M', 'π'),
- (0x1D71C, 'M', 'α'),
- (0x1D71D, 'M', 'β'),
- (0x1D71E, 'M', 'γ'),
- (0x1D71F, 'M', 'δ'),
- (0x1D720, 'M', 'ε'),
- (0x1D721, 'M', 'ζ'),
- (0x1D722, 'M', 'η'),
- (0x1D723, 'M', 'θ'),
- (0x1D724, 'M', 'ι'),
- (0x1D725, 'M', 'κ'),
- (0x1D726, 'M', 'λ'),
- (0x1D727, 'M', 'μ'),
- (0x1D728, 'M', 'ν'),
- (0x1D729, 'M', 'ξ'),
- (0x1D72A, 'M', 'ο'),
- (0x1D72B, 'M', 'π'),
- (0x1D72C, 'M', 'ρ'),
- (0x1D72D, 'M', 'θ'),
- (0x1D72E, 'M', 'σ'),
- (0x1D72F, 'M', 'τ'),
- (0x1D730, 'M', 'υ'),
- (0x1D731, 'M', 'φ'),
- (0x1D732, 'M', 'χ'),
- (0x1D733, 'M', 'ψ'),
- (0x1D734, 'M', 'ω'),
- (0x1D735, 'M', '∇'),
- (0x1D736, 'M', 'α'),
- (0x1D737, 'M', 'β'),
- (0x1D738, 'M', 'γ'),
- (0x1D739, 'M', 'δ'),
- (0x1D73A, 'M', 'ε'),
- (0x1D73B, 'M', 'ζ'),
- (0x1D73C, 'M', 'η'),
- (0x1D73D, 'M', 'θ'),
- (0x1D73E, 'M', 'ι'),
- (0x1D73F, 'M', 'κ'),
- (0x1D740, 'M', 'λ'),
- (0x1D741, 'M', 'μ'),
- (0x1D742, 'M', 'ν'),
- (0x1D743, 'M', 'ξ'),
- (0x1D744, 'M', 'ο'),
- (0x1D745, 'M', 'π'),
- (0x1D746, 'M', 'ρ'),
- (0x1D747, 'M', 'σ'),
- (0x1D749, 'M', 'τ'),
- (0x1D74A, 'M', 'υ'),
+ (0x1D6E9, "M", "θ"),
+ (0x1D6EA, "M", "ι"),
+ (0x1D6EB, "M", "κ"),
+ (0x1D6EC, "M", "λ"),
+ (0x1D6ED, "M", "μ"),
+ (0x1D6EE, "M", "ν"),
+ (0x1D6EF, "M", "ξ"),
+ (0x1D6F0, "M", "ο"),
+ (0x1D6F1, "M", "π"),
+ (0x1D6F2, "M", "ρ"),
+ (0x1D6F3, "M", "θ"),
+ (0x1D6F4, "M", "σ"),
+ (0x1D6F5, "M", "τ"),
+ (0x1D6F6, "M", "υ"),
+ (0x1D6F7, "M", "φ"),
+ (0x1D6F8, "M", "χ"),
+ (0x1D6F9, "M", "ψ"),
+ (0x1D6FA, "M", "ω"),
+ (0x1D6FB, "M", "∇"),
+ (0x1D6FC, "M", "α"),
+ (0x1D6FD, "M", "β"),
+ (0x1D6FE, "M", "γ"),
+ (0x1D6FF, "M", "δ"),
+ (0x1D700, "M", "ε"),
+ (0x1D701, "M", "ζ"),
+ (0x1D702, "M", "η"),
+ (0x1D703, "M", "θ"),
+ (0x1D704, "M", "ι"),
+ (0x1D705, "M", "κ"),
+ (0x1D706, "M", "λ"),
+ (0x1D707, "M", "μ"),
+ (0x1D708, "M", "ν"),
+ (0x1D709, "M", "ξ"),
+ (0x1D70A, "M", "ο"),
+ (0x1D70B, "M", "π"),
+ (0x1D70C, "M", "ρ"),
+ (0x1D70D, "M", "σ"),
+ (0x1D70F, "M", "τ"),
+ (0x1D710, "M", "υ"),
+ (0x1D711, "M", "φ"),
+ (0x1D712, "M", "χ"),
+ (0x1D713, "M", "ψ"),
+ (0x1D714, "M", "ω"),
+ (0x1D715, "M", "∂"),
+ (0x1D716, "M", "ε"),
+ (0x1D717, "M", "θ"),
+ (0x1D718, "M", "κ"),
+ (0x1D719, "M", "φ"),
+ (0x1D71A, "M", "ρ"),
+ (0x1D71B, "M", "π"),
+ (0x1D71C, "M", "α"),
+ (0x1D71D, "M", "β"),
+ (0x1D71E, "M", "γ"),
+ (0x1D71F, "M", "δ"),
+ (0x1D720, "M", "ε"),
+ (0x1D721, "M", "ζ"),
+ (0x1D722, "M", "η"),
+ (0x1D723, "M", "θ"),
+ (0x1D724, "M", "ι"),
+ (0x1D725, "M", "κ"),
+ (0x1D726, "M", "λ"),
+ (0x1D727, "M", "μ"),
+ (0x1D728, "M", "ν"),
+ (0x1D729, "M", "ξ"),
+ (0x1D72A, "M", "ο"),
+ (0x1D72B, "M", "π"),
+ (0x1D72C, "M", "ρ"),
+ (0x1D72D, "M", "θ"),
+ (0x1D72E, "M", "σ"),
+ (0x1D72F, "M", "τ"),
+ (0x1D730, "M", "υ"),
+ (0x1D731, "M", "φ"),
+ (0x1D732, "M", "χ"),
+ (0x1D733, "M", "ψ"),
+ (0x1D734, "M", "ω"),
+ (0x1D735, "M", "∇"),
+ (0x1D736, "M", "α"),
+ (0x1D737, "M", "β"),
+ (0x1D738, "M", "γ"),
+ (0x1D739, "M", "δ"),
+ (0x1D73A, "M", "ε"),
+ (0x1D73B, "M", "ζ"),
+ (0x1D73C, "M", "η"),
+ (0x1D73D, "M", "θ"),
+ (0x1D73E, "M", "ι"),
+ (0x1D73F, "M", "κ"),
+ (0x1D740, "M", "λ"),
+ (0x1D741, "M", "μ"),
+ (0x1D742, "M", "ν"),
+ (0x1D743, "M", "ξ"),
+ (0x1D744, "M", "ο"),
+ (0x1D745, "M", "π"),
+ (0x1D746, "M", "ρ"),
+ (0x1D747, "M", "σ"),
+ (0x1D749, "M", "τ"),
+ (0x1D74A, "M", "υ"),
+ (0x1D74B, "M", "φ"),
+ (0x1D74C, "M", "χ"),
+ (0x1D74D, "M", "ψ"),
+ (0x1D74E, "M", "ω"),
]
+
def _seg_69() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D74B, 'M', 'φ'),
- (0x1D74C, 'M', 'χ'),
- (0x1D74D, 'M', 'ψ'),
- (0x1D74E, 'M', 'ω'),
- (0x1D74F, 'M', '∂'),
- (0x1D750, 'M', 'ε'),
- (0x1D751, 'M', 'θ'),
- (0x1D752, 'M', 'κ'),
- (0x1D753, 'M', 'φ'),
- (0x1D754, 'M', 'ρ'),
- (0x1D755, 'M', 'π'),
- (0x1D756, 'M', 'α'),
- (0x1D757, 'M', 'β'),
- (0x1D758, 'M', 'γ'),
- (0x1D759, 'M', 'δ'),
- (0x1D75A, 'M', 'ε'),
- (0x1D75B, 'M', 'ζ'),
- (0x1D75C, 'M', 'η'),
- (0x1D75D, 'M', 'θ'),
- (0x1D75E, 'M', 'ι'),
- (0x1D75F, 'M', 'κ'),
- (0x1D760, 'M', 'λ'),
- (0x1D761, 'M', 'μ'),
- (0x1D762, 'M', 'ν'),
- (0x1D763, 'M', 'ξ'),
- (0x1D764, 'M', 'ο'),
- (0x1D765, 'M', 'π'),
- (0x1D766, 'M', 'ρ'),
- (0x1D767, 'M', 'θ'),
- (0x1D768, 'M', 'σ'),
- (0x1D769, 'M', 'τ'),
- (0x1D76A, 'M', 'υ'),
- (0x1D76B, 'M', 'φ'),
- (0x1D76C, 'M', 'χ'),
- (0x1D76D, 'M', 'ψ'),
- (0x1D76E, 'M', 'ω'),
- (0x1D76F, 'M', '∇'),
- (0x1D770, 'M', 'α'),
- (0x1D771, 'M', 'β'),
- (0x1D772, 'M', 'γ'),
- (0x1D773, 'M', 'δ'),
- (0x1D774, 'M', 'ε'),
- (0x1D775, 'M', 'ζ'),
- (0x1D776, 'M', 'η'),
- (0x1D777, 'M', 'θ'),
- (0x1D778, 'M', 'ι'),
- (0x1D779, 'M', 'κ'),
- (0x1D77A, 'M', 'λ'),
- (0x1D77B, 'M', 'μ'),
- (0x1D77C, 'M', 'ν'),
- (0x1D77D, 'M', 'ξ'),
- (0x1D77E, 'M', 'ο'),
- (0x1D77F, 'M', 'π'),
- (0x1D780, 'M', 'ρ'),
- (0x1D781, 'M', 'σ'),
- (0x1D783, 'M', 'τ'),
- (0x1D784, 'M', 'υ'),
- (0x1D785, 'M', 'φ'),
- (0x1D786, 'M', 'χ'),
- (0x1D787, 'M', 'ψ'),
- (0x1D788, 'M', 'ω'),
- (0x1D789, 'M', '∂'),
- (0x1D78A, 'M', 'ε'),
- (0x1D78B, 'M', 'θ'),
- (0x1D78C, 'M', 'κ'),
- (0x1D78D, 'M', 'φ'),
- (0x1D78E, 'M', 'ρ'),
- (0x1D78F, 'M', 'π'),
- (0x1D790, 'M', 'α'),
- (0x1D791, 'M', 'β'),
- (0x1D792, 'M', 'γ'),
- (0x1D793, 'M', 'δ'),
- (0x1D794, 'M', 'ε'),
- (0x1D795, 'M', 'ζ'),
- (0x1D796, 'M', 'η'),
- (0x1D797, 'M', 'θ'),
- (0x1D798, 'M', 'ι'),
- (0x1D799, 'M', 'κ'),
- (0x1D79A, 'M', 'λ'),
- (0x1D79B, 'M', 'μ'),
- (0x1D79C, 'M', 'ν'),
- (0x1D79D, 'M', 'ξ'),
- (0x1D79E, 'M', 'ο'),
- (0x1D79F, 'M', 'π'),
- (0x1D7A0, 'M', 'ρ'),
- (0x1D7A1, 'M', 'θ'),
- (0x1D7A2, 'M', 'σ'),
- (0x1D7A3, 'M', 'τ'),
- (0x1D7A4, 'M', 'υ'),
- (0x1D7A5, 'M', 'φ'),
- (0x1D7A6, 'M', 'χ'),
- (0x1D7A7, 'M', 'ψ'),
- (0x1D7A8, 'M', 'ω'),
- (0x1D7A9, 'M', '∇'),
- (0x1D7AA, 'M', 'α'),
- (0x1D7AB, 'M', 'β'),
- (0x1D7AC, 'M', 'γ'),
- (0x1D7AD, 'M', 'δ'),
- (0x1D7AE, 'M', 'ε'),
- (0x1D7AF, 'M', 'ζ'),
+ (0x1D74F, "M", "∂"),
+ (0x1D750, "M", "ε"),
+ (0x1D751, "M", "θ"),
+ (0x1D752, "M", "κ"),
+ (0x1D753, "M", "φ"),
+ (0x1D754, "M", "ρ"),
+ (0x1D755, "M", "π"),
+ (0x1D756, "M", "α"),
+ (0x1D757, "M", "β"),
+ (0x1D758, "M", "γ"),
+ (0x1D759, "M", "δ"),
+ (0x1D75A, "M", "ε"),
+ (0x1D75B, "M", "ζ"),
+ (0x1D75C, "M", "η"),
+ (0x1D75D, "M", "θ"),
+ (0x1D75E, "M", "ι"),
+ (0x1D75F, "M", "κ"),
+ (0x1D760, "M", "λ"),
+ (0x1D761, "M", "μ"),
+ (0x1D762, "M", "ν"),
+ (0x1D763, "M", "ξ"),
+ (0x1D764, "M", "ο"),
+ (0x1D765, "M", "π"),
+ (0x1D766, "M", "ρ"),
+ (0x1D767, "M", "θ"),
+ (0x1D768, "M", "σ"),
+ (0x1D769, "M", "τ"),
+ (0x1D76A, "M", "υ"),
+ (0x1D76B, "M", "φ"),
+ (0x1D76C, "M", "χ"),
+ (0x1D76D, "M", "ψ"),
+ (0x1D76E, "M", "ω"),
+ (0x1D76F, "M", "∇"),
+ (0x1D770, "M", "α"),
+ (0x1D771, "M", "β"),
+ (0x1D772, "M", "γ"),
+ (0x1D773, "M", "δ"),
+ (0x1D774, "M", "ε"),
+ (0x1D775, "M", "ζ"),
+ (0x1D776, "M", "η"),
+ (0x1D777, "M", "θ"),
+ (0x1D778, "M", "ι"),
+ (0x1D779, "M", "κ"),
+ (0x1D77A, "M", "λ"),
+ (0x1D77B, "M", "μ"),
+ (0x1D77C, "M", "ν"),
+ (0x1D77D, "M", "ξ"),
+ (0x1D77E, "M", "ο"),
+ (0x1D77F, "M", "π"),
+ (0x1D780, "M", "ρ"),
+ (0x1D781, "M", "σ"),
+ (0x1D783, "M", "τ"),
+ (0x1D784, "M", "υ"),
+ (0x1D785, "M", "φ"),
+ (0x1D786, "M", "χ"),
+ (0x1D787, "M", "ψ"),
+ (0x1D788, "M", "ω"),
+ (0x1D789, "M", "∂"),
+ (0x1D78A, "M", "ε"),
+ (0x1D78B, "M", "θ"),
+ (0x1D78C, "M", "κ"),
+ (0x1D78D, "M", "φ"),
+ (0x1D78E, "M", "ρ"),
+ (0x1D78F, "M", "π"),
+ (0x1D790, "M", "α"),
+ (0x1D791, "M", "β"),
+ (0x1D792, "M", "γ"),
+ (0x1D793, "M", "δ"),
+ (0x1D794, "M", "ε"),
+ (0x1D795, "M", "ζ"),
+ (0x1D796, "M", "η"),
+ (0x1D797, "M", "θ"),
+ (0x1D798, "M", "ι"),
+ (0x1D799, "M", "κ"),
+ (0x1D79A, "M", "λ"),
+ (0x1D79B, "M", "μ"),
+ (0x1D79C, "M", "ν"),
+ (0x1D79D, "M", "ξ"),
+ (0x1D79E, "M", "ο"),
+ (0x1D79F, "M", "π"),
+ (0x1D7A0, "M", "ρ"),
+ (0x1D7A1, "M", "θ"),
+ (0x1D7A2, "M", "σ"),
+ (0x1D7A3, "M", "τ"),
+ (0x1D7A4, "M", "υ"),
+ (0x1D7A5, "M", "φ"),
+ (0x1D7A6, "M", "χ"),
+ (0x1D7A7, "M", "ψ"),
+ (0x1D7A8, "M", "ω"),
+ (0x1D7A9, "M", "∇"),
+ (0x1D7AA, "M", "α"),
+ (0x1D7AB, "M", "β"),
+ (0x1D7AC, "M", "γ"),
+ (0x1D7AD, "M", "δ"),
+ (0x1D7AE, "M", "ε"),
+ (0x1D7AF, "M", "ζ"),
+ (0x1D7B0, "M", "η"),
+ (0x1D7B1, "M", "θ"),
+ (0x1D7B2, "M", "ι"),
+ (0x1D7B3, "M", "κ"),
]
+
def _seg_70() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1D7B0, 'M', 'η'),
- (0x1D7B1, 'M', 'θ'),
- (0x1D7B2, 'M', 'ι'),
- (0x1D7B3, 'M', 'κ'),
- (0x1D7B4, 'M', 'λ'),
- (0x1D7B5, 'M', 'μ'),
- (0x1D7B6, 'M', 'ν'),
- (0x1D7B7, 'M', 'ξ'),
- (0x1D7B8, 'M', 'ο'),
- (0x1D7B9, 'M', 'π'),
- (0x1D7BA, 'M', 'ρ'),
- (0x1D7BB, 'M', 'σ'),
- (0x1D7BD, 'M', 'τ'),
- (0x1D7BE, 'M', 'υ'),
- (0x1D7BF, 'M', 'φ'),
- (0x1D7C0, 'M', 'χ'),
- (0x1D7C1, 'M', 'ψ'),
- (0x1D7C2, 'M', 'ω'),
- (0x1D7C3, 'M', '∂'),
- (0x1D7C4, 'M', 'ε'),
- (0x1D7C5, 'M', 'θ'),
- (0x1D7C6, 'M', 'κ'),
- (0x1D7C7, 'M', 'φ'),
- (0x1D7C8, 'M', 'ρ'),
- (0x1D7C9, 'M', 'π'),
- (0x1D7CA, 'M', 'ϝ'),
- (0x1D7CC, 'X'),
- (0x1D7CE, 'M', '0'),
- (0x1D7CF, 'M', '1'),
- (0x1D7D0, 'M', '2'),
- (0x1D7D1, 'M', '3'),
- (0x1D7D2, 'M', '4'),
- (0x1D7D3, 'M', '5'),
- (0x1D7D4, 'M', '6'),
- (0x1D7D5, 'M', '7'),
- (0x1D7D6, 'M', '8'),
- (0x1D7D7, 'M', '9'),
- (0x1D7D8, 'M', '0'),
- (0x1D7D9, 'M', '1'),
- (0x1D7DA, 'M', '2'),
- (0x1D7DB, 'M', '3'),
- (0x1D7DC, 'M', '4'),
- (0x1D7DD, 'M', '5'),
- (0x1D7DE, 'M', '6'),
- (0x1D7DF, 'M', '7'),
- (0x1D7E0, 'M', '8'),
- (0x1D7E1, 'M', '9'),
- (0x1D7E2, 'M', '0'),
- (0x1D7E3, 'M', '1'),
- (0x1D7E4, 'M', '2'),
- (0x1D7E5, 'M', '3'),
- (0x1D7E6, 'M', '4'),
- (0x1D7E7, 'M', '5'),
- (0x1D7E8, 'M', '6'),
- (0x1D7E9, 'M', '7'),
- (0x1D7EA, 'M', '8'),
- (0x1D7EB, 'M', '9'),
- (0x1D7EC, 'M', '0'),
- (0x1D7ED, 'M', '1'),
- (0x1D7EE, 'M', '2'),
- (0x1D7EF, 'M', '3'),
- (0x1D7F0, 'M', '4'),
- (0x1D7F1, 'M', '5'),
- (0x1D7F2, 'M', '6'),
- (0x1D7F3, 'M', '7'),
- (0x1D7F4, 'M', '8'),
- (0x1D7F5, 'M', '9'),
- (0x1D7F6, 'M', '0'),
- (0x1D7F7, 'M', '1'),
- (0x1D7F8, 'M', '2'),
- (0x1D7F9, 'M', '3'),
- (0x1D7FA, 'M', '4'),
- (0x1D7FB, 'M', '5'),
- (0x1D7FC, 'M', '6'),
- (0x1D7FD, 'M', '7'),
- (0x1D7FE, 'M', '8'),
- (0x1D7FF, 'M', '9'),
- (0x1D800, 'V'),
- (0x1DA8C, 'X'),
- (0x1DA9B, 'V'),
- (0x1DAA0, 'X'),
- (0x1DAA1, 'V'),
- (0x1DAB0, 'X'),
- (0x1DF00, 'V'),
- (0x1DF1F, 'X'),
- (0x1DF25, 'V'),
- (0x1DF2B, 'X'),
- (0x1E000, 'V'),
- (0x1E007, 'X'),
- (0x1E008, 'V'),
- (0x1E019, 'X'),
- (0x1E01B, 'V'),
- (0x1E022, 'X'),
- (0x1E023, 'V'),
- (0x1E025, 'X'),
- (0x1E026, 'V'),
- (0x1E02B, 'X'),
- (0x1E030, 'M', 'а'),
- (0x1E031, 'M', 'б'),
- (0x1E032, 'M', 'в'),
+ (0x1D7B4, "M", "λ"),
+ (0x1D7B5, "M", "μ"),
+ (0x1D7B6, "M", "ν"),
+ (0x1D7B7, "M", "ξ"),
+ (0x1D7B8, "M", "ο"),
+ (0x1D7B9, "M", "π"),
+ (0x1D7BA, "M", "ρ"),
+ (0x1D7BB, "M", "σ"),
+ (0x1D7BD, "M", "τ"),
+ (0x1D7BE, "M", "υ"),
+ (0x1D7BF, "M", "φ"),
+ (0x1D7C0, "M", "χ"),
+ (0x1D7C1, "M", "ψ"),
+ (0x1D7C2, "M", "ω"),
+ (0x1D7C3, "M", "∂"),
+ (0x1D7C4, "M", "ε"),
+ (0x1D7C5, "M", "θ"),
+ (0x1D7C6, "M", "κ"),
+ (0x1D7C7, "M", "φ"),
+ (0x1D7C8, "M", "ρ"),
+ (0x1D7C9, "M", "π"),
+ (0x1D7CA, "M", "ϝ"),
+ (0x1D7CC, "X"),
+ (0x1D7CE, "M", "0"),
+ (0x1D7CF, "M", "1"),
+ (0x1D7D0, "M", "2"),
+ (0x1D7D1, "M", "3"),
+ (0x1D7D2, "M", "4"),
+ (0x1D7D3, "M", "5"),
+ (0x1D7D4, "M", "6"),
+ (0x1D7D5, "M", "7"),
+ (0x1D7D6, "M", "8"),
+ (0x1D7D7, "M", "9"),
+ (0x1D7D8, "M", "0"),
+ (0x1D7D9, "M", "1"),
+ (0x1D7DA, "M", "2"),
+ (0x1D7DB, "M", "3"),
+ (0x1D7DC, "M", "4"),
+ (0x1D7DD, "M", "5"),
+ (0x1D7DE, "M", "6"),
+ (0x1D7DF, "M", "7"),
+ (0x1D7E0, "M", "8"),
+ (0x1D7E1, "M", "9"),
+ (0x1D7E2, "M", "0"),
+ (0x1D7E3, "M", "1"),
+ (0x1D7E4, "M", "2"),
+ (0x1D7E5, "M", "3"),
+ (0x1D7E6, "M", "4"),
+ (0x1D7E7, "M", "5"),
+ (0x1D7E8, "M", "6"),
+ (0x1D7E9, "M", "7"),
+ (0x1D7EA, "M", "8"),
+ (0x1D7EB, "M", "9"),
+ (0x1D7EC, "M", "0"),
+ (0x1D7ED, "M", "1"),
+ (0x1D7EE, "M", "2"),
+ (0x1D7EF, "M", "3"),
+ (0x1D7F0, "M", "4"),
+ (0x1D7F1, "M", "5"),
+ (0x1D7F2, "M", "6"),
+ (0x1D7F3, "M", "7"),
+ (0x1D7F4, "M", "8"),
+ (0x1D7F5, "M", "9"),
+ (0x1D7F6, "M", "0"),
+ (0x1D7F7, "M", "1"),
+ (0x1D7F8, "M", "2"),
+ (0x1D7F9, "M", "3"),
+ (0x1D7FA, "M", "4"),
+ (0x1D7FB, "M", "5"),
+ (0x1D7FC, "M", "6"),
+ (0x1D7FD, "M", "7"),
+ (0x1D7FE, "M", "8"),
+ (0x1D7FF, "M", "9"),
+ (0x1D800, "V"),
+ (0x1DA8C, "X"),
+ (0x1DA9B, "V"),
+ (0x1DAA0, "X"),
+ (0x1DAA1, "V"),
+ (0x1DAB0, "X"),
+ (0x1DF00, "V"),
+ (0x1DF1F, "X"),
+ (0x1DF25, "V"),
+ (0x1DF2B, "X"),
+ (0x1E000, "V"),
+ (0x1E007, "X"),
+ (0x1E008, "V"),
+ (0x1E019, "X"),
+ (0x1E01B, "V"),
+ (0x1E022, "X"),
+ (0x1E023, "V"),
+ (0x1E025, "X"),
+ (0x1E026, "V"),
+ (0x1E02B, "X"),
+ (0x1E030, "M", "а"),
+ (0x1E031, "M", "б"),
+ (0x1E032, "M", "в"),
+ (0x1E033, "M", "г"),
+ (0x1E034, "M", "д"),
+ (0x1E035, "M", "е"),
+ (0x1E036, "M", "ж"),
]
+
def _seg_71() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E033, 'M', 'г'),
- (0x1E034, 'M', 'д'),
- (0x1E035, 'M', 'е'),
- (0x1E036, 'M', 'ж'),
- (0x1E037, 'M', 'з'),
- (0x1E038, 'M', 'и'),
- (0x1E039, 'M', 'к'),
- (0x1E03A, 'M', 'л'),
- (0x1E03B, 'M', 'м'),
- (0x1E03C, 'M', 'о'),
- (0x1E03D, 'M', 'п'),
- (0x1E03E, 'M', 'р'),
- (0x1E03F, 'M', 'с'),
- (0x1E040, 'M', 'т'),
- (0x1E041, 'M', 'у'),
- (0x1E042, 'M', 'ф'),
- (0x1E043, 'M', 'х'),
- (0x1E044, 'M', 'ц'),
- (0x1E045, 'M', 'ч'),
- (0x1E046, 'M', 'ш'),
- (0x1E047, 'M', 'ы'),
- (0x1E048, 'M', 'э'),
- (0x1E049, 'M', 'ю'),
- (0x1E04A, 'M', 'ꚉ'),
- (0x1E04B, 'M', 'ә'),
- (0x1E04C, 'M', 'і'),
- (0x1E04D, 'M', 'ј'),
- (0x1E04E, 'M', 'ө'),
- (0x1E04F, 'M', 'ү'),
- (0x1E050, 'M', 'ӏ'),
- (0x1E051, 'M', 'а'),
- (0x1E052, 'M', 'б'),
- (0x1E053, 'M', 'в'),
- (0x1E054, 'M', 'г'),
- (0x1E055, 'M', 'д'),
- (0x1E056, 'M', 'е'),
- (0x1E057, 'M', 'ж'),
- (0x1E058, 'M', 'з'),
- (0x1E059, 'M', 'и'),
- (0x1E05A, 'M', 'к'),
- (0x1E05B, 'M', 'л'),
- (0x1E05C, 'M', 'о'),
- (0x1E05D, 'M', 'п'),
- (0x1E05E, 'M', 'с'),
- (0x1E05F, 'M', 'у'),
- (0x1E060, 'M', 'ф'),
- (0x1E061, 'M', 'х'),
- (0x1E062, 'M', 'ц'),
- (0x1E063, 'M', 'ч'),
- (0x1E064, 'M', 'ш'),
- (0x1E065, 'M', 'ъ'),
- (0x1E066, 'M', 'ы'),
- (0x1E067, 'M', 'ґ'),
- (0x1E068, 'M', 'і'),
- (0x1E069, 'M', 'ѕ'),
- (0x1E06A, 'M', 'џ'),
- (0x1E06B, 'M', 'ҫ'),
- (0x1E06C, 'M', 'ꙑ'),
- (0x1E06D, 'M', 'ұ'),
- (0x1E06E, 'X'),
- (0x1E08F, 'V'),
- (0x1E090, 'X'),
- (0x1E100, 'V'),
- (0x1E12D, 'X'),
- (0x1E130, 'V'),
- (0x1E13E, 'X'),
- (0x1E140, 'V'),
- (0x1E14A, 'X'),
- (0x1E14E, 'V'),
- (0x1E150, 'X'),
- (0x1E290, 'V'),
- (0x1E2AF, 'X'),
- (0x1E2C0, 'V'),
- (0x1E2FA, 'X'),
- (0x1E2FF, 'V'),
- (0x1E300, 'X'),
- (0x1E4D0, 'V'),
- (0x1E4FA, 'X'),
- (0x1E7E0, 'V'),
- (0x1E7E7, 'X'),
- (0x1E7E8, 'V'),
- (0x1E7EC, 'X'),
- (0x1E7ED, 'V'),
- (0x1E7EF, 'X'),
- (0x1E7F0, 'V'),
- (0x1E7FF, 'X'),
- (0x1E800, 'V'),
- (0x1E8C5, 'X'),
- (0x1E8C7, 'V'),
- (0x1E8D7, 'X'),
- (0x1E900, 'M', '𞤢'),
- (0x1E901, 'M', '𞤣'),
- (0x1E902, 'M', '𞤤'),
- (0x1E903, 'M', '𞤥'),
- (0x1E904, 'M', '𞤦'),
- (0x1E905, 'M', '𞤧'),
- (0x1E906, 'M', '𞤨'),
- (0x1E907, 'M', '𞤩'),
- (0x1E908, 'M', '𞤪'),
- (0x1E909, 'M', '𞤫'),
+ (0x1E037, "M", "з"),
+ (0x1E038, "M", "и"),
+ (0x1E039, "M", "к"),
+ (0x1E03A, "M", "л"),
+ (0x1E03B, "M", "м"),
+ (0x1E03C, "M", "о"),
+ (0x1E03D, "M", "п"),
+ (0x1E03E, "M", "р"),
+ (0x1E03F, "M", "с"),
+ (0x1E040, "M", "т"),
+ (0x1E041, "M", "у"),
+ (0x1E042, "M", "ф"),
+ (0x1E043, "M", "х"),
+ (0x1E044, "M", "ц"),
+ (0x1E045, "M", "ч"),
+ (0x1E046, "M", "ш"),
+ (0x1E047, "M", "ы"),
+ (0x1E048, "M", "э"),
+ (0x1E049, "M", "ю"),
+ (0x1E04A, "M", "ꚉ"),
+ (0x1E04B, "M", "ә"),
+ (0x1E04C, "M", "і"),
+ (0x1E04D, "M", "ј"),
+ (0x1E04E, "M", "ө"),
+ (0x1E04F, "M", "ү"),
+ (0x1E050, "M", "ӏ"),
+ (0x1E051, "M", "а"),
+ (0x1E052, "M", "б"),
+ (0x1E053, "M", "в"),
+ (0x1E054, "M", "г"),
+ (0x1E055, "M", "д"),
+ (0x1E056, "M", "е"),
+ (0x1E057, "M", "ж"),
+ (0x1E058, "M", "з"),
+ (0x1E059, "M", "и"),
+ (0x1E05A, "M", "к"),
+ (0x1E05B, "M", "л"),
+ (0x1E05C, "M", "о"),
+ (0x1E05D, "M", "п"),
+ (0x1E05E, "M", "с"),
+ (0x1E05F, "M", "у"),
+ (0x1E060, "M", "ф"),
+ (0x1E061, "M", "х"),
+ (0x1E062, "M", "ц"),
+ (0x1E063, "M", "ч"),
+ (0x1E064, "M", "ш"),
+ (0x1E065, "M", "ъ"),
+ (0x1E066, "M", "ы"),
+ (0x1E067, "M", "ґ"),
+ (0x1E068, "M", "і"),
+ (0x1E069, "M", "ѕ"),
+ (0x1E06A, "M", "џ"),
+ (0x1E06B, "M", "ҫ"),
+ (0x1E06C, "M", "ꙑ"),
+ (0x1E06D, "M", "ұ"),
+ (0x1E06E, "X"),
+ (0x1E08F, "V"),
+ (0x1E090, "X"),
+ (0x1E100, "V"),
+ (0x1E12D, "X"),
+ (0x1E130, "V"),
+ (0x1E13E, "X"),
+ (0x1E140, "V"),
+ (0x1E14A, "X"),
+ (0x1E14E, "V"),
+ (0x1E150, "X"),
+ (0x1E290, "V"),
+ (0x1E2AF, "X"),
+ (0x1E2C0, "V"),
+ (0x1E2FA, "X"),
+ (0x1E2FF, "V"),
+ (0x1E300, "X"),
+ (0x1E4D0, "V"),
+ (0x1E4FA, "X"),
+ (0x1E7E0, "V"),
+ (0x1E7E7, "X"),
+ (0x1E7E8, "V"),
+ (0x1E7EC, "X"),
+ (0x1E7ED, "V"),
+ (0x1E7EF, "X"),
+ (0x1E7F0, "V"),
+ (0x1E7FF, "X"),
+ (0x1E800, "V"),
+ (0x1E8C5, "X"),
+ (0x1E8C7, "V"),
+ (0x1E8D7, "X"),
+ (0x1E900, "M", "𞤢"),
+ (0x1E901, "M", "𞤣"),
+ (0x1E902, "M", "𞤤"),
+ (0x1E903, "M", "𞤥"),
+ (0x1E904, "M", "𞤦"),
+ (0x1E905, "M", "𞤧"),
+ (0x1E906, "M", "𞤨"),
+ (0x1E907, "M", "𞤩"),
+ (0x1E908, "M", "𞤪"),
+ (0x1E909, "M", "𞤫"),
+ (0x1E90A, "M", "𞤬"),
+ (0x1E90B, "M", "𞤭"),
+ (0x1E90C, "M", "𞤮"),
+ (0x1E90D, "M", "𞤯"),
]
+
def _seg_72() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1E90A, 'M', '𞤬'),
- (0x1E90B, 'M', '𞤭'),
- (0x1E90C, 'M', '𞤮'),
- (0x1E90D, 'M', '𞤯'),
- (0x1E90E, 'M', '𞤰'),
- (0x1E90F, 'M', '𞤱'),
- (0x1E910, 'M', '𞤲'),
- (0x1E911, 'M', '𞤳'),
- (0x1E912, 'M', '𞤴'),
- (0x1E913, 'M', '𞤵'),
- (0x1E914, 'M', '𞤶'),
- (0x1E915, 'M', '𞤷'),
- (0x1E916, 'M', '𞤸'),
- (0x1E917, 'M', '𞤹'),
- (0x1E918, 'M', '𞤺'),
- (0x1E919, 'M', '𞤻'),
- (0x1E91A, 'M', '𞤼'),
- (0x1E91B, 'M', '𞤽'),
- (0x1E91C, 'M', '𞤾'),
- (0x1E91D, 'M', '𞤿'),
- (0x1E91E, 'M', '𞥀'),
- (0x1E91F, 'M', '𞥁'),
- (0x1E920, 'M', '𞥂'),
- (0x1E921, 'M', '𞥃'),
- (0x1E922, 'V'),
- (0x1E94C, 'X'),
- (0x1E950, 'V'),
- (0x1E95A, 'X'),
- (0x1E95E, 'V'),
- (0x1E960, 'X'),
- (0x1EC71, 'V'),
- (0x1ECB5, 'X'),
- (0x1ED01, 'V'),
- (0x1ED3E, 'X'),
- (0x1EE00, 'M', 'ا'),
- (0x1EE01, 'M', 'ب'),
- (0x1EE02, 'M', 'ج'),
- (0x1EE03, 'M', 'د'),
- (0x1EE04, 'X'),
- (0x1EE05, 'M', 'و'),
- (0x1EE06, 'M', 'ز'),
- (0x1EE07, 'M', 'ح'),
- (0x1EE08, 'M', 'ط'),
- (0x1EE09, 'M', 'ي'),
- (0x1EE0A, 'M', 'ك'),
- (0x1EE0B, 'M', 'ل'),
- (0x1EE0C, 'M', 'م'),
- (0x1EE0D, 'M', 'ن'),
- (0x1EE0E, 'M', 'س'),
- (0x1EE0F, 'M', 'ع'),
- (0x1EE10, 'M', 'ف'),
- (0x1EE11, 'M', 'ص'),
- (0x1EE12, 'M', 'ق'),
- (0x1EE13, 'M', 'ر'),
- (0x1EE14, 'M', 'ش'),
- (0x1EE15, 'M', 'ت'),
- (0x1EE16, 'M', 'ث'),
- (0x1EE17, 'M', 'خ'),
- (0x1EE18, 'M', 'ذ'),
- (0x1EE19, 'M', 'ض'),
- (0x1EE1A, 'M', 'ظ'),
- (0x1EE1B, 'M', 'غ'),
- (0x1EE1C, 'M', 'ٮ'),
- (0x1EE1D, 'M', 'ں'),
- (0x1EE1E, 'M', 'ڡ'),
- (0x1EE1F, 'M', 'ٯ'),
- (0x1EE20, 'X'),
- (0x1EE21, 'M', 'ب'),
- (0x1EE22, 'M', 'ج'),
- (0x1EE23, 'X'),
- (0x1EE24, 'M', 'ه'),
- (0x1EE25, 'X'),
- (0x1EE27, 'M', 'ح'),
- (0x1EE28, 'X'),
- (0x1EE29, 'M', 'ي'),
- (0x1EE2A, 'M', 'ك'),
- (0x1EE2B, 'M', 'ل'),
- (0x1EE2C, 'M', 'م'),
- (0x1EE2D, 'M', 'ن'),
- (0x1EE2E, 'M', 'س'),
- (0x1EE2F, 'M', 'ع'),
- (0x1EE30, 'M', 'ف'),
- (0x1EE31, 'M', 'ص'),
- (0x1EE32, 'M', 'ق'),
- (0x1EE33, 'X'),
- (0x1EE34, 'M', 'ش'),
- (0x1EE35, 'M', 'ت'),
- (0x1EE36, 'M', 'ث'),
- (0x1EE37, 'M', 'خ'),
- (0x1EE38, 'X'),
- (0x1EE39, 'M', 'ض'),
- (0x1EE3A, 'X'),
- (0x1EE3B, 'M', 'غ'),
- (0x1EE3C, 'X'),
- (0x1EE42, 'M', 'ج'),
- (0x1EE43, 'X'),
- (0x1EE47, 'M', 'ح'),
- (0x1EE48, 'X'),
- (0x1EE49, 'M', 'ي'),
- (0x1EE4A, 'X'),
+ (0x1E90E, "M", "𞤰"),
+ (0x1E90F, "M", "𞤱"),
+ (0x1E910, "M", "𞤲"),
+ (0x1E911, "M", "𞤳"),
+ (0x1E912, "M", "𞤴"),
+ (0x1E913, "M", "𞤵"),
+ (0x1E914, "M", "𞤶"),
+ (0x1E915, "M", "𞤷"),
+ (0x1E916, "M", "𞤸"),
+ (0x1E917, "M", "𞤹"),
+ (0x1E918, "M", "𞤺"),
+ (0x1E919, "M", "𞤻"),
+ (0x1E91A, "M", "𞤼"),
+ (0x1E91B, "M", "𞤽"),
+ (0x1E91C, "M", "𞤾"),
+ (0x1E91D, "M", "𞤿"),
+ (0x1E91E, "M", "𞥀"),
+ (0x1E91F, "M", "𞥁"),
+ (0x1E920, "M", "𞥂"),
+ (0x1E921, "M", "𞥃"),
+ (0x1E922, "V"),
+ (0x1E94C, "X"),
+ (0x1E950, "V"),
+ (0x1E95A, "X"),
+ (0x1E95E, "V"),
+ (0x1E960, "X"),
+ (0x1EC71, "V"),
+ (0x1ECB5, "X"),
+ (0x1ED01, "V"),
+ (0x1ED3E, "X"),
+ (0x1EE00, "M", "ا"),
+ (0x1EE01, "M", "ب"),
+ (0x1EE02, "M", "ج"),
+ (0x1EE03, "M", "د"),
+ (0x1EE04, "X"),
+ (0x1EE05, "M", "و"),
+ (0x1EE06, "M", "ز"),
+ (0x1EE07, "M", "ح"),
+ (0x1EE08, "M", "ط"),
+ (0x1EE09, "M", "ي"),
+ (0x1EE0A, "M", "ك"),
+ (0x1EE0B, "M", "ل"),
+ (0x1EE0C, "M", "م"),
+ (0x1EE0D, "M", "ن"),
+ (0x1EE0E, "M", "س"),
+ (0x1EE0F, "M", "ع"),
+ (0x1EE10, "M", "ف"),
+ (0x1EE11, "M", "ص"),
+ (0x1EE12, "M", "ق"),
+ (0x1EE13, "M", "ر"),
+ (0x1EE14, "M", "ش"),
+ (0x1EE15, "M", "ت"),
+ (0x1EE16, "M", "ث"),
+ (0x1EE17, "M", "خ"),
+ (0x1EE18, "M", "ذ"),
+ (0x1EE19, "M", "ض"),
+ (0x1EE1A, "M", "ظ"),
+ (0x1EE1B, "M", "غ"),
+ (0x1EE1C, "M", "ٮ"),
+ (0x1EE1D, "M", "ں"),
+ (0x1EE1E, "M", "ڡ"),
+ (0x1EE1F, "M", "ٯ"),
+ (0x1EE20, "X"),
+ (0x1EE21, "M", "ب"),
+ (0x1EE22, "M", "ج"),
+ (0x1EE23, "X"),
+ (0x1EE24, "M", "ه"),
+ (0x1EE25, "X"),
+ (0x1EE27, "M", "ح"),
+ (0x1EE28, "X"),
+ (0x1EE29, "M", "ي"),
+ (0x1EE2A, "M", "ك"),
+ (0x1EE2B, "M", "ل"),
+ (0x1EE2C, "M", "م"),
+ (0x1EE2D, "M", "ن"),
+ (0x1EE2E, "M", "س"),
+ (0x1EE2F, "M", "ع"),
+ (0x1EE30, "M", "ف"),
+ (0x1EE31, "M", "ص"),
+ (0x1EE32, "M", "ق"),
+ (0x1EE33, "X"),
+ (0x1EE34, "M", "ش"),
+ (0x1EE35, "M", "ت"),
+ (0x1EE36, "M", "ث"),
+ (0x1EE37, "M", "خ"),
+ (0x1EE38, "X"),
+ (0x1EE39, "M", "ض"),
+ (0x1EE3A, "X"),
+ (0x1EE3B, "M", "غ"),
+ (0x1EE3C, "X"),
+ (0x1EE42, "M", "ج"),
+ (0x1EE43, "X"),
+ (0x1EE47, "M", "ح"),
+ (0x1EE48, "X"),
+ (0x1EE49, "M", "ي"),
+ (0x1EE4A, "X"),
+ (0x1EE4B, "M", "ل"),
+ (0x1EE4C, "X"),
+ (0x1EE4D, "M", "ن"),
+ (0x1EE4E, "M", "س"),
]
+
def _seg_73() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EE4B, 'M', 'ل'),
- (0x1EE4C, 'X'),
- (0x1EE4D, 'M', 'ن'),
- (0x1EE4E, 'M', 'س'),
- (0x1EE4F, 'M', 'ع'),
- (0x1EE50, 'X'),
- (0x1EE51, 'M', 'ص'),
- (0x1EE52, 'M', 'ق'),
- (0x1EE53, 'X'),
- (0x1EE54, 'M', 'ش'),
- (0x1EE55, 'X'),
- (0x1EE57, 'M', 'خ'),
- (0x1EE58, 'X'),
- (0x1EE59, 'M', 'ض'),
- (0x1EE5A, 'X'),
- (0x1EE5B, 'M', 'غ'),
- (0x1EE5C, 'X'),
- (0x1EE5D, 'M', 'ں'),
- (0x1EE5E, 'X'),
- (0x1EE5F, 'M', 'ٯ'),
- (0x1EE60, 'X'),
- (0x1EE61, 'M', 'ب'),
- (0x1EE62, 'M', 'ج'),
- (0x1EE63, 'X'),
- (0x1EE64, 'M', 'ه'),
- (0x1EE65, 'X'),
- (0x1EE67, 'M', 'ح'),
- (0x1EE68, 'M', 'ط'),
- (0x1EE69, 'M', 'ي'),
- (0x1EE6A, 'M', 'ك'),
- (0x1EE6B, 'X'),
- (0x1EE6C, 'M', 'م'),
- (0x1EE6D, 'M', 'ن'),
- (0x1EE6E, 'M', 'س'),
- (0x1EE6F, 'M', 'ع'),
- (0x1EE70, 'M', 'ف'),
- (0x1EE71, 'M', 'ص'),
- (0x1EE72, 'M', 'ق'),
- (0x1EE73, 'X'),
- (0x1EE74, 'M', 'ش'),
- (0x1EE75, 'M', 'ت'),
- (0x1EE76, 'M', 'ث'),
- (0x1EE77, 'M', 'خ'),
- (0x1EE78, 'X'),
- (0x1EE79, 'M', 'ض'),
- (0x1EE7A, 'M', 'ظ'),
- (0x1EE7B, 'M', 'غ'),
- (0x1EE7C, 'M', 'ٮ'),
- (0x1EE7D, 'X'),
- (0x1EE7E, 'M', 'ڡ'),
- (0x1EE7F, 'X'),
- (0x1EE80, 'M', 'ا'),
- (0x1EE81, 'M', 'ب'),
- (0x1EE82, 'M', 'ج'),
- (0x1EE83, 'M', 'د'),
- (0x1EE84, 'M', 'ه'),
- (0x1EE85, 'M', 'و'),
- (0x1EE86, 'M', 'ز'),
- (0x1EE87, 'M', 'ح'),
- (0x1EE88, 'M', 'ط'),
- (0x1EE89, 'M', 'ي'),
- (0x1EE8A, 'X'),
- (0x1EE8B, 'M', 'ل'),
- (0x1EE8C, 'M', 'م'),
- (0x1EE8D, 'M', 'ن'),
- (0x1EE8E, 'M', 'س'),
- (0x1EE8F, 'M', 'ع'),
- (0x1EE90, 'M', 'ف'),
- (0x1EE91, 'M', 'ص'),
- (0x1EE92, 'M', 'ق'),
- (0x1EE93, 'M', 'ر'),
- (0x1EE94, 'M', 'ش'),
- (0x1EE95, 'M', 'ت'),
- (0x1EE96, 'M', 'ث'),
- (0x1EE97, 'M', 'خ'),
- (0x1EE98, 'M', 'ذ'),
- (0x1EE99, 'M', 'ض'),
- (0x1EE9A, 'M', 'ظ'),
- (0x1EE9B, 'M', 'غ'),
- (0x1EE9C, 'X'),
- (0x1EEA1, 'M', 'ب'),
- (0x1EEA2, 'M', 'ج'),
- (0x1EEA3, 'M', 'د'),
- (0x1EEA4, 'X'),
- (0x1EEA5, 'M', 'و'),
- (0x1EEA6, 'M', 'ز'),
- (0x1EEA7, 'M', 'ح'),
- (0x1EEA8, 'M', 'ط'),
- (0x1EEA9, 'M', 'ي'),
- (0x1EEAA, 'X'),
- (0x1EEAB, 'M', 'ل'),
- (0x1EEAC, 'M', 'م'),
- (0x1EEAD, 'M', 'ن'),
- (0x1EEAE, 'M', 'س'),
- (0x1EEAF, 'M', 'ع'),
- (0x1EEB0, 'M', 'ف'),
- (0x1EEB1, 'M', 'ص'),
- (0x1EEB2, 'M', 'ق'),
- (0x1EEB3, 'M', 'ر'),
- (0x1EEB4, 'M', 'ش'),
+ (0x1EE4F, "M", "ع"),
+ (0x1EE50, "X"),
+ (0x1EE51, "M", "ص"),
+ (0x1EE52, "M", "ق"),
+ (0x1EE53, "X"),
+ (0x1EE54, "M", "ش"),
+ (0x1EE55, "X"),
+ (0x1EE57, "M", "خ"),
+ (0x1EE58, "X"),
+ (0x1EE59, "M", "ض"),
+ (0x1EE5A, "X"),
+ (0x1EE5B, "M", "غ"),
+ (0x1EE5C, "X"),
+ (0x1EE5D, "M", "ں"),
+ (0x1EE5E, "X"),
+ (0x1EE5F, "M", "ٯ"),
+ (0x1EE60, "X"),
+ (0x1EE61, "M", "ب"),
+ (0x1EE62, "M", "ج"),
+ (0x1EE63, "X"),
+ (0x1EE64, "M", "ه"),
+ (0x1EE65, "X"),
+ (0x1EE67, "M", "ح"),
+ (0x1EE68, "M", "ط"),
+ (0x1EE69, "M", "ي"),
+ (0x1EE6A, "M", "ك"),
+ (0x1EE6B, "X"),
+ (0x1EE6C, "M", "م"),
+ (0x1EE6D, "M", "ن"),
+ (0x1EE6E, "M", "س"),
+ (0x1EE6F, "M", "ع"),
+ (0x1EE70, "M", "ف"),
+ (0x1EE71, "M", "ص"),
+ (0x1EE72, "M", "ق"),
+ (0x1EE73, "X"),
+ (0x1EE74, "M", "ش"),
+ (0x1EE75, "M", "ت"),
+ (0x1EE76, "M", "ث"),
+ (0x1EE77, "M", "خ"),
+ (0x1EE78, "X"),
+ (0x1EE79, "M", "ض"),
+ (0x1EE7A, "M", "ظ"),
+ (0x1EE7B, "M", "غ"),
+ (0x1EE7C, "M", "ٮ"),
+ (0x1EE7D, "X"),
+ (0x1EE7E, "M", "ڡ"),
+ (0x1EE7F, "X"),
+ (0x1EE80, "M", "ا"),
+ (0x1EE81, "M", "ب"),
+ (0x1EE82, "M", "ج"),
+ (0x1EE83, "M", "د"),
+ (0x1EE84, "M", "ه"),
+ (0x1EE85, "M", "و"),
+ (0x1EE86, "M", "ز"),
+ (0x1EE87, "M", "ح"),
+ (0x1EE88, "M", "ط"),
+ (0x1EE89, "M", "ي"),
+ (0x1EE8A, "X"),
+ (0x1EE8B, "M", "ل"),
+ (0x1EE8C, "M", "م"),
+ (0x1EE8D, "M", "ن"),
+ (0x1EE8E, "M", "س"),
+ (0x1EE8F, "M", "ع"),
+ (0x1EE90, "M", "ف"),
+ (0x1EE91, "M", "ص"),
+ (0x1EE92, "M", "ق"),
+ (0x1EE93, "M", "ر"),
+ (0x1EE94, "M", "ش"),
+ (0x1EE95, "M", "ت"),
+ (0x1EE96, "M", "ث"),
+ (0x1EE97, "M", "خ"),
+ (0x1EE98, "M", "ذ"),
+ (0x1EE99, "M", "ض"),
+ (0x1EE9A, "M", "ظ"),
+ (0x1EE9B, "M", "غ"),
+ (0x1EE9C, "X"),
+ (0x1EEA1, "M", "ب"),
+ (0x1EEA2, "M", "ج"),
+ (0x1EEA3, "M", "د"),
+ (0x1EEA4, "X"),
+ (0x1EEA5, "M", "و"),
+ (0x1EEA6, "M", "ز"),
+ (0x1EEA7, "M", "ح"),
+ (0x1EEA8, "M", "ط"),
+ (0x1EEA9, "M", "ي"),
+ (0x1EEAA, "X"),
+ (0x1EEAB, "M", "ل"),
+ (0x1EEAC, "M", "م"),
+ (0x1EEAD, "M", "ن"),
+ (0x1EEAE, "M", "س"),
+ (0x1EEAF, "M", "ع"),
+ (0x1EEB0, "M", "ف"),
+ (0x1EEB1, "M", "ص"),
+ (0x1EEB2, "M", "ق"),
+ (0x1EEB3, "M", "ر"),
+ (0x1EEB4, "M", "ش"),
+ (0x1EEB5, "M", "ت"),
+ (0x1EEB6, "M", "ث"),
+ (0x1EEB7, "M", "خ"),
+ (0x1EEB8, "M", "ذ"),
]
+
def _seg_74() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1EEB5, 'M', 'ت'),
- (0x1EEB6, 'M', 'ث'),
- (0x1EEB7, 'M', 'خ'),
- (0x1EEB8, 'M', 'ذ'),
- (0x1EEB9, 'M', 'ض'),
- (0x1EEBA, 'M', 'ظ'),
- (0x1EEBB, 'M', 'غ'),
- (0x1EEBC, 'X'),
- (0x1EEF0, 'V'),
- (0x1EEF2, 'X'),
- (0x1F000, 'V'),
- (0x1F02C, 'X'),
- (0x1F030, 'V'),
- (0x1F094, 'X'),
- (0x1F0A0, 'V'),
- (0x1F0AF, 'X'),
- (0x1F0B1, 'V'),
- (0x1F0C0, 'X'),
- (0x1F0C1, 'V'),
- (0x1F0D0, 'X'),
- (0x1F0D1, 'V'),
- (0x1F0F6, 'X'),
- (0x1F101, '3', '0,'),
- (0x1F102, '3', '1,'),
- (0x1F103, '3', '2,'),
- (0x1F104, '3', '3,'),
- (0x1F105, '3', '4,'),
- (0x1F106, '3', '5,'),
- (0x1F107, '3', '6,'),
- (0x1F108, '3', '7,'),
- (0x1F109, '3', '8,'),
- (0x1F10A, '3', '9,'),
- (0x1F10B, 'V'),
- (0x1F110, '3', '(a)'),
- (0x1F111, '3', '(b)'),
- (0x1F112, '3', '(c)'),
- (0x1F113, '3', '(d)'),
- (0x1F114, '3', '(e)'),
- (0x1F115, '3', '(f)'),
- (0x1F116, '3', '(g)'),
- (0x1F117, '3', '(h)'),
- (0x1F118, '3', '(i)'),
- (0x1F119, '3', '(j)'),
- (0x1F11A, '3', '(k)'),
- (0x1F11B, '3', '(l)'),
- (0x1F11C, '3', '(m)'),
- (0x1F11D, '3', '(n)'),
- (0x1F11E, '3', '(o)'),
- (0x1F11F, '3', '(p)'),
- (0x1F120, '3', '(q)'),
- (0x1F121, '3', '(r)'),
- (0x1F122, '3', '(s)'),
- (0x1F123, '3', '(t)'),
- (0x1F124, '3', '(u)'),
- (0x1F125, '3', '(v)'),
- (0x1F126, '3', '(w)'),
- (0x1F127, '3', '(x)'),
- (0x1F128, '3', '(y)'),
- (0x1F129, '3', '(z)'),
- (0x1F12A, 'M', '〔s〕'),
- (0x1F12B, 'M', 'c'),
- (0x1F12C, 'M', 'r'),
- (0x1F12D, 'M', 'cd'),
- (0x1F12E, 'M', 'wz'),
- (0x1F12F, 'V'),
- (0x1F130, 'M', 'a'),
- (0x1F131, 'M', 'b'),
- (0x1F132, 'M', 'c'),
- (0x1F133, 'M', 'd'),
- (0x1F134, 'M', 'e'),
- (0x1F135, 'M', 'f'),
- (0x1F136, 'M', 'g'),
- (0x1F137, 'M', 'h'),
- (0x1F138, 'M', 'i'),
- (0x1F139, 'M', 'j'),
- (0x1F13A, 'M', 'k'),
- (0x1F13B, 'M', 'l'),
- (0x1F13C, 'M', 'm'),
- (0x1F13D, 'M', 'n'),
- (0x1F13E, 'M', 'o'),
- (0x1F13F, 'M', 'p'),
- (0x1F140, 'M', 'q'),
- (0x1F141, 'M', 'r'),
- (0x1F142, 'M', 's'),
- (0x1F143, 'M', 't'),
- (0x1F144, 'M', 'u'),
- (0x1F145, 'M', 'v'),
- (0x1F146, 'M', 'w'),
- (0x1F147, 'M', 'x'),
- (0x1F148, 'M', 'y'),
- (0x1F149, 'M', 'z'),
- (0x1F14A, 'M', 'hv'),
- (0x1F14B, 'M', 'mv'),
- (0x1F14C, 'M', 'sd'),
- (0x1F14D, 'M', 'ss'),
- (0x1F14E, 'M', 'ppv'),
- (0x1F14F, 'M', 'wc'),
- (0x1F150, 'V'),
- (0x1F16A, 'M', 'mc'),
- (0x1F16B, 'M', 'md'),
+ (0x1EEB9, "M", "ض"),
+ (0x1EEBA, "M", "ظ"),
+ (0x1EEBB, "M", "غ"),
+ (0x1EEBC, "X"),
+ (0x1EEF0, "V"),
+ (0x1EEF2, "X"),
+ (0x1F000, "V"),
+ (0x1F02C, "X"),
+ (0x1F030, "V"),
+ (0x1F094, "X"),
+ (0x1F0A0, "V"),
+ (0x1F0AF, "X"),
+ (0x1F0B1, "V"),
+ (0x1F0C0, "X"),
+ (0x1F0C1, "V"),
+ (0x1F0D0, "X"),
+ (0x1F0D1, "V"),
+ (0x1F0F6, "X"),
+ (0x1F101, "3", "0,"),
+ (0x1F102, "3", "1,"),
+ (0x1F103, "3", "2,"),
+ (0x1F104, "3", "3,"),
+ (0x1F105, "3", "4,"),
+ (0x1F106, "3", "5,"),
+ (0x1F107, "3", "6,"),
+ (0x1F108, "3", "7,"),
+ (0x1F109, "3", "8,"),
+ (0x1F10A, "3", "9,"),
+ (0x1F10B, "V"),
+ (0x1F110, "3", "(a)"),
+ (0x1F111, "3", "(b)"),
+ (0x1F112, "3", "(c)"),
+ (0x1F113, "3", "(d)"),
+ (0x1F114, "3", "(e)"),
+ (0x1F115, "3", "(f)"),
+ (0x1F116, "3", "(g)"),
+ (0x1F117, "3", "(h)"),
+ (0x1F118, "3", "(i)"),
+ (0x1F119, "3", "(j)"),
+ (0x1F11A, "3", "(k)"),
+ (0x1F11B, "3", "(l)"),
+ (0x1F11C, "3", "(m)"),
+ (0x1F11D, "3", "(n)"),
+ (0x1F11E, "3", "(o)"),
+ (0x1F11F, "3", "(p)"),
+ (0x1F120, "3", "(q)"),
+ (0x1F121, "3", "(r)"),
+ (0x1F122, "3", "(s)"),
+ (0x1F123, "3", "(t)"),
+ (0x1F124, "3", "(u)"),
+ (0x1F125, "3", "(v)"),
+ (0x1F126, "3", "(w)"),
+ (0x1F127, "3", "(x)"),
+ (0x1F128, "3", "(y)"),
+ (0x1F129, "3", "(z)"),
+ (0x1F12A, "M", "〔s〕"),
+ (0x1F12B, "M", "c"),
+ (0x1F12C, "M", "r"),
+ (0x1F12D, "M", "cd"),
+ (0x1F12E, "M", "wz"),
+ (0x1F12F, "V"),
+ (0x1F130, "M", "a"),
+ (0x1F131, "M", "b"),
+ (0x1F132, "M", "c"),
+ (0x1F133, "M", "d"),
+ (0x1F134, "M", "e"),
+ (0x1F135, "M", "f"),
+ (0x1F136, "M", "g"),
+ (0x1F137, "M", "h"),
+ (0x1F138, "M", "i"),
+ (0x1F139, "M", "j"),
+ (0x1F13A, "M", "k"),
+ (0x1F13B, "M", "l"),
+ (0x1F13C, "M", "m"),
+ (0x1F13D, "M", "n"),
+ (0x1F13E, "M", "o"),
+ (0x1F13F, "M", "p"),
+ (0x1F140, "M", "q"),
+ (0x1F141, "M", "r"),
+ (0x1F142, "M", "s"),
+ (0x1F143, "M", "t"),
+ (0x1F144, "M", "u"),
+ (0x1F145, "M", "v"),
+ (0x1F146, "M", "w"),
+ (0x1F147, "M", "x"),
+ (0x1F148, "M", "y"),
+ (0x1F149, "M", "z"),
+ (0x1F14A, "M", "hv"),
+ (0x1F14B, "M", "mv"),
+ (0x1F14C, "M", "sd"),
+ (0x1F14D, "M", "ss"),
+ (0x1F14E, "M", "ppv"),
+ (0x1F14F, "M", "wc"),
+ (0x1F150, "V"),
+ (0x1F16A, "M", "mc"),
+ (0x1F16B, "M", "md"),
+ (0x1F16C, "M", "mr"),
+ (0x1F16D, "V"),
+ (0x1F190, "M", "dj"),
+ (0x1F191, "V"),
]
+
def _seg_75() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1F16C, 'M', 'mr'),
- (0x1F16D, 'V'),
- (0x1F190, 'M', 'dj'),
- (0x1F191, 'V'),
- (0x1F1AE, 'X'),
- (0x1F1E6, 'V'),
- (0x1F200, 'M', 'ほか'),
- (0x1F201, 'M', 'ココ'),
- (0x1F202, 'M', 'サ'),
- (0x1F203, 'X'),
- (0x1F210, 'M', '手'),
- (0x1F211, 'M', '字'),
- (0x1F212, 'M', '双'),
- (0x1F213, 'M', 'デ'),
- (0x1F214, 'M', '二'),
- (0x1F215, 'M', '多'),
- (0x1F216, 'M', '解'),
- (0x1F217, 'M', '天'),
- (0x1F218, 'M', '交'),
- (0x1F219, 'M', '映'),
- (0x1F21A, 'M', '無'),
- (0x1F21B, 'M', '料'),
- (0x1F21C, 'M', '前'),
- (0x1F21D, 'M', '後'),
- (0x1F21E, 'M', '再'),
- (0x1F21F, 'M', '新'),
- (0x1F220, 'M', '初'),
- (0x1F221, 'M', '終'),
- (0x1F222, 'M', '生'),
- (0x1F223, 'M', '販'),
- (0x1F224, 'M', '声'),
- (0x1F225, 'M', '吹'),
- (0x1F226, 'M', '演'),
- (0x1F227, 'M', '投'),
- (0x1F228, 'M', '捕'),
- (0x1F229, 'M', '一'),
- (0x1F22A, 'M', '三'),
- (0x1F22B, 'M', '遊'),
- (0x1F22C, 'M', '左'),
- (0x1F22D, 'M', '中'),
- (0x1F22E, 'M', '右'),
- (0x1F22F, 'M', '指'),
- (0x1F230, 'M', '走'),
- (0x1F231, 'M', '打'),
- (0x1F232, 'M', '禁'),
- (0x1F233, 'M', '空'),
- (0x1F234, 'M', '合'),
- (0x1F235, 'M', '満'),
- (0x1F236, 'M', '有'),
- (0x1F237, 'M', '月'),
- (0x1F238, 'M', '申'),
- (0x1F239, 'M', '割'),
- (0x1F23A, 'M', '営'),
- (0x1F23B, 'M', '配'),
- (0x1F23C, 'X'),
- (0x1F240, 'M', '〔本〕'),
- (0x1F241, 'M', '〔三〕'),
- (0x1F242, 'M', '〔二〕'),
- (0x1F243, 'M', '〔安〕'),
- (0x1F244, 'M', '〔点〕'),
- (0x1F245, 'M', '〔打〕'),
- (0x1F246, 'M', '〔盗〕'),
- (0x1F247, 'M', '〔勝〕'),
- (0x1F248, 'M', '〔敗〕'),
- (0x1F249, 'X'),
- (0x1F250, 'M', '得'),
- (0x1F251, 'M', '可'),
- (0x1F252, 'X'),
- (0x1F260, 'V'),
- (0x1F266, 'X'),
- (0x1F300, 'V'),
- (0x1F6D8, 'X'),
- (0x1F6DC, 'V'),
- (0x1F6ED, 'X'),
- (0x1F6F0, 'V'),
- (0x1F6FD, 'X'),
- (0x1F700, 'V'),
- (0x1F777, 'X'),
- (0x1F77B, 'V'),
- (0x1F7DA, 'X'),
- (0x1F7E0, 'V'),
- (0x1F7EC, 'X'),
- (0x1F7F0, 'V'),
- (0x1F7F1, 'X'),
- (0x1F800, 'V'),
- (0x1F80C, 'X'),
- (0x1F810, 'V'),
- (0x1F848, 'X'),
- (0x1F850, 'V'),
- (0x1F85A, 'X'),
- (0x1F860, 'V'),
- (0x1F888, 'X'),
- (0x1F890, 'V'),
- (0x1F8AE, 'X'),
- (0x1F8B0, 'V'),
- (0x1F8B2, 'X'),
- (0x1F900, 'V'),
- (0x1FA54, 'X'),
- (0x1FA60, 'V'),
- (0x1FA6E, 'X'),
+ (0x1F1AE, "X"),
+ (0x1F1E6, "V"),
+ (0x1F200, "M", "ほか"),
+ (0x1F201, "M", "ココ"),
+ (0x1F202, "M", "サ"),
+ (0x1F203, "X"),
+ (0x1F210, "M", "手"),
+ (0x1F211, "M", "字"),
+ (0x1F212, "M", "双"),
+ (0x1F213, "M", "デ"),
+ (0x1F214, "M", "二"),
+ (0x1F215, "M", "多"),
+ (0x1F216, "M", "解"),
+ (0x1F217, "M", "天"),
+ (0x1F218, "M", "交"),
+ (0x1F219, "M", "映"),
+ (0x1F21A, "M", "無"),
+ (0x1F21B, "M", "料"),
+ (0x1F21C, "M", "前"),
+ (0x1F21D, "M", "後"),
+ (0x1F21E, "M", "再"),
+ (0x1F21F, "M", "新"),
+ (0x1F220, "M", "初"),
+ (0x1F221, "M", "終"),
+ (0x1F222, "M", "生"),
+ (0x1F223, "M", "販"),
+ (0x1F224, "M", "声"),
+ (0x1F225, "M", "吹"),
+ (0x1F226, "M", "演"),
+ (0x1F227, "M", "投"),
+ (0x1F228, "M", "捕"),
+ (0x1F229, "M", "一"),
+ (0x1F22A, "M", "三"),
+ (0x1F22B, "M", "遊"),
+ (0x1F22C, "M", "左"),
+ (0x1F22D, "M", "中"),
+ (0x1F22E, "M", "右"),
+ (0x1F22F, "M", "指"),
+ (0x1F230, "M", "走"),
+ (0x1F231, "M", "打"),
+ (0x1F232, "M", "禁"),
+ (0x1F233, "M", "空"),
+ (0x1F234, "M", "合"),
+ (0x1F235, "M", "満"),
+ (0x1F236, "M", "有"),
+ (0x1F237, "M", "月"),
+ (0x1F238, "M", "申"),
+ (0x1F239, "M", "割"),
+ (0x1F23A, "M", "営"),
+ (0x1F23B, "M", "配"),
+ (0x1F23C, "X"),
+ (0x1F240, "M", "〔本〕"),
+ (0x1F241, "M", "〔三〕"),
+ (0x1F242, "M", "〔二〕"),
+ (0x1F243, "M", "〔安〕"),
+ (0x1F244, "M", "〔点〕"),
+ (0x1F245, "M", "〔打〕"),
+ (0x1F246, "M", "〔盗〕"),
+ (0x1F247, "M", "〔勝〕"),
+ (0x1F248, "M", "〔敗〕"),
+ (0x1F249, "X"),
+ (0x1F250, "M", "得"),
+ (0x1F251, "M", "可"),
+ (0x1F252, "X"),
+ (0x1F260, "V"),
+ (0x1F266, "X"),
+ (0x1F300, "V"),
+ (0x1F6D8, "X"),
+ (0x1F6DC, "V"),
+ (0x1F6ED, "X"),
+ (0x1F6F0, "V"),
+ (0x1F6FD, "X"),
+ (0x1F700, "V"),
+ (0x1F777, "X"),
+ (0x1F77B, "V"),
+ (0x1F7DA, "X"),
+ (0x1F7E0, "V"),
+ (0x1F7EC, "X"),
+ (0x1F7F0, "V"),
+ (0x1F7F1, "X"),
+ (0x1F800, "V"),
+ (0x1F80C, "X"),
+ (0x1F810, "V"),
+ (0x1F848, "X"),
+ (0x1F850, "V"),
+ (0x1F85A, "X"),
+ (0x1F860, "V"),
+ (0x1F888, "X"),
+ (0x1F890, "V"),
+ (0x1F8AE, "X"),
+ (0x1F8B0, "V"),
+ (0x1F8B2, "X"),
+ (0x1F900, "V"),
+ (0x1FA54, "X"),
+ (0x1FA60, "V"),
+ (0x1FA6E, "X"),
+ (0x1FA70, "V"),
+ (0x1FA7D, "X"),
+ (0x1FA80, "V"),
+ (0x1FA89, "X"),
]
+
def _seg_76() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x1FA70, 'V'),
- (0x1FA7D, 'X'),
- (0x1FA80, 'V'),
- (0x1FA89, 'X'),
- (0x1FA90, 'V'),
- (0x1FABE, 'X'),
- (0x1FABF, 'V'),
- (0x1FAC6, 'X'),
- (0x1FACE, 'V'),
- (0x1FADC, 'X'),
- (0x1FAE0, 'V'),
- (0x1FAE9, 'X'),
- (0x1FAF0, 'V'),
- (0x1FAF9, 'X'),
- (0x1FB00, 'V'),
- (0x1FB93, 'X'),
- (0x1FB94, 'V'),
- (0x1FBCB, 'X'),
- (0x1FBF0, 'M', '0'),
- (0x1FBF1, 'M', '1'),
- (0x1FBF2, 'M', '2'),
- (0x1FBF3, 'M', '3'),
- (0x1FBF4, 'M', '4'),
- (0x1FBF5, 'M', '5'),
- (0x1FBF6, 'M', '6'),
- (0x1FBF7, 'M', '7'),
- (0x1FBF8, 'M', '8'),
- (0x1FBF9, 'M', '9'),
- (0x1FBFA, 'X'),
- (0x20000, 'V'),
- (0x2A6E0, 'X'),
- (0x2A700, 'V'),
- (0x2B73A, 'X'),
- (0x2B740, 'V'),
- (0x2B81E, 'X'),
- (0x2B820, 'V'),
- (0x2CEA2, 'X'),
- (0x2CEB0, 'V'),
- (0x2EBE1, 'X'),
- (0x2F800, 'M', '丽'),
- (0x2F801, 'M', '丸'),
- (0x2F802, 'M', '乁'),
- (0x2F803, 'M', '𠄢'),
- (0x2F804, 'M', '你'),
- (0x2F805, 'M', '侮'),
- (0x2F806, 'M', '侻'),
- (0x2F807, 'M', '倂'),
- (0x2F808, 'M', '偺'),
- (0x2F809, 'M', '備'),
- (0x2F80A, 'M', '僧'),
- (0x2F80B, 'M', '像'),
- (0x2F80C, 'M', '㒞'),
- (0x2F80D, 'M', '𠘺'),
- (0x2F80E, 'M', '免'),
- (0x2F80F, 'M', '兔'),
- (0x2F810, 'M', '兤'),
- (0x2F811, 'M', '具'),
- (0x2F812, 'M', '𠔜'),
- (0x2F813, 'M', '㒹'),
- (0x2F814, 'M', '內'),
- (0x2F815, 'M', '再'),
- (0x2F816, 'M', '𠕋'),
- (0x2F817, 'M', '冗'),
- (0x2F818, 'M', '冤'),
- (0x2F819, 'M', '仌'),
- (0x2F81A, 'M', '冬'),
- (0x2F81B, 'M', '况'),
- (0x2F81C, 'M', '𩇟'),
- (0x2F81D, 'M', '凵'),
- (0x2F81E, 'M', '刃'),
- (0x2F81F, 'M', '㓟'),
- (0x2F820, 'M', '刻'),
- (0x2F821, 'M', '剆'),
- (0x2F822, 'M', '割'),
- (0x2F823, 'M', '剷'),
- (0x2F824, 'M', '㔕'),
- (0x2F825, 'M', '勇'),
- (0x2F826, 'M', '勉'),
- (0x2F827, 'M', '勤'),
- (0x2F828, 'M', '勺'),
- (0x2F829, 'M', '包'),
- (0x2F82A, 'M', '匆'),
- (0x2F82B, 'M', '北'),
- (0x2F82C, 'M', '卉'),
- (0x2F82D, 'M', '卑'),
- (0x2F82E, 'M', '博'),
- (0x2F82F, 'M', '即'),
- (0x2F830, 'M', '卽'),
- (0x2F831, 'M', '卿'),
- (0x2F834, 'M', '𠨬'),
- (0x2F835, 'M', '灰'),
- (0x2F836, 'M', '及'),
- (0x2F837, 'M', '叟'),
- (0x2F838, 'M', '𠭣'),
- (0x2F839, 'M', '叫'),
- (0x2F83A, 'M', '叱'),
- (0x2F83B, 'M', '吆'),
- (0x2F83C, 'M', '咞'),
- (0x2F83D, 'M', '吸'),
- (0x2F83E, 'M', '呈'),
+ (0x1FA90, "V"),
+ (0x1FABE, "X"),
+ (0x1FABF, "V"),
+ (0x1FAC6, "X"),
+ (0x1FACE, "V"),
+ (0x1FADC, "X"),
+ (0x1FAE0, "V"),
+ (0x1FAE9, "X"),
+ (0x1FAF0, "V"),
+ (0x1FAF9, "X"),
+ (0x1FB00, "V"),
+ (0x1FB93, "X"),
+ (0x1FB94, "V"),
+ (0x1FBCB, "X"),
+ (0x1FBF0, "M", "0"),
+ (0x1FBF1, "M", "1"),
+ (0x1FBF2, "M", "2"),
+ (0x1FBF3, "M", "3"),
+ (0x1FBF4, "M", "4"),
+ (0x1FBF5, "M", "5"),
+ (0x1FBF6, "M", "6"),
+ (0x1FBF7, "M", "7"),
+ (0x1FBF8, "M", "8"),
+ (0x1FBF9, "M", "9"),
+ (0x1FBFA, "X"),
+ (0x20000, "V"),
+ (0x2A6E0, "X"),
+ (0x2A700, "V"),
+ (0x2B73A, "X"),
+ (0x2B740, "V"),
+ (0x2B81E, "X"),
+ (0x2B820, "V"),
+ (0x2CEA2, "X"),
+ (0x2CEB0, "V"),
+ (0x2EBE1, "X"),
+ (0x2EBF0, "V"),
+ (0x2EE5E, "X"),
+ (0x2F800, "M", "丽"),
+ (0x2F801, "M", "丸"),
+ (0x2F802, "M", "乁"),
+ (0x2F803, "M", "𠄢"),
+ (0x2F804, "M", "你"),
+ (0x2F805, "M", "侮"),
+ (0x2F806, "M", "侻"),
+ (0x2F807, "M", "倂"),
+ (0x2F808, "M", "偺"),
+ (0x2F809, "M", "備"),
+ (0x2F80A, "M", "僧"),
+ (0x2F80B, "M", "像"),
+ (0x2F80C, "M", "㒞"),
+ (0x2F80D, "M", "𠘺"),
+ (0x2F80E, "M", "免"),
+ (0x2F80F, "M", "兔"),
+ (0x2F810, "M", "兤"),
+ (0x2F811, "M", "具"),
+ (0x2F812, "M", "𠔜"),
+ (0x2F813, "M", "㒹"),
+ (0x2F814, "M", "內"),
+ (0x2F815, "M", "再"),
+ (0x2F816, "M", "𠕋"),
+ (0x2F817, "M", "冗"),
+ (0x2F818, "M", "冤"),
+ (0x2F819, "M", "仌"),
+ (0x2F81A, "M", "冬"),
+ (0x2F81B, "M", "况"),
+ (0x2F81C, "M", "𩇟"),
+ (0x2F81D, "M", "凵"),
+ (0x2F81E, "M", "刃"),
+ (0x2F81F, "M", "㓟"),
+ (0x2F820, "M", "刻"),
+ (0x2F821, "M", "剆"),
+ (0x2F822, "M", "割"),
+ (0x2F823, "M", "剷"),
+ (0x2F824, "M", "㔕"),
+ (0x2F825, "M", "勇"),
+ (0x2F826, "M", "勉"),
+ (0x2F827, "M", "勤"),
+ (0x2F828, "M", "勺"),
+ (0x2F829, "M", "包"),
+ (0x2F82A, "M", "匆"),
+ (0x2F82B, "M", "北"),
+ (0x2F82C, "M", "卉"),
+ (0x2F82D, "M", "卑"),
+ (0x2F82E, "M", "博"),
+ (0x2F82F, "M", "即"),
+ (0x2F830, "M", "卽"),
+ (0x2F831, "M", "卿"),
+ (0x2F834, "M", "𠨬"),
+ (0x2F835, "M", "灰"),
+ (0x2F836, "M", "及"),
+ (0x2F837, "M", "叟"),
+ (0x2F838, "M", "𠭣"),
+ (0x2F839, "M", "叫"),
+ (0x2F83A, "M", "叱"),
+ (0x2F83B, "M", "吆"),
+ (0x2F83C, "M", "咞"),
+ (0x2F83D, "M", "吸"),
+ (0x2F83E, "M", "呈"),
+ (0x2F83F, "M", "周"),
+ (0x2F840, "M", "咢"),
]
+
def _seg_77() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F83F, 'M', '周'),
- (0x2F840, 'M', '咢'),
- (0x2F841, 'M', '哶'),
- (0x2F842, 'M', '唐'),
- (0x2F843, 'M', '啓'),
- (0x2F844, 'M', '啣'),
- (0x2F845, 'M', '善'),
- (0x2F847, 'M', '喙'),
- (0x2F848, 'M', '喫'),
- (0x2F849, 'M', '喳'),
- (0x2F84A, 'M', '嗂'),
- (0x2F84B, 'M', '圖'),
- (0x2F84C, 'M', '嘆'),
- (0x2F84D, 'M', '圗'),
- (0x2F84E, 'M', '噑'),
- (0x2F84F, 'M', '噴'),
- (0x2F850, 'M', '切'),
- (0x2F851, 'M', '壮'),
- (0x2F852, 'M', '城'),
- (0x2F853, 'M', '埴'),
- (0x2F854, 'M', '堍'),
- (0x2F855, 'M', '型'),
- (0x2F856, 'M', '堲'),
- (0x2F857, 'M', '報'),
- (0x2F858, 'M', '墬'),
- (0x2F859, 'M', '𡓤'),
- (0x2F85A, 'M', '売'),
- (0x2F85B, 'M', '壷'),
- (0x2F85C, 'M', '夆'),
- (0x2F85D, 'M', '多'),
- (0x2F85E, 'M', '夢'),
- (0x2F85F, 'M', '奢'),
- (0x2F860, 'M', '𡚨'),
- (0x2F861, 'M', '𡛪'),
- (0x2F862, 'M', '姬'),
- (0x2F863, 'M', '娛'),
- (0x2F864, 'M', '娧'),
- (0x2F865, 'M', '姘'),
- (0x2F866, 'M', '婦'),
- (0x2F867, 'M', '㛮'),
- (0x2F868, 'X'),
- (0x2F869, 'M', '嬈'),
- (0x2F86A, 'M', '嬾'),
- (0x2F86C, 'M', '𡧈'),
- (0x2F86D, 'M', '寃'),
- (0x2F86E, 'M', '寘'),
- (0x2F86F, 'M', '寧'),
- (0x2F870, 'M', '寳'),
- (0x2F871, 'M', '𡬘'),
- (0x2F872, 'M', '寿'),
- (0x2F873, 'M', '将'),
- (0x2F874, 'X'),
- (0x2F875, 'M', '尢'),
- (0x2F876, 'M', '㞁'),
- (0x2F877, 'M', '屠'),
- (0x2F878, 'M', '屮'),
- (0x2F879, 'M', '峀'),
- (0x2F87A, 'M', '岍'),
- (0x2F87B, 'M', '𡷤'),
- (0x2F87C, 'M', '嵃'),
- (0x2F87D, 'M', '𡷦'),
- (0x2F87E, 'M', '嵮'),
- (0x2F87F, 'M', '嵫'),
- (0x2F880, 'M', '嵼'),
- (0x2F881, 'M', '巡'),
- (0x2F882, 'M', '巢'),
- (0x2F883, 'M', '㠯'),
- (0x2F884, 'M', '巽'),
- (0x2F885, 'M', '帨'),
- (0x2F886, 'M', '帽'),
- (0x2F887, 'M', '幩'),
- (0x2F888, 'M', '㡢'),
- (0x2F889, 'M', '𢆃'),
- (0x2F88A, 'M', '㡼'),
- (0x2F88B, 'M', '庰'),
- (0x2F88C, 'M', '庳'),
- (0x2F88D, 'M', '庶'),
- (0x2F88E, 'M', '廊'),
- (0x2F88F, 'M', '𪎒'),
- (0x2F890, 'M', '廾'),
- (0x2F891, 'M', '𢌱'),
- (0x2F893, 'M', '舁'),
- (0x2F894, 'M', '弢'),
- (0x2F896, 'M', '㣇'),
- (0x2F897, 'M', '𣊸'),
- (0x2F898, 'M', '𦇚'),
- (0x2F899, 'M', '形'),
- (0x2F89A, 'M', '彫'),
- (0x2F89B, 'M', '㣣'),
- (0x2F89C, 'M', '徚'),
- (0x2F89D, 'M', '忍'),
- (0x2F89E, 'M', '志'),
- (0x2F89F, 'M', '忹'),
- (0x2F8A0, 'M', '悁'),
- (0x2F8A1, 'M', '㤺'),
- (0x2F8A2, 'M', '㤜'),
- (0x2F8A3, 'M', '悔'),
- (0x2F8A4, 'M', '𢛔'),
- (0x2F8A5, 'M', '惇'),
- (0x2F8A6, 'M', '慈'),
+ (0x2F841, "M", "哶"),
+ (0x2F842, "M", "唐"),
+ (0x2F843, "M", "啓"),
+ (0x2F844, "M", "啣"),
+ (0x2F845, "M", "善"),
+ (0x2F847, "M", "喙"),
+ (0x2F848, "M", "喫"),
+ (0x2F849, "M", "喳"),
+ (0x2F84A, "M", "嗂"),
+ (0x2F84B, "M", "圖"),
+ (0x2F84C, "M", "嘆"),
+ (0x2F84D, "M", "圗"),
+ (0x2F84E, "M", "噑"),
+ (0x2F84F, "M", "噴"),
+ (0x2F850, "M", "切"),
+ (0x2F851, "M", "壮"),
+ (0x2F852, "M", "城"),
+ (0x2F853, "M", "埴"),
+ (0x2F854, "M", "堍"),
+ (0x2F855, "M", "型"),
+ (0x2F856, "M", "堲"),
+ (0x2F857, "M", "報"),
+ (0x2F858, "M", "墬"),
+ (0x2F859, "M", "𡓤"),
+ (0x2F85A, "M", "売"),
+ (0x2F85B, "M", "壷"),
+ (0x2F85C, "M", "夆"),
+ (0x2F85D, "M", "多"),
+ (0x2F85E, "M", "夢"),
+ (0x2F85F, "M", "奢"),
+ (0x2F860, "M", "𡚨"),
+ (0x2F861, "M", "𡛪"),
+ (0x2F862, "M", "姬"),
+ (0x2F863, "M", "娛"),
+ (0x2F864, "M", "娧"),
+ (0x2F865, "M", "姘"),
+ (0x2F866, "M", "婦"),
+ (0x2F867, "M", "㛮"),
+ (0x2F868, "X"),
+ (0x2F869, "M", "嬈"),
+ (0x2F86A, "M", "嬾"),
+ (0x2F86C, "M", "𡧈"),
+ (0x2F86D, "M", "寃"),
+ (0x2F86E, "M", "寘"),
+ (0x2F86F, "M", "寧"),
+ (0x2F870, "M", "寳"),
+ (0x2F871, "M", "𡬘"),
+ (0x2F872, "M", "寿"),
+ (0x2F873, "M", "将"),
+ (0x2F874, "X"),
+ (0x2F875, "M", "尢"),
+ (0x2F876, "M", "㞁"),
+ (0x2F877, "M", "屠"),
+ (0x2F878, "M", "屮"),
+ (0x2F879, "M", "峀"),
+ (0x2F87A, "M", "岍"),
+ (0x2F87B, "M", "𡷤"),
+ (0x2F87C, "M", "嵃"),
+ (0x2F87D, "M", "𡷦"),
+ (0x2F87E, "M", "嵮"),
+ (0x2F87F, "M", "嵫"),
+ (0x2F880, "M", "嵼"),
+ (0x2F881, "M", "巡"),
+ (0x2F882, "M", "巢"),
+ (0x2F883, "M", "㠯"),
+ (0x2F884, "M", "巽"),
+ (0x2F885, "M", "帨"),
+ (0x2F886, "M", "帽"),
+ (0x2F887, "M", "幩"),
+ (0x2F888, "M", "㡢"),
+ (0x2F889, "M", "𢆃"),
+ (0x2F88A, "M", "㡼"),
+ (0x2F88B, "M", "庰"),
+ (0x2F88C, "M", "庳"),
+ (0x2F88D, "M", "庶"),
+ (0x2F88E, "M", "廊"),
+ (0x2F88F, "M", "𪎒"),
+ (0x2F890, "M", "廾"),
+ (0x2F891, "M", "𢌱"),
+ (0x2F893, "M", "舁"),
+ (0x2F894, "M", "弢"),
+ (0x2F896, "M", "㣇"),
+ (0x2F897, "M", "𣊸"),
+ (0x2F898, "M", "𦇚"),
+ (0x2F899, "M", "形"),
+ (0x2F89A, "M", "彫"),
+ (0x2F89B, "M", "㣣"),
+ (0x2F89C, "M", "徚"),
+ (0x2F89D, "M", "忍"),
+ (0x2F89E, "M", "志"),
+ (0x2F89F, "M", "忹"),
+ (0x2F8A0, "M", "悁"),
+ (0x2F8A1, "M", "㤺"),
+ (0x2F8A2, "M", "㤜"),
+ (0x2F8A3, "M", "悔"),
+ (0x2F8A4, "M", "𢛔"),
+ (0x2F8A5, "M", "惇"),
+ (0x2F8A6, "M", "慈"),
+ (0x2F8A7, "M", "慌"),
+ (0x2F8A8, "M", "慎"),
]
+
def _seg_78() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F8A7, 'M', '慌'),
- (0x2F8A8, 'M', '慎'),
- (0x2F8A9, 'M', '慌'),
- (0x2F8AA, 'M', '慺'),
- (0x2F8AB, 'M', '憎'),
- (0x2F8AC, 'M', '憲'),
- (0x2F8AD, 'M', '憤'),
- (0x2F8AE, 'M', '憯'),
- (0x2F8AF, 'M', '懞'),
- (0x2F8B0, 'M', '懲'),
- (0x2F8B1, 'M', '懶'),
- (0x2F8B2, 'M', '成'),
- (0x2F8B3, 'M', '戛'),
- (0x2F8B4, 'M', '扝'),
- (0x2F8B5, 'M', '抱'),
- (0x2F8B6, 'M', '拔'),
- (0x2F8B7, 'M', '捐'),
- (0x2F8B8, 'M', '𢬌'),
- (0x2F8B9, 'M', '挽'),
- (0x2F8BA, 'M', '拼'),
- (0x2F8BB, 'M', '捨'),
- (0x2F8BC, 'M', '掃'),
- (0x2F8BD, 'M', '揤'),
- (0x2F8BE, 'M', '𢯱'),
- (0x2F8BF, 'M', '搢'),
- (0x2F8C0, 'M', '揅'),
- (0x2F8C1, 'M', '掩'),
- (0x2F8C2, 'M', '㨮'),
- (0x2F8C3, 'M', '摩'),
- (0x2F8C4, 'M', '摾'),
- (0x2F8C5, 'M', '撝'),
- (0x2F8C6, 'M', '摷'),
- (0x2F8C7, 'M', '㩬'),
- (0x2F8C8, 'M', '敏'),
- (0x2F8C9, 'M', '敬'),
- (0x2F8CA, 'M', '𣀊'),
- (0x2F8CB, 'M', '旣'),
- (0x2F8CC, 'M', '書'),
- (0x2F8CD, 'M', '晉'),
- (0x2F8CE, 'M', '㬙'),
- (0x2F8CF, 'M', '暑'),
- (0x2F8D0, 'M', '㬈'),
- (0x2F8D1, 'M', '㫤'),
- (0x2F8D2, 'M', '冒'),
- (0x2F8D3, 'M', '冕'),
- (0x2F8D4, 'M', '最'),
- (0x2F8D5, 'M', '暜'),
- (0x2F8D6, 'M', '肭'),
- (0x2F8D7, 'M', '䏙'),
- (0x2F8D8, 'M', '朗'),
- (0x2F8D9, 'M', '望'),
- (0x2F8DA, 'M', '朡'),
- (0x2F8DB, 'M', '杞'),
- (0x2F8DC, 'M', '杓'),
- (0x2F8DD, 'M', '𣏃'),
- (0x2F8DE, 'M', '㭉'),
- (0x2F8DF, 'M', '柺'),
- (0x2F8E0, 'M', '枅'),
- (0x2F8E1, 'M', '桒'),
- (0x2F8E2, 'M', '梅'),
- (0x2F8E3, 'M', '𣑭'),
- (0x2F8E4, 'M', '梎'),
- (0x2F8E5, 'M', '栟'),
- (0x2F8E6, 'M', '椔'),
- (0x2F8E7, 'M', '㮝'),
- (0x2F8E8, 'M', '楂'),
- (0x2F8E9, 'M', '榣'),
- (0x2F8EA, 'M', '槪'),
- (0x2F8EB, 'M', '檨'),
- (0x2F8EC, 'M', '𣚣'),
- (0x2F8ED, 'M', '櫛'),
- (0x2F8EE, 'M', '㰘'),
- (0x2F8EF, 'M', '次'),
- (0x2F8F0, 'M', '𣢧'),
- (0x2F8F1, 'M', '歔'),
- (0x2F8F2, 'M', '㱎'),
- (0x2F8F3, 'M', '歲'),
- (0x2F8F4, 'M', '殟'),
- (0x2F8F5, 'M', '殺'),
- (0x2F8F6, 'M', '殻'),
- (0x2F8F7, 'M', '𣪍'),
- (0x2F8F8, 'M', '𡴋'),
- (0x2F8F9, 'M', '𣫺'),
- (0x2F8FA, 'M', '汎'),
- (0x2F8FB, 'M', '𣲼'),
- (0x2F8FC, 'M', '沿'),
- (0x2F8FD, 'M', '泍'),
- (0x2F8FE, 'M', '汧'),
- (0x2F8FF, 'M', '洖'),
- (0x2F900, 'M', '派'),
- (0x2F901, 'M', '海'),
- (0x2F902, 'M', '流'),
- (0x2F903, 'M', '浩'),
- (0x2F904, 'M', '浸'),
- (0x2F905, 'M', '涅'),
- (0x2F906, 'M', '𣴞'),
- (0x2F907, 'M', '洴'),
- (0x2F908, 'M', '港'),
- (0x2F909, 'M', '湮'),
- (0x2F90A, 'M', '㴳'),
+ (0x2F8A9, "M", "慌"),
+ (0x2F8AA, "M", "慺"),
+ (0x2F8AB, "M", "憎"),
+ (0x2F8AC, "M", "憲"),
+ (0x2F8AD, "M", "憤"),
+ (0x2F8AE, "M", "憯"),
+ (0x2F8AF, "M", "懞"),
+ (0x2F8B0, "M", "懲"),
+ (0x2F8B1, "M", "懶"),
+ (0x2F8B2, "M", "成"),
+ (0x2F8B3, "M", "戛"),
+ (0x2F8B4, "M", "扝"),
+ (0x2F8B5, "M", "抱"),
+ (0x2F8B6, "M", "拔"),
+ (0x2F8B7, "M", "捐"),
+ (0x2F8B8, "M", "𢬌"),
+ (0x2F8B9, "M", "挽"),
+ (0x2F8BA, "M", "拼"),
+ (0x2F8BB, "M", "捨"),
+ (0x2F8BC, "M", "掃"),
+ (0x2F8BD, "M", "揤"),
+ (0x2F8BE, "M", "𢯱"),
+ (0x2F8BF, "M", "搢"),
+ (0x2F8C0, "M", "揅"),
+ (0x2F8C1, "M", "掩"),
+ (0x2F8C2, "M", "㨮"),
+ (0x2F8C3, "M", "摩"),
+ (0x2F8C4, "M", "摾"),
+ (0x2F8C5, "M", "撝"),
+ (0x2F8C6, "M", "摷"),
+ (0x2F8C7, "M", "㩬"),
+ (0x2F8C8, "M", "敏"),
+ (0x2F8C9, "M", "敬"),
+ (0x2F8CA, "M", "𣀊"),
+ (0x2F8CB, "M", "旣"),
+ (0x2F8CC, "M", "書"),
+ (0x2F8CD, "M", "晉"),
+ (0x2F8CE, "M", "㬙"),
+ (0x2F8CF, "M", "暑"),
+ (0x2F8D0, "M", "㬈"),
+ (0x2F8D1, "M", "㫤"),
+ (0x2F8D2, "M", "冒"),
+ (0x2F8D3, "M", "冕"),
+ (0x2F8D4, "M", "最"),
+ (0x2F8D5, "M", "暜"),
+ (0x2F8D6, "M", "肭"),
+ (0x2F8D7, "M", "䏙"),
+ (0x2F8D8, "M", "朗"),
+ (0x2F8D9, "M", "望"),
+ (0x2F8DA, "M", "朡"),
+ (0x2F8DB, "M", "杞"),
+ (0x2F8DC, "M", "杓"),
+ (0x2F8DD, "M", "𣏃"),
+ (0x2F8DE, "M", "㭉"),
+ (0x2F8DF, "M", "柺"),
+ (0x2F8E0, "M", "枅"),
+ (0x2F8E1, "M", "桒"),
+ (0x2F8E2, "M", "梅"),
+ (0x2F8E3, "M", "𣑭"),
+ (0x2F8E4, "M", "梎"),
+ (0x2F8E5, "M", "栟"),
+ (0x2F8E6, "M", "椔"),
+ (0x2F8E7, "M", "㮝"),
+ (0x2F8E8, "M", "楂"),
+ (0x2F8E9, "M", "榣"),
+ (0x2F8EA, "M", "槪"),
+ (0x2F8EB, "M", "檨"),
+ (0x2F8EC, "M", "𣚣"),
+ (0x2F8ED, "M", "櫛"),
+ (0x2F8EE, "M", "㰘"),
+ (0x2F8EF, "M", "次"),
+ (0x2F8F0, "M", "𣢧"),
+ (0x2F8F1, "M", "歔"),
+ (0x2F8F2, "M", "㱎"),
+ (0x2F8F3, "M", "歲"),
+ (0x2F8F4, "M", "殟"),
+ (0x2F8F5, "M", "殺"),
+ (0x2F8F6, "M", "殻"),
+ (0x2F8F7, "M", "𣪍"),
+ (0x2F8F8, "M", "𡴋"),
+ (0x2F8F9, "M", "𣫺"),
+ (0x2F8FA, "M", "汎"),
+ (0x2F8FB, "M", "𣲼"),
+ (0x2F8FC, "M", "沿"),
+ (0x2F8FD, "M", "泍"),
+ (0x2F8FE, "M", "汧"),
+ (0x2F8FF, "M", "洖"),
+ (0x2F900, "M", "派"),
+ (0x2F901, "M", "海"),
+ (0x2F902, "M", "流"),
+ (0x2F903, "M", "浩"),
+ (0x2F904, "M", "浸"),
+ (0x2F905, "M", "涅"),
+ (0x2F906, "M", "𣴞"),
+ (0x2F907, "M", "洴"),
+ (0x2F908, "M", "港"),
+ (0x2F909, "M", "湮"),
+ (0x2F90A, "M", "㴳"),
+ (0x2F90B, "M", "滋"),
+ (0x2F90C, "M", "滇"),
]
+
def _seg_79() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F90B, 'M', '滋'),
- (0x2F90C, 'M', '滇'),
- (0x2F90D, 'M', '𣻑'),
- (0x2F90E, 'M', '淹'),
- (0x2F90F, 'M', '潮'),
- (0x2F910, 'M', '𣽞'),
- (0x2F911, 'M', '𣾎'),
- (0x2F912, 'M', '濆'),
- (0x2F913, 'M', '瀹'),
- (0x2F914, 'M', '瀞'),
- (0x2F915, 'M', '瀛'),
- (0x2F916, 'M', '㶖'),
- (0x2F917, 'M', '灊'),
- (0x2F918, 'M', '災'),
- (0x2F919, 'M', '灷'),
- (0x2F91A, 'M', '炭'),
- (0x2F91B, 'M', '𠔥'),
- (0x2F91C, 'M', '煅'),
- (0x2F91D, 'M', '𤉣'),
- (0x2F91E, 'M', '熜'),
- (0x2F91F, 'X'),
- (0x2F920, 'M', '爨'),
- (0x2F921, 'M', '爵'),
- (0x2F922, 'M', '牐'),
- (0x2F923, 'M', '𤘈'),
- (0x2F924, 'M', '犀'),
- (0x2F925, 'M', '犕'),
- (0x2F926, 'M', '𤜵'),
- (0x2F927, 'M', '𤠔'),
- (0x2F928, 'M', '獺'),
- (0x2F929, 'M', '王'),
- (0x2F92A, 'M', '㺬'),
- (0x2F92B, 'M', '玥'),
- (0x2F92C, 'M', '㺸'),
- (0x2F92E, 'M', '瑇'),
- (0x2F92F, 'M', '瑜'),
- (0x2F930, 'M', '瑱'),
- (0x2F931, 'M', '璅'),
- (0x2F932, 'M', '瓊'),
- (0x2F933, 'M', '㼛'),
- (0x2F934, 'M', '甤'),
- (0x2F935, 'M', '𤰶'),
- (0x2F936, 'M', '甾'),
- (0x2F937, 'M', '𤲒'),
- (0x2F938, 'M', '異'),
- (0x2F939, 'M', '𢆟'),
- (0x2F93A, 'M', '瘐'),
- (0x2F93B, 'M', '𤾡'),
- (0x2F93C, 'M', '𤾸'),
- (0x2F93D, 'M', '𥁄'),
- (0x2F93E, 'M', '㿼'),
- (0x2F93F, 'M', '䀈'),
- (0x2F940, 'M', '直'),
- (0x2F941, 'M', '𥃳'),
- (0x2F942, 'M', '𥃲'),
- (0x2F943, 'M', '𥄙'),
- (0x2F944, 'M', '𥄳'),
- (0x2F945, 'M', '眞'),
- (0x2F946, 'M', '真'),
- (0x2F948, 'M', '睊'),
- (0x2F949, 'M', '䀹'),
- (0x2F94A, 'M', '瞋'),
- (0x2F94B, 'M', '䁆'),
- (0x2F94C, 'M', '䂖'),
- (0x2F94D, 'M', '𥐝'),
- (0x2F94E, 'M', '硎'),
- (0x2F94F, 'M', '碌'),
- (0x2F950, 'M', '磌'),
- (0x2F951, 'M', '䃣'),
- (0x2F952, 'M', '𥘦'),
- (0x2F953, 'M', '祖'),
- (0x2F954, 'M', '𥚚'),
- (0x2F955, 'M', '𥛅'),
- (0x2F956, 'M', '福'),
- (0x2F957, 'M', '秫'),
- (0x2F958, 'M', '䄯'),
- (0x2F959, 'M', '穀'),
- (0x2F95A, 'M', '穊'),
- (0x2F95B, 'M', '穏'),
- (0x2F95C, 'M', '𥥼'),
- (0x2F95D, 'M', '𥪧'),
- (0x2F95F, 'X'),
- (0x2F960, 'M', '䈂'),
- (0x2F961, 'M', '𥮫'),
- (0x2F962, 'M', '篆'),
- (0x2F963, 'M', '築'),
- (0x2F964, 'M', '䈧'),
- (0x2F965, 'M', '𥲀'),
- (0x2F966, 'M', '糒'),
- (0x2F967, 'M', '䊠'),
- (0x2F968, 'M', '糨'),
- (0x2F969, 'M', '糣'),
- (0x2F96A, 'M', '紀'),
- (0x2F96B, 'M', '𥾆'),
- (0x2F96C, 'M', '絣'),
- (0x2F96D, 'M', '䌁'),
- (0x2F96E, 'M', '緇'),
- (0x2F96F, 'M', '縂'),
- (0x2F970, 'M', '繅'),
- (0x2F971, 'M', '䌴'),
+ (0x2F90D, "M", "𣻑"),
+ (0x2F90E, "M", "淹"),
+ (0x2F90F, "M", "潮"),
+ (0x2F910, "M", "𣽞"),
+ (0x2F911, "M", "𣾎"),
+ (0x2F912, "M", "濆"),
+ (0x2F913, "M", "瀹"),
+ (0x2F914, "M", "瀞"),
+ (0x2F915, "M", "瀛"),
+ (0x2F916, "M", "㶖"),
+ (0x2F917, "M", "灊"),
+ (0x2F918, "M", "災"),
+ (0x2F919, "M", "灷"),
+ (0x2F91A, "M", "炭"),
+ (0x2F91B, "M", "𠔥"),
+ (0x2F91C, "M", "煅"),
+ (0x2F91D, "M", "𤉣"),
+ (0x2F91E, "M", "熜"),
+ (0x2F91F, "X"),
+ (0x2F920, "M", "爨"),
+ (0x2F921, "M", "爵"),
+ (0x2F922, "M", "牐"),
+ (0x2F923, "M", "𤘈"),
+ (0x2F924, "M", "犀"),
+ (0x2F925, "M", "犕"),
+ (0x2F926, "M", "𤜵"),
+ (0x2F927, "M", "𤠔"),
+ (0x2F928, "M", "獺"),
+ (0x2F929, "M", "王"),
+ (0x2F92A, "M", "㺬"),
+ (0x2F92B, "M", "玥"),
+ (0x2F92C, "M", "㺸"),
+ (0x2F92E, "M", "瑇"),
+ (0x2F92F, "M", "瑜"),
+ (0x2F930, "M", "瑱"),
+ (0x2F931, "M", "璅"),
+ (0x2F932, "M", "瓊"),
+ (0x2F933, "M", "㼛"),
+ (0x2F934, "M", "甤"),
+ (0x2F935, "M", "𤰶"),
+ (0x2F936, "M", "甾"),
+ (0x2F937, "M", "𤲒"),
+ (0x2F938, "M", "異"),
+ (0x2F939, "M", "𢆟"),
+ (0x2F93A, "M", "瘐"),
+ (0x2F93B, "M", "𤾡"),
+ (0x2F93C, "M", "𤾸"),
+ (0x2F93D, "M", "𥁄"),
+ (0x2F93E, "M", "㿼"),
+ (0x2F93F, "M", "䀈"),
+ (0x2F940, "M", "直"),
+ (0x2F941, "M", "𥃳"),
+ (0x2F942, "M", "𥃲"),
+ (0x2F943, "M", "𥄙"),
+ (0x2F944, "M", "𥄳"),
+ (0x2F945, "M", "眞"),
+ (0x2F946, "M", "真"),
+ (0x2F948, "M", "睊"),
+ (0x2F949, "M", "䀹"),
+ (0x2F94A, "M", "瞋"),
+ (0x2F94B, "M", "䁆"),
+ (0x2F94C, "M", "䂖"),
+ (0x2F94D, "M", "𥐝"),
+ (0x2F94E, "M", "硎"),
+ (0x2F94F, "M", "碌"),
+ (0x2F950, "M", "磌"),
+ (0x2F951, "M", "䃣"),
+ (0x2F952, "M", "𥘦"),
+ (0x2F953, "M", "祖"),
+ (0x2F954, "M", "𥚚"),
+ (0x2F955, "M", "𥛅"),
+ (0x2F956, "M", "福"),
+ (0x2F957, "M", "秫"),
+ (0x2F958, "M", "䄯"),
+ (0x2F959, "M", "穀"),
+ (0x2F95A, "M", "穊"),
+ (0x2F95B, "M", "穏"),
+ (0x2F95C, "M", "𥥼"),
+ (0x2F95D, "M", "𥪧"),
+ (0x2F95F, "X"),
+ (0x2F960, "M", "䈂"),
+ (0x2F961, "M", "𥮫"),
+ (0x2F962, "M", "篆"),
+ (0x2F963, "M", "築"),
+ (0x2F964, "M", "䈧"),
+ (0x2F965, "M", "𥲀"),
+ (0x2F966, "M", "糒"),
+ (0x2F967, "M", "䊠"),
+ (0x2F968, "M", "糨"),
+ (0x2F969, "M", "糣"),
+ (0x2F96A, "M", "紀"),
+ (0x2F96B, "M", "𥾆"),
+ (0x2F96C, "M", "絣"),
+ (0x2F96D, "M", "䌁"),
+ (0x2F96E, "M", "緇"),
+ (0x2F96F, "M", "縂"),
+ (0x2F970, "M", "繅"),
+ (0x2F971, "M", "䌴"),
+ (0x2F972, "M", "𦈨"),
+ (0x2F973, "M", "𦉇"),
]
+
def _seg_80() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F972, 'M', '𦈨'),
- (0x2F973, 'M', '𦉇'),
- (0x2F974, 'M', '䍙'),
- (0x2F975, 'M', '𦋙'),
- (0x2F976, 'M', '罺'),
- (0x2F977, 'M', '𦌾'),
- (0x2F978, 'M', '羕'),
- (0x2F979, 'M', '翺'),
- (0x2F97A, 'M', '者'),
- (0x2F97B, 'M', '𦓚'),
- (0x2F97C, 'M', '𦔣'),
- (0x2F97D, 'M', '聠'),
- (0x2F97E, 'M', '𦖨'),
- (0x2F97F, 'M', '聰'),
- (0x2F980, 'M', '𣍟'),
- (0x2F981, 'M', '䏕'),
- (0x2F982, 'M', '育'),
- (0x2F983, 'M', '脃'),
- (0x2F984, 'M', '䐋'),
- (0x2F985, 'M', '脾'),
- (0x2F986, 'M', '媵'),
- (0x2F987, 'M', '𦞧'),
- (0x2F988, 'M', '𦞵'),
- (0x2F989, 'M', '𣎓'),
- (0x2F98A, 'M', '𣎜'),
- (0x2F98B, 'M', '舁'),
- (0x2F98C, 'M', '舄'),
- (0x2F98D, 'M', '辞'),
- (0x2F98E, 'M', '䑫'),
- (0x2F98F, 'M', '芑'),
- (0x2F990, 'M', '芋'),
- (0x2F991, 'M', '芝'),
- (0x2F992, 'M', '劳'),
- (0x2F993, 'M', '花'),
- (0x2F994, 'M', '芳'),
- (0x2F995, 'M', '芽'),
- (0x2F996, 'M', '苦'),
- (0x2F997, 'M', '𦬼'),
- (0x2F998, 'M', '若'),
- (0x2F999, 'M', '茝'),
- (0x2F99A, 'M', '荣'),
- (0x2F99B, 'M', '莭'),
- (0x2F99C, 'M', '茣'),
- (0x2F99D, 'M', '莽'),
- (0x2F99E, 'M', '菧'),
- (0x2F99F, 'M', '著'),
- (0x2F9A0, 'M', '荓'),
- (0x2F9A1, 'M', '菊'),
- (0x2F9A2, 'M', '菌'),
- (0x2F9A3, 'M', '菜'),
- (0x2F9A4, 'M', '𦰶'),
- (0x2F9A5, 'M', '𦵫'),
- (0x2F9A6, 'M', '𦳕'),
- (0x2F9A7, 'M', '䔫'),
- (0x2F9A8, 'M', '蓱'),
- (0x2F9A9, 'M', '蓳'),
- (0x2F9AA, 'M', '蔖'),
- (0x2F9AB, 'M', '𧏊'),
- (0x2F9AC, 'M', '蕤'),
- (0x2F9AD, 'M', '𦼬'),
- (0x2F9AE, 'M', '䕝'),
- (0x2F9AF, 'M', '䕡'),
- (0x2F9B0, 'M', '𦾱'),
- (0x2F9B1, 'M', '𧃒'),
- (0x2F9B2, 'M', '䕫'),
- (0x2F9B3, 'M', '虐'),
- (0x2F9B4, 'M', '虜'),
- (0x2F9B5, 'M', '虧'),
- (0x2F9B6, 'M', '虩'),
- (0x2F9B7, 'M', '蚩'),
- (0x2F9B8, 'M', '蚈'),
- (0x2F9B9, 'M', '蜎'),
- (0x2F9BA, 'M', '蛢'),
- (0x2F9BB, 'M', '蝹'),
- (0x2F9BC, 'M', '蜨'),
- (0x2F9BD, 'M', '蝫'),
- (0x2F9BE, 'M', '螆'),
- (0x2F9BF, 'X'),
- (0x2F9C0, 'M', '蟡'),
- (0x2F9C1, 'M', '蠁'),
- (0x2F9C2, 'M', '䗹'),
- (0x2F9C3, 'M', '衠'),
- (0x2F9C4, 'M', '衣'),
- (0x2F9C5, 'M', '𧙧'),
- (0x2F9C6, 'M', '裗'),
- (0x2F9C7, 'M', '裞'),
- (0x2F9C8, 'M', '䘵'),
- (0x2F9C9, 'M', '裺'),
- (0x2F9CA, 'M', '㒻'),
- (0x2F9CB, 'M', '𧢮'),
- (0x2F9CC, 'M', '𧥦'),
- (0x2F9CD, 'M', '䚾'),
- (0x2F9CE, 'M', '䛇'),
- (0x2F9CF, 'M', '誠'),
- (0x2F9D0, 'M', '諭'),
- (0x2F9D1, 'M', '變'),
- (0x2F9D2, 'M', '豕'),
- (0x2F9D3, 'M', '𧲨'),
- (0x2F9D4, 'M', '貫'),
- (0x2F9D5, 'M', '賁'),
+ (0x2F974, "M", "䍙"),
+ (0x2F975, "M", "𦋙"),
+ (0x2F976, "M", "罺"),
+ (0x2F977, "M", "𦌾"),
+ (0x2F978, "M", "羕"),
+ (0x2F979, "M", "翺"),
+ (0x2F97A, "M", "者"),
+ (0x2F97B, "M", "𦓚"),
+ (0x2F97C, "M", "𦔣"),
+ (0x2F97D, "M", "聠"),
+ (0x2F97E, "M", "𦖨"),
+ (0x2F97F, "M", "聰"),
+ (0x2F980, "M", "𣍟"),
+ (0x2F981, "M", "䏕"),
+ (0x2F982, "M", "育"),
+ (0x2F983, "M", "脃"),
+ (0x2F984, "M", "䐋"),
+ (0x2F985, "M", "脾"),
+ (0x2F986, "M", "媵"),
+ (0x2F987, "M", "𦞧"),
+ (0x2F988, "M", "𦞵"),
+ (0x2F989, "M", "𣎓"),
+ (0x2F98A, "M", "𣎜"),
+ (0x2F98B, "M", "舁"),
+ (0x2F98C, "M", "舄"),
+ (0x2F98D, "M", "辞"),
+ (0x2F98E, "M", "䑫"),
+ (0x2F98F, "M", "芑"),
+ (0x2F990, "M", "芋"),
+ (0x2F991, "M", "芝"),
+ (0x2F992, "M", "劳"),
+ (0x2F993, "M", "花"),
+ (0x2F994, "M", "芳"),
+ (0x2F995, "M", "芽"),
+ (0x2F996, "M", "苦"),
+ (0x2F997, "M", "𦬼"),
+ (0x2F998, "M", "若"),
+ (0x2F999, "M", "茝"),
+ (0x2F99A, "M", "荣"),
+ (0x2F99B, "M", "莭"),
+ (0x2F99C, "M", "茣"),
+ (0x2F99D, "M", "莽"),
+ (0x2F99E, "M", "菧"),
+ (0x2F99F, "M", "著"),
+ (0x2F9A0, "M", "荓"),
+ (0x2F9A1, "M", "菊"),
+ (0x2F9A2, "M", "菌"),
+ (0x2F9A3, "M", "菜"),
+ (0x2F9A4, "M", "𦰶"),
+ (0x2F9A5, "M", "𦵫"),
+ (0x2F9A6, "M", "𦳕"),
+ (0x2F9A7, "M", "䔫"),
+ (0x2F9A8, "M", "蓱"),
+ (0x2F9A9, "M", "蓳"),
+ (0x2F9AA, "M", "蔖"),
+ (0x2F9AB, "M", "𧏊"),
+ (0x2F9AC, "M", "蕤"),
+ (0x2F9AD, "M", "𦼬"),
+ (0x2F9AE, "M", "䕝"),
+ (0x2F9AF, "M", "䕡"),
+ (0x2F9B0, "M", "𦾱"),
+ (0x2F9B1, "M", "𧃒"),
+ (0x2F9B2, "M", "䕫"),
+ (0x2F9B3, "M", "虐"),
+ (0x2F9B4, "M", "虜"),
+ (0x2F9B5, "M", "虧"),
+ (0x2F9B6, "M", "虩"),
+ (0x2F9B7, "M", "蚩"),
+ (0x2F9B8, "M", "蚈"),
+ (0x2F9B9, "M", "蜎"),
+ (0x2F9BA, "M", "蛢"),
+ (0x2F9BB, "M", "蝹"),
+ (0x2F9BC, "M", "蜨"),
+ (0x2F9BD, "M", "蝫"),
+ (0x2F9BE, "M", "螆"),
+ (0x2F9BF, "X"),
+ (0x2F9C0, "M", "蟡"),
+ (0x2F9C1, "M", "蠁"),
+ (0x2F9C2, "M", "䗹"),
+ (0x2F9C3, "M", "衠"),
+ (0x2F9C4, "M", "衣"),
+ (0x2F9C5, "M", "𧙧"),
+ (0x2F9C6, "M", "裗"),
+ (0x2F9C7, "M", "裞"),
+ (0x2F9C8, "M", "䘵"),
+ (0x2F9C9, "M", "裺"),
+ (0x2F9CA, "M", "㒻"),
+ (0x2F9CB, "M", "𧢮"),
+ (0x2F9CC, "M", "𧥦"),
+ (0x2F9CD, "M", "䚾"),
+ (0x2F9CE, "M", "䛇"),
+ (0x2F9CF, "M", "誠"),
+ (0x2F9D0, "M", "諭"),
+ (0x2F9D1, "M", "變"),
+ (0x2F9D2, "M", "豕"),
+ (0x2F9D3, "M", "𧲨"),
+ (0x2F9D4, "M", "貫"),
+ (0x2F9D5, "M", "賁"),
+ (0x2F9D6, "M", "贛"),
+ (0x2F9D7, "M", "起"),
]
+
def _seg_81() -> List[Union[Tuple[int, str], Tuple[int, str, str]]]:
return [
- (0x2F9D6, 'M', '贛'),
- (0x2F9D7, 'M', '起'),
- (0x2F9D8, 'M', '𧼯'),
- (0x2F9D9, 'M', '𠠄'),
- (0x2F9DA, 'M', '跋'),
- (0x2F9DB, 'M', '趼'),
- (0x2F9DC, 'M', '跰'),
- (0x2F9DD, 'M', '𠣞'),
- (0x2F9DE, 'M', '軔'),
- (0x2F9DF, 'M', '輸'),
- (0x2F9E0, 'M', '𨗒'),
- (0x2F9E1, 'M', '𨗭'),
- (0x2F9E2, 'M', '邔'),
- (0x2F9E3, 'M', '郱'),
- (0x2F9E4, 'M', '鄑'),
- (0x2F9E5, 'M', '𨜮'),
- (0x2F9E6, 'M', '鄛'),
- (0x2F9E7, 'M', '鈸'),
- (0x2F9E8, 'M', '鋗'),
- (0x2F9E9, 'M', '鋘'),
- (0x2F9EA, 'M', '鉼'),
- (0x2F9EB, 'M', '鏹'),
- (0x2F9EC, 'M', '鐕'),
- (0x2F9ED, 'M', '𨯺'),
- (0x2F9EE, 'M', '開'),
- (0x2F9EF, 'M', '䦕'),
- (0x2F9F0, 'M', '閷'),
- (0x2F9F1, 'M', '𨵷'),
- (0x2F9F2, 'M', '䧦'),
- (0x2F9F3, 'M', '雃'),
- (0x2F9F4, 'M', '嶲'),
- (0x2F9F5, 'M', '霣'),
- (0x2F9F6, 'M', '𩅅'),
- (0x2F9F7, 'M', '𩈚'),
- (0x2F9F8, 'M', '䩮'),
- (0x2F9F9, 'M', '䩶'),
- (0x2F9FA, 'M', '韠'),
- (0x2F9FB, 'M', '𩐊'),
- (0x2F9FC, 'M', '䪲'),
- (0x2F9FD, 'M', '𩒖'),
- (0x2F9FE, 'M', '頋'),
- (0x2FA00, 'M', '頩'),
- (0x2FA01, 'M', '𩖶'),
- (0x2FA02, 'M', '飢'),
- (0x2FA03, 'M', '䬳'),
- (0x2FA04, 'M', '餩'),
- (0x2FA05, 'M', '馧'),
- (0x2FA06, 'M', '駂'),
- (0x2FA07, 'M', '駾'),
- (0x2FA08, 'M', '䯎'),
- (0x2FA09, 'M', '𩬰'),
- (0x2FA0A, 'M', '鬒'),
- (0x2FA0B, 'M', '鱀'),
- (0x2FA0C, 'M', '鳽'),
- (0x2FA0D, 'M', '䳎'),
- (0x2FA0E, 'M', '䳭'),
- (0x2FA0F, 'M', '鵧'),
- (0x2FA10, 'M', '𪃎'),
- (0x2FA11, 'M', '䳸'),
- (0x2FA12, 'M', '𪄅'),
- (0x2FA13, 'M', '𪈎'),
- (0x2FA14, 'M', '𪊑'),
- (0x2FA15, 'M', '麻'),
- (0x2FA16, 'M', '䵖'),
- (0x2FA17, 'M', '黹'),
- (0x2FA18, 'M', '黾'),
- (0x2FA19, 'M', '鼅'),
- (0x2FA1A, 'M', '鼏'),
- (0x2FA1B, 'M', '鼖'),
- (0x2FA1C, 'M', '鼻'),
- (0x2FA1D, 'M', '𪘀'),
- (0x2FA1E, 'X'),
- (0x30000, 'V'),
- (0x3134B, 'X'),
- (0x31350, 'V'),
- (0x323B0, 'X'),
- (0xE0100, 'I'),
- (0xE01F0, 'X'),
+ (0x2F9D8, "M", "𧼯"),
+ (0x2F9D9, "M", "𠠄"),
+ (0x2F9DA, "M", "跋"),
+ (0x2F9DB, "M", "趼"),
+ (0x2F9DC, "M", "跰"),
+ (0x2F9DD, "M", "𠣞"),
+ (0x2F9DE, "M", "軔"),
+ (0x2F9DF, "M", "輸"),
+ (0x2F9E0, "M", "𨗒"),
+ (0x2F9E1, "M", "𨗭"),
+ (0x2F9E2, "M", "邔"),
+ (0x2F9E3, "M", "郱"),
+ (0x2F9E4, "M", "鄑"),
+ (0x2F9E5, "M", "𨜮"),
+ (0x2F9E6, "M", "鄛"),
+ (0x2F9E7, "M", "鈸"),
+ (0x2F9E8, "M", "鋗"),
+ (0x2F9E9, "M", "鋘"),
+ (0x2F9EA, "M", "鉼"),
+ (0x2F9EB, "M", "鏹"),
+ (0x2F9EC, "M", "鐕"),
+ (0x2F9ED, "M", "𨯺"),
+ (0x2F9EE, "M", "開"),
+ (0x2F9EF, "M", "䦕"),
+ (0x2F9F0, "M", "閷"),
+ (0x2F9F1, "M", "𨵷"),
+ (0x2F9F2, "M", "䧦"),
+ (0x2F9F3, "M", "雃"),
+ (0x2F9F4, "M", "嶲"),
+ (0x2F9F5, "M", "霣"),
+ (0x2F9F6, "M", "𩅅"),
+ (0x2F9F7, "M", "𩈚"),
+ (0x2F9F8, "M", "䩮"),
+ (0x2F9F9, "M", "䩶"),
+ (0x2F9FA, "M", "韠"),
+ (0x2F9FB, "M", "𩐊"),
+ (0x2F9FC, "M", "䪲"),
+ (0x2F9FD, "M", "𩒖"),
+ (0x2F9FE, "M", "頋"),
+ (0x2FA00, "M", "頩"),
+ (0x2FA01, "M", "𩖶"),
+ (0x2FA02, "M", "飢"),
+ (0x2FA03, "M", "䬳"),
+ (0x2FA04, "M", "餩"),
+ (0x2FA05, "M", "馧"),
+ (0x2FA06, "M", "駂"),
+ (0x2FA07, "M", "駾"),
+ (0x2FA08, "M", "䯎"),
+ (0x2FA09, "M", "𩬰"),
+ (0x2FA0A, "M", "鬒"),
+ (0x2FA0B, "M", "鱀"),
+ (0x2FA0C, "M", "鳽"),
+ (0x2FA0D, "M", "䳎"),
+ (0x2FA0E, "M", "䳭"),
+ (0x2FA0F, "M", "鵧"),
+ (0x2FA10, "M", "𪃎"),
+ (0x2FA11, "M", "䳸"),
+ (0x2FA12, "M", "𪄅"),
+ (0x2FA13, "M", "𪈎"),
+ (0x2FA14, "M", "𪊑"),
+ (0x2FA15, "M", "麻"),
+ (0x2FA16, "M", "䵖"),
+ (0x2FA17, "M", "黹"),
+ (0x2FA18, "M", "黾"),
+ (0x2FA19, "M", "鼅"),
+ (0x2FA1A, "M", "鼏"),
+ (0x2FA1B, "M", "鼖"),
+ (0x2FA1C, "M", "鼻"),
+ (0x2FA1D, "M", "𪘀"),
+ (0x2FA1E, "X"),
+ (0x30000, "V"),
+ (0x3134B, "X"),
+ (0x31350, "V"),
+ (0x323B0, "X"),
+ (0xE0100, "I"),
+ (0xE01F0, "X"),
]
+
uts46data = tuple(
_seg_0()
+ _seg_1()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py
index 1300b866..ad68271d 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py
@@ -1,22 +1,20 @@
-# coding: utf-8
-from .exceptions import *
+# ruff: noqa: F401
+import os
+
+from .exceptions import * # noqa: F403
from .ext import ExtType, Timestamp
-import os
-import sys
+version = (1, 1, 1)
+__version__ = "1.1.1"
-version = (1, 0, 5)
-__version__ = "1.0.5"
-
-
-if os.environ.get("MSGPACK_PUREPYTHON") or sys.version_info[0] == 2:
- from .fallback import Packer, unpackb, Unpacker
+if os.environ.get("MSGPACK_PUREPYTHON"):
+ from .fallback import Packer, Unpacker, unpackb
else:
try:
- from ._cmsgpack import Packer, unpackb, Unpacker
+ from ._cmsgpack import Packer, Unpacker, unpackb
except ImportError:
- from .fallback import Packer, unpackb, Unpacker
+ from .fallback import Packer, Unpacker, unpackb
def pack(o, stream, **kwargs):
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc
index 80610360..1338bbbd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc
index ea1fa1d5..701a7ff7 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc
index 0fe4ddcd..646446a8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc
index d38265f4..4298315f 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py
index 23e0d6b4..9694819a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py
@@ -1,21 +1,6 @@
-# coding: utf-8
-from collections import namedtuple
import datetime
-import sys
import struct
-
-
-PY2 = sys.version_info[0] == 2
-
-if PY2:
- int_types = (int, long)
- _utc = None
-else:
- int_types = int
- try:
- _utc = datetime.timezone.utc
- except AttributeError:
- _utc = datetime.timezone(datetime.timedelta(0))
+from collections import namedtuple
class ExtType(namedtuple("ExtType", "code data")):
@@ -28,14 +13,15 @@ class ExtType(namedtuple("ExtType", "code data")):
raise TypeError("data must be bytes")
if not 0 <= code <= 127:
raise ValueError("code must be 0~127")
- return super(ExtType, cls).__new__(cls, code, data)
+ return super().__new__(cls, code, data)
-class Timestamp(object):
+class Timestamp:
"""Timestamp represents the Timestamp extension type in msgpack.
- When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`. When using pure-Python
- msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and unpack `Timestamp`.
+ When built with Cython, msgpack uses C methods to pack and unpack `Timestamp`.
+ When using pure-Python msgpack, :func:`to_bytes` and :func:`from_bytes` are used to pack and
+ unpack `Timestamp`.
This class is immutable: Do not override seconds and nanoseconds.
"""
@@ -53,31 +39,25 @@ class Timestamp(object):
Number of nanoseconds to add to `seconds` to get fractional time.
Maximum is 999_999_999. Default is 0.
- Note: Negative times (before the UNIX epoch) are represented as negative seconds + positive ns.
+ Note: Negative times (before the UNIX epoch) are represented as neg. seconds + pos. ns.
"""
- if not isinstance(seconds, int_types):
+ if not isinstance(seconds, int):
raise TypeError("seconds must be an integer")
- if not isinstance(nanoseconds, int_types):
+ if not isinstance(nanoseconds, int):
raise TypeError("nanoseconds must be an integer")
if not (0 <= nanoseconds < 10**9):
- raise ValueError(
- "nanoseconds must be a non-negative integer less than 999999999."
- )
+ raise ValueError("nanoseconds must be a non-negative integer less than 999999999.")
self.seconds = seconds
self.nanoseconds = nanoseconds
def __repr__(self):
"""String representation of Timestamp."""
- return "Timestamp(seconds={0}, nanoseconds={1})".format(
- self.seconds, self.nanoseconds
- )
+ return f"Timestamp(seconds={self.seconds}, nanoseconds={self.nanoseconds})"
def __eq__(self, other):
"""Check for equality with another Timestamp object"""
if type(other) is self.__class__:
- return (
- self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
- )
+ return self.seconds == other.seconds and self.nanoseconds == other.nanoseconds
return False
def __ne__(self, other):
@@ -140,7 +120,7 @@ class Timestamp(object):
"""Create a Timestamp from posix timestamp in seconds.
:param unix_float: Posix timestamp in seconds.
- :type unix_float: int or float.
+ :type unix_float: int or float
"""
seconds = int(unix_sec // 1)
nanoseconds = int((unix_sec % 1) * 10**9)
@@ -174,20 +154,17 @@ class Timestamp(object):
def to_datetime(self):
"""Get the timestamp as a UTC datetime.
- Python 2 is not supported.
-
- :rtype: datetime.
+ :rtype: `datetime.datetime`
"""
- return datetime.datetime.fromtimestamp(0, _utc) + datetime.timedelta(
- seconds=self.to_unix()
+ utc = datetime.timezone.utc
+ return datetime.datetime.fromtimestamp(0, utc) + datetime.timedelta(
+ seconds=self.seconds, microseconds=self.nanoseconds // 1000
)
@staticmethod
def from_datetime(dt):
"""Create a Timestamp from datetime with tzinfo.
- Python 2 is not supported.
-
:rtype: Timestamp
"""
- return Timestamp.from_unix(dt.timestamp())
+ return Timestamp(seconds=int(dt.timestamp()), nanoseconds=dt.microsecond * 1000)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
index e8cebc1b..b02e47cf 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
@@ -1,60 +1,22 @@
"""Fallback pure Python implementation of msgpack"""
-from datetime import datetime as _DateTime
-import sys
+
import struct
-
-
-PY2 = sys.version_info[0] == 2
-if PY2:
- int_types = (int, long)
-
- def dict_iteritems(d):
- return d.iteritems()
-
-else:
- int_types = int
- unicode = str
- xrange = range
-
- def dict_iteritems(d):
- return d.items()
-
-
-if sys.version_info < (3, 5):
- # Ugly hack...
- RecursionError = RuntimeError
-
- def _is_recursionerror(e):
- return (
- len(e.args) == 1
- and isinstance(e.args[0], str)
- and e.args[0].startswith("maximum recursion depth exceeded")
- )
-
-else:
-
- def _is_recursionerror(e):
- return True
-
+import sys
+from datetime import datetime as _DateTime
if hasattr(sys, "pypy_version_info"):
- # StringIO is slow on PyPy, StringIO is faster. However: PyPy's own
- # StringBuilder is fastest.
from __pypy__ import newlist_hint
+ from __pypy__.builders import BytesBuilder
- try:
- from __pypy__.builders import BytesBuilder as StringBuilder
- except ImportError:
- from __pypy__.builders import StringBuilder
- USING_STRINGBUILDER = True
+ _USING_STRINGBUILDER = True
- class StringIO(object):
+ class BytesIO:
def __init__(self, s=b""):
if s:
- self.builder = StringBuilder(len(s))
+ self.builder = BytesBuilder(len(s))
self.builder.append(s)
else:
- self.builder = StringBuilder()
+ self.builder = BytesBuilder()
def write(self, s):
if isinstance(s, memoryview):
@@ -67,17 +29,17 @@ if hasattr(sys, "pypy_version_info"):
return self.builder.build()
else:
- USING_STRINGBUILDER = False
- from io import BytesIO as StringIO
+ from io import BytesIO
- newlist_hint = lambda size: []
+ _USING_STRINGBUILDER = False
+
+ def newlist_hint(size):
+ return []
-from .exceptions import BufferFull, OutOfData, ExtraData, FormatError, StackError
-
+from .exceptions import BufferFull, ExtraData, FormatError, OutOfData, StackError
from .ext import ExtType, Timestamp
-
EX_SKIP = 0
EX_CONSTRUCT = 1
EX_READ_ARRAY_HEADER = 2
@@ -125,24 +87,13 @@ def unpackb(packed, **kwargs):
ret = unpacker._unpack()
except OutOfData:
raise ValueError("Unpack failed: incomplete input")
- except RecursionError as e:
- if _is_recursionerror(e):
- raise StackError
- raise
+ except RecursionError:
+ raise StackError
if unpacker._got_extradata():
raise ExtraData(ret, unpacker._get_extradata())
return ret
-if sys.version_info < (2, 7, 6):
-
- def _unpack_from(f, b, o=0):
- """Explicit type cast for legacy struct.unpack_from"""
- return struct.unpack_from(f, bytes(b), o)
-
-else:
- _unpack_from = struct.unpack_from
-
_NO_FORMAT_USED = ""
_MSGPACK_HEADERS = {
0xC4: (1, _NO_FORMAT_USED, TYPE_BIN),
@@ -176,14 +127,14 @@ _MSGPACK_HEADERS = {
}
-class Unpacker(object):
+class Unpacker:
"""Streaming unpacker.
Arguments:
:param file_like:
File-like object having `.read(n)` method.
- If specified, unpacker reads serialized data from it and :meth:`feed()` is not usable.
+ If specified, unpacker reads serialized data from it and `.feed()` is not usable.
:param int read_size:
Used as `file_like.read(read_size)`. (default: `min(16*1024, max_buffer_size)`)
@@ -202,17 +153,17 @@ class Unpacker(object):
0 - Timestamp
1 - float (Seconds from the EPOCH)
2 - int (Nanoseconds from the EPOCH)
- 3 - datetime.datetime (UTC). Python 2 is not supported.
+ 3 - datetime.datetime (UTC).
:param bool strict_map_key:
If true (default), only str or bytes are accepted for map (dict) keys.
- :param callable object_hook:
+ :param object_hook:
When specified, it should be callable.
Unpacker calls it with a dict argument after unpacking msgpack map.
(See also simplejson)
- :param callable object_pairs_hook:
+ :param object_pairs_hook:
When specified, it should be callable.
Unpacker calls it with a list of key-value pairs after unpacking msgpack map.
(See also simplejson)
@@ -275,6 +226,7 @@ class Unpacker(object):
def __init__(
self,
file_like=None,
+ *,
read_size=0,
use_list=True,
raw=False,
@@ -359,9 +311,7 @@ class Unpacker(object):
if object_pairs_hook is not None and not callable(object_pairs_hook):
raise TypeError("`object_pairs_hook` is not callable")
if object_hook is not None and object_pairs_hook is not None:
- raise TypeError(
- "object_pairs_hook and object_hook are mutually " "exclusive"
- )
+ raise TypeError("object_pairs_hook and object_hook are mutually exclusive")
if not callable(ext_hook):
raise TypeError("`ext_hook` is not callable")
@@ -379,6 +329,7 @@ class Unpacker(object):
# Use extend here: INPLACE_ADD += doesn't reliably typecast memoryview in jython
self._buffer.extend(view)
+ view.release()
def _consume(self):
"""Gets rid of the used parts of the buffer."""
@@ -453,20 +404,18 @@ class Unpacker(object):
n = b & 0b00011111
typ = TYPE_RAW
if n > self._max_str_len:
- raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
+ raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
obj = self._read(n)
elif b & 0b11110000 == 0b10010000:
n = b & 0b00001111
typ = TYPE_ARRAY
if n > self._max_array_len:
- raise ValueError(
- "%s exceeds max_array_len(%s)" % (n, self._max_array_len)
- )
+ raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
elif b & 0b11110000 == 0b10000000:
n = b & 0b00001111
typ = TYPE_MAP
if n > self._max_map_len:
- raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
+ raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
elif b == 0xC0:
obj = None
elif b == 0xC2:
@@ -477,65 +426,61 @@ class Unpacker(object):
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- n = _unpack_from(fmt, self._buffer, self._buff_i)[0]
+ n = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
else:
n = self._buffer[self._buff_i]
self._buff_i += size
if n > self._max_bin_len:
- raise ValueError("%s exceeds max_bin_len(%s)" % (n, self._max_bin_len))
+ raise ValueError(f"{n} exceeds max_bin_len({self._max_bin_len})")
obj = self._read(n)
elif 0xC7 <= b <= 0xC9:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- L, n = _unpack_from(fmt, self._buffer, self._buff_i)
+ L, n = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if L > self._max_ext_len:
- raise ValueError("%s exceeds max_ext_len(%s)" % (L, self._max_ext_len))
+ raise ValueError(f"{L} exceeds max_ext_len({self._max_ext_len})")
obj = self._read(L)
elif 0xCA <= b <= 0xD3:
size, fmt = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- obj = _unpack_from(fmt, self._buffer, self._buff_i)[0]
+ obj = struct.unpack_from(fmt, self._buffer, self._buff_i)[0]
else:
obj = self._buffer[self._buff_i]
self._buff_i += size
elif 0xD4 <= b <= 0xD8:
size, fmt, typ = _MSGPACK_HEADERS[b]
if self._max_ext_len < size:
- raise ValueError(
- "%s exceeds max_ext_len(%s)" % (size, self._max_ext_len)
- )
+ raise ValueError(f"{size} exceeds max_ext_len({self._max_ext_len})")
self._reserve(size + 1)
- n, obj = _unpack_from(fmt, self._buffer, self._buff_i)
+ n, obj = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size + 1
elif 0xD9 <= b <= 0xDB:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
if len(fmt) > 0:
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
else:
n = self._buffer[self._buff_i]
self._buff_i += size
if n > self._max_str_len:
- raise ValueError("%s exceeds max_str_len(%s)" % (n, self._max_str_len))
+ raise ValueError(f"{n} exceeds max_str_len({self._max_str_len})")
obj = self._read(n)
elif 0xDC <= b <= 0xDD:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if n > self._max_array_len:
- raise ValueError(
- "%s exceeds max_array_len(%s)" % (n, self._max_array_len)
- )
+ raise ValueError(f"{n} exceeds max_array_len({self._max_array_len})")
elif 0xDE <= b <= 0xDF:
size, fmt, typ = _MSGPACK_HEADERS[b]
self._reserve(size)
- (n,) = _unpack_from(fmt, self._buffer, self._buff_i)
+ (n,) = struct.unpack_from(fmt, self._buffer, self._buff_i)
self._buff_i += size
if n > self._max_map_len:
- raise ValueError("%s exceeds max_map_len(%s)" % (n, self._max_map_len))
+ raise ValueError(f"{n} exceeds max_map_len({self._max_map_len})")
else:
raise FormatError("Unknown header: 0x%x" % b)
return typ, n, obj
@@ -554,12 +499,12 @@ class Unpacker(object):
# TODO should we eliminate the recursion?
if typ == TYPE_ARRAY:
if execute == EX_SKIP:
- for i in xrange(n):
+ for i in range(n):
# TODO check whether we need to call `list_hook`
self._unpack(EX_SKIP)
return
ret = newlist_hint(n)
- for i in xrange(n):
+ for i in range(n):
ret.append(self._unpack(EX_CONSTRUCT))
if self._list_hook is not None:
ret = self._list_hook(ret)
@@ -567,25 +512,22 @@ class Unpacker(object):
return ret if self._use_list else tuple(ret)
if typ == TYPE_MAP:
if execute == EX_SKIP:
- for i in xrange(n):
+ for i in range(n):
# TODO check whether we need to call hooks
self._unpack(EX_SKIP)
self._unpack(EX_SKIP)
return
if self._object_pairs_hook is not None:
ret = self._object_pairs_hook(
- (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT))
- for _ in xrange(n)
+ (self._unpack(EX_CONSTRUCT), self._unpack(EX_CONSTRUCT)) for _ in range(n)
)
else:
ret = {}
- for _ in xrange(n):
+ for _ in range(n):
key = self._unpack(EX_CONSTRUCT)
- if self._strict_map_key and type(key) not in (unicode, bytes):
- raise ValueError(
- "%s is not allowed for map key" % str(type(key))
- )
- if not PY2 and type(key) is str:
+ if self._strict_map_key and type(key) not in (str, bytes):
+ raise ValueError("%s is not allowed for map key" % str(type(key)))
+ if isinstance(key, str):
key = sys.intern(key)
ret[key] = self._unpack(EX_CONSTRUCT)
if self._object_hook is not None:
@@ -659,7 +601,7 @@ class Unpacker(object):
return self._stream_offset
-class Packer(object):
+class Packer:
"""
MessagePack Packer
@@ -671,7 +613,8 @@ class Packer(object):
Packer's constructor has some keyword arguments:
- :param callable default:
+ :param default:
+ When specified, it should be callable.
Convert user type to builtin type that Packer supports.
See also simplejson's document.
@@ -698,38 +641,18 @@ class Packer(object):
If set to true, datetime with tzinfo is packed into Timestamp type.
Note that the tzinfo is stripped in the timestamp.
You can get UTC datetime with `timestamp=3` option of the Unpacker.
- (Python 2 is not supported).
:param str unicode_errors:
The error handler for encoding unicode. (default: 'strict')
DO NOT USE THIS!! This option is kept for very specific usage.
- Example of streaming deserialize from file-like object::
-
- unpacker = Unpacker(file_like)
- for o in unpacker:
- process(o)
-
- Example of streaming deserialize from socket::
-
- unpacker = Unpacker()
- while True:
- buf = sock.recv(1024**2)
- if not buf:
- break
- unpacker.feed(buf)
- for o in unpacker:
- process(o)
-
- Raises ``ExtraData`` when *packed* contains extra bytes.
- Raises ``OutOfData`` when *packed* is incomplete.
- Raises ``FormatError`` when *packed* is not valid msgpack.
- Raises ``StackError`` when *packed* contains too nested.
- Other exceptions can be raised during unpacking.
+ :param int buf_size:
+ Internal buffer size. This option is used only for C implementation.
"""
def __init__(
self,
+ *,
default=None,
use_single_float=False,
autoreset=True,
@@ -737,19 +660,17 @@ class Packer(object):
strict_types=False,
datetime=False,
unicode_errors=None,
+ buf_size=None,
):
self._strict_types = strict_types
self._use_float = use_single_float
self._autoreset = autoreset
self._use_bin_type = use_bin_type
- self._buffer = StringIO()
- if PY2 and datetime:
- raise ValueError("datetime is not supported in Python 2")
+ self._buffer = BytesIO()
self._datetime = bool(datetime)
self._unicode_errors = unicode_errors or "strict"
- if default is not None:
- if not callable(default):
- raise TypeError("default must be callable")
+ if default is not None and not callable(default):
+ raise TypeError("default must be callable")
self._default = default
def _pack(
@@ -774,7 +695,7 @@ class Packer(object):
if obj:
return self._buffer.write(b"\xc3")
return self._buffer.write(b"\xc2")
- if check(obj, int_types):
+ if check(obj, int):
if 0 <= obj < 0x80:
return self._buffer.write(struct.pack("B", obj))
if -0x20 <= obj < 0:
@@ -806,7 +727,7 @@ class Packer(object):
raise ValueError("%s is too large" % type(obj).__name__)
self._pack_bin_header(n)
return self._buffer.write(obj)
- if check(obj, unicode):
+ if check(obj, str):
obj = obj.encode("utf-8", self._unicode_errors)
n = len(obj)
if n >= 2**32:
@@ -855,13 +776,11 @@ class Packer(object):
if check(obj, list_types):
n = len(obj)
self._pack_array_header(n)
- for i in xrange(n):
+ for i in range(n):
self._pack(obj[i], nest_limit - 1)
return
if check(obj, dict):
- return self._pack_map_pairs(
- len(obj), dict_iteritems(obj), nest_limit - 1
- )
+ return self._pack_map_pairs(len(obj), obj.items(), nest_limit - 1)
if self._datetime and check(obj, _DateTime) and obj.tzinfo is not None:
obj = Timestamp.from_datetime(obj)
@@ -874,26 +793,26 @@ class Packer(object):
continue
if self._datetime and check(obj, _DateTime):
- raise ValueError("Cannot serialize %r where tzinfo=None" % (obj,))
+ raise ValueError(f"Cannot serialize {obj!r} where tzinfo=None")
- raise TypeError("Cannot serialize %r" % (obj,))
+ raise TypeError(f"Cannot serialize {obj!r}")
def pack(self, obj):
try:
self._pack(obj)
except:
- self._buffer = StringIO() # force reset
+ self._buffer = BytesIO() # force reset
raise
if self._autoreset:
ret = self._buffer.getvalue()
- self._buffer = StringIO()
+ self._buffer = BytesIO()
return ret
def pack_map_pairs(self, pairs):
self._pack_map_pairs(len(pairs), pairs)
if self._autoreset:
ret = self._buffer.getvalue()
- self._buffer = StringIO()
+ self._buffer = BytesIO()
return ret
def pack_array_header(self, n):
@@ -902,7 +821,7 @@ class Packer(object):
self._pack_array_header(n)
if self._autoreset:
ret = self._buffer.getvalue()
- self._buffer = StringIO()
+ self._buffer = BytesIO()
return ret
def pack_map_header(self, n):
@@ -911,7 +830,7 @@ class Packer(object):
self._pack_map_header(n)
if self._autoreset:
ret = self._buffer.getvalue()
- self._buffer = StringIO()
+ self._buffer = BytesIO()
return ret
def pack_ext_type(self, typecode, data):
@@ -963,7 +882,7 @@ class Packer(object):
def _pack_map_pairs(self, n, pairs, nest_limit=DEFAULT_RECURSE_LIMIT):
self._pack_map_header(n)
- for (k, v) in pairs:
+ for k, v in pairs:
self._pack(k, nest_limit - 1)
self._pack(v, nest_limit - 1)
@@ -1000,11 +919,11 @@ class Packer(object):
This method is useful only when autoreset=False.
"""
- self._buffer = StringIO()
+ self._buffer = BytesIO()
def getbuffer(self):
"""Return view of internal buffer."""
- if USING_STRINGBUILDER or PY2:
+ if _USING_STRINGBUILDER:
return memoryview(self.bytes())
else:
return self._buffer.getbuffer()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py
deleted file mode 100644
index 3551bc2d..00000000
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file is dual licensed under the terms of the Apache License, Version
-# 2.0, and the BSD License. See the LICENSE file in the root of this repository
-# for complete details.
-
-__all__ = [
- "__title__",
- "__summary__",
- "__uri__",
- "__version__",
- "__author__",
- "__email__",
- "__license__",
- "__copyright__",
-]
-
-__title__ = "packaging"
-__summary__ = "Core utilities for Python packages"
-__uri__ = "https://github.com/pypa/packaging"
-
-__version__ = "21.3"
-
-__author__ = "Donald Stufft and individual contributors"
-__email__ = "donald@stufft.io"
-
-__license__ = "BSD-2-Clause or Apache-2.0"
-__copyright__ = "2014-2019 %s" % __author__
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py
index 3c50c5dc..d45c22cf 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py
@@ -2,24 +2,14 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
-from .__about__ import (
- __author__,
- __copyright__,
- __email__,
- __license__,
- __summary__,
- __title__,
- __uri__,
- __version__,
-)
+__title__ = "packaging"
+__summary__ = "Core utilities for Python packages"
+__uri__ = "https://github.com/pypa/packaging"
-__all__ = [
- "__title__",
- "__summary__",
- "__uri__",
- "__version__",
- "__author__",
- "__email__",
- "__license__",
- "__copyright__",
-]
+__version__ = "25.0"
+
+__author__ = "Donald Stufft and individual contributors"
+__email__ = "donald@stufft.io"
+
+__license__ = "BSD-2-Clause or Apache-2.0"
+__copyright__ = f"2014 {__author__}"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc
deleted file mode 100644
index 243ec18f..00000000
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-312.pyc and /dev/null differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc
index d3a3a3e2..a8703d42 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc
new file mode 100644
index 00000000..328eedff
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_elffile.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc
index 79b59fd4..0965c983 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc
index 8e21bca7..f76c91cd 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc
new file mode 100644
index 00000000..5fe45f7f
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_parser.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc
index 54855cf3..2e568c4d 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc
new file mode 100644
index 00000000..7ebcc50a
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/_tokenizer.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc
index cb91f38b..0b666b1b 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc
new file mode 100644
index 00000000..9b416bc4
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/metadata.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc
index aa03b7b5..2403dd07 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc
index adbe1280..23f1e44e 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc
index 753a0e4c..7ac063e1 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc
index 1fef0eb3..13002dba 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc
index 5d9e4f02..8fd944a9 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py
new file mode 100644
index 00000000..7a5afc33
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_elffile.py
@@ -0,0 +1,109 @@
+"""
+ELF file parser.
+
+This provides a class ``ELFFile`` that parses an ELF executable in a similar
+interface to ``ZipFile``. Only the read interface is implemented.
+
+Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
+ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
+"""
+
+from __future__ import annotations
+
+import enum
+import os
+import struct
+from typing import IO
+
+
+class ELFInvalid(ValueError):
+ pass
+
+
+class EIClass(enum.IntEnum):
+ C32 = 1
+ C64 = 2
+
+
+class EIData(enum.IntEnum):
+ Lsb = 1
+ Msb = 2
+
+
+class EMachine(enum.IntEnum):
+ I386 = 3
+ S390 = 22
+ Arm = 40
+ X8664 = 62
+ AArc64 = 183
+
+
+class ELFFile:
+ """
+ Representation of an ELF executable.
+ """
+
+ def __init__(self, f: IO[bytes]) -> None:
+ self._f = f
+
+ try:
+ ident = self._read("16B")
+ except struct.error as e:
+ raise ELFInvalid("unable to parse identification") from e
+ magic = bytes(ident[:4])
+ if magic != b"\x7fELF":
+ raise ELFInvalid(f"invalid magic: {magic!r}")
+
+ self.capacity = ident[4] # Format for program header (bitness).
+ self.encoding = ident[5] # Data structure encoding (endianness).
+
+ try:
+ # e_fmt: Format for program header.
+ # p_fmt: Format for section header.
+ # p_idx: Indexes to find p_type, p_offset, and p_filesz.
+ e_fmt, self._p_fmt, self._p_idx = {
+ (1, 1): ("HHIIIIIHHH", ">IIIIIIII", (0, 1, 4)), # 32-bit MSB.
+ (2, 1): ("HHIQQQIHHH", ">IIQQQQQQ", (0, 2, 5)), # 64-bit MSB.
+ }[(self.capacity, self.encoding)]
+ except KeyError as e:
+ raise ELFInvalid(
+ f"unrecognized capacity ({self.capacity}) or encoding ({self.encoding})"
+ ) from e
+
+ try:
+ (
+ _,
+ self.machine, # Architecture type.
+ _,
+ _,
+ self._e_phoff, # Offset of program header.
+ _,
+ self.flags, # Processor-specific flags.
+ _,
+ self._e_phentsize, # Size of section.
+ self._e_phnum, # Number of sections.
+ ) = self._read(e_fmt)
+ except struct.error as e:
+ raise ELFInvalid("unable to parse machine and section information") from e
+
+ def _read(self, fmt: str) -> tuple[int, ...]:
+ return struct.unpack(fmt, self._f.read(struct.calcsize(fmt)))
+
+ @property
+ def interpreter(self) -> str | None:
+ """
+ The path recorded in the ``PT_INTERP`` section header.
+ """
+ for index in range(self._e_phnum):
+ self._f.seek(self._e_phoff + self._e_phentsize * index)
+ try:
+ data = self._read(self._p_fmt)
+ except struct.error:
+ continue
+ if data[self._p_idx[0]] != 3: # Not PT_INTERP.
+ continue
+ self._f.seek(data[self._p_idx[1]])
+ return os.fsdecode(self._f.read(data[self._p_idx[2]])).strip("\0")
+ return None
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py
index 4c379aa6..95f55762 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py
@@ -1,122 +1,72 @@
+from __future__ import annotations
+
import collections
+import contextlib
import functools
import os
import re
-import struct
import sys
import warnings
-from typing import IO, Dict, Iterator, NamedTuple, Optional, Tuple
+from typing import Generator, Iterator, NamedTuple, Sequence
+
+from ._elffile import EIClass, EIData, ELFFile, EMachine
+
+EF_ARM_ABIMASK = 0xFF000000
+EF_ARM_ABI_VER5 = 0x05000000
+EF_ARM_ABI_FLOAT_HARD = 0x00000400
-# Python does not provide platform information at sufficient granularity to
-# identify the architecture of the running executable in some cases, so we
-# determine it dynamically by reading the information from the running
-# process. This only applies on Linux, which uses the ELF format.
-class _ELFFileHeader:
- # https://en.wikipedia.org/wiki/Executable_and_Linkable_Format#File_header
- class _InvalidELFFileHeader(ValueError):
- """
- An invalid ELF file header was found.
- """
-
- ELF_MAGIC_NUMBER = 0x7F454C46
- ELFCLASS32 = 1
- ELFCLASS64 = 2
- ELFDATA2LSB = 1
- ELFDATA2MSB = 2
- EM_386 = 3
- EM_S390 = 22
- EM_ARM = 40
- EM_X86_64 = 62
- EF_ARM_ABIMASK = 0xFF000000
- EF_ARM_ABI_VER5 = 0x05000000
- EF_ARM_ABI_FLOAT_HARD = 0x00000400
-
- def __init__(self, file: IO[bytes]) -> None:
- def unpack(fmt: str) -> int:
- try:
- data = file.read(struct.calcsize(fmt))
- result: Tuple[int, ...] = struct.unpack(fmt, data)
- except struct.error:
- raise _ELFFileHeader._InvalidELFFileHeader()
- return result[0]
-
- self.e_ident_magic = unpack(">I")
- if self.e_ident_magic != self.ELF_MAGIC_NUMBER:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_class = unpack("B")
- if self.e_ident_class not in {self.ELFCLASS32, self.ELFCLASS64}:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_data = unpack("B")
- if self.e_ident_data not in {self.ELFDATA2LSB, self.ELFDATA2MSB}:
- raise _ELFFileHeader._InvalidELFFileHeader()
- self.e_ident_version = unpack("B")
- self.e_ident_osabi = unpack("B")
- self.e_ident_abiversion = unpack("B")
- self.e_ident_pad = file.read(7)
- format_h = "H"
- format_i = "I"
- format_q = "Q"
- format_p = format_i if self.e_ident_class == self.ELFCLASS32 else format_q
- self.e_type = unpack(format_h)
- self.e_machine = unpack(format_h)
- self.e_version = unpack(format_i)
- self.e_entry = unpack(format_p)
- self.e_phoff = unpack(format_p)
- self.e_shoff = unpack(format_p)
- self.e_flags = unpack(format_i)
- self.e_ehsize = unpack(format_h)
- self.e_phentsize = unpack(format_h)
- self.e_phnum = unpack(format_h)
- self.e_shentsize = unpack(format_h)
- self.e_shnum = unpack(format_h)
- self.e_shstrndx = unpack(format_h)
-
-
-def _get_elf_header() -> Optional[_ELFFileHeader]:
+# `os.PathLike` not a generic type until Python 3.9, so sticking with `str`
+# as the type for `path` until then.
+@contextlib.contextmanager
+def _parse_elf(path: str) -> Generator[ELFFile | None, None, None]:
try:
- with open(sys.executable, "rb") as f:
- elf_header = _ELFFileHeader(f)
- except (OSError, TypeError, _ELFFileHeader._InvalidELFFileHeader):
- return None
- return elf_header
+ with open(path, "rb") as f:
+ yield ELFFile(f)
+ except (OSError, TypeError, ValueError):
+ yield None
-def _is_linux_armhf() -> bool:
+def _is_linux_armhf(executable: str) -> bool:
# hard-float ABI can be detected from the ELF header of the running
# process
# https://static.docs.arm.com/ihi0044/g/aaelf32.pdf
- elf_header = _get_elf_header()
- if elf_header is None:
- return False
- result = elf_header.e_ident_class == elf_header.ELFCLASS32
- result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
- result &= elf_header.e_machine == elf_header.EM_ARM
- result &= (
- elf_header.e_flags & elf_header.EF_ARM_ABIMASK
- ) == elf_header.EF_ARM_ABI_VER5
- result &= (
- elf_header.e_flags & elf_header.EF_ARM_ABI_FLOAT_HARD
- ) == elf_header.EF_ARM_ABI_FLOAT_HARD
- return result
+ with _parse_elf(executable) as f:
+ return (
+ f is not None
+ and f.capacity == EIClass.C32
+ and f.encoding == EIData.Lsb
+ and f.machine == EMachine.Arm
+ and f.flags & EF_ARM_ABIMASK == EF_ARM_ABI_VER5
+ and f.flags & EF_ARM_ABI_FLOAT_HARD == EF_ARM_ABI_FLOAT_HARD
+ )
-def _is_linux_i686() -> bool:
- elf_header = _get_elf_header()
- if elf_header is None:
- return False
- result = elf_header.e_ident_class == elf_header.ELFCLASS32
- result &= elf_header.e_ident_data == elf_header.ELFDATA2LSB
- result &= elf_header.e_machine == elf_header.EM_386
- return result
+def _is_linux_i686(executable: str) -> bool:
+ with _parse_elf(executable) as f:
+ return (
+ f is not None
+ and f.capacity == EIClass.C32
+ and f.encoding == EIData.Lsb
+ and f.machine == EMachine.I386
+ )
-def _have_compatible_abi(arch: str) -> bool:
- if arch == "armv7l":
- return _is_linux_armhf()
- if arch == "i686":
- return _is_linux_i686()
- return arch in {"x86_64", "aarch64", "ppc64", "ppc64le", "s390x"}
+def _have_compatible_abi(executable: str, archs: Sequence[str]) -> bool:
+ if "armv7l" in archs:
+ return _is_linux_armhf(executable)
+ if "i686" in archs:
+ return _is_linux_i686(executable)
+ allowed_archs = {
+ "x86_64",
+ "aarch64",
+ "ppc64",
+ "ppc64le",
+ "s390x",
+ "loongarch64",
+ "riscv64",
+ }
+ return any(arch in allowed_archs for arch in archs)
# If glibc ever changes its major version, we need to know what the last
@@ -124,7 +74,7 @@ def _have_compatible_abi(arch: str) -> bool:
# For now, guess what the highest minor version might be, assume it will
# be 50 for testing. Once this actually happens, update the dictionary
# with the actual value.
-_LAST_GLIBC_MINOR: Dict[int, int] = collections.defaultdict(lambda: 50)
+_LAST_GLIBC_MINOR: dict[int, int] = collections.defaultdict(lambda: 50)
class _GLibCVersion(NamedTuple):
@@ -132,7 +82,7 @@ class _GLibCVersion(NamedTuple):
minor: int
-def _glibc_version_string_confstr() -> Optional[str]:
+def _glibc_version_string_confstr() -> str | None:
"""
Primary implementation of glibc_version_string using os.confstr.
"""
@@ -141,17 +91,17 @@ def _glibc_version_string_confstr() -> Optional[str]:
# platform module.
# https://github.com/python/cpython/blob/fcf1d003bf4f0100c/Lib/platform.py#L175-L183
try:
- # os.confstr("CS_GNU_LIBC_VERSION") returns a string like "glibc 2.17".
- version_string = os.confstr("CS_GNU_LIBC_VERSION")
+ # Should be a string like "glibc 2.17".
+ version_string: str | None = os.confstr("CS_GNU_LIBC_VERSION")
assert version_string is not None
- _, version = version_string.split()
+ _, version = version_string.rsplit()
except (AssertionError, AttributeError, OSError, ValueError):
# os.confstr() or CS_GNU_LIBC_VERSION not available (or a bad value)...
return None
return version
-def _glibc_version_string_ctypes() -> Optional[str]:
+def _glibc_version_string_ctypes() -> str | None:
"""
Fallback implementation of glibc_version_string using ctypes.
"""
@@ -195,12 +145,12 @@ def _glibc_version_string_ctypes() -> Optional[str]:
return version_str
-def _glibc_version_string() -> Optional[str]:
+def _glibc_version_string() -> str | None:
"""Returns glibc version string, or None if not using glibc."""
return _glibc_version_string_confstr() or _glibc_version_string_ctypes()
-def _parse_glibc_version(version_str: str) -> Tuple[int, int]:
+def _parse_glibc_version(version_str: str) -> tuple[int, int]:
"""Parse glibc version.
We use a regexp instead of str.split because we want to discard any
@@ -211,16 +161,16 @@ def _parse_glibc_version(version_str: str) -> Tuple[int, int]:
m = re.match(r"(?P[0-9]+)\.(?P[0-9]+)", version_str)
if not m:
warnings.warn(
- "Expected glibc version with 2 components major.minor,"
- " got: %s" % version_str,
+ f"Expected glibc version with 2 components major.minor, got: {version_str}",
RuntimeWarning,
+ stacklevel=2,
)
return -1, -1
return int(m.group("major")), int(m.group("minor"))
-@functools.lru_cache()
-def _get_glibc_version() -> Tuple[int, int]:
+@functools.lru_cache
+def _get_glibc_version() -> tuple[int, int]:
version_str = _glibc_version_string()
if version_str is None:
return (-1, -1)
@@ -228,13 +178,13 @@ def _get_glibc_version() -> Tuple[int, int]:
# From PEP 513, PEP 600
-def _is_compatible(name: str, arch: str, version: _GLibCVersion) -> bool:
+def _is_compatible(arch: str, version: _GLibCVersion) -> bool:
sys_glibc = _get_glibc_version()
if sys_glibc < version:
return False
# Check for presence of _manylinux module.
try:
- import _manylinux # noqa
+ import _manylinux
except ImportError:
return True
if hasattr(_manylinux, "manylinux_compatible"):
@@ -264,12 +214,22 @@ _LEGACY_MANYLINUX_MAP = {
}
-def platform_tags(linux: str, arch: str) -> Iterator[str]:
- if not _have_compatible_abi(arch):
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
+ """Generate manylinux tags compatible to the current platform.
+
+ :param archs: Sequence of compatible architectures.
+ The first one shall be the closest to the actual architecture and be the part of
+ platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+ The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+ be manylinux-compatible.
+
+ :returns: An iterator of compatible manylinux tags.
+ """
+ if not _have_compatible_abi(sys.executable, archs):
return
# Oldest glibc to be supported regardless of architecture is (2, 17).
too_old_glibc2 = _GLibCVersion(2, 16)
- if arch in {"x86_64", "i686"}:
+ if set(archs) & {"x86_64", "i686"}:
# On x86/i686 also oldest glibc to be supported is (2, 5).
too_old_glibc2 = _GLibCVersion(2, 4)
current_glibc = _GLibCVersion(*_get_glibc_version())
@@ -283,19 +243,20 @@ def platform_tags(linux: str, arch: str) -> Iterator[str]:
for glibc_major in range(current_glibc.major - 1, 1, -1):
glibc_minor = _LAST_GLIBC_MINOR[glibc_major]
glibc_max_list.append(_GLibCVersion(glibc_major, glibc_minor))
- for glibc_max in glibc_max_list:
- if glibc_max.major == too_old_glibc2.major:
- min_minor = too_old_glibc2.minor
- else:
- # For other glibc major versions oldest supported is (x, 0).
- min_minor = -1
- for glibc_minor in range(glibc_max.minor, min_minor, -1):
- glibc_version = _GLibCVersion(glibc_max.major, glibc_minor)
- tag = "manylinux_{}_{}".format(*glibc_version)
- if _is_compatible(tag, arch, glibc_version):
- yield linux.replace("linux", tag)
- # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags.
- if glibc_version in _LEGACY_MANYLINUX_MAP:
- legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version]
- if _is_compatible(legacy_tag, arch, glibc_version):
- yield linux.replace("linux", legacy_tag)
+ for arch in archs:
+ for glibc_max in glibc_max_list:
+ if glibc_max.major == too_old_glibc2.major:
+ min_minor = too_old_glibc2.minor
+ else:
+ # For other glibc major versions oldest supported is (x, 0).
+ min_minor = -1
+ for glibc_minor in range(glibc_max.minor, min_minor, -1):
+ glibc_version = _GLibCVersion(glibc_max.major, glibc_minor)
+ tag = "manylinux_{}_{}".format(*glibc_version)
+ if _is_compatible(arch, glibc_version):
+ yield f"{tag}_{arch}"
+ # Handle the legacy manylinux1, manylinux2010, manylinux2014 tags.
+ if glibc_version in _LEGACY_MANYLINUX_MAP:
+ legacy_tag = _LEGACY_MANYLINUX_MAP[glibc_version]
+ if _is_compatible(arch, glibc_version):
+ yield f"{legacy_tag}_{arch}"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
index 8ac3059b..d2bf30b5 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
@@ -4,68 +4,15 @@ This module implements logic to detect if the currently running Python is
linked against musl, and what musl version is used.
"""
-import contextlib
+from __future__ import annotations
+
import functools
-import operator
-import os
import re
-import struct
import subprocess
import sys
-from typing import IO, Iterator, NamedTuple, Optional, Tuple
+from typing import Iterator, NamedTuple, Sequence
-
-def _read_unpacked(f: IO[bytes], fmt: str) -> Tuple[int, ...]:
- return struct.unpack(fmt, f.read(struct.calcsize(fmt)))
-
-
-def _parse_ld_musl_from_elf(f: IO[bytes]) -> Optional[str]:
- """Detect musl libc location by parsing the Python executable.
-
- Based on: https://gist.github.com/lyssdod/f51579ae8d93c8657a5564aefc2ffbca
- ELF header: https://refspecs.linuxfoundation.org/elf/gabi4+/ch4.eheader.html
- """
- f.seek(0)
- try:
- ident = _read_unpacked(f, "16B")
- except struct.error:
- return None
- if ident[:4] != tuple(b"\x7fELF"): # Invalid magic, not ELF.
- return None
- f.seek(struct.calcsize("HHI"), 1) # Skip file type, machine, and version.
-
- try:
- # e_fmt: Format for program header.
- # p_fmt: Format for section header.
- # p_idx: Indexes to find p_type, p_offset, and p_filesz.
- e_fmt, p_fmt, p_idx = {
- 1: ("IIIIHHH", "IIIIIIII", (0, 1, 4)), # 32-bit.
- 2: ("QQQIHHH", "IIQQQQQQ", (0, 2, 5)), # 64-bit.
- }[ident[4]]
- except KeyError:
- return None
- else:
- p_get = operator.itemgetter(*p_idx)
-
- # Find the interpreter section and return its content.
- try:
- _, e_phoff, _, _, _, e_phentsize, e_phnum = _read_unpacked(f, e_fmt)
- except struct.error:
- return None
- for i in range(e_phnum + 1):
- f.seek(e_phoff + e_phentsize * i)
- try:
- p_type, p_offset, p_filesz = p_get(_read_unpacked(f, p_fmt))
- except struct.error:
- return None
- if p_type != 3: # Not PT_INTERP.
- continue
- f.seek(p_offset)
- interpreter = os.fsdecode(f.read(p_filesz)).strip("\0")
- if "musl" not in interpreter:
- return None
- return interpreter
- return None
+from ._elffile import ELFFile
class _MuslVersion(NamedTuple):
@@ -73,7 +20,7 @@ class _MuslVersion(NamedTuple):
minor: int
-def _parse_musl_version(output: str) -> Optional[_MuslVersion]:
+def _parse_musl_version(output: str) -> _MuslVersion | None:
lines = [n for n in (n.strip() for n in output.splitlines()) if n]
if len(lines) < 2 or lines[0][:4] != "musl":
return None
@@ -83,8 +30,8 @@ def _parse_musl_version(output: str) -> Optional[_MuslVersion]:
return _MuslVersion(major=int(m.group(1)), minor=int(m.group(2)))
-@functools.lru_cache()
-def _get_musl_version(executable: str) -> Optional[_MuslVersion]:
+@functools.lru_cache
+def _get_musl_version(executable: str) -> _MuslVersion | None:
"""Detect currently-running musl runtime version.
This is done by checking the specified executable's dynamic linking
@@ -95,32 +42,34 @@ def _get_musl_version(executable: str) -> Optional[_MuslVersion]:
Version 1.2.2
Dynamic Program Loader
"""
- with contextlib.ExitStack() as stack:
- try:
- f = stack.enter_context(open(executable, "rb"))
- except OSError:
- return None
- ld = _parse_ld_musl_from_elf(f)
- if not ld:
+ try:
+ with open(executable, "rb") as f:
+ ld = ELFFile(f).interpreter
+ except (OSError, TypeError, ValueError):
return None
- proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True)
+ if ld is None or "musl" not in ld:
+ return None
+ proc = subprocess.run([ld], stderr=subprocess.PIPE, text=True)
return _parse_musl_version(proc.stderr)
-def platform_tags(arch: str) -> Iterator[str]:
+def platform_tags(archs: Sequence[str]) -> Iterator[str]:
"""Generate musllinux tags compatible to the current platform.
- :param arch: Should be the part of platform tag after the ``linux_``
- prefix, e.g. ``x86_64``. The ``linux_`` prefix is assumed as a
- prerequisite for the current platform to be musllinux-compatible.
+ :param archs: Sequence of compatible architectures.
+ The first one shall be the closest to the actual architecture and be the part of
+ platform tag after the ``linux_`` prefix, e.g. ``x86_64``.
+ The ``linux_`` prefix is assumed as a prerequisite for the current platform to
+ be musllinux-compatible.
:returns: An iterator of compatible musllinux tags.
"""
sys_musl = _get_musl_version(sys.executable)
if sys_musl is None: # Python not dynamically linked against musl.
return
- for minor in range(sys_musl.minor, -1, -1):
- yield f"musllinux_{sys_musl.major}_{minor}_{arch}"
+ for arch in archs:
+ for minor in range(sys_musl.minor, -1, -1):
+ yield f"musllinux_{sys_musl.major}_{minor}_{arch}"
if __name__ == "__main__": # pragma: no cover
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py
new file mode 100644
index 00000000..0007c0aa
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_parser.py
@@ -0,0 +1,353 @@
+"""Handwritten parser of dependency specifiers.
+
+The docstring for each __parse_* function contains EBNF-inspired grammar representing
+the implementation.
+"""
+
+from __future__ import annotations
+
+import ast
+from typing import NamedTuple, Sequence, Tuple, Union
+
+from ._tokenizer import DEFAULT_RULES, Tokenizer
+
+
+class Node:
+ def __init__(self, value: str) -> None:
+ self.value = value
+
+ def __str__(self) -> str:
+ return self.value
+
+ def __repr__(self) -> str:
+ return f"<{self.__class__.__name__}('{self}')>"
+
+ def serialize(self) -> str:
+ raise NotImplementedError
+
+
+class Variable(Node):
+ def serialize(self) -> str:
+ return str(self)
+
+
+class Value(Node):
+ def serialize(self) -> str:
+ return f'"{self}"'
+
+
+class Op(Node):
+ def serialize(self) -> str:
+ return str(self)
+
+
+MarkerVar = Union[Variable, Value]
+MarkerItem = Tuple[MarkerVar, Op, MarkerVar]
+MarkerAtom = Union[MarkerItem, Sequence["MarkerAtom"]]
+MarkerList = Sequence[Union["MarkerList", MarkerAtom, str]]
+
+
+class ParsedRequirement(NamedTuple):
+ name: str
+ url: str
+ extras: list[str]
+ specifier: str
+ marker: MarkerList | None
+
+
+# --------------------------------------------------------------------------------------
+# Recursive descent parser for dependency specifier
+# --------------------------------------------------------------------------------------
+def parse_requirement(source: str) -> ParsedRequirement:
+ return _parse_requirement(Tokenizer(source, rules=DEFAULT_RULES))
+
+
+def _parse_requirement(tokenizer: Tokenizer) -> ParsedRequirement:
+ """
+ requirement = WS? IDENTIFIER WS? extras WS? requirement_details
+ """
+ tokenizer.consume("WS")
+
+ name_token = tokenizer.expect(
+ "IDENTIFIER", expected="package name at the start of dependency specifier"
+ )
+ name = name_token.text
+ tokenizer.consume("WS")
+
+ extras = _parse_extras(tokenizer)
+ tokenizer.consume("WS")
+
+ url, specifier, marker = _parse_requirement_details(tokenizer)
+ tokenizer.expect("END", expected="end of dependency specifier")
+
+ return ParsedRequirement(name, url, extras, specifier, marker)
+
+
+def _parse_requirement_details(
+ tokenizer: Tokenizer,
+) -> tuple[str, str, MarkerList | None]:
+ """
+ requirement_details = AT URL (WS requirement_marker?)?
+ | specifier WS? (requirement_marker)?
+ """
+
+ specifier = ""
+ url = ""
+ marker = None
+
+ if tokenizer.check("AT"):
+ tokenizer.read()
+ tokenizer.consume("WS")
+
+ url_start = tokenizer.position
+ url = tokenizer.expect("URL", expected="URL after @").text
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ tokenizer.expect("WS", expected="whitespace after URL")
+
+ # The input might end after whitespace.
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ marker = _parse_requirement_marker(
+ tokenizer, span_start=url_start, after="URL and whitespace"
+ )
+ else:
+ specifier_start = tokenizer.position
+ specifier = _parse_specifier(tokenizer)
+ tokenizer.consume("WS")
+
+ if tokenizer.check("END", peek=True):
+ return (url, specifier, marker)
+
+ marker = _parse_requirement_marker(
+ tokenizer,
+ span_start=specifier_start,
+ after=(
+ "version specifier"
+ if specifier
+ else "name and no valid version specifier"
+ ),
+ )
+
+ return (url, specifier, marker)
+
+
+def _parse_requirement_marker(
+ tokenizer: Tokenizer, *, span_start: int, after: str
+) -> MarkerList:
+ """
+ requirement_marker = SEMICOLON marker WS?
+ """
+
+ if not tokenizer.check("SEMICOLON"):
+ tokenizer.raise_syntax_error(
+ f"Expected end or semicolon (after {after})",
+ span_start=span_start,
+ )
+ tokenizer.read()
+
+ marker = _parse_marker(tokenizer)
+ tokenizer.consume("WS")
+
+ return marker
+
+
+def _parse_extras(tokenizer: Tokenizer) -> list[str]:
+ """
+ extras = (LEFT_BRACKET wsp* extras_list? wsp* RIGHT_BRACKET)?
+ """
+ if not tokenizer.check("LEFT_BRACKET", peek=True):
+ return []
+
+ with tokenizer.enclosing_tokens(
+ "LEFT_BRACKET",
+ "RIGHT_BRACKET",
+ around="extras",
+ ):
+ tokenizer.consume("WS")
+ extras = _parse_extras_list(tokenizer)
+ tokenizer.consume("WS")
+
+ return extras
+
+
+def _parse_extras_list(tokenizer: Tokenizer) -> list[str]:
+ """
+ extras_list = identifier (wsp* ',' wsp* identifier)*
+ """
+ extras: list[str] = []
+
+ if not tokenizer.check("IDENTIFIER"):
+ return extras
+
+ extras.append(tokenizer.read().text)
+
+ while True:
+ tokenizer.consume("WS")
+ if tokenizer.check("IDENTIFIER", peek=True):
+ tokenizer.raise_syntax_error("Expected comma between extra names")
+ elif not tokenizer.check("COMMA"):
+ break
+
+ tokenizer.read()
+ tokenizer.consume("WS")
+
+ extra_token = tokenizer.expect("IDENTIFIER", expected="extra name after comma")
+ extras.append(extra_token.text)
+
+ return extras
+
+
+def _parse_specifier(tokenizer: Tokenizer) -> str:
+ """
+ specifier = LEFT_PARENTHESIS WS? version_many WS? RIGHT_PARENTHESIS
+ | WS? version_many WS?
+ """
+ with tokenizer.enclosing_tokens(
+ "LEFT_PARENTHESIS",
+ "RIGHT_PARENTHESIS",
+ around="version specifier",
+ ):
+ tokenizer.consume("WS")
+ parsed_specifiers = _parse_version_many(tokenizer)
+ tokenizer.consume("WS")
+
+ return parsed_specifiers
+
+
+def _parse_version_many(tokenizer: Tokenizer) -> str:
+ """
+ version_many = (SPECIFIER (WS? COMMA WS? SPECIFIER)*)?
+ """
+ parsed_specifiers = ""
+ while tokenizer.check("SPECIFIER"):
+ span_start = tokenizer.position
+ parsed_specifiers += tokenizer.read().text
+ if tokenizer.check("VERSION_PREFIX_TRAIL", peek=True):
+ tokenizer.raise_syntax_error(
+ ".* suffix can only be used with `==` or `!=` operators",
+ span_start=span_start,
+ span_end=tokenizer.position + 1,
+ )
+ if tokenizer.check("VERSION_LOCAL_LABEL_TRAIL", peek=True):
+ tokenizer.raise_syntax_error(
+ "Local version label can only be used with `==` or `!=` operators",
+ span_start=span_start,
+ span_end=tokenizer.position,
+ )
+ tokenizer.consume("WS")
+ if not tokenizer.check("COMMA"):
+ break
+ parsed_specifiers += tokenizer.read().text
+ tokenizer.consume("WS")
+
+ return parsed_specifiers
+
+
+# --------------------------------------------------------------------------------------
+# Recursive descent parser for marker expression
+# --------------------------------------------------------------------------------------
+def parse_marker(source: str) -> MarkerList:
+ return _parse_full_marker(Tokenizer(source, rules=DEFAULT_RULES))
+
+
+def _parse_full_marker(tokenizer: Tokenizer) -> MarkerList:
+ retval = _parse_marker(tokenizer)
+ tokenizer.expect("END", expected="end of marker expression")
+ return retval
+
+
+def _parse_marker(tokenizer: Tokenizer) -> MarkerList:
+ """
+ marker = marker_atom (BOOLOP marker_atom)+
+ """
+ expression = [_parse_marker_atom(tokenizer)]
+ while tokenizer.check("BOOLOP"):
+ token = tokenizer.read()
+ expr_right = _parse_marker_atom(tokenizer)
+ expression.extend((token.text, expr_right))
+ return expression
+
+
+def _parse_marker_atom(tokenizer: Tokenizer) -> MarkerAtom:
+ """
+ marker_atom = WS? LEFT_PARENTHESIS WS? marker WS? RIGHT_PARENTHESIS WS?
+ | WS? marker_item WS?
+ """
+
+ tokenizer.consume("WS")
+ if tokenizer.check("LEFT_PARENTHESIS", peek=True):
+ with tokenizer.enclosing_tokens(
+ "LEFT_PARENTHESIS",
+ "RIGHT_PARENTHESIS",
+ around="marker expression",
+ ):
+ tokenizer.consume("WS")
+ marker: MarkerAtom = _parse_marker(tokenizer)
+ tokenizer.consume("WS")
+ else:
+ marker = _parse_marker_item(tokenizer)
+ tokenizer.consume("WS")
+ return marker
+
+
+def _parse_marker_item(tokenizer: Tokenizer) -> MarkerItem:
+ """
+ marker_item = WS? marker_var WS? marker_op WS? marker_var WS?
+ """
+ tokenizer.consume("WS")
+ marker_var_left = _parse_marker_var(tokenizer)
+ tokenizer.consume("WS")
+ marker_op = _parse_marker_op(tokenizer)
+ tokenizer.consume("WS")
+ marker_var_right = _parse_marker_var(tokenizer)
+ tokenizer.consume("WS")
+ return (marker_var_left, marker_op, marker_var_right)
+
+
+def _parse_marker_var(tokenizer: Tokenizer) -> MarkerVar:
+ """
+ marker_var = VARIABLE | QUOTED_STRING
+ """
+ if tokenizer.check("VARIABLE"):
+ return process_env_var(tokenizer.read().text.replace(".", "_"))
+ elif tokenizer.check("QUOTED_STRING"):
+ return process_python_str(tokenizer.read().text)
+ else:
+ tokenizer.raise_syntax_error(
+ message="Expected a marker variable or quoted string"
+ )
+
+
+def process_env_var(env_var: str) -> Variable:
+ if env_var in ("platform_python_implementation", "python_implementation"):
+ return Variable("platform_python_implementation")
+ else:
+ return Variable(env_var)
+
+
+def process_python_str(python_str: str) -> Value:
+ value = ast.literal_eval(python_str)
+ return Value(str(value))
+
+
+def _parse_marker_op(tokenizer: Tokenizer) -> Op:
+ """
+ marker_op = IN | NOT IN | OP
+ """
+ if tokenizer.check("IN"):
+ tokenizer.read()
+ return Op("in")
+ elif tokenizer.check("NOT"):
+ tokenizer.read()
+ tokenizer.expect("WS", expected="whitespace after 'not'")
+ tokenizer.expect("IN", expected="'in' after 'not'")
+ return Op("not in")
+ elif tokenizer.check("OP"):
+ return Op(tokenizer.read().text)
+ else:
+ return tokenizer.raise_syntax_error(
+ "Expected marker operator, one of <=, <, !=, ==, >=, >, ~=, ===, in, not in"
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py
new file mode 100644
index 00000000..d28a9b6c
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_tokenizer.py
@@ -0,0 +1,195 @@
+from __future__ import annotations
+
+import contextlib
+import re
+from dataclasses import dataclass
+from typing import Iterator, NoReturn
+
+from .specifiers import Specifier
+
+
+@dataclass
+class Token:
+ name: str
+ text: str
+ position: int
+
+
+class ParserSyntaxError(Exception):
+ """The provided source text could not be parsed correctly."""
+
+ def __init__(
+ self,
+ message: str,
+ *,
+ source: str,
+ span: tuple[int, int],
+ ) -> None:
+ self.span = span
+ self.message = message
+ self.source = source
+
+ super().__init__()
+
+ def __str__(self) -> str:
+ marker = " " * self.span[0] + "~" * (self.span[1] - self.span[0]) + "^"
+ return "\n ".join([self.message, self.source, marker])
+
+
+DEFAULT_RULES: dict[str, str | re.Pattern[str]] = {
+ "LEFT_PARENTHESIS": r"\(",
+ "RIGHT_PARENTHESIS": r"\)",
+ "LEFT_BRACKET": r"\[",
+ "RIGHT_BRACKET": r"\]",
+ "SEMICOLON": r";",
+ "COMMA": r",",
+ "QUOTED_STRING": re.compile(
+ r"""
+ (
+ ('[^']*')
+ |
+ ("[^"]*")
+ )
+ """,
+ re.VERBOSE,
+ ),
+ "OP": r"(===|==|~=|!=|<=|>=|<|>)",
+ "BOOLOP": r"\b(or|and)\b",
+ "IN": r"\bin\b",
+ "NOT": r"\bnot\b",
+ "VARIABLE": re.compile(
+ r"""
+ \b(
+ python_version
+ |python_full_version
+ |os[._]name
+ |sys[._]platform
+ |platform_(release|system)
+ |platform[._](version|machine|python_implementation)
+ |python_implementation
+ |implementation_(name|version)
+ |extras?
+ |dependency_groups
+ )\b
+ """,
+ re.VERBOSE,
+ ),
+ "SPECIFIER": re.compile(
+ Specifier._operator_regex_str + Specifier._version_regex_str,
+ re.VERBOSE | re.IGNORECASE,
+ ),
+ "AT": r"\@",
+ "URL": r"[^ \t]+",
+ "IDENTIFIER": r"\b[a-zA-Z0-9][a-zA-Z0-9._-]*\b",
+ "VERSION_PREFIX_TRAIL": r"\.\*",
+ "VERSION_LOCAL_LABEL_TRAIL": r"\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*",
+ "WS": r"[ \t]+",
+ "END": r"$",
+}
+
+
+class Tokenizer:
+ """Context-sensitive token parsing.
+
+ Provides methods to examine the input stream to check whether the next token
+ matches.
+ """
+
+ def __init__(
+ self,
+ source: str,
+ *,
+ rules: dict[str, str | re.Pattern[str]],
+ ) -> None:
+ self.source = source
+ self.rules: dict[str, re.Pattern[str]] = {
+ name: re.compile(pattern) for name, pattern in rules.items()
+ }
+ self.next_token: Token | None = None
+ self.position = 0
+
+ def consume(self, name: str) -> None:
+ """Move beyond provided token name, if at current position."""
+ if self.check(name):
+ self.read()
+
+ def check(self, name: str, *, peek: bool = False) -> bool:
+ """Check whether the next token has the provided name.
+
+ By default, if the check succeeds, the token *must* be read before
+ another check. If `peek` is set to `True`, the token is not loaded and
+ would need to be checked again.
+ """
+ assert self.next_token is None, (
+ f"Cannot check for {name!r}, already have {self.next_token!r}"
+ )
+ assert name in self.rules, f"Unknown token name: {name!r}"
+
+ expression = self.rules[name]
+
+ match = expression.match(self.source, self.position)
+ if match is None:
+ return False
+ if not peek:
+ self.next_token = Token(name, match[0], self.position)
+ return True
+
+ def expect(self, name: str, *, expected: str) -> Token:
+ """Expect a certain token name next, failing with a syntax error otherwise.
+
+ The token is *not* read.
+ """
+ if not self.check(name):
+ raise self.raise_syntax_error(f"Expected {expected}")
+ return self.read()
+
+ def read(self) -> Token:
+ """Consume the next token and return it."""
+ token = self.next_token
+ assert token is not None
+
+ self.position += len(token.text)
+ self.next_token = None
+
+ return token
+
+ def raise_syntax_error(
+ self,
+ message: str,
+ *,
+ span_start: int | None = None,
+ span_end: int | None = None,
+ ) -> NoReturn:
+ """Raise ParserSyntaxError at the given position."""
+ span = (
+ self.position if span_start is None else span_start,
+ self.position if span_end is None else span_end,
+ )
+ raise ParserSyntaxError(
+ message,
+ source=self.source,
+ span=span,
+ )
+
+ @contextlib.contextmanager
+ def enclosing_tokens(
+ self, open_token: str, close_token: str, *, around: str
+ ) -> Iterator[None]:
+ if self.check(open_token):
+ open_position = self.position
+ self.read()
+ else:
+ open_position = None
+
+ yield
+
+ if open_position is None:
+ return
+
+ if not self.check(close_token):
+ self.raise_syntax_error(
+ f"Expected matching {close_token} for {open_token}, after {around}",
+ span_start=open_position,
+ )
+
+ self.read()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__init__.py
new file mode 100644
index 00000000..031f277f
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__init__.py
@@ -0,0 +1,145 @@
+#######################################################################################
+#
+# Adapted from:
+# https://github.com/pypa/hatch/blob/5352e44/backend/src/hatchling/licenses/parse.py
+#
+# MIT License
+#
+# Copyright (c) 2017-present Ofek Lev
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy of this
+# software and associated documentation files (the "Software"), to deal in the Software
+# without restriction, including without limitation the rights to use, copy, modify,
+# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to the following
+# conditions:
+#
+# The above copyright notice and this permission notice shall be included in all copies
+# or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
+# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+#
+# With additional allowance of arbitrary `LicenseRef-` identifiers, not just
+# `LicenseRef-Public-Domain` and `LicenseRef-Proprietary`.
+#
+#######################################################################################
+from __future__ import annotations
+
+import re
+from typing import NewType, cast
+
+from pip._vendor.packaging.licenses._spdx import EXCEPTIONS, LICENSES
+
+__all__ = [
+ "InvalidLicenseExpression",
+ "NormalizedLicenseExpression",
+ "canonicalize_license_expression",
+]
+
+license_ref_allowed = re.compile("^[A-Za-z0-9.-]*$")
+
+NormalizedLicenseExpression = NewType("NormalizedLicenseExpression", str)
+
+
+class InvalidLicenseExpression(ValueError):
+ """Raised when a license-expression string is invalid
+
+ >>> canonicalize_license_expression("invalid")
+ Traceback (most recent call last):
+ ...
+ packaging.licenses.InvalidLicenseExpression: Invalid license expression: 'invalid'
+ """
+
+
+def canonicalize_license_expression(
+ raw_license_expression: str,
+) -> NormalizedLicenseExpression:
+ if not raw_license_expression:
+ message = f"Invalid license expression: {raw_license_expression!r}"
+ raise InvalidLicenseExpression(message)
+
+ # Pad any parentheses so tokenization can be achieved by merely splitting on
+ # whitespace.
+ license_expression = raw_license_expression.replace("(", " ( ").replace(")", " ) ")
+ licenseref_prefix = "LicenseRef-"
+ license_refs = {
+ ref.lower(): "LicenseRef-" + ref[len(licenseref_prefix) :]
+ for ref in license_expression.split()
+ if ref.lower().startswith(licenseref_prefix.lower())
+ }
+
+ # Normalize to lower case so we can look up licenses/exceptions
+ # and so boolean operators are Python-compatible.
+ license_expression = license_expression.lower()
+
+ tokens = license_expression.split()
+
+ # Rather than implementing boolean logic, we create an expression that Python can
+ # parse. Everything that is not involved with the grammar itself is treated as
+ # `False` and the expression should evaluate as such.
+ python_tokens = []
+ for token in tokens:
+ if token not in {"or", "and", "with", "(", ")"}:
+ python_tokens.append("False")
+ elif token == "with":
+ python_tokens.append("or")
+ elif token == "(" and python_tokens and python_tokens[-1] not in {"or", "and"}:
+ message = f"Invalid license expression: {raw_license_expression!r}"
+ raise InvalidLicenseExpression(message)
+ else:
+ python_tokens.append(token)
+
+ python_expression = " ".join(python_tokens)
+ try:
+ invalid = eval(python_expression, globals(), locals())
+ except Exception:
+ invalid = True
+
+ if invalid is not False:
+ message = f"Invalid license expression: {raw_license_expression!r}"
+ raise InvalidLicenseExpression(message) from None
+
+ # Take a final pass to check for unknown licenses/exceptions.
+ normalized_tokens = []
+ for token in tokens:
+ if token in {"or", "and", "with", "(", ")"}:
+ normalized_tokens.append(token.upper())
+ continue
+
+ if normalized_tokens and normalized_tokens[-1] == "WITH":
+ if token not in EXCEPTIONS:
+ message = f"Unknown license exception: {token!r}"
+ raise InvalidLicenseExpression(message)
+
+ normalized_tokens.append(EXCEPTIONS[token]["id"])
+ else:
+ if token.endswith("+"):
+ final_token = token[:-1]
+ suffix = "+"
+ else:
+ final_token = token
+ suffix = ""
+
+ if final_token.startswith("licenseref-"):
+ if not license_ref_allowed.match(final_token):
+ message = f"Invalid licenseref: {final_token!r}"
+ raise InvalidLicenseExpression(message)
+ normalized_tokens.append(license_refs[final_token] + suffix)
+ else:
+ if final_token not in LICENSES:
+ message = f"Unknown license: {final_token!r}"
+ raise InvalidLicenseExpression(message)
+ normalized_tokens.append(LICENSES[final_token]["id"] + suffix)
+
+ normalized_expression = " ".join(normalized_tokens)
+
+ return cast(
+ NormalizedLicenseExpression,
+ normalized_expression.replace("( ", "(").replace(" )", ")"),
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 00000000..6216bcf3
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-312.pyc
new file mode 100644
index 00000000..3a5c650e
Binary files /dev/null and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/__pycache__/_spdx.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/_spdx.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/_spdx.py
new file mode 100644
index 00000000..eac22276
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/licenses/_spdx.py
@@ -0,0 +1,759 @@
+
+from __future__ import annotations
+
+from typing import TypedDict
+
+class SPDXLicense(TypedDict):
+ id: str
+ deprecated: bool
+
+class SPDXException(TypedDict):
+ id: str
+ deprecated: bool
+
+
+VERSION = '3.25.0'
+
+LICENSES: dict[str, SPDXLicense] = {
+ '0bsd': {'id': '0BSD', 'deprecated': False},
+ '3d-slicer-1.0': {'id': '3D-Slicer-1.0', 'deprecated': False},
+ 'aal': {'id': 'AAL', 'deprecated': False},
+ 'abstyles': {'id': 'Abstyles', 'deprecated': False},
+ 'adacore-doc': {'id': 'AdaCore-doc', 'deprecated': False},
+ 'adobe-2006': {'id': 'Adobe-2006', 'deprecated': False},
+ 'adobe-display-postscript': {'id': 'Adobe-Display-PostScript', 'deprecated': False},
+ 'adobe-glyph': {'id': 'Adobe-Glyph', 'deprecated': False},
+ 'adobe-utopia': {'id': 'Adobe-Utopia', 'deprecated': False},
+ 'adsl': {'id': 'ADSL', 'deprecated': False},
+ 'afl-1.1': {'id': 'AFL-1.1', 'deprecated': False},
+ 'afl-1.2': {'id': 'AFL-1.2', 'deprecated': False},
+ 'afl-2.0': {'id': 'AFL-2.0', 'deprecated': False},
+ 'afl-2.1': {'id': 'AFL-2.1', 'deprecated': False},
+ 'afl-3.0': {'id': 'AFL-3.0', 'deprecated': False},
+ 'afmparse': {'id': 'Afmparse', 'deprecated': False},
+ 'agpl-1.0': {'id': 'AGPL-1.0', 'deprecated': True},
+ 'agpl-1.0-only': {'id': 'AGPL-1.0-only', 'deprecated': False},
+ 'agpl-1.0-or-later': {'id': 'AGPL-1.0-or-later', 'deprecated': False},
+ 'agpl-3.0': {'id': 'AGPL-3.0', 'deprecated': True},
+ 'agpl-3.0-only': {'id': 'AGPL-3.0-only', 'deprecated': False},
+ 'agpl-3.0-or-later': {'id': 'AGPL-3.0-or-later', 'deprecated': False},
+ 'aladdin': {'id': 'Aladdin', 'deprecated': False},
+ 'amd-newlib': {'id': 'AMD-newlib', 'deprecated': False},
+ 'amdplpa': {'id': 'AMDPLPA', 'deprecated': False},
+ 'aml': {'id': 'AML', 'deprecated': False},
+ 'aml-glslang': {'id': 'AML-glslang', 'deprecated': False},
+ 'ampas': {'id': 'AMPAS', 'deprecated': False},
+ 'antlr-pd': {'id': 'ANTLR-PD', 'deprecated': False},
+ 'antlr-pd-fallback': {'id': 'ANTLR-PD-fallback', 'deprecated': False},
+ 'any-osi': {'id': 'any-OSI', 'deprecated': False},
+ 'apache-1.0': {'id': 'Apache-1.0', 'deprecated': False},
+ 'apache-1.1': {'id': 'Apache-1.1', 'deprecated': False},
+ 'apache-2.0': {'id': 'Apache-2.0', 'deprecated': False},
+ 'apafml': {'id': 'APAFML', 'deprecated': False},
+ 'apl-1.0': {'id': 'APL-1.0', 'deprecated': False},
+ 'app-s2p': {'id': 'App-s2p', 'deprecated': False},
+ 'apsl-1.0': {'id': 'APSL-1.0', 'deprecated': False},
+ 'apsl-1.1': {'id': 'APSL-1.1', 'deprecated': False},
+ 'apsl-1.2': {'id': 'APSL-1.2', 'deprecated': False},
+ 'apsl-2.0': {'id': 'APSL-2.0', 'deprecated': False},
+ 'arphic-1999': {'id': 'Arphic-1999', 'deprecated': False},
+ 'artistic-1.0': {'id': 'Artistic-1.0', 'deprecated': False},
+ 'artistic-1.0-cl8': {'id': 'Artistic-1.0-cl8', 'deprecated': False},
+ 'artistic-1.0-perl': {'id': 'Artistic-1.0-Perl', 'deprecated': False},
+ 'artistic-2.0': {'id': 'Artistic-2.0', 'deprecated': False},
+ 'aswf-digital-assets-1.0': {'id': 'ASWF-Digital-Assets-1.0', 'deprecated': False},
+ 'aswf-digital-assets-1.1': {'id': 'ASWF-Digital-Assets-1.1', 'deprecated': False},
+ 'baekmuk': {'id': 'Baekmuk', 'deprecated': False},
+ 'bahyph': {'id': 'Bahyph', 'deprecated': False},
+ 'barr': {'id': 'Barr', 'deprecated': False},
+ 'bcrypt-solar-designer': {'id': 'bcrypt-Solar-Designer', 'deprecated': False},
+ 'beerware': {'id': 'Beerware', 'deprecated': False},
+ 'bitstream-charter': {'id': 'Bitstream-Charter', 'deprecated': False},
+ 'bitstream-vera': {'id': 'Bitstream-Vera', 'deprecated': False},
+ 'bittorrent-1.0': {'id': 'BitTorrent-1.0', 'deprecated': False},
+ 'bittorrent-1.1': {'id': 'BitTorrent-1.1', 'deprecated': False},
+ 'blessing': {'id': 'blessing', 'deprecated': False},
+ 'blueoak-1.0.0': {'id': 'BlueOak-1.0.0', 'deprecated': False},
+ 'boehm-gc': {'id': 'Boehm-GC', 'deprecated': False},
+ 'borceux': {'id': 'Borceux', 'deprecated': False},
+ 'brian-gladman-2-clause': {'id': 'Brian-Gladman-2-Clause', 'deprecated': False},
+ 'brian-gladman-3-clause': {'id': 'Brian-Gladman-3-Clause', 'deprecated': False},
+ 'bsd-1-clause': {'id': 'BSD-1-Clause', 'deprecated': False},
+ 'bsd-2-clause': {'id': 'BSD-2-Clause', 'deprecated': False},
+ 'bsd-2-clause-darwin': {'id': 'BSD-2-Clause-Darwin', 'deprecated': False},
+ 'bsd-2-clause-first-lines': {'id': 'BSD-2-Clause-first-lines', 'deprecated': False},
+ 'bsd-2-clause-freebsd': {'id': 'BSD-2-Clause-FreeBSD', 'deprecated': True},
+ 'bsd-2-clause-netbsd': {'id': 'BSD-2-Clause-NetBSD', 'deprecated': True},
+ 'bsd-2-clause-patent': {'id': 'BSD-2-Clause-Patent', 'deprecated': False},
+ 'bsd-2-clause-views': {'id': 'BSD-2-Clause-Views', 'deprecated': False},
+ 'bsd-3-clause': {'id': 'BSD-3-Clause', 'deprecated': False},
+ 'bsd-3-clause-acpica': {'id': 'BSD-3-Clause-acpica', 'deprecated': False},
+ 'bsd-3-clause-attribution': {'id': 'BSD-3-Clause-Attribution', 'deprecated': False},
+ 'bsd-3-clause-clear': {'id': 'BSD-3-Clause-Clear', 'deprecated': False},
+ 'bsd-3-clause-flex': {'id': 'BSD-3-Clause-flex', 'deprecated': False},
+ 'bsd-3-clause-hp': {'id': 'BSD-3-Clause-HP', 'deprecated': False},
+ 'bsd-3-clause-lbnl': {'id': 'BSD-3-Clause-LBNL', 'deprecated': False},
+ 'bsd-3-clause-modification': {'id': 'BSD-3-Clause-Modification', 'deprecated': False},
+ 'bsd-3-clause-no-military-license': {'id': 'BSD-3-Clause-No-Military-License', 'deprecated': False},
+ 'bsd-3-clause-no-nuclear-license': {'id': 'BSD-3-Clause-No-Nuclear-License', 'deprecated': False},
+ 'bsd-3-clause-no-nuclear-license-2014': {'id': 'BSD-3-Clause-No-Nuclear-License-2014', 'deprecated': False},
+ 'bsd-3-clause-no-nuclear-warranty': {'id': 'BSD-3-Clause-No-Nuclear-Warranty', 'deprecated': False},
+ 'bsd-3-clause-open-mpi': {'id': 'BSD-3-Clause-Open-MPI', 'deprecated': False},
+ 'bsd-3-clause-sun': {'id': 'BSD-3-Clause-Sun', 'deprecated': False},
+ 'bsd-4-clause': {'id': 'BSD-4-Clause', 'deprecated': False},
+ 'bsd-4-clause-shortened': {'id': 'BSD-4-Clause-Shortened', 'deprecated': False},
+ 'bsd-4-clause-uc': {'id': 'BSD-4-Clause-UC', 'deprecated': False},
+ 'bsd-4.3reno': {'id': 'BSD-4.3RENO', 'deprecated': False},
+ 'bsd-4.3tahoe': {'id': 'BSD-4.3TAHOE', 'deprecated': False},
+ 'bsd-advertising-acknowledgement': {'id': 'BSD-Advertising-Acknowledgement', 'deprecated': False},
+ 'bsd-attribution-hpnd-disclaimer': {'id': 'BSD-Attribution-HPND-disclaimer', 'deprecated': False},
+ 'bsd-inferno-nettverk': {'id': 'BSD-Inferno-Nettverk', 'deprecated': False},
+ 'bsd-protection': {'id': 'BSD-Protection', 'deprecated': False},
+ 'bsd-source-beginning-file': {'id': 'BSD-Source-beginning-file', 'deprecated': False},
+ 'bsd-source-code': {'id': 'BSD-Source-Code', 'deprecated': False},
+ 'bsd-systemics': {'id': 'BSD-Systemics', 'deprecated': False},
+ 'bsd-systemics-w3works': {'id': 'BSD-Systemics-W3Works', 'deprecated': False},
+ 'bsl-1.0': {'id': 'BSL-1.0', 'deprecated': False},
+ 'busl-1.1': {'id': 'BUSL-1.1', 'deprecated': False},
+ 'bzip2-1.0.5': {'id': 'bzip2-1.0.5', 'deprecated': True},
+ 'bzip2-1.0.6': {'id': 'bzip2-1.0.6', 'deprecated': False},
+ 'c-uda-1.0': {'id': 'C-UDA-1.0', 'deprecated': False},
+ 'cal-1.0': {'id': 'CAL-1.0', 'deprecated': False},
+ 'cal-1.0-combined-work-exception': {'id': 'CAL-1.0-Combined-Work-Exception', 'deprecated': False},
+ 'caldera': {'id': 'Caldera', 'deprecated': False},
+ 'caldera-no-preamble': {'id': 'Caldera-no-preamble', 'deprecated': False},
+ 'catharon': {'id': 'Catharon', 'deprecated': False},
+ 'catosl-1.1': {'id': 'CATOSL-1.1', 'deprecated': False},
+ 'cc-by-1.0': {'id': 'CC-BY-1.0', 'deprecated': False},
+ 'cc-by-2.0': {'id': 'CC-BY-2.0', 'deprecated': False},
+ 'cc-by-2.5': {'id': 'CC-BY-2.5', 'deprecated': False},
+ 'cc-by-2.5-au': {'id': 'CC-BY-2.5-AU', 'deprecated': False},
+ 'cc-by-3.0': {'id': 'CC-BY-3.0', 'deprecated': False},
+ 'cc-by-3.0-at': {'id': 'CC-BY-3.0-AT', 'deprecated': False},
+ 'cc-by-3.0-au': {'id': 'CC-BY-3.0-AU', 'deprecated': False},
+ 'cc-by-3.0-de': {'id': 'CC-BY-3.0-DE', 'deprecated': False},
+ 'cc-by-3.0-igo': {'id': 'CC-BY-3.0-IGO', 'deprecated': False},
+ 'cc-by-3.0-nl': {'id': 'CC-BY-3.0-NL', 'deprecated': False},
+ 'cc-by-3.0-us': {'id': 'CC-BY-3.0-US', 'deprecated': False},
+ 'cc-by-4.0': {'id': 'CC-BY-4.0', 'deprecated': False},
+ 'cc-by-nc-1.0': {'id': 'CC-BY-NC-1.0', 'deprecated': False},
+ 'cc-by-nc-2.0': {'id': 'CC-BY-NC-2.0', 'deprecated': False},
+ 'cc-by-nc-2.5': {'id': 'CC-BY-NC-2.5', 'deprecated': False},
+ 'cc-by-nc-3.0': {'id': 'CC-BY-NC-3.0', 'deprecated': False},
+ 'cc-by-nc-3.0-de': {'id': 'CC-BY-NC-3.0-DE', 'deprecated': False},
+ 'cc-by-nc-4.0': {'id': 'CC-BY-NC-4.0', 'deprecated': False},
+ 'cc-by-nc-nd-1.0': {'id': 'CC-BY-NC-ND-1.0', 'deprecated': False},
+ 'cc-by-nc-nd-2.0': {'id': 'CC-BY-NC-ND-2.0', 'deprecated': False},
+ 'cc-by-nc-nd-2.5': {'id': 'CC-BY-NC-ND-2.5', 'deprecated': False},
+ 'cc-by-nc-nd-3.0': {'id': 'CC-BY-NC-ND-3.0', 'deprecated': False},
+ 'cc-by-nc-nd-3.0-de': {'id': 'CC-BY-NC-ND-3.0-DE', 'deprecated': False},
+ 'cc-by-nc-nd-3.0-igo': {'id': 'CC-BY-NC-ND-3.0-IGO', 'deprecated': False},
+ 'cc-by-nc-nd-4.0': {'id': 'CC-BY-NC-ND-4.0', 'deprecated': False},
+ 'cc-by-nc-sa-1.0': {'id': 'CC-BY-NC-SA-1.0', 'deprecated': False},
+ 'cc-by-nc-sa-2.0': {'id': 'CC-BY-NC-SA-2.0', 'deprecated': False},
+ 'cc-by-nc-sa-2.0-de': {'id': 'CC-BY-NC-SA-2.0-DE', 'deprecated': False},
+ 'cc-by-nc-sa-2.0-fr': {'id': 'CC-BY-NC-SA-2.0-FR', 'deprecated': False},
+ 'cc-by-nc-sa-2.0-uk': {'id': 'CC-BY-NC-SA-2.0-UK', 'deprecated': False},
+ 'cc-by-nc-sa-2.5': {'id': 'CC-BY-NC-SA-2.5', 'deprecated': False},
+ 'cc-by-nc-sa-3.0': {'id': 'CC-BY-NC-SA-3.0', 'deprecated': False},
+ 'cc-by-nc-sa-3.0-de': {'id': 'CC-BY-NC-SA-3.0-DE', 'deprecated': False},
+ 'cc-by-nc-sa-3.0-igo': {'id': 'CC-BY-NC-SA-3.0-IGO', 'deprecated': False},
+ 'cc-by-nc-sa-4.0': {'id': 'CC-BY-NC-SA-4.0', 'deprecated': False},
+ 'cc-by-nd-1.0': {'id': 'CC-BY-ND-1.0', 'deprecated': False},
+ 'cc-by-nd-2.0': {'id': 'CC-BY-ND-2.0', 'deprecated': False},
+ 'cc-by-nd-2.5': {'id': 'CC-BY-ND-2.5', 'deprecated': False},
+ 'cc-by-nd-3.0': {'id': 'CC-BY-ND-3.0', 'deprecated': False},
+ 'cc-by-nd-3.0-de': {'id': 'CC-BY-ND-3.0-DE', 'deprecated': False},
+ 'cc-by-nd-4.0': {'id': 'CC-BY-ND-4.0', 'deprecated': False},
+ 'cc-by-sa-1.0': {'id': 'CC-BY-SA-1.0', 'deprecated': False},
+ 'cc-by-sa-2.0': {'id': 'CC-BY-SA-2.0', 'deprecated': False},
+ 'cc-by-sa-2.0-uk': {'id': 'CC-BY-SA-2.0-UK', 'deprecated': False},
+ 'cc-by-sa-2.1-jp': {'id': 'CC-BY-SA-2.1-JP', 'deprecated': False},
+ 'cc-by-sa-2.5': {'id': 'CC-BY-SA-2.5', 'deprecated': False},
+ 'cc-by-sa-3.0': {'id': 'CC-BY-SA-3.0', 'deprecated': False},
+ 'cc-by-sa-3.0-at': {'id': 'CC-BY-SA-3.0-AT', 'deprecated': False},
+ 'cc-by-sa-3.0-de': {'id': 'CC-BY-SA-3.0-DE', 'deprecated': False},
+ 'cc-by-sa-3.0-igo': {'id': 'CC-BY-SA-3.0-IGO', 'deprecated': False},
+ 'cc-by-sa-4.0': {'id': 'CC-BY-SA-4.0', 'deprecated': False},
+ 'cc-pddc': {'id': 'CC-PDDC', 'deprecated': False},
+ 'cc0-1.0': {'id': 'CC0-1.0', 'deprecated': False},
+ 'cddl-1.0': {'id': 'CDDL-1.0', 'deprecated': False},
+ 'cddl-1.1': {'id': 'CDDL-1.1', 'deprecated': False},
+ 'cdl-1.0': {'id': 'CDL-1.0', 'deprecated': False},
+ 'cdla-permissive-1.0': {'id': 'CDLA-Permissive-1.0', 'deprecated': False},
+ 'cdla-permissive-2.0': {'id': 'CDLA-Permissive-2.0', 'deprecated': False},
+ 'cdla-sharing-1.0': {'id': 'CDLA-Sharing-1.0', 'deprecated': False},
+ 'cecill-1.0': {'id': 'CECILL-1.0', 'deprecated': False},
+ 'cecill-1.1': {'id': 'CECILL-1.1', 'deprecated': False},
+ 'cecill-2.0': {'id': 'CECILL-2.0', 'deprecated': False},
+ 'cecill-2.1': {'id': 'CECILL-2.1', 'deprecated': False},
+ 'cecill-b': {'id': 'CECILL-B', 'deprecated': False},
+ 'cecill-c': {'id': 'CECILL-C', 'deprecated': False},
+ 'cern-ohl-1.1': {'id': 'CERN-OHL-1.1', 'deprecated': False},
+ 'cern-ohl-1.2': {'id': 'CERN-OHL-1.2', 'deprecated': False},
+ 'cern-ohl-p-2.0': {'id': 'CERN-OHL-P-2.0', 'deprecated': False},
+ 'cern-ohl-s-2.0': {'id': 'CERN-OHL-S-2.0', 'deprecated': False},
+ 'cern-ohl-w-2.0': {'id': 'CERN-OHL-W-2.0', 'deprecated': False},
+ 'cfitsio': {'id': 'CFITSIO', 'deprecated': False},
+ 'check-cvs': {'id': 'check-cvs', 'deprecated': False},
+ 'checkmk': {'id': 'checkmk', 'deprecated': False},
+ 'clartistic': {'id': 'ClArtistic', 'deprecated': False},
+ 'clips': {'id': 'Clips', 'deprecated': False},
+ 'cmu-mach': {'id': 'CMU-Mach', 'deprecated': False},
+ 'cmu-mach-nodoc': {'id': 'CMU-Mach-nodoc', 'deprecated': False},
+ 'cnri-jython': {'id': 'CNRI-Jython', 'deprecated': False},
+ 'cnri-python': {'id': 'CNRI-Python', 'deprecated': False},
+ 'cnri-python-gpl-compatible': {'id': 'CNRI-Python-GPL-Compatible', 'deprecated': False},
+ 'coil-1.0': {'id': 'COIL-1.0', 'deprecated': False},
+ 'community-spec-1.0': {'id': 'Community-Spec-1.0', 'deprecated': False},
+ 'condor-1.1': {'id': 'Condor-1.1', 'deprecated': False},
+ 'copyleft-next-0.3.0': {'id': 'copyleft-next-0.3.0', 'deprecated': False},
+ 'copyleft-next-0.3.1': {'id': 'copyleft-next-0.3.1', 'deprecated': False},
+ 'cornell-lossless-jpeg': {'id': 'Cornell-Lossless-JPEG', 'deprecated': False},
+ 'cpal-1.0': {'id': 'CPAL-1.0', 'deprecated': False},
+ 'cpl-1.0': {'id': 'CPL-1.0', 'deprecated': False},
+ 'cpol-1.02': {'id': 'CPOL-1.02', 'deprecated': False},
+ 'cronyx': {'id': 'Cronyx', 'deprecated': False},
+ 'crossword': {'id': 'Crossword', 'deprecated': False},
+ 'crystalstacker': {'id': 'CrystalStacker', 'deprecated': False},
+ 'cua-opl-1.0': {'id': 'CUA-OPL-1.0', 'deprecated': False},
+ 'cube': {'id': 'Cube', 'deprecated': False},
+ 'curl': {'id': 'curl', 'deprecated': False},
+ 'cve-tou': {'id': 'cve-tou', 'deprecated': False},
+ 'd-fsl-1.0': {'id': 'D-FSL-1.0', 'deprecated': False},
+ 'dec-3-clause': {'id': 'DEC-3-Clause', 'deprecated': False},
+ 'diffmark': {'id': 'diffmark', 'deprecated': False},
+ 'dl-de-by-2.0': {'id': 'DL-DE-BY-2.0', 'deprecated': False},
+ 'dl-de-zero-2.0': {'id': 'DL-DE-ZERO-2.0', 'deprecated': False},
+ 'doc': {'id': 'DOC', 'deprecated': False},
+ 'docbook-schema': {'id': 'DocBook-Schema', 'deprecated': False},
+ 'docbook-xml': {'id': 'DocBook-XML', 'deprecated': False},
+ 'dotseqn': {'id': 'Dotseqn', 'deprecated': False},
+ 'drl-1.0': {'id': 'DRL-1.0', 'deprecated': False},
+ 'drl-1.1': {'id': 'DRL-1.1', 'deprecated': False},
+ 'dsdp': {'id': 'DSDP', 'deprecated': False},
+ 'dtoa': {'id': 'dtoa', 'deprecated': False},
+ 'dvipdfm': {'id': 'dvipdfm', 'deprecated': False},
+ 'ecl-1.0': {'id': 'ECL-1.0', 'deprecated': False},
+ 'ecl-2.0': {'id': 'ECL-2.0', 'deprecated': False},
+ 'ecos-2.0': {'id': 'eCos-2.0', 'deprecated': True},
+ 'efl-1.0': {'id': 'EFL-1.0', 'deprecated': False},
+ 'efl-2.0': {'id': 'EFL-2.0', 'deprecated': False},
+ 'egenix': {'id': 'eGenix', 'deprecated': False},
+ 'elastic-2.0': {'id': 'Elastic-2.0', 'deprecated': False},
+ 'entessa': {'id': 'Entessa', 'deprecated': False},
+ 'epics': {'id': 'EPICS', 'deprecated': False},
+ 'epl-1.0': {'id': 'EPL-1.0', 'deprecated': False},
+ 'epl-2.0': {'id': 'EPL-2.0', 'deprecated': False},
+ 'erlpl-1.1': {'id': 'ErlPL-1.1', 'deprecated': False},
+ 'etalab-2.0': {'id': 'etalab-2.0', 'deprecated': False},
+ 'eudatagrid': {'id': 'EUDatagrid', 'deprecated': False},
+ 'eupl-1.0': {'id': 'EUPL-1.0', 'deprecated': False},
+ 'eupl-1.1': {'id': 'EUPL-1.1', 'deprecated': False},
+ 'eupl-1.2': {'id': 'EUPL-1.2', 'deprecated': False},
+ 'eurosym': {'id': 'Eurosym', 'deprecated': False},
+ 'fair': {'id': 'Fair', 'deprecated': False},
+ 'fbm': {'id': 'FBM', 'deprecated': False},
+ 'fdk-aac': {'id': 'FDK-AAC', 'deprecated': False},
+ 'ferguson-twofish': {'id': 'Ferguson-Twofish', 'deprecated': False},
+ 'frameworx-1.0': {'id': 'Frameworx-1.0', 'deprecated': False},
+ 'freebsd-doc': {'id': 'FreeBSD-DOC', 'deprecated': False},
+ 'freeimage': {'id': 'FreeImage', 'deprecated': False},
+ 'fsfap': {'id': 'FSFAP', 'deprecated': False},
+ 'fsfap-no-warranty-disclaimer': {'id': 'FSFAP-no-warranty-disclaimer', 'deprecated': False},
+ 'fsful': {'id': 'FSFUL', 'deprecated': False},
+ 'fsfullr': {'id': 'FSFULLR', 'deprecated': False},
+ 'fsfullrwd': {'id': 'FSFULLRWD', 'deprecated': False},
+ 'ftl': {'id': 'FTL', 'deprecated': False},
+ 'furuseth': {'id': 'Furuseth', 'deprecated': False},
+ 'fwlw': {'id': 'fwlw', 'deprecated': False},
+ 'gcr-docs': {'id': 'GCR-docs', 'deprecated': False},
+ 'gd': {'id': 'GD', 'deprecated': False},
+ 'gfdl-1.1': {'id': 'GFDL-1.1', 'deprecated': True},
+ 'gfdl-1.1-invariants-only': {'id': 'GFDL-1.1-invariants-only', 'deprecated': False},
+ 'gfdl-1.1-invariants-or-later': {'id': 'GFDL-1.1-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.1-no-invariants-only': {'id': 'GFDL-1.1-no-invariants-only', 'deprecated': False},
+ 'gfdl-1.1-no-invariants-or-later': {'id': 'GFDL-1.1-no-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.1-only': {'id': 'GFDL-1.1-only', 'deprecated': False},
+ 'gfdl-1.1-or-later': {'id': 'GFDL-1.1-or-later', 'deprecated': False},
+ 'gfdl-1.2': {'id': 'GFDL-1.2', 'deprecated': True},
+ 'gfdl-1.2-invariants-only': {'id': 'GFDL-1.2-invariants-only', 'deprecated': False},
+ 'gfdl-1.2-invariants-or-later': {'id': 'GFDL-1.2-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.2-no-invariants-only': {'id': 'GFDL-1.2-no-invariants-only', 'deprecated': False},
+ 'gfdl-1.2-no-invariants-or-later': {'id': 'GFDL-1.2-no-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.2-only': {'id': 'GFDL-1.2-only', 'deprecated': False},
+ 'gfdl-1.2-or-later': {'id': 'GFDL-1.2-or-later', 'deprecated': False},
+ 'gfdl-1.3': {'id': 'GFDL-1.3', 'deprecated': True},
+ 'gfdl-1.3-invariants-only': {'id': 'GFDL-1.3-invariants-only', 'deprecated': False},
+ 'gfdl-1.3-invariants-or-later': {'id': 'GFDL-1.3-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.3-no-invariants-only': {'id': 'GFDL-1.3-no-invariants-only', 'deprecated': False},
+ 'gfdl-1.3-no-invariants-or-later': {'id': 'GFDL-1.3-no-invariants-or-later', 'deprecated': False},
+ 'gfdl-1.3-only': {'id': 'GFDL-1.3-only', 'deprecated': False},
+ 'gfdl-1.3-or-later': {'id': 'GFDL-1.3-or-later', 'deprecated': False},
+ 'giftware': {'id': 'Giftware', 'deprecated': False},
+ 'gl2ps': {'id': 'GL2PS', 'deprecated': False},
+ 'glide': {'id': 'Glide', 'deprecated': False},
+ 'glulxe': {'id': 'Glulxe', 'deprecated': False},
+ 'glwtpl': {'id': 'GLWTPL', 'deprecated': False},
+ 'gnuplot': {'id': 'gnuplot', 'deprecated': False},
+ 'gpl-1.0': {'id': 'GPL-1.0', 'deprecated': True},
+ 'gpl-1.0+': {'id': 'GPL-1.0+', 'deprecated': True},
+ 'gpl-1.0-only': {'id': 'GPL-1.0-only', 'deprecated': False},
+ 'gpl-1.0-or-later': {'id': 'GPL-1.0-or-later', 'deprecated': False},
+ 'gpl-2.0': {'id': 'GPL-2.0', 'deprecated': True},
+ 'gpl-2.0+': {'id': 'GPL-2.0+', 'deprecated': True},
+ 'gpl-2.0-only': {'id': 'GPL-2.0-only', 'deprecated': False},
+ 'gpl-2.0-or-later': {'id': 'GPL-2.0-or-later', 'deprecated': False},
+ 'gpl-2.0-with-autoconf-exception': {'id': 'GPL-2.0-with-autoconf-exception', 'deprecated': True},
+ 'gpl-2.0-with-bison-exception': {'id': 'GPL-2.0-with-bison-exception', 'deprecated': True},
+ 'gpl-2.0-with-classpath-exception': {'id': 'GPL-2.0-with-classpath-exception', 'deprecated': True},
+ 'gpl-2.0-with-font-exception': {'id': 'GPL-2.0-with-font-exception', 'deprecated': True},
+ 'gpl-2.0-with-gcc-exception': {'id': 'GPL-2.0-with-GCC-exception', 'deprecated': True},
+ 'gpl-3.0': {'id': 'GPL-3.0', 'deprecated': True},
+ 'gpl-3.0+': {'id': 'GPL-3.0+', 'deprecated': True},
+ 'gpl-3.0-only': {'id': 'GPL-3.0-only', 'deprecated': False},
+ 'gpl-3.0-or-later': {'id': 'GPL-3.0-or-later', 'deprecated': False},
+ 'gpl-3.0-with-autoconf-exception': {'id': 'GPL-3.0-with-autoconf-exception', 'deprecated': True},
+ 'gpl-3.0-with-gcc-exception': {'id': 'GPL-3.0-with-GCC-exception', 'deprecated': True},
+ 'graphics-gems': {'id': 'Graphics-Gems', 'deprecated': False},
+ 'gsoap-1.3b': {'id': 'gSOAP-1.3b', 'deprecated': False},
+ 'gtkbook': {'id': 'gtkbook', 'deprecated': False},
+ 'gutmann': {'id': 'Gutmann', 'deprecated': False},
+ 'haskellreport': {'id': 'HaskellReport', 'deprecated': False},
+ 'hdparm': {'id': 'hdparm', 'deprecated': False},
+ 'hidapi': {'id': 'HIDAPI', 'deprecated': False},
+ 'hippocratic-2.1': {'id': 'Hippocratic-2.1', 'deprecated': False},
+ 'hp-1986': {'id': 'HP-1986', 'deprecated': False},
+ 'hp-1989': {'id': 'HP-1989', 'deprecated': False},
+ 'hpnd': {'id': 'HPND', 'deprecated': False},
+ 'hpnd-dec': {'id': 'HPND-DEC', 'deprecated': False},
+ 'hpnd-doc': {'id': 'HPND-doc', 'deprecated': False},
+ 'hpnd-doc-sell': {'id': 'HPND-doc-sell', 'deprecated': False},
+ 'hpnd-export-us': {'id': 'HPND-export-US', 'deprecated': False},
+ 'hpnd-export-us-acknowledgement': {'id': 'HPND-export-US-acknowledgement', 'deprecated': False},
+ 'hpnd-export-us-modify': {'id': 'HPND-export-US-modify', 'deprecated': False},
+ 'hpnd-export2-us': {'id': 'HPND-export2-US', 'deprecated': False},
+ 'hpnd-fenneberg-livingston': {'id': 'HPND-Fenneberg-Livingston', 'deprecated': False},
+ 'hpnd-inria-imag': {'id': 'HPND-INRIA-IMAG', 'deprecated': False},
+ 'hpnd-intel': {'id': 'HPND-Intel', 'deprecated': False},
+ 'hpnd-kevlin-henney': {'id': 'HPND-Kevlin-Henney', 'deprecated': False},
+ 'hpnd-markus-kuhn': {'id': 'HPND-Markus-Kuhn', 'deprecated': False},
+ 'hpnd-merchantability-variant': {'id': 'HPND-merchantability-variant', 'deprecated': False},
+ 'hpnd-mit-disclaimer': {'id': 'HPND-MIT-disclaimer', 'deprecated': False},
+ 'hpnd-netrek': {'id': 'HPND-Netrek', 'deprecated': False},
+ 'hpnd-pbmplus': {'id': 'HPND-Pbmplus', 'deprecated': False},
+ 'hpnd-sell-mit-disclaimer-xserver': {'id': 'HPND-sell-MIT-disclaimer-xserver', 'deprecated': False},
+ 'hpnd-sell-regexpr': {'id': 'HPND-sell-regexpr', 'deprecated': False},
+ 'hpnd-sell-variant': {'id': 'HPND-sell-variant', 'deprecated': False},
+ 'hpnd-sell-variant-mit-disclaimer': {'id': 'HPND-sell-variant-MIT-disclaimer', 'deprecated': False},
+ 'hpnd-sell-variant-mit-disclaimer-rev': {'id': 'HPND-sell-variant-MIT-disclaimer-rev', 'deprecated': False},
+ 'hpnd-uc': {'id': 'HPND-UC', 'deprecated': False},
+ 'hpnd-uc-export-us': {'id': 'HPND-UC-export-US', 'deprecated': False},
+ 'htmltidy': {'id': 'HTMLTIDY', 'deprecated': False},
+ 'ibm-pibs': {'id': 'IBM-pibs', 'deprecated': False},
+ 'icu': {'id': 'ICU', 'deprecated': False},
+ 'iec-code-components-eula': {'id': 'IEC-Code-Components-EULA', 'deprecated': False},
+ 'ijg': {'id': 'IJG', 'deprecated': False},
+ 'ijg-short': {'id': 'IJG-short', 'deprecated': False},
+ 'imagemagick': {'id': 'ImageMagick', 'deprecated': False},
+ 'imatix': {'id': 'iMatix', 'deprecated': False},
+ 'imlib2': {'id': 'Imlib2', 'deprecated': False},
+ 'info-zip': {'id': 'Info-ZIP', 'deprecated': False},
+ 'inner-net-2.0': {'id': 'Inner-Net-2.0', 'deprecated': False},
+ 'intel': {'id': 'Intel', 'deprecated': False},
+ 'intel-acpi': {'id': 'Intel-ACPI', 'deprecated': False},
+ 'interbase-1.0': {'id': 'Interbase-1.0', 'deprecated': False},
+ 'ipa': {'id': 'IPA', 'deprecated': False},
+ 'ipl-1.0': {'id': 'IPL-1.0', 'deprecated': False},
+ 'isc': {'id': 'ISC', 'deprecated': False},
+ 'isc-veillard': {'id': 'ISC-Veillard', 'deprecated': False},
+ 'jam': {'id': 'Jam', 'deprecated': False},
+ 'jasper-2.0': {'id': 'JasPer-2.0', 'deprecated': False},
+ 'jpl-image': {'id': 'JPL-image', 'deprecated': False},
+ 'jpnic': {'id': 'JPNIC', 'deprecated': False},
+ 'json': {'id': 'JSON', 'deprecated': False},
+ 'kastrup': {'id': 'Kastrup', 'deprecated': False},
+ 'kazlib': {'id': 'Kazlib', 'deprecated': False},
+ 'knuth-ctan': {'id': 'Knuth-CTAN', 'deprecated': False},
+ 'lal-1.2': {'id': 'LAL-1.2', 'deprecated': False},
+ 'lal-1.3': {'id': 'LAL-1.3', 'deprecated': False},
+ 'latex2e': {'id': 'Latex2e', 'deprecated': False},
+ 'latex2e-translated-notice': {'id': 'Latex2e-translated-notice', 'deprecated': False},
+ 'leptonica': {'id': 'Leptonica', 'deprecated': False},
+ 'lgpl-2.0': {'id': 'LGPL-2.0', 'deprecated': True},
+ 'lgpl-2.0+': {'id': 'LGPL-2.0+', 'deprecated': True},
+ 'lgpl-2.0-only': {'id': 'LGPL-2.0-only', 'deprecated': False},
+ 'lgpl-2.0-or-later': {'id': 'LGPL-2.0-or-later', 'deprecated': False},
+ 'lgpl-2.1': {'id': 'LGPL-2.1', 'deprecated': True},
+ 'lgpl-2.1+': {'id': 'LGPL-2.1+', 'deprecated': True},
+ 'lgpl-2.1-only': {'id': 'LGPL-2.1-only', 'deprecated': False},
+ 'lgpl-2.1-or-later': {'id': 'LGPL-2.1-or-later', 'deprecated': False},
+ 'lgpl-3.0': {'id': 'LGPL-3.0', 'deprecated': True},
+ 'lgpl-3.0+': {'id': 'LGPL-3.0+', 'deprecated': True},
+ 'lgpl-3.0-only': {'id': 'LGPL-3.0-only', 'deprecated': False},
+ 'lgpl-3.0-or-later': {'id': 'LGPL-3.0-or-later', 'deprecated': False},
+ 'lgpllr': {'id': 'LGPLLR', 'deprecated': False},
+ 'libpng': {'id': 'Libpng', 'deprecated': False},
+ 'libpng-2.0': {'id': 'libpng-2.0', 'deprecated': False},
+ 'libselinux-1.0': {'id': 'libselinux-1.0', 'deprecated': False},
+ 'libtiff': {'id': 'libtiff', 'deprecated': False},
+ 'libutil-david-nugent': {'id': 'libutil-David-Nugent', 'deprecated': False},
+ 'liliq-p-1.1': {'id': 'LiLiQ-P-1.1', 'deprecated': False},
+ 'liliq-r-1.1': {'id': 'LiLiQ-R-1.1', 'deprecated': False},
+ 'liliq-rplus-1.1': {'id': 'LiLiQ-Rplus-1.1', 'deprecated': False},
+ 'linux-man-pages-1-para': {'id': 'Linux-man-pages-1-para', 'deprecated': False},
+ 'linux-man-pages-copyleft': {'id': 'Linux-man-pages-copyleft', 'deprecated': False},
+ 'linux-man-pages-copyleft-2-para': {'id': 'Linux-man-pages-copyleft-2-para', 'deprecated': False},
+ 'linux-man-pages-copyleft-var': {'id': 'Linux-man-pages-copyleft-var', 'deprecated': False},
+ 'linux-openib': {'id': 'Linux-OpenIB', 'deprecated': False},
+ 'loop': {'id': 'LOOP', 'deprecated': False},
+ 'lpd-document': {'id': 'LPD-document', 'deprecated': False},
+ 'lpl-1.0': {'id': 'LPL-1.0', 'deprecated': False},
+ 'lpl-1.02': {'id': 'LPL-1.02', 'deprecated': False},
+ 'lppl-1.0': {'id': 'LPPL-1.0', 'deprecated': False},
+ 'lppl-1.1': {'id': 'LPPL-1.1', 'deprecated': False},
+ 'lppl-1.2': {'id': 'LPPL-1.2', 'deprecated': False},
+ 'lppl-1.3a': {'id': 'LPPL-1.3a', 'deprecated': False},
+ 'lppl-1.3c': {'id': 'LPPL-1.3c', 'deprecated': False},
+ 'lsof': {'id': 'lsof', 'deprecated': False},
+ 'lucida-bitmap-fonts': {'id': 'Lucida-Bitmap-Fonts', 'deprecated': False},
+ 'lzma-sdk-9.11-to-9.20': {'id': 'LZMA-SDK-9.11-to-9.20', 'deprecated': False},
+ 'lzma-sdk-9.22': {'id': 'LZMA-SDK-9.22', 'deprecated': False},
+ 'mackerras-3-clause': {'id': 'Mackerras-3-Clause', 'deprecated': False},
+ 'mackerras-3-clause-acknowledgment': {'id': 'Mackerras-3-Clause-acknowledgment', 'deprecated': False},
+ 'magaz': {'id': 'magaz', 'deprecated': False},
+ 'mailprio': {'id': 'mailprio', 'deprecated': False},
+ 'makeindex': {'id': 'MakeIndex', 'deprecated': False},
+ 'martin-birgmeier': {'id': 'Martin-Birgmeier', 'deprecated': False},
+ 'mcphee-slideshow': {'id': 'McPhee-slideshow', 'deprecated': False},
+ 'metamail': {'id': 'metamail', 'deprecated': False},
+ 'minpack': {'id': 'Minpack', 'deprecated': False},
+ 'miros': {'id': 'MirOS', 'deprecated': False},
+ 'mit': {'id': 'MIT', 'deprecated': False},
+ 'mit-0': {'id': 'MIT-0', 'deprecated': False},
+ 'mit-advertising': {'id': 'MIT-advertising', 'deprecated': False},
+ 'mit-cmu': {'id': 'MIT-CMU', 'deprecated': False},
+ 'mit-enna': {'id': 'MIT-enna', 'deprecated': False},
+ 'mit-feh': {'id': 'MIT-feh', 'deprecated': False},
+ 'mit-festival': {'id': 'MIT-Festival', 'deprecated': False},
+ 'mit-khronos-old': {'id': 'MIT-Khronos-old', 'deprecated': False},
+ 'mit-modern-variant': {'id': 'MIT-Modern-Variant', 'deprecated': False},
+ 'mit-open-group': {'id': 'MIT-open-group', 'deprecated': False},
+ 'mit-testregex': {'id': 'MIT-testregex', 'deprecated': False},
+ 'mit-wu': {'id': 'MIT-Wu', 'deprecated': False},
+ 'mitnfa': {'id': 'MITNFA', 'deprecated': False},
+ 'mmixware': {'id': 'MMIXware', 'deprecated': False},
+ 'motosoto': {'id': 'Motosoto', 'deprecated': False},
+ 'mpeg-ssg': {'id': 'MPEG-SSG', 'deprecated': False},
+ 'mpi-permissive': {'id': 'mpi-permissive', 'deprecated': False},
+ 'mpich2': {'id': 'mpich2', 'deprecated': False},
+ 'mpl-1.0': {'id': 'MPL-1.0', 'deprecated': False},
+ 'mpl-1.1': {'id': 'MPL-1.1', 'deprecated': False},
+ 'mpl-2.0': {'id': 'MPL-2.0', 'deprecated': False},
+ 'mpl-2.0-no-copyleft-exception': {'id': 'MPL-2.0-no-copyleft-exception', 'deprecated': False},
+ 'mplus': {'id': 'mplus', 'deprecated': False},
+ 'ms-lpl': {'id': 'MS-LPL', 'deprecated': False},
+ 'ms-pl': {'id': 'MS-PL', 'deprecated': False},
+ 'ms-rl': {'id': 'MS-RL', 'deprecated': False},
+ 'mtll': {'id': 'MTLL', 'deprecated': False},
+ 'mulanpsl-1.0': {'id': 'MulanPSL-1.0', 'deprecated': False},
+ 'mulanpsl-2.0': {'id': 'MulanPSL-2.0', 'deprecated': False},
+ 'multics': {'id': 'Multics', 'deprecated': False},
+ 'mup': {'id': 'Mup', 'deprecated': False},
+ 'naist-2003': {'id': 'NAIST-2003', 'deprecated': False},
+ 'nasa-1.3': {'id': 'NASA-1.3', 'deprecated': False},
+ 'naumen': {'id': 'Naumen', 'deprecated': False},
+ 'nbpl-1.0': {'id': 'NBPL-1.0', 'deprecated': False},
+ 'ncbi-pd': {'id': 'NCBI-PD', 'deprecated': False},
+ 'ncgl-uk-2.0': {'id': 'NCGL-UK-2.0', 'deprecated': False},
+ 'ncl': {'id': 'NCL', 'deprecated': False},
+ 'ncsa': {'id': 'NCSA', 'deprecated': False},
+ 'net-snmp': {'id': 'Net-SNMP', 'deprecated': True},
+ 'netcdf': {'id': 'NetCDF', 'deprecated': False},
+ 'newsletr': {'id': 'Newsletr', 'deprecated': False},
+ 'ngpl': {'id': 'NGPL', 'deprecated': False},
+ 'nicta-1.0': {'id': 'NICTA-1.0', 'deprecated': False},
+ 'nist-pd': {'id': 'NIST-PD', 'deprecated': False},
+ 'nist-pd-fallback': {'id': 'NIST-PD-fallback', 'deprecated': False},
+ 'nist-software': {'id': 'NIST-Software', 'deprecated': False},
+ 'nlod-1.0': {'id': 'NLOD-1.0', 'deprecated': False},
+ 'nlod-2.0': {'id': 'NLOD-2.0', 'deprecated': False},
+ 'nlpl': {'id': 'NLPL', 'deprecated': False},
+ 'nokia': {'id': 'Nokia', 'deprecated': False},
+ 'nosl': {'id': 'NOSL', 'deprecated': False},
+ 'noweb': {'id': 'Noweb', 'deprecated': False},
+ 'npl-1.0': {'id': 'NPL-1.0', 'deprecated': False},
+ 'npl-1.1': {'id': 'NPL-1.1', 'deprecated': False},
+ 'nposl-3.0': {'id': 'NPOSL-3.0', 'deprecated': False},
+ 'nrl': {'id': 'NRL', 'deprecated': False},
+ 'ntp': {'id': 'NTP', 'deprecated': False},
+ 'ntp-0': {'id': 'NTP-0', 'deprecated': False},
+ 'nunit': {'id': 'Nunit', 'deprecated': True},
+ 'o-uda-1.0': {'id': 'O-UDA-1.0', 'deprecated': False},
+ 'oar': {'id': 'OAR', 'deprecated': False},
+ 'occt-pl': {'id': 'OCCT-PL', 'deprecated': False},
+ 'oclc-2.0': {'id': 'OCLC-2.0', 'deprecated': False},
+ 'odbl-1.0': {'id': 'ODbL-1.0', 'deprecated': False},
+ 'odc-by-1.0': {'id': 'ODC-By-1.0', 'deprecated': False},
+ 'offis': {'id': 'OFFIS', 'deprecated': False},
+ 'ofl-1.0': {'id': 'OFL-1.0', 'deprecated': False},
+ 'ofl-1.0-no-rfn': {'id': 'OFL-1.0-no-RFN', 'deprecated': False},
+ 'ofl-1.0-rfn': {'id': 'OFL-1.0-RFN', 'deprecated': False},
+ 'ofl-1.1': {'id': 'OFL-1.1', 'deprecated': False},
+ 'ofl-1.1-no-rfn': {'id': 'OFL-1.1-no-RFN', 'deprecated': False},
+ 'ofl-1.1-rfn': {'id': 'OFL-1.1-RFN', 'deprecated': False},
+ 'ogc-1.0': {'id': 'OGC-1.0', 'deprecated': False},
+ 'ogdl-taiwan-1.0': {'id': 'OGDL-Taiwan-1.0', 'deprecated': False},
+ 'ogl-canada-2.0': {'id': 'OGL-Canada-2.0', 'deprecated': False},
+ 'ogl-uk-1.0': {'id': 'OGL-UK-1.0', 'deprecated': False},
+ 'ogl-uk-2.0': {'id': 'OGL-UK-2.0', 'deprecated': False},
+ 'ogl-uk-3.0': {'id': 'OGL-UK-3.0', 'deprecated': False},
+ 'ogtsl': {'id': 'OGTSL', 'deprecated': False},
+ 'oldap-1.1': {'id': 'OLDAP-1.1', 'deprecated': False},
+ 'oldap-1.2': {'id': 'OLDAP-1.2', 'deprecated': False},
+ 'oldap-1.3': {'id': 'OLDAP-1.3', 'deprecated': False},
+ 'oldap-1.4': {'id': 'OLDAP-1.4', 'deprecated': False},
+ 'oldap-2.0': {'id': 'OLDAP-2.0', 'deprecated': False},
+ 'oldap-2.0.1': {'id': 'OLDAP-2.0.1', 'deprecated': False},
+ 'oldap-2.1': {'id': 'OLDAP-2.1', 'deprecated': False},
+ 'oldap-2.2': {'id': 'OLDAP-2.2', 'deprecated': False},
+ 'oldap-2.2.1': {'id': 'OLDAP-2.2.1', 'deprecated': False},
+ 'oldap-2.2.2': {'id': 'OLDAP-2.2.2', 'deprecated': False},
+ 'oldap-2.3': {'id': 'OLDAP-2.3', 'deprecated': False},
+ 'oldap-2.4': {'id': 'OLDAP-2.4', 'deprecated': False},
+ 'oldap-2.5': {'id': 'OLDAP-2.5', 'deprecated': False},
+ 'oldap-2.6': {'id': 'OLDAP-2.6', 'deprecated': False},
+ 'oldap-2.7': {'id': 'OLDAP-2.7', 'deprecated': False},
+ 'oldap-2.8': {'id': 'OLDAP-2.8', 'deprecated': False},
+ 'olfl-1.3': {'id': 'OLFL-1.3', 'deprecated': False},
+ 'oml': {'id': 'OML', 'deprecated': False},
+ 'openpbs-2.3': {'id': 'OpenPBS-2.3', 'deprecated': False},
+ 'openssl': {'id': 'OpenSSL', 'deprecated': False},
+ 'openssl-standalone': {'id': 'OpenSSL-standalone', 'deprecated': False},
+ 'openvision': {'id': 'OpenVision', 'deprecated': False},
+ 'opl-1.0': {'id': 'OPL-1.0', 'deprecated': False},
+ 'opl-uk-3.0': {'id': 'OPL-UK-3.0', 'deprecated': False},
+ 'opubl-1.0': {'id': 'OPUBL-1.0', 'deprecated': False},
+ 'oset-pl-2.1': {'id': 'OSET-PL-2.1', 'deprecated': False},
+ 'osl-1.0': {'id': 'OSL-1.0', 'deprecated': False},
+ 'osl-1.1': {'id': 'OSL-1.1', 'deprecated': False},
+ 'osl-2.0': {'id': 'OSL-2.0', 'deprecated': False},
+ 'osl-2.1': {'id': 'OSL-2.1', 'deprecated': False},
+ 'osl-3.0': {'id': 'OSL-3.0', 'deprecated': False},
+ 'padl': {'id': 'PADL', 'deprecated': False},
+ 'parity-6.0.0': {'id': 'Parity-6.0.0', 'deprecated': False},
+ 'parity-7.0.0': {'id': 'Parity-7.0.0', 'deprecated': False},
+ 'pddl-1.0': {'id': 'PDDL-1.0', 'deprecated': False},
+ 'php-3.0': {'id': 'PHP-3.0', 'deprecated': False},
+ 'php-3.01': {'id': 'PHP-3.01', 'deprecated': False},
+ 'pixar': {'id': 'Pixar', 'deprecated': False},
+ 'pkgconf': {'id': 'pkgconf', 'deprecated': False},
+ 'plexus': {'id': 'Plexus', 'deprecated': False},
+ 'pnmstitch': {'id': 'pnmstitch', 'deprecated': False},
+ 'polyform-noncommercial-1.0.0': {'id': 'PolyForm-Noncommercial-1.0.0', 'deprecated': False},
+ 'polyform-small-business-1.0.0': {'id': 'PolyForm-Small-Business-1.0.0', 'deprecated': False},
+ 'postgresql': {'id': 'PostgreSQL', 'deprecated': False},
+ 'ppl': {'id': 'PPL', 'deprecated': False},
+ 'psf-2.0': {'id': 'PSF-2.0', 'deprecated': False},
+ 'psfrag': {'id': 'psfrag', 'deprecated': False},
+ 'psutils': {'id': 'psutils', 'deprecated': False},
+ 'python-2.0': {'id': 'Python-2.0', 'deprecated': False},
+ 'python-2.0.1': {'id': 'Python-2.0.1', 'deprecated': False},
+ 'python-ldap': {'id': 'python-ldap', 'deprecated': False},
+ 'qhull': {'id': 'Qhull', 'deprecated': False},
+ 'qpl-1.0': {'id': 'QPL-1.0', 'deprecated': False},
+ 'qpl-1.0-inria-2004': {'id': 'QPL-1.0-INRIA-2004', 'deprecated': False},
+ 'radvd': {'id': 'radvd', 'deprecated': False},
+ 'rdisc': {'id': 'Rdisc', 'deprecated': False},
+ 'rhecos-1.1': {'id': 'RHeCos-1.1', 'deprecated': False},
+ 'rpl-1.1': {'id': 'RPL-1.1', 'deprecated': False},
+ 'rpl-1.5': {'id': 'RPL-1.5', 'deprecated': False},
+ 'rpsl-1.0': {'id': 'RPSL-1.0', 'deprecated': False},
+ 'rsa-md': {'id': 'RSA-MD', 'deprecated': False},
+ 'rscpl': {'id': 'RSCPL', 'deprecated': False},
+ 'ruby': {'id': 'Ruby', 'deprecated': False},
+ 'ruby-pty': {'id': 'Ruby-pty', 'deprecated': False},
+ 'sax-pd': {'id': 'SAX-PD', 'deprecated': False},
+ 'sax-pd-2.0': {'id': 'SAX-PD-2.0', 'deprecated': False},
+ 'saxpath': {'id': 'Saxpath', 'deprecated': False},
+ 'scea': {'id': 'SCEA', 'deprecated': False},
+ 'schemereport': {'id': 'SchemeReport', 'deprecated': False},
+ 'sendmail': {'id': 'Sendmail', 'deprecated': False},
+ 'sendmail-8.23': {'id': 'Sendmail-8.23', 'deprecated': False},
+ 'sgi-b-1.0': {'id': 'SGI-B-1.0', 'deprecated': False},
+ 'sgi-b-1.1': {'id': 'SGI-B-1.1', 'deprecated': False},
+ 'sgi-b-2.0': {'id': 'SGI-B-2.0', 'deprecated': False},
+ 'sgi-opengl': {'id': 'SGI-OpenGL', 'deprecated': False},
+ 'sgp4': {'id': 'SGP4', 'deprecated': False},
+ 'shl-0.5': {'id': 'SHL-0.5', 'deprecated': False},
+ 'shl-0.51': {'id': 'SHL-0.51', 'deprecated': False},
+ 'simpl-2.0': {'id': 'SimPL-2.0', 'deprecated': False},
+ 'sissl': {'id': 'SISSL', 'deprecated': False},
+ 'sissl-1.2': {'id': 'SISSL-1.2', 'deprecated': False},
+ 'sl': {'id': 'SL', 'deprecated': False},
+ 'sleepycat': {'id': 'Sleepycat', 'deprecated': False},
+ 'smlnj': {'id': 'SMLNJ', 'deprecated': False},
+ 'smppl': {'id': 'SMPPL', 'deprecated': False},
+ 'snia': {'id': 'SNIA', 'deprecated': False},
+ 'snprintf': {'id': 'snprintf', 'deprecated': False},
+ 'softsurfer': {'id': 'softSurfer', 'deprecated': False},
+ 'soundex': {'id': 'Soundex', 'deprecated': False},
+ 'spencer-86': {'id': 'Spencer-86', 'deprecated': False},
+ 'spencer-94': {'id': 'Spencer-94', 'deprecated': False},
+ 'spencer-99': {'id': 'Spencer-99', 'deprecated': False},
+ 'spl-1.0': {'id': 'SPL-1.0', 'deprecated': False},
+ 'ssh-keyscan': {'id': 'ssh-keyscan', 'deprecated': False},
+ 'ssh-openssh': {'id': 'SSH-OpenSSH', 'deprecated': False},
+ 'ssh-short': {'id': 'SSH-short', 'deprecated': False},
+ 'ssleay-standalone': {'id': 'SSLeay-standalone', 'deprecated': False},
+ 'sspl-1.0': {'id': 'SSPL-1.0', 'deprecated': False},
+ 'standardml-nj': {'id': 'StandardML-NJ', 'deprecated': True},
+ 'sugarcrm-1.1.3': {'id': 'SugarCRM-1.1.3', 'deprecated': False},
+ 'sun-ppp': {'id': 'Sun-PPP', 'deprecated': False},
+ 'sun-ppp-2000': {'id': 'Sun-PPP-2000', 'deprecated': False},
+ 'sunpro': {'id': 'SunPro', 'deprecated': False},
+ 'swl': {'id': 'SWL', 'deprecated': False},
+ 'swrule': {'id': 'swrule', 'deprecated': False},
+ 'symlinks': {'id': 'Symlinks', 'deprecated': False},
+ 'tapr-ohl-1.0': {'id': 'TAPR-OHL-1.0', 'deprecated': False},
+ 'tcl': {'id': 'TCL', 'deprecated': False},
+ 'tcp-wrappers': {'id': 'TCP-wrappers', 'deprecated': False},
+ 'termreadkey': {'id': 'TermReadKey', 'deprecated': False},
+ 'tgppl-1.0': {'id': 'TGPPL-1.0', 'deprecated': False},
+ 'threeparttable': {'id': 'threeparttable', 'deprecated': False},
+ 'tmate': {'id': 'TMate', 'deprecated': False},
+ 'torque-1.1': {'id': 'TORQUE-1.1', 'deprecated': False},
+ 'tosl': {'id': 'TOSL', 'deprecated': False},
+ 'tpdl': {'id': 'TPDL', 'deprecated': False},
+ 'tpl-1.0': {'id': 'TPL-1.0', 'deprecated': False},
+ 'ttwl': {'id': 'TTWL', 'deprecated': False},
+ 'ttyp0': {'id': 'TTYP0', 'deprecated': False},
+ 'tu-berlin-1.0': {'id': 'TU-Berlin-1.0', 'deprecated': False},
+ 'tu-berlin-2.0': {'id': 'TU-Berlin-2.0', 'deprecated': False},
+ 'ubuntu-font-1.0': {'id': 'Ubuntu-font-1.0', 'deprecated': False},
+ 'ucar': {'id': 'UCAR', 'deprecated': False},
+ 'ucl-1.0': {'id': 'UCL-1.0', 'deprecated': False},
+ 'ulem': {'id': 'ulem', 'deprecated': False},
+ 'umich-merit': {'id': 'UMich-Merit', 'deprecated': False},
+ 'unicode-3.0': {'id': 'Unicode-3.0', 'deprecated': False},
+ 'unicode-dfs-2015': {'id': 'Unicode-DFS-2015', 'deprecated': False},
+ 'unicode-dfs-2016': {'id': 'Unicode-DFS-2016', 'deprecated': False},
+ 'unicode-tou': {'id': 'Unicode-TOU', 'deprecated': False},
+ 'unixcrypt': {'id': 'UnixCrypt', 'deprecated': False},
+ 'unlicense': {'id': 'Unlicense', 'deprecated': False},
+ 'upl-1.0': {'id': 'UPL-1.0', 'deprecated': False},
+ 'urt-rle': {'id': 'URT-RLE', 'deprecated': False},
+ 'vim': {'id': 'Vim', 'deprecated': False},
+ 'vostrom': {'id': 'VOSTROM', 'deprecated': False},
+ 'vsl-1.0': {'id': 'VSL-1.0', 'deprecated': False},
+ 'w3c': {'id': 'W3C', 'deprecated': False},
+ 'w3c-19980720': {'id': 'W3C-19980720', 'deprecated': False},
+ 'w3c-20150513': {'id': 'W3C-20150513', 'deprecated': False},
+ 'w3m': {'id': 'w3m', 'deprecated': False},
+ 'watcom-1.0': {'id': 'Watcom-1.0', 'deprecated': False},
+ 'widget-workshop': {'id': 'Widget-Workshop', 'deprecated': False},
+ 'wsuipa': {'id': 'Wsuipa', 'deprecated': False},
+ 'wtfpl': {'id': 'WTFPL', 'deprecated': False},
+ 'wxwindows': {'id': 'wxWindows', 'deprecated': True},
+ 'x11': {'id': 'X11', 'deprecated': False},
+ 'x11-distribute-modifications-variant': {'id': 'X11-distribute-modifications-variant', 'deprecated': False},
+ 'x11-swapped': {'id': 'X11-swapped', 'deprecated': False},
+ 'xdebug-1.03': {'id': 'Xdebug-1.03', 'deprecated': False},
+ 'xerox': {'id': 'Xerox', 'deprecated': False},
+ 'xfig': {'id': 'Xfig', 'deprecated': False},
+ 'xfree86-1.1': {'id': 'XFree86-1.1', 'deprecated': False},
+ 'xinetd': {'id': 'xinetd', 'deprecated': False},
+ 'xkeyboard-config-zinoviev': {'id': 'xkeyboard-config-Zinoviev', 'deprecated': False},
+ 'xlock': {'id': 'xlock', 'deprecated': False},
+ 'xnet': {'id': 'Xnet', 'deprecated': False},
+ 'xpp': {'id': 'xpp', 'deprecated': False},
+ 'xskat': {'id': 'XSkat', 'deprecated': False},
+ 'xzoom': {'id': 'xzoom', 'deprecated': False},
+ 'ypl-1.0': {'id': 'YPL-1.0', 'deprecated': False},
+ 'ypl-1.1': {'id': 'YPL-1.1', 'deprecated': False},
+ 'zed': {'id': 'Zed', 'deprecated': False},
+ 'zeeff': {'id': 'Zeeff', 'deprecated': False},
+ 'zend-2.0': {'id': 'Zend-2.0', 'deprecated': False},
+ 'zimbra-1.3': {'id': 'Zimbra-1.3', 'deprecated': False},
+ 'zimbra-1.4': {'id': 'Zimbra-1.4', 'deprecated': False},
+ 'zlib': {'id': 'Zlib', 'deprecated': False},
+ 'zlib-acknowledgement': {'id': 'zlib-acknowledgement', 'deprecated': False},
+ 'zpl-1.1': {'id': 'ZPL-1.1', 'deprecated': False},
+ 'zpl-2.0': {'id': 'ZPL-2.0', 'deprecated': False},
+ 'zpl-2.1': {'id': 'ZPL-2.1', 'deprecated': False},
+}
+
+EXCEPTIONS: dict[str, SPDXException] = {
+ '389-exception': {'id': '389-exception', 'deprecated': False},
+ 'asterisk-exception': {'id': 'Asterisk-exception', 'deprecated': False},
+ 'asterisk-linking-protocols-exception': {'id': 'Asterisk-linking-protocols-exception', 'deprecated': False},
+ 'autoconf-exception-2.0': {'id': 'Autoconf-exception-2.0', 'deprecated': False},
+ 'autoconf-exception-3.0': {'id': 'Autoconf-exception-3.0', 'deprecated': False},
+ 'autoconf-exception-generic': {'id': 'Autoconf-exception-generic', 'deprecated': False},
+ 'autoconf-exception-generic-3.0': {'id': 'Autoconf-exception-generic-3.0', 'deprecated': False},
+ 'autoconf-exception-macro': {'id': 'Autoconf-exception-macro', 'deprecated': False},
+ 'bison-exception-1.24': {'id': 'Bison-exception-1.24', 'deprecated': False},
+ 'bison-exception-2.2': {'id': 'Bison-exception-2.2', 'deprecated': False},
+ 'bootloader-exception': {'id': 'Bootloader-exception', 'deprecated': False},
+ 'classpath-exception-2.0': {'id': 'Classpath-exception-2.0', 'deprecated': False},
+ 'clisp-exception-2.0': {'id': 'CLISP-exception-2.0', 'deprecated': False},
+ 'cryptsetup-openssl-exception': {'id': 'cryptsetup-OpenSSL-exception', 'deprecated': False},
+ 'digirule-foss-exception': {'id': 'DigiRule-FOSS-exception', 'deprecated': False},
+ 'ecos-exception-2.0': {'id': 'eCos-exception-2.0', 'deprecated': False},
+ 'erlang-otp-linking-exception': {'id': 'erlang-otp-linking-exception', 'deprecated': False},
+ 'fawkes-runtime-exception': {'id': 'Fawkes-Runtime-exception', 'deprecated': False},
+ 'fltk-exception': {'id': 'FLTK-exception', 'deprecated': False},
+ 'fmt-exception': {'id': 'fmt-exception', 'deprecated': False},
+ 'font-exception-2.0': {'id': 'Font-exception-2.0', 'deprecated': False},
+ 'freertos-exception-2.0': {'id': 'freertos-exception-2.0', 'deprecated': False},
+ 'gcc-exception-2.0': {'id': 'GCC-exception-2.0', 'deprecated': False},
+ 'gcc-exception-2.0-note': {'id': 'GCC-exception-2.0-note', 'deprecated': False},
+ 'gcc-exception-3.1': {'id': 'GCC-exception-3.1', 'deprecated': False},
+ 'gmsh-exception': {'id': 'Gmsh-exception', 'deprecated': False},
+ 'gnat-exception': {'id': 'GNAT-exception', 'deprecated': False},
+ 'gnome-examples-exception': {'id': 'GNOME-examples-exception', 'deprecated': False},
+ 'gnu-compiler-exception': {'id': 'GNU-compiler-exception', 'deprecated': False},
+ 'gnu-javamail-exception': {'id': 'gnu-javamail-exception', 'deprecated': False},
+ 'gpl-3.0-interface-exception': {'id': 'GPL-3.0-interface-exception', 'deprecated': False},
+ 'gpl-3.0-linking-exception': {'id': 'GPL-3.0-linking-exception', 'deprecated': False},
+ 'gpl-3.0-linking-source-exception': {'id': 'GPL-3.0-linking-source-exception', 'deprecated': False},
+ 'gpl-cc-1.0': {'id': 'GPL-CC-1.0', 'deprecated': False},
+ 'gstreamer-exception-2005': {'id': 'GStreamer-exception-2005', 'deprecated': False},
+ 'gstreamer-exception-2008': {'id': 'GStreamer-exception-2008', 'deprecated': False},
+ 'i2p-gpl-java-exception': {'id': 'i2p-gpl-java-exception', 'deprecated': False},
+ 'kicad-libraries-exception': {'id': 'KiCad-libraries-exception', 'deprecated': False},
+ 'lgpl-3.0-linking-exception': {'id': 'LGPL-3.0-linking-exception', 'deprecated': False},
+ 'libpri-openh323-exception': {'id': 'libpri-OpenH323-exception', 'deprecated': False},
+ 'libtool-exception': {'id': 'Libtool-exception', 'deprecated': False},
+ 'linux-syscall-note': {'id': 'Linux-syscall-note', 'deprecated': False},
+ 'llgpl': {'id': 'LLGPL', 'deprecated': False},
+ 'llvm-exception': {'id': 'LLVM-exception', 'deprecated': False},
+ 'lzma-exception': {'id': 'LZMA-exception', 'deprecated': False},
+ 'mif-exception': {'id': 'mif-exception', 'deprecated': False},
+ 'nokia-qt-exception-1.1': {'id': 'Nokia-Qt-exception-1.1', 'deprecated': True},
+ 'ocaml-lgpl-linking-exception': {'id': 'OCaml-LGPL-linking-exception', 'deprecated': False},
+ 'occt-exception-1.0': {'id': 'OCCT-exception-1.0', 'deprecated': False},
+ 'openjdk-assembly-exception-1.0': {'id': 'OpenJDK-assembly-exception-1.0', 'deprecated': False},
+ 'openvpn-openssl-exception': {'id': 'openvpn-openssl-exception', 'deprecated': False},
+ 'pcre2-exception': {'id': 'PCRE2-exception', 'deprecated': False},
+ 'ps-or-pdf-font-exception-20170817': {'id': 'PS-or-PDF-font-exception-20170817', 'deprecated': False},
+ 'qpl-1.0-inria-2004-exception': {'id': 'QPL-1.0-INRIA-2004-exception', 'deprecated': False},
+ 'qt-gpl-exception-1.0': {'id': 'Qt-GPL-exception-1.0', 'deprecated': False},
+ 'qt-lgpl-exception-1.1': {'id': 'Qt-LGPL-exception-1.1', 'deprecated': False},
+ 'qwt-exception-1.0': {'id': 'Qwt-exception-1.0', 'deprecated': False},
+ 'romic-exception': {'id': 'romic-exception', 'deprecated': False},
+ 'rrdtool-floss-exception-2.0': {'id': 'RRDtool-FLOSS-exception-2.0', 'deprecated': False},
+ 'sane-exception': {'id': 'SANE-exception', 'deprecated': False},
+ 'shl-2.0': {'id': 'SHL-2.0', 'deprecated': False},
+ 'shl-2.1': {'id': 'SHL-2.1', 'deprecated': False},
+ 'stunnel-exception': {'id': 'stunnel-exception', 'deprecated': False},
+ 'swi-exception': {'id': 'SWI-exception', 'deprecated': False},
+ 'swift-exception': {'id': 'Swift-exception', 'deprecated': False},
+ 'texinfo-exception': {'id': 'Texinfo-exception', 'deprecated': False},
+ 'u-boot-exception-2.0': {'id': 'u-boot-exception-2.0', 'deprecated': False},
+ 'ubdl-exception': {'id': 'UBDL-exception', 'deprecated': False},
+ 'universal-foss-exception-1.0': {'id': 'Universal-FOSS-exception-1.0', 'deprecated': False},
+ 'vsftpd-openssl-exception': {'id': 'vsftpd-openssl-exception', 'deprecated': False},
+ 'wxwindows-exception-3.1': {'id': 'WxWindows-exception-3.1', 'deprecated': False},
+ 'x11vnc-openssl-exception': {'id': 'x11vnc-openssl-exception', 'deprecated': False},
+}
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
index 540e7a4d..e7cea572 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
@@ -2,35 +2,32 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
import operator
import os
import platform
import sys
-from typing import Any, Callable, Dict, List, Optional, Tuple, Union
-
-from pip._vendor.pyparsing import ( # noqa: N817
- Forward,
- Group,
- Literal as L,
- ParseException,
- ParseResults,
- QuotedString,
- ZeroOrMore,
- stringEnd,
- stringStart,
-)
+from typing import AbstractSet, Any, Callable, Literal, TypedDict, Union, cast
+from ._parser import MarkerAtom, MarkerList, Op, Value, Variable
+from ._parser import parse_marker as _parse_marker
+from ._tokenizer import ParserSyntaxError
from .specifiers import InvalidSpecifier, Specifier
+from .utils import canonicalize_name
__all__ = [
+ "EvaluateContext",
"InvalidMarker",
+ "Marker",
"UndefinedComparison",
"UndefinedEnvironmentName",
- "Marker",
"default_environment",
]
-Operator = Callable[[str, str], bool]
+Operator = Callable[[str, Union[str, AbstractSet[str]]], bool]
+EvaluateContext = Literal["metadata", "lock_file", "requirement"]
+MARKERS_ALLOWING_SET = {"extras", "dependency_groups"}
class InvalidMarker(ValueError):
@@ -52,103 +49,97 @@ class UndefinedEnvironmentName(ValueError):
"""
-class Node:
- def __init__(self, value: Any) -> None:
- self.value = value
+class Environment(TypedDict):
+ implementation_name: str
+ """The implementation's identifier, e.g. ``'cpython'``."""
- def __str__(self) -> str:
- return str(self.value)
+ implementation_version: str
+ """
+ The implementation's version, e.g. ``'3.13.0a2'`` for CPython 3.13.0a2, or
+ ``'7.3.13'`` for PyPy3.10 v7.3.13.
+ """
- def __repr__(self) -> str:
- return f"<{self.__class__.__name__}('{self}')>"
+ os_name: str
+ """
+ The value of :py:data:`os.name`. The name of the operating system dependent module
+ imported, e.g. ``'posix'``.
+ """
- def serialize(self) -> str:
- raise NotImplementedError
+ platform_machine: str
+ """
+ Returns the machine type, e.g. ``'i386'``.
+
+ An empty string if the value cannot be determined.
+ """
+
+ platform_release: str
+ """
+ The system's release, e.g. ``'2.2.0'`` or ``'NT'``.
+
+ An empty string if the value cannot be determined.
+ """
+
+ platform_system: str
+ """
+ The system/OS name, e.g. ``'Linux'``, ``'Windows'`` or ``'Java'``.
+
+ An empty string if the value cannot be determined.
+ """
+
+ platform_version: str
+ """
+ The system's release version, e.g. ``'#3 on degas'``.
+
+ An empty string if the value cannot be determined.
+ """
+
+ python_full_version: str
+ """
+ The Python version as string ``'major.minor.patchlevel'``.
+
+ Note that unlike the Python :py:data:`sys.version`, this value will always include
+ the patchlevel (it defaults to 0).
+ """
+
+ platform_python_implementation: str
+ """
+ A string identifying the Python implementation, e.g. ``'CPython'``.
+ """
+
+ python_version: str
+ """The Python version as string ``'major.minor'``."""
+
+ sys_platform: str
+ """
+ This string contains a platform identifier that can be used to append
+ platform-specific components to :py:data:`sys.path`, for instance.
+
+ For Unix systems, except on Linux and AIX, this is the lowercased OS name as
+ returned by ``uname -s`` with the first part of the version as returned by
+ ``uname -r`` appended, e.g. ``'sunos5'`` or ``'freebsd8'``, at the time when Python
+ was built.
+ """
-class Variable(Node):
- def serialize(self) -> str:
- return str(self)
-
-
-class Value(Node):
- def serialize(self) -> str:
- return f'"{self}"'
-
-
-class Op(Node):
- def serialize(self) -> str:
- return str(self)
-
-
-VARIABLE = (
- L("implementation_version")
- | L("platform_python_implementation")
- | L("implementation_name")
- | L("python_full_version")
- | L("platform_release")
- | L("platform_version")
- | L("platform_machine")
- | L("platform_system")
- | L("python_version")
- | L("sys_platform")
- | L("os_name")
- | L("os.name") # PEP-345
- | L("sys.platform") # PEP-345
- | L("platform.version") # PEP-345
- | L("platform.machine") # PEP-345
- | L("platform.python_implementation") # PEP-345
- | L("python_implementation") # undocumented setuptools legacy
- | L("extra") # PEP-508
-)
-ALIASES = {
- "os.name": "os_name",
- "sys.platform": "sys_platform",
- "platform.version": "platform_version",
- "platform.machine": "platform_machine",
- "platform.python_implementation": "platform_python_implementation",
- "python_implementation": "platform_python_implementation",
-}
-VARIABLE.setParseAction(lambda s, l, t: Variable(ALIASES.get(t[0], t[0])))
-
-VERSION_CMP = (
- L("===") | L("==") | L(">=") | L("<=") | L("!=") | L("~=") | L(">") | L("<")
-)
-
-MARKER_OP = VERSION_CMP | L("not in") | L("in")
-MARKER_OP.setParseAction(lambda s, l, t: Op(t[0]))
-
-MARKER_VALUE = QuotedString("'") | QuotedString('"')
-MARKER_VALUE.setParseAction(lambda s, l, t: Value(t[0]))
-
-BOOLOP = L("and") | L("or")
-
-MARKER_VAR = VARIABLE | MARKER_VALUE
-
-MARKER_ITEM = Group(MARKER_VAR + MARKER_OP + MARKER_VAR)
-MARKER_ITEM.setParseAction(lambda s, l, t: tuple(t[0]))
-
-LPAREN = L("(").suppress()
-RPAREN = L(")").suppress()
-
-MARKER_EXPR = Forward()
-MARKER_ATOM = MARKER_ITEM | Group(LPAREN + MARKER_EXPR + RPAREN)
-MARKER_EXPR << MARKER_ATOM + ZeroOrMore(BOOLOP + MARKER_EXPR)
-
-MARKER = stringStart + MARKER_EXPR + stringEnd
-
-
-def _coerce_parse_result(results: Union[ParseResults, List[Any]]) -> List[Any]:
- if isinstance(results, ParseResults):
- return [_coerce_parse_result(i) for i in results]
- else:
- return results
+def _normalize_extra_values(results: Any) -> Any:
+ """
+ Normalize extra values.
+ """
+ if isinstance(results[0], tuple):
+ lhs, op, rhs = results[0]
+ if isinstance(lhs, Variable) and lhs.value == "extra":
+ normalized_extra = canonicalize_name(rhs.value)
+ rhs = Value(normalized_extra)
+ elif isinstance(rhs, Variable) and rhs.value == "extra":
+ normalized_extra = canonicalize_name(lhs.value)
+ lhs = Value(normalized_extra)
+ results[0] = lhs, op, rhs
+ return results
def _format_marker(
- marker: Union[List[str], Tuple[Node, ...], str], first: Optional[bool] = True
+ marker: list[str] | MarkerAtom | str, first: bool | None = True
) -> str:
-
assert isinstance(marker, (list, tuple, str))
# Sometimes we have a structure like [[...]] which is a single item list
@@ -174,7 +165,7 @@ def _format_marker(
return marker
-_operators: Dict[str, Operator] = {
+_operators: dict[str, Operator] = {
"in": lambda lhs, rhs: lhs in rhs,
"not in": lambda lhs, rhs: lhs not in rhs,
"<": operator.lt,
@@ -186,41 +177,46 @@ _operators: Dict[str, Operator] = {
}
-def _eval_op(lhs: str, op: Op, rhs: str) -> bool:
- try:
- spec = Specifier("".join([op.serialize(), rhs]))
- except InvalidSpecifier:
- pass
- else:
- return spec.contains(lhs)
+def _eval_op(lhs: str, op: Op, rhs: str | AbstractSet[str]) -> bool:
+ if isinstance(rhs, str):
+ try:
+ spec = Specifier("".join([op.serialize(), rhs]))
+ except InvalidSpecifier:
+ pass
+ else:
+ return spec.contains(lhs, prereleases=True)
- oper: Optional[Operator] = _operators.get(op.serialize())
+ oper: Operator | None = _operators.get(op.serialize())
if oper is None:
raise UndefinedComparison(f"Undefined {op!r} on {lhs!r} and {rhs!r}.")
return oper(lhs, rhs)
-class Undefined:
- pass
+def _normalize(
+ lhs: str, rhs: str | AbstractSet[str], key: str
+) -> tuple[str, str | AbstractSet[str]]:
+ # PEP 685 – Comparison of extra names for optional distribution dependencies
+ # https://peps.python.org/pep-0685/
+ # > When comparing extra names, tools MUST normalize the names being
+ # > compared using the semantics outlined in PEP 503 for names
+ if key == "extra":
+ assert isinstance(rhs, str), "extra value must be a string"
+ return (canonicalize_name(lhs), canonicalize_name(rhs))
+ if key in MARKERS_ALLOWING_SET:
+ if isinstance(rhs, str): # pragma: no cover
+ return (canonicalize_name(lhs), canonicalize_name(rhs))
+ else:
+ return (canonicalize_name(lhs), {canonicalize_name(v) for v in rhs})
+
+ # other environment markers don't have such standards
+ return lhs, rhs
-_undefined = Undefined()
-
-
-def _get_env(environment: Dict[str, str], name: str) -> str:
- value: Union[str, Undefined] = environment.get(name, _undefined)
-
- if isinstance(value, Undefined):
- raise UndefinedEnvironmentName(
- f"{name!r} does not exist in evaluation environment."
- )
-
- return value
-
-
-def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
- groups: List[List[bool]] = [[]]
+def _evaluate_markers(
+ markers: MarkerList, environment: dict[str, str | AbstractSet[str]]
+) -> bool:
+ groups: list[list[bool]] = [[]]
for marker in markers:
assert isinstance(marker, (list, tuple, str))
@@ -231,12 +227,15 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
lhs, op, rhs = marker
if isinstance(lhs, Variable):
- lhs_value = _get_env(environment, lhs.value)
+ environment_key = lhs.value
+ lhs_value = environment[environment_key]
rhs_value = rhs.value
else:
lhs_value = lhs.value
- rhs_value = _get_env(environment, rhs.value)
-
+ environment_key = rhs.value
+ rhs_value = environment[environment_key]
+ assert isinstance(lhs_value, str), "lhs must be a string"
+ lhs_value, rhs_value = _normalize(lhs_value, rhs_value, key=environment_key)
groups[-1].append(_eval_op(lhs_value, op, rhs_value))
else:
assert marker in ["and", "or"]
@@ -246,15 +245,15 @@ def _evaluate_markers(markers: List[Any], environment: Dict[str, str]) -> bool:
return any(all(item) for item in groups)
-def format_full_version(info: "sys._version_info") -> str:
- version = "{0.major}.{0.minor}.{0.micro}".format(info)
+def format_full_version(info: sys._version_info) -> str:
+ version = f"{info.major}.{info.minor}.{info.micro}"
kind = info.releaselevel
if kind != "final":
version += kind[0] + str(info.serial)
return version
-def default_environment() -> Dict[str, str]:
+def default_environment() -> Environment:
iver = format_full_version(sys.implementation.version)
implementation_name = sys.implementation.name
return {
@@ -274,13 +273,29 @@ def default_environment() -> Dict[str, str]:
class Marker:
def __init__(self, marker: str) -> None:
+ # Note: We create a Marker object without calling this constructor in
+ # packaging.requirements.Requirement. If any additional logic is
+ # added here, make sure to mirror/adapt Requirement.
try:
- self._markers = _coerce_parse_result(MARKER.parseString(marker))
- except ParseException as e:
- raise InvalidMarker(
- f"Invalid marker: {marker!r}, parse error at "
- f"{marker[e.loc : e.loc + 8]!r}"
- )
+ self._markers = _normalize_extra_values(_parse_marker(marker))
+ # The attribute `_markers` can be described in terms of a recursive type:
+ # MarkerList = List[Union[Tuple[Node, ...], str, MarkerList]]
+ #
+ # For example, the following expression:
+ # python_version > "3.6" or (python_version == "3.6" and os_name == "unix")
+ #
+ # is parsed into:
+ # [
+ # (, ')>, ),
+ # 'and',
+ # [
+ # (, , ),
+ # 'or',
+ # (, , )
+ # ]
+ # ]
+ except ParserSyntaxError as e:
+ raise InvalidMarker(str(e)) from e
def __str__(self) -> str:
return _format_marker(self._markers)
@@ -288,17 +303,60 @@ class Marker:
def __repr__(self) -> str:
return f""
- def evaluate(self, environment: Optional[Dict[str, str]] = None) -> bool:
+ def __hash__(self) -> int:
+ return hash((self.__class__.__name__, str(self)))
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Marker):
+ return NotImplemented
+
+ return str(self) == str(other)
+
+ def evaluate(
+ self,
+ environment: dict[str, str] | None = None,
+ context: EvaluateContext = "metadata",
+ ) -> bool:
"""Evaluate a marker.
Return the boolean from evaluating the given marker against the
environment. environment is an optional argument to override all or
- part of the determined environment.
+ part of the determined environment. The *context* parameter specifies what
+ context the markers are being evaluated for, which influences what markers
+ are considered valid. Acceptable values are "metadata" (for core metadata;
+ default), "lock_file", and "requirement" (i.e. all other situations).
The environment is determined from the current Python process.
"""
- current_environment = default_environment()
+ current_environment = cast(
+ "dict[str, str | AbstractSet[str]]", default_environment()
+ )
+ if context == "lock_file":
+ current_environment.update(
+ extras=frozenset(), dependency_groups=frozenset()
+ )
+ elif context == "metadata":
+ current_environment["extra"] = ""
if environment is not None:
current_environment.update(environment)
+ # The API used to allow setting extra to None. We need to handle this
+ # case for backwards compatibility.
+ if "extra" in current_environment and current_environment["extra"] is None:
+ current_environment["extra"] = ""
- return _evaluate_markers(self._markers, current_environment)
+ return _evaluate_markers(
+ self._markers, _repair_python_full_version(current_environment)
+ )
+
+
+def _repair_python_full_version(
+ env: dict[str, str | AbstractSet[str]],
+) -> dict[str, str | AbstractSet[str]]:
+ """
+ Work around platform.python_version() returning something that is not PEP 440
+ compliant for non-tagged Python builds.
+ """
+ python_full_version = cast(str, env["python_full_version"])
+ if python_full_version.endswith("+"):
+ env["python_full_version"] = f"{python_full_version}local"
+ return env
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py
new file mode 100644
index 00000000..3bd8602d
--- /dev/null
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/metadata.py
@@ -0,0 +1,862 @@
+from __future__ import annotations
+
+import email.feedparser
+import email.header
+import email.message
+import email.parser
+import email.policy
+import pathlib
+import sys
+import typing
+from typing import (
+ Any,
+ Callable,
+ Generic,
+ Literal,
+ TypedDict,
+ cast,
+)
+
+from . import licenses, requirements, specifiers, utils
+from . import version as version_module
+from .licenses import NormalizedLicenseExpression
+
+T = typing.TypeVar("T")
+
+
+if sys.version_info >= (3, 11): # pragma: no cover
+ ExceptionGroup = ExceptionGroup
+else: # pragma: no cover
+
+ class ExceptionGroup(Exception):
+ """A minimal implementation of :external:exc:`ExceptionGroup` from Python 3.11.
+
+ If :external:exc:`ExceptionGroup` is already defined by Python itself,
+ that version is used instead.
+ """
+
+ message: str
+ exceptions: list[Exception]
+
+ def __init__(self, message: str, exceptions: list[Exception]) -> None:
+ self.message = message
+ self.exceptions = exceptions
+
+ def __repr__(self) -> str:
+ return f"{self.__class__.__name__}({self.message!r}, {self.exceptions!r})"
+
+
+class InvalidMetadata(ValueError):
+ """A metadata field contains invalid data."""
+
+ field: str
+ """The name of the field that contains invalid data."""
+
+ def __init__(self, field: str, message: str) -> None:
+ self.field = field
+ super().__init__(message)
+
+
+# The RawMetadata class attempts to make as few assumptions about the underlying
+# serialization formats as possible. The idea is that as long as a serialization
+# formats offer some very basic primitives in *some* way then we can support
+# serializing to and from that format.
+class RawMetadata(TypedDict, total=False):
+ """A dictionary of raw core metadata.
+
+ Each field in core metadata maps to a key of this dictionary (when data is
+ provided). The key is lower-case and underscores are used instead of dashes
+ compared to the equivalent core metadata field. Any core metadata field that
+ can be specified multiple times or can hold multiple values in a single
+ field have a key with a plural name. See :class:`Metadata` whose attributes
+ match the keys of this dictionary.
+
+ Core metadata fields that can be specified multiple times are stored as a
+ list or dict depending on which is appropriate for the field. Any fields
+ which hold multiple values in a single field are stored as a list.
+
+ """
+
+ # Metadata 1.0 - PEP 241
+ metadata_version: str
+ name: str
+ version: str
+ platforms: list[str]
+ summary: str
+ description: str
+ keywords: list[str]
+ home_page: str
+ author: str
+ author_email: str
+ license: str
+
+ # Metadata 1.1 - PEP 314
+ supported_platforms: list[str]
+ download_url: str
+ classifiers: list[str]
+ requires: list[str]
+ provides: list[str]
+ obsoletes: list[str]
+
+ # Metadata 1.2 - PEP 345
+ maintainer: str
+ maintainer_email: str
+ requires_dist: list[str]
+ provides_dist: list[str]
+ obsoletes_dist: list[str]
+ requires_python: str
+ requires_external: list[str]
+ project_urls: dict[str, str]
+
+ # Metadata 2.0
+ # PEP 426 attempted to completely revamp the metadata format
+ # but got stuck without ever being able to build consensus on
+ # it and ultimately ended up withdrawn.
+ #
+ # However, a number of tools had started emitting METADATA with
+ # `2.0` Metadata-Version, so for historical reasons, this version
+ # was skipped.
+
+ # Metadata 2.1 - PEP 566
+ description_content_type: str
+ provides_extra: list[str]
+
+ # Metadata 2.2 - PEP 643
+ dynamic: list[str]
+
+ # Metadata 2.3 - PEP 685
+ # No new fields were added in PEP 685, just some edge case were
+ # tightened up to provide better interoptability.
+
+ # Metadata 2.4 - PEP 639
+ license_expression: str
+ license_files: list[str]
+
+
+_STRING_FIELDS = {
+ "author",
+ "author_email",
+ "description",
+ "description_content_type",
+ "download_url",
+ "home_page",
+ "license",
+ "license_expression",
+ "maintainer",
+ "maintainer_email",
+ "metadata_version",
+ "name",
+ "requires_python",
+ "summary",
+ "version",
+}
+
+_LIST_FIELDS = {
+ "classifiers",
+ "dynamic",
+ "license_files",
+ "obsoletes",
+ "obsoletes_dist",
+ "platforms",
+ "provides",
+ "provides_dist",
+ "provides_extra",
+ "requires",
+ "requires_dist",
+ "requires_external",
+ "supported_platforms",
+}
+
+_DICT_FIELDS = {
+ "project_urls",
+}
+
+
+def _parse_keywords(data: str) -> list[str]:
+ """Split a string of comma-separated keywords into a list of keywords."""
+ return [k.strip() for k in data.split(",")]
+
+
+def _parse_project_urls(data: list[str]) -> dict[str, str]:
+ """Parse a list of label/URL string pairings separated by a comma."""
+ urls = {}
+ for pair in data:
+ # Our logic is slightly tricky here as we want to try and do
+ # *something* reasonable with malformed data.
+ #
+ # The main thing that we have to worry about, is data that does
+ # not have a ',' at all to split the label from the Value. There
+ # isn't a singular right answer here, and we will fail validation
+ # later on (if the caller is validating) so it doesn't *really*
+ # matter, but since the missing value has to be an empty str
+ # and our return value is dict[str, str], if we let the key
+ # be the missing value, then they'd have multiple '' values that
+ # overwrite each other in a accumulating dict.
+ #
+ # The other potentional issue is that it's possible to have the
+ # same label multiple times in the metadata, with no solid "right"
+ # answer with what to do in that case. As such, we'll do the only
+ # thing we can, which is treat the field as unparseable and add it
+ # to our list of unparsed fields.
+ parts = [p.strip() for p in pair.split(",", 1)]
+ parts.extend([""] * (max(0, 2 - len(parts)))) # Ensure 2 items
+
+ # TODO: The spec doesn't say anything about if the keys should be
+ # considered case sensitive or not... logically they should
+ # be case-preserving and case-insensitive, but doing that
+ # would open up more cases where we might have duplicate
+ # entries.
+ label, url = parts
+ if label in urls:
+ # The label already exists in our set of urls, so this field
+ # is unparseable, and we can just add the whole thing to our
+ # unparseable data and stop processing it.
+ raise KeyError("duplicate labels in project urls")
+ urls[label] = url
+
+ return urls
+
+
+def _get_payload(msg: email.message.Message, source: bytes | str) -> str:
+ """Get the body of the message."""
+ # If our source is a str, then our caller has managed encodings for us,
+ # and we don't need to deal with it.
+ if isinstance(source, str):
+ payload = msg.get_payload()
+ assert isinstance(payload, str)
+ return payload
+ # If our source is a bytes, then we're managing the encoding and we need
+ # to deal with it.
+ else:
+ bpayload = msg.get_payload(decode=True)
+ assert isinstance(bpayload, bytes)
+ try:
+ return bpayload.decode("utf8", "strict")
+ except UnicodeDecodeError as exc:
+ raise ValueError("payload in an invalid encoding") from exc
+
+
+# The various parse_FORMAT functions here are intended to be as lenient as
+# possible in their parsing, while still returning a correctly typed
+# RawMetadata.
+#
+# To aid in this, we also generally want to do as little touching of the
+# data as possible, except where there are possibly some historic holdovers
+# that make valid data awkward to work with.
+#
+# While this is a lower level, intermediate format than our ``Metadata``
+# class, some light touch ups can make a massive difference in usability.
+
+# Map METADATA fields to RawMetadata.
+_EMAIL_TO_RAW_MAPPING = {
+ "author": "author",
+ "author-email": "author_email",
+ "classifier": "classifiers",
+ "description": "description",
+ "description-content-type": "description_content_type",
+ "download-url": "download_url",
+ "dynamic": "dynamic",
+ "home-page": "home_page",
+ "keywords": "keywords",
+ "license": "license",
+ "license-expression": "license_expression",
+ "license-file": "license_files",
+ "maintainer": "maintainer",
+ "maintainer-email": "maintainer_email",
+ "metadata-version": "metadata_version",
+ "name": "name",
+ "obsoletes": "obsoletes",
+ "obsoletes-dist": "obsoletes_dist",
+ "platform": "platforms",
+ "project-url": "project_urls",
+ "provides": "provides",
+ "provides-dist": "provides_dist",
+ "provides-extra": "provides_extra",
+ "requires": "requires",
+ "requires-dist": "requires_dist",
+ "requires-external": "requires_external",
+ "requires-python": "requires_python",
+ "summary": "summary",
+ "supported-platform": "supported_platforms",
+ "version": "version",
+}
+_RAW_TO_EMAIL_MAPPING = {raw: email for email, raw in _EMAIL_TO_RAW_MAPPING.items()}
+
+
+def parse_email(data: bytes | str) -> tuple[RawMetadata, dict[str, list[str]]]:
+ """Parse a distribution's metadata stored as email headers (e.g. from ``METADATA``).
+
+ This function returns a two-item tuple of dicts. The first dict is of
+ recognized fields from the core metadata specification. Fields that can be
+ parsed and translated into Python's built-in types are converted
+ appropriately. All other fields are left as-is. Fields that are allowed to
+ appear multiple times are stored as lists.
+
+ The second dict contains all other fields from the metadata. This includes
+ any unrecognized fields. It also includes any fields which are expected to
+ be parsed into a built-in type but were not formatted appropriately. Finally,
+ any fields that are expected to appear only once but are repeated are
+ included in this dict.
+
+ """
+ raw: dict[str, str | list[str] | dict[str, str]] = {}
+ unparsed: dict[str, list[str]] = {}
+
+ if isinstance(data, str):
+ parsed = email.parser.Parser(policy=email.policy.compat32).parsestr(data)
+ else:
+ parsed = email.parser.BytesParser(policy=email.policy.compat32).parsebytes(data)
+
+ # We have to wrap parsed.keys() in a set, because in the case of multiple
+ # values for a key (a list), the key will appear multiple times in the
+ # list of keys, but we're avoiding that by using get_all().
+ for name in frozenset(parsed.keys()):
+ # Header names in RFC are case insensitive, so we'll normalize to all
+ # lower case to make comparisons easier.
+ name = name.lower()
+
+ # We use get_all() here, even for fields that aren't multiple use,
+ # because otherwise someone could have e.g. two Name fields, and we
+ # would just silently ignore it rather than doing something about it.
+ headers = parsed.get_all(name) or []
+
+ # The way the email module works when parsing bytes is that it
+ # unconditionally decodes the bytes as ascii using the surrogateescape
+ # handler. When you pull that data back out (such as with get_all() ),
+ # it looks to see if the str has any surrogate escapes, and if it does
+ # it wraps it in a Header object instead of returning the string.
+ #
+ # As such, we'll look for those Header objects, and fix up the encoding.
+ value = []
+ # Flag if we have run into any issues processing the headers, thus
+ # signalling that the data belongs in 'unparsed'.
+ valid_encoding = True
+ for h in headers:
+ # It's unclear if this can return more types than just a Header or
+ # a str, so we'll just assert here to make sure.
+ assert isinstance(h, (email.header.Header, str))
+
+ # If it's a header object, we need to do our little dance to get
+ # the real data out of it. In cases where there is invalid data
+ # we're going to end up with mojibake, but there's no obvious, good
+ # way around that without reimplementing parts of the Header object
+ # ourselves.
+ #
+ # That should be fine since, if mojibacked happens, this key is
+ # going into the unparsed dict anyways.
+ if isinstance(h, email.header.Header):
+ # The Header object stores it's data as chunks, and each chunk
+ # can be independently encoded, so we'll need to check each
+ # of them.
+ chunks: list[tuple[bytes, str | None]] = []
+ for bin, encoding in email.header.decode_header(h):
+ try:
+ bin.decode("utf8", "strict")
+ except UnicodeDecodeError:
+ # Enable mojibake.
+ encoding = "latin1"
+ valid_encoding = False
+ else:
+ encoding = "utf8"
+ chunks.append((bin, encoding))
+
+ # Turn our chunks back into a Header object, then let that
+ # Header object do the right thing to turn them into a
+ # string for us.
+ value.append(str(email.header.make_header(chunks)))
+ # This is already a string, so just add it.
+ else:
+ value.append(h)
+
+ # We've processed all of our values to get them into a list of str,
+ # but we may have mojibake data, in which case this is an unparsed
+ # field.
+ if not valid_encoding:
+ unparsed[name] = value
+ continue
+
+ raw_name = _EMAIL_TO_RAW_MAPPING.get(name)
+ if raw_name is None:
+ # This is a bit of a weird situation, we've encountered a key that
+ # we don't know what it means, so we don't know whether it's meant
+ # to be a list or not.
+ #
+ # Since we can't really tell one way or another, we'll just leave it
+ # as a list, even though it may be a single item list, because that's
+ # what makes the most sense for email headers.
+ unparsed[name] = value
+ continue
+
+ # If this is one of our string fields, then we'll check to see if our
+ # value is a list of a single item. If it is then we'll assume that
+ # it was emitted as a single string, and unwrap the str from inside
+ # the list.
+ #
+ # If it's any other kind of data, then we haven't the faintest clue
+ # what we should parse it as, and we have to just add it to our list
+ # of unparsed stuff.
+ if raw_name in _STRING_FIELDS and len(value) == 1:
+ raw[raw_name] = value[0]
+ # If this is one of our list of string fields, then we can just assign
+ # the value, since email *only* has strings, and our get_all() call
+ # above ensures that this is a list.
+ elif raw_name in _LIST_FIELDS:
+ raw[raw_name] = value
+ # Special Case: Keywords
+ # The keywords field is implemented in the metadata spec as a str,
+ # but it conceptually is a list of strings, and is serialized using
+ # ", ".join(keywords), so we'll do some light data massaging to turn
+ # this into what it logically is.
+ elif raw_name == "keywords" and len(value) == 1:
+ raw[raw_name] = _parse_keywords(value[0])
+ # Special Case: Project-URL
+ # The project urls is implemented in the metadata spec as a list of
+ # specially-formatted strings that represent a key and a value, which
+ # is fundamentally a mapping, however the email format doesn't support
+ # mappings in a sane way, so it was crammed into a list of strings
+ # instead.
+ #
+ # We will do a little light data massaging to turn this into a map as
+ # it logically should be.
+ elif raw_name == "project_urls":
+ try:
+ raw[raw_name] = _parse_project_urls(value)
+ except KeyError:
+ unparsed[name] = value
+ # Nothing that we've done has managed to parse this, so it'll just
+ # throw it in our unparseable data and move on.
+ else:
+ unparsed[name] = value
+
+ # We need to support getting the Description from the message payload in
+ # addition to getting it from the the headers. This does mean, though, there
+ # is the possibility of it being set both ways, in which case we put both
+ # in 'unparsed' since we don't know which is right.
+ try:
+ payload = _get_payload(parsed, data)
+ except ValueError:
+ unparsed.setdefault("description", []).append(
+ parsed.get_payload(decode=isinstance(data, bytes)) # type: ignore[call-overload]
+ )
+ else:
+ if payload:
+ # Check to see if we've already got a description, if so then both
+ # it, and this body move to unparseable.
+ if "description" in raw:
+ description_header = cast(str, raw.pop("description"))
+ unparsed.setdefault("description", []).extend(
+ [description_header, payload]
+ )
+ elif "description" in unparsed:
+ unparsed["description"].append(payload)
+ else:
+ raw["description"] = payload
+
+ # We need to cast our `raw` to a metadata, because a TypedDict only support
+ # literal key names, but we're computing our key names on purpose, but the
+ # way this function is implemented, our `TypedDict` can only have valid key
+ # names.
+ return cast(RawMetadata, raw), unparsed
+
+
+_NOT_FOUND = object()
+
+
+# Keep the two values in sync.
+_VALID_METADATA_VERSIONS = ["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"]
+_MetadataVersion = Literal["1.0", "1.1", "1.2", "2.1", "2.2", "2.3", "2.4"]
+
+_REQUIRED_ATTRS = frozenset(["metadata_version", "name", "version"])
+
+
+class _Validator(Generic[T]):
+ """Validate a metadata field.
+
+ All _process_*() methods correspond to a core metadata field. The method is
+ called with the field's raw value. If the raw value is valid it is returned
+ in its "enriched" form (e.g. ``version.Version`` for the ``Version`` field).
+ If the raw value is invalid, :exc:`InvalidMetadata` is raised (with a cause
+ as appropriate).
+ """
+
+ name: str
+ raw_name: str
+ added: _MetadataVersion
+
+ def __init__(
+ self,
+ *,
+ added: _MetadataVersion = "1.0",
+ ) -> None:
+ self.added = added
+
+ def __set_name__(self, _owner: Metadata, name: str) -> None:
+ self.name = name
+ self.raw_name = _RAW_TO_EMAIL_MAPPING[name]
+
+ def __get__(self, instance: Metadata, _owner: type[Metadata]) -> T:
+ # With Python 3.8, the caching can be replaced with functools.cached_property().
+ # No need to check the cache as attribute lookup will resolve into the
+ # instance's __dict__ before __get__ is called.
+ cache = instance.__dict__
+ value = instance._raw.get(self.name)
+
+ # To make the _process_* methods easier, we'll check if the value is None
+ # and if this field is NOT a required attribute, and if both of those
+ # things are true, we'll skip the the converter. This will mean that the
+ # converters never have to deal with the None union.
+ if self.name in _REQUIRED_ATTRS or value is not None:
+ try:
+ converter: Callable[[Any], T] = getattr(self, f"_process_{self.name}")
+ except AttributeError:
+ pass
+ else:
+ value = converter(value)
+
+ cache[self.name] = value
+ try:
+ del instance._raw[self.name] # type: ignore[misc]
+ except KeyError:
+ pass
+
+ return cast(T, value)
+
+ def _invalid_metadata(
+ self, msg: str, cause: Exception | None = None
+ ) -> InvalidMetadata:
+ exc = InvalidMetadata(
+ self.raw_name, msg.format_map({"field": repr(self.raw_name)})
+ )
+ exc.__cause__ = cause
+ return exc
+
+ def _process_metadata_version(self, value: str) -> _MetadataVersion:
+ # Implicitly makes Metadata-Version required.
+ if value not in _VALID_METADATA_VERSIONS:
+ raise self._invalid_metadata(f"{value!r} is not a valid metadata version")
+ return cast(_MetadataVersion, value)
+
+ def _process_name(self, value: str) -> str:
+ if not value:
+ raise self._invalid_metadata("{field} is a required field")
+ # Validate the name as a side-effect.
+ try:
+ utils.canonicalize_name(value, validate=True)
+ except utils.InvalidName as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ ) from exc
+ else:
+ return value
+
+ def _process_version(self, value: str) -> version_module.Version:
+ if not value:
+ raise self._invalid_metadata("{field} is a required field")
+ try:
+ return version_module.parse(value)
+ except version_module.InvalidVersion as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ ) from exc
+
+ def _process_summary(self, value: str) -> str:
+ """Check the field contains no newlines."""
+ if "\n" in value:
+ raise self._invalid_metadata("{field} must be a single line")
+ return value
+
+ def _process_description_content_type(self, value: str) -> str:
+ content_types = {"text/plain", "text/x-rst", "text/markdown"}
+ message = email.message.EmailMessage()
+ message["content-type"] = value
+
+ content_type, parameters = (
+ # Defaults to `text/plain` if parsing failed.
+ message.get_content_type().lower(),
+ message["content-type"].params,
+ )
+ # Check if content-type is valid or defaulted to `text/plain` and thus was
+ # not parseable.
+ if content_type not in content_types or content_type not in value.lower():
+ raise self._invalid_metadata(
+ f"{{field}} must be one of {list(content_types)}, not {value!r}"
+ )
+
+ charset = parameters.get("charset", "UTF-8")
+ if charset != "UTF-8":
+ raise self._invalid_metadata(
+ f"{{field}} can only specify the UTF-8 charset, not {list(charset)}"
+ )
+
+ markdown_variants = {"GFM", "CommonMark"}
+ variant = parameters.get("variant", "GFM") # Use an acceptable default.
+ if content_type == "text/markdown" and variant not in markdown_variants:
+ raise self._invalid_metadata(
+ f"valid Markdown variants for {{field}} are {list(markdown_variants)}, "
+ f"not {variant!r}",
+ )
+ return value
+
+ def _process_dynamic(self, value: list[str]) -> list[str]:
+ for dynamic_field in map(str.lower, value):
+ if dynamic_field in {"name", "version", "metadata-version"}:
+ raise self._invalid_metadata(
+ f"{dynamic_field!r} is not allowed as a dynamic field"
+ )
+ elif dynamic_field not in _EMAIL_TO_RAW_MAPPING:
+ raise self._invalid_metadata(
+ f"{dynamic_field!r} is not a valid dynamic field"
+ )
+ return list(map(str.lower, value))
+
+ def _process_provides_extra(
+ self,
+ value: list[str],
+ ) -> list[utils.NormalizedName]:
+ normalized_names = []
+ try:
+ for name in value:
+ normalized_names.append(utils.canonicalize_name(name, validate=True))
+ except utils.InvalidName as exc:
+ raise self._invalid_metadata(
+ f"{name!r} is invalid for {{field}}", cause=exc
+ ) from exc
+ else:
+ return normalized_names
+
+ def _process_requires_python(self, value: str) -> specifiers.SpecifierSet:
+ try:
+ return specifiers.SpecifierSet(value)
+ except specifiers.InvalidSpecifier as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ ) from exc
+
+ def _process_requires_dist(
+ self,
+ value: list[str],
+ ) -> list[requirements.Requirement]:
+ reqs = []
+ try:
+ for req in value:
+ reqs.append(requirements.Requirement(req))
+ except requirements.InvalidRequirement as exc:
+ raise self._invalid_metadata(
+ f"{req!r} is invalid for {{field}}", cause=exc
+ ) from exc
+ else:
+ return reqs
+
+ def _process_license_expression(
+ self, value: str
+ ) -> NormalizedLicenseExpression | None:
+ try:
+ return licenses.canonicalize_license_expression(value)
+ except ValueError as exc:
+ raise self._invalid_metadata(
+ f"{value!r} is invalid for {{field}}", cause=exc
+ ) from exc
+
+ def _process_license_files(self, value: list[str]) -> list[str]:
+ paths = []
+ for path in value:
+ if ".." in path:
+ raise self._invalid_metadata(
+ f"{path!r} is invalid for {{field}}, "
+ "parent directory indicators are not allowed"
+ )
+ if "*" in path:
+ raise self._invalid_metadata(
+ f"{path!r} is invalid for {{field}}, paths must be resolved"
+ )
+ if (
+ pathlib.PurePosixPath(path).is_absolute()
+ or pathlib.PureWindowsPath(path).is_absolute()
+ ):
+ raise self._invalid_metadata(
+ f"{path!r} is invalid for {{field}}, paths must be relative"
+ )
+ if pathlib.PureWindowsPath(path).as_posix() != path:
+ raise self._invalid_metadata(
+ f"{path!r} is invalid for {{field}}, paths must use '/' delimiter"
+ )
+ paths.append(path)
+ return paths
+
+
+class Metadata:
+ """Representation of distribution metadata.
+
+ Compared to :class:`RawMetadata`, this class provides objects representing
+ metadata fields instead of only using built-in types. Any invalid metadata
+ will cause :exc:`InvalidMetadata` to be raised (with a
+ :py:attr:`~BaseException.__cause__` attribute as appropriate).
+ """
+
+ _raw: RawMetadata
+
+ @classmethod
+ def from_raw(cls, data: RawMetadata, *, validate: bool = True) -> Metadata:
+ """Create an instance from :class:`RawMetadata`.
+
+ If *validate* is true, all metadata will be validated. All exceptions
+ related to validation will be gathered and raised as an :class:`ExceptionGroup`.
+ """
+ ins = cls()
+ ins._raw = data.copy() # Mutations occur due to caching enriched values.
+
+ if validate:
+ exceptions: list[Exception] = []
+ try:
+ metadata_version = ins.metadata_version
+ metadata_age = _VALID_METADATA_VERSIONS.index(metadata_version)
+ except InvalidMetadata as metadata_version_exc:
+ exceptions.append(metadata_version_exc)
+ metadata_version = None
+
+ # Make sure to check for the fields that are present, the required
+ # fields (so their absence can be reported).
+ fields_to_check = frozenset(ins._raw) | _REQUIRED_ATTRS
+ # Remove fields that have already been checked.
+ fields_to_check -= {"metadata_version"}
+
+ for key in fields_to_check:
+ try:
+ if metadata_version:
+ # Can't use getattr() as that triggers descriptor protocol which
+ # will fail due to no value for the instance argument.
+ try:
+ field_metadata_version = cls.__dict__[key].added
+ except KeyError:
+ exc = InvalidMetadata(key, f"unrecognized field: {key!r}")
+ exceptions.append(exc)
+ continue
+ field_age = _VALID_METADATA_VERSIONS.index(
+ field_metadata_version
+ )
+ if field_age > metadata_age:
+ field = _RAW_TO_EMAIL_MAPPING[key]
+ exc = InvalidMetadata(
+ field,
+ f"{field} introduced in metadata version "
+ f"{field_metadata_version}, not {metadata_version}",
+ )
+ exceptions.append(exc)
+ continue
+ getattr(ins, key)
+ except InvalidMetadata as exc:
+ exceptions.append(exc)
+
+ if exceptions:
+ raise ExceptionGroup("invalid metadata", exceptions)
+
+ return ins
+
+ @classmethod
+ def from_email(cls, data: bytes | str, *, validate: bool = True) -> Metadata:
+ """Parse metadata from email headers.
+
+ If *validate* is true, the metadata will be validated. All exceptions
+ related to validation will be gathered and raised as an :class:`ExceptionGroup`.
+ """
+ raw, unparsed = parse_email(data)
+
+ if validate:
+ exceptions: list[Exception] = []
+ for unparsed_key in unparsed:
+ if unparsed_key in _EMAIL_TO_RAW_MAPPING:
+ message = f"{unparsed_key!r} has invalid data"
+ else:
+ message = f"unrecognized field: {unparsed_key!r}"
+ exceptions.append(InvalidMetadata(unparsed_key, message))
+
+ if exceptions:
+ raise ExceptionGroup("unparsed", exceptions)
+
+ try:
+ return cls.from_raw(raw, validate=validate)
+ except ExceptionGroup as exc_group:
+ raise ExceptionGroup(
+ "invalid or unparsed metadata", exc_group.exceptions
+ ) from None
+
+ metadata_version: _Validator[_MetadataVersion] = _Validator()
+ """:external:ref:`core-metadata-metadata-version`
+ (required; validated to be a valid metadata version)"""
+ # `name` is not normalized/typed to NormalizedName so as to provide access to
+ # the original/raw name.
+ name: _Validator[str] = _Validator()
+ """:external:ref:`core-metadata-name`
+ (required; validated using :func:`~packaging.utils.canonicalize_name` and its
+ *validate* parameter)"""
+ version: _Validator[version_module.Version] = _Validator()
+ """:external:ref:`core-metadata-version` (required)"""
+ dynamic: _Validator[list[str] | None] = _Validator(
+ added="2.2",
+ )
+ """:external:ref:`core-metadata-dynamic`
+ (validated against core metadata field names and lowercased)"""
+ platforms: _Validator[list[str] | None] = _Validator()
+ """:external:ref:`core-metadata-platform`"""
+ supported_platforms: _Validator[list[str] | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-supported-platform`"""
+ summary: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-summary` (validated to contain no newlines)"""
+ description: _Validator[str | None] = _Validator() # TODO 2.1: can be in body
+ """:external:ref:`core-metadata-description`"""
+ description_content_type: _Validator[str | None] = _Validator(added="2.1")
+ """:external:ref:`core-metadata-description-content-type` (validated)"""
+ keywords: _Validator[list[str] | None] = _Validator()
+ """:external:ref:`core-metadata-keywords`"""
+ home_page: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-home-page`"""
+ download_url: _Validator[str | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-download-url`"""
+ author: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-author`"""
+ author_email: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-author-email`"""
+ maintainer: _Validator[str | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-maintainer`"""
+ maintainer_email: _Validator[str | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-maintainer-email`"""
+ license: _Validator[str | None] = _Validator()
+ """:external:ref:`core-metadata-license`"""
+ license_expression: _Validator[NormalizedLicenseExpression | None] = _Validator(
+ added="2.4"
+ )
+ """:external:ref:`core-metadata-license-expression`"""
+ license_files: _Validator[list[str] | None] = _Validator(added="2.4")
+ """:external:ref:`core-metadata-license-file`"""
+ classifiers: _Validator[list[str] | None] = _Validator(added="1.1")
+ """:external:ref:`core-metadata-classifier`"""
+ requires_dist: _Validator[list[requirements.Requirement] | None] = _Validator(
+ added="1.2"
+ )
+ """:external:ref:`core-metadata-requires-dist`"""
+ requires_python: _Validator[specifiers.SpecifierSet | None] = _Validator(
+ added="1.2"
+ )
+ """:external:ref:`core-metadata-requires-python`"""
+ # Because `Requires-External` allows for non-PEP 440 version specifiers, we
+ # don't do any processing on the values.
+ requires_external: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-requires-external`"""
+ project_urls: _Validator[dict[str, str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-project-url`"""
+ # PEP 685 lets us raise an error if an extra doesn't pass `Name` validation
+ # regardless of metadata version.
+ provides_extra: _Validator[list[utils.NormalizedName] | None] = _Validator(
+ added="2.1",
+ )
+ """:external:ref:`core-metadata-provides-extra`"""
+ provides_dist: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-provides-dist`"""
+ obsoletes_dist: _Validator[list[str] | None] = _Validator(added="1.2")
+ """:external:ref:`core-metadata-obsoletes-dist`"""
+ requires: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Requires`` (deprecated)"""
+ provides: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Provides`` (deprecated)"""
+ obsoletes: _Validator[list[str] | None] = _Validator(added="1.1")
+ """``Obsoletes`` (deprecated)"""
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py
index 1eab7dd6..4e068c95 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py
@@ -1,27 +1,15 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
-import re
-import string
-import urllib.parse
-from typing import List, Optional as TOptional, Set
+from typing import Any, Iterator
-from pip._vendor.pyparsing import ( # noqa
- Combine,
- Literal as L,
- Optional,
- ParseException,
- Regex,
- Word,
- ZeroOrMore,
- originalTextFor,
- stringEnd,
- stringStart,
-)
-
-from .markers import MARKER_EXPR, Marker
-from .specifiers import LegacySpecifier, Specifier, SpecifierSet
+from ._parser import parse_requirement as _parse_requirement
+from ._tokenizer import ParserSyntaxError
+from .markers import Marker, _normalize_extra_values
+from .specifiers import SpecifierSet
+from .utils import canonicalize_name
class InvalidRequirement(ValueError):
@@ -30,60 +18,6 @@ class InvalidRequirement(ValueError):
"""
-ALPHANUM = Word(string.ascii_letters + string.digits)
-
-LBRACKET = L("[").suppress()
-RBRACKET = L("]").suppress()
-LPAREN = L("(").suppress()
-RPAREN = L(")").suppress()
-COMMA = L(",").suppress()
-SEMICOLON = L(";").suppress()
-AT = L("@").suppress()
-
-PUNCTUATION = Word("-_.")
-IDENTIFIER_END = ALPHANUM | (ZeroOrMore(PUNCTUATION) + ALPHANUM)
-IDENTIFIER = Combine(ALPHANUM + ZeroOrMore(IDENTIFIER_END))
-
-NAME = IDENTIFIER("name")
-EXTRA = IDENTIFIER
-
-URI = Regex(r"[^ ]+")("url")
-URL = AT + URI
-
-EXTRAS_LIST = EXTRA + ZeroOrMore(COMMA + EXTRA)
-EXTRAS = (LBRACKET + Optional(EXTRAS_LIST) + RBRACKET)("extras")
-
-VERSION_PEP440 = Regex(Specifier._regex_str, re.VERBOSE | re.IGNORECASE)
-VERSION_LEGACY = Regex(LegacySpecifier._regex_str, re.VERBOSE | re.IGNORECASE)
-
-VERSION_ONE = VERSION_PEP440 ^ VERSION_LEGACY
-VERSION_MANY = Combine(
- VERSION_ONE + ZeroOrMore(COMMA + VERSION_ONE), joinString=",", adjacent=False
-)("_raw_spec")
-_VERSION_SPEC = Optional((LPAREN + VERSION_MANY + RPAREN) | VERSION_MANY)
-_VERSION_SPEC.setParseAction(lambda s, l, t: t._raw_spec or "")
-
-VERSION_SPEC = originalTextFor(_VERSION_SPEC)("specifier")
-VERSION_SPEC.setParseAction(lambda s, l, t: t[1])
-
-MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
-MARKER_EXPR.setParseAction(
- lambda s, l, t: Marker(s[t._original_start : t._original_end])
-)
-MARKER_SEPARATOR = SEMICOLON
-MARKER = MARKER_SEPARATOR + MARKER_EXPR
-
-VERSION_AND_MARKER = VERSION_SPEC + Optional(MARKER)
-URL_AND_MARKER = URL + Optional(MARKER)
-
-NAMED_REQUIREMENT = NAME + Optional(EXTRAS) + (URL_AND_MARKER | VERSION_AND_MARKER)
-
-REQUIREMENT = stringStart + NAMED_REQUIREMENT + stringEnd
-# pyparsing isn't thread safe during initialization, so we do it eagerly, see
-# issue #104
-REQUIREMENT.parseString("x[]")
-
-
class Requirement:
"""Parse a requirement.
@@ -99,48 +33,59 @@ class Requirement:
def __init__(self, requirement_string: str) -> None:
try:
- req = REQUIREMENT.parseString(requirement_string)
- except ParseException as e:
- raise InvalidRequirement(
- f'Parse error at "{ requirement_string[e.loc : e.loc + 8]!r}": {e.msg}'
- )
+ parsed = _parse_requirement(requirement_string)
+ except ParserSyntaxError as e:
+ raise InvalidRequirement(str(e)) from e
- self.name: str = req.name
- if req.url:
- parsed_url = urllib.parse.urlparse(req.url)
- if parsed_url.scheme == "file":
- if urllib.parse.urlunparse(parsed_url) != req.url:
- raise InvalidRequirement("Invalid URL given")
- elif not (parsed_url.scheme and parsed_url.netloc) or (
- not parsed_url.scheme and not parsed_url.netloc
- ):
- raise InvalidRequirement(f"Invalid URL: {req.url}")
- self.url: TOptional[str] = req.url
- else:
- self.url = None
- self.extras: Set[str] = set(req.extras.asList() if req.extras else [])
- self.specifier: SpecifierSet = SpecifierSet(req.specifier)
- self.marker: TOptional[Marker] = req.marker if req.marker else None
+ self.name: str = parsed.name
+ self.url: str | None = parsed.url or None
+ self.extras: set[str] = set(parsed.extras or [])
+ self.specifier: SpecifierSet = SpecifierSet(parsed.specifier)
+ self.marker: Marker | None = None
+ if parsed.marker is not None:
+ self.marker = Marker.__new__(Marker)
+ self.marker._markers = _normalize_extra_values(parsed.marker)
- def __str__(self) -> str:
- parts: List[str] = [self.name]
+ def _iter_parts(self, name: str) -> Iterator[str]:
+ yield name
if self.extras:
formatted_extras = ",".join(sorted(self.extras))
- parts.append(f"[{formatted_extras}]")
+ yield f"[{formatted_extras}]"
if self.specifier:
- parts.append(str(self.specifier))
+ yield str(self.specifier)
if self.url:
- parts.append(f"@ {self.url}")
+ yield f"@ {self.url}"
if self.marker:
- parts.append(" ")
+ yield " "
if self.marker:
- parts.append(f"; {self.marker}")
+ yield f"; {self.marker}"
- return "".join(parts)
+ def __str__(self) -> str:
+ return "".join(self._iter_parts(self.name))
def __repr__(self) -> str:
return f""
+
+ def __hash__(self) -> int:
+ return hash(
+ (
+ self.__class__.__name__,
+ *self._iter_parts(canonicalize_name(self.name)),
+ )
+ )
+
+ def __eq__(self, other: Any) -> bool:
+ if not isinstance(other, Requirement):
+ return NotImplemented
+
+ return (
+ canonicalize_name(self.name) == canonicalize_name(other.name)
+ and self.extras == other.extras
+ and self.specifier == other.specifier
+ and self.url == other.url
+ and self.marker == other.marker
+ )
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py
index 0e218a6f..47c3929a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py
@@ -1,38 +1,43 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+"""
+.. testsetup::
+
+ from pip._vendor.packaging.specifiers import Specifier, SpecifierSet, InvalidSpecifier
+ from pip._vendor.packaging.version import Version
+"""
+
+from __future__ import annotations
import abc
-import functools
import itertools
import re
-import warnings
-from typing import (
- Callable,
- Dict,
- Iterable,
- Iterator,
- List,
- Optional,
- Pattern,
- Set,
- Tuple,
- TypeVar,
- Union,
-)
+from typing import Callable, Iterable, Iterator, TypeVar, Union
from .utils import canonicalize_version
-from .version import LegacyVersion, Version, parse
+from .version import Version
-ParsedVersion = Union[Version, LegacyVersion]
-UnparsedVersion = Union[Version, LegacyVersion, str]
-VersionTypeVar = TypeVar("VersionTypeVar", bound=UnparsedVersion)
-CallableOperator = Callable[[ParsedVersion, str], bool]
+UnparsedVersion = Union[Version, str]
+UnparsedVersionVar = TypeVar("UnparsedVersionVar", bound=UnparsedVersion)
+CallableOperator = Callable[[Version, str], bool]
+
+
+def _coerce_version(version: UnparsedVersion) -> Version:
+ if not isinstance(version, Version):
+ version = Version(version)
+ return version
class InvalidSpecifier(ValueError):
"""
- An invalid specifier was found, users should refer to PEP 440.
+ Raised when attempting to create a :class:`Specifier` with a specifier
+ string that is invalid.
+
+ >>> Specifier("lolwat")
+ Traceback (most recent call last):
+ ...
+ packaging.specifiers.InvalidSpecifier: Invalid specifier: 'lolwat'
"""
@@ -40,266 +45,71 @@ class BaseSpecifier(metaclass=abc.ABCMeta):
@abc.abstractmethod
def __str__(self) -> str:
"""
- Returns the str representation of this Specifier like object. This
+ Returns the str representation of this Specifier-like object. This
should be representative of the Specifier itself.
"""
@abc.abstractmethod
def __hash__(self) -> int:
"""
- Returns a hash value for this Specifier like object.
+ Returns a hash value for this Specifier-like object.
"""
@abc.abstractmethod
def __eq__(self, other: object) -> bool:
"""
- Returns a boolean representing whether or not the two Specifier like
+ Returns a boolean representing whether or not the two Specifier-like
objects are equal.
+
+ :param other: The other object to check against.
"""
- @abc.abstractproperty
- def prereleases(self) -> Optional[bool]:
- """
- Returns whether or not pre-releases as a whole are allowed by this
- specifier.
+ @property
+ @abc.abstractmethod
+ def prereleases(self) -> bool | None:
+ """Whether or not pre-releases as a whole are allowed.
+
+ This can be set to either ``True`` or ``False`` to explicitly enable or disable
+ prereleases or it can be set to ``None`` (the default) to use default semantics.
"""
@prereleases.setter
def prereleases(self, value: bool) -> None:
- """
- Sets whether or not pre-releases as a whole are allowed by this
- specifier.
+ """Setter for :attr:`prereleases`.
+
+ :param value: The value to set.
"""
@abc.abstractmethod
- def contains(self, item: str, prereleases: Optional[bool] = None) -> bool:
+ def contains(self, item: str, prereleases: bool | None = None) -> bool:
"""
Determines if the given item is contained within this specifier.
"""
@abc.abstractmethod
def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
"""
Takes an iterable of items and filters them so that only items which
are contained within this specifier are allowed in it.
"""
-class _IndividualSpecifier(BaseSpecifier):
+class Specifier(BaseSpecifier):
+ """This class abstracts handling of version specifiers.
- _operators: Dict[str, str] = {}
- _regex: Pattern[str]
+ .. tip::
- def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
- match = self._regex.search(spec)
- if not match:
- raise InvalidSpecifier(f"Invalid specifier: '{spec}'")
+ It is generally not required to instantiate this manually. You should instead
+ prefer to work with :class:`SpecifierSet` instead, which can parse
+ comma-separated version specifiers (which is what package metadata contains).
+ """
- self._spec: Tuple[str, str] = (
- match.group("operator").strip(),
- match.group("version").strip(),
- )
-
- # Store whether or not this Specifier should accept prereleases
- self._prereleases = prereleases
-
- def __repr__(self) -> str:
- pre = (
- f", prereleases={self.prereleases!r}"
- if self._prereleases is not None
- else ""
- )
-
- return f"<{self.__class__.__name__}({str(self)!r}{pre})>"
-
- def __str__(self) -> str:
- return "{}{}".format(*self._spec)
-
- @property
- def _canonical_spec(self) -> Tuple[str, str]:
- return self._spec[0], canonicalize_version(self._spec[1])
-
- def __hash__(self) -> int:
- return hash(self._canonical_spec)
-
- def __eq__(self, other: object) -> bool:
- if isinstance(other, str):
- try:
- other = self.__class__(str(other))
- except InvalidSpecifier:
- return NotImplemented
- elif not isinstance(other, self.__class__):
- return NotImplemented
-
- return self._canonical_spec == other._canonical_spec
-
- def _get_operator(self, op: str) -> CallableOperator:
- operator_callable: CallableOperator = getattr(
- self, f"_compare_{self._operators[op]}"
- )
- return operator_callable
-
- def _coerce_version(self, version: UnparsedVersion) -> ParsedVersion:
- if not isinstance(version, (LegacyVersion, Version)):
- version = parse(version)
- return version
-
- @property
- def operator(self) -> str:
- return self._spec[0]
-
- @property
- def version(self) -> str:
- return self._spec[1]
-
- @property
- def prereleases(self) -> Optional[bool]:
- return self._prereleases
-
- @prereleases.setter
- def prereleases(self, value: bool) -> None:
- self._prereleases = value
-
- def __contains__(self, item: str) -> bool:
- return self.contains(item)
-
- def contains(
- self, item: UnparsedVersion, prereleases: Optional[bool] = None
- ) -> bool:
-
- # Determine if prereleases are to be allowed or not.
- if prereleases is None:
- prereleases = self.prereleases
-
- # Normalize item to a Version or LegacyVersion, this allows us to have
- # a shortcut for ``"2.0" in Specifier(">=2")
- normalized_item = self._coerce_version(item)
-
- # Determine if we should be supporting prereleases in this specifier
- # or not, if we do not support prereleases than we can short circuit
- # logic if this version is a prereleases.
- if normalized_item.is_prerelease and not prereleases:
- return False
-
- # Actually do the comparison to determine if this item is contained
- # within this Specifier or not.
- operator_callable: CallableOperator = self._get_operator(self.operator)
- return operator_callable(normalized_item, self.version)
-
- def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
-
- yielded = False
- found_prereleases = []
-
- kw = {"prereleases": prereleases if prereleases is not None else True}
-
- # Attempt to iterate over all the values in the iterable and if any of
- # them match, yield them.
- for version in iterable:
- parsed_version = self._coerce_version(version)
-
- if self.contains(parsed_version, **kw):
- # If our version is a prerelease, and we were not set to allow
- # prereleases, then we'll store it for later in case nothing
- # else matches this specifier.
- if parsed_version.is_prerelease and not (
- prereleases or self.prereleases
- ):
- found_prereleases.append(version)
- # Either this is not a prerelease, or we should have been
- # accepting prereleases from the beginning.
- else:
- yielded = True
- yield version
-
- # Now that we've iterated over everything, determine if we've yielded
- # any values, and if we have not and we have any prereleases stored up
- # then we will go ahead and yield the prereleases.
- if not yielded and found_prereleases:
- for version in found_prereleases:
- yield version
-
-
-class LegacySpecifier(_IndividualSpecifier):
-
- _regex_str = r"""
- (?P(==|!=|<=|>=|<|>))
- \s*
- (?P
- [^,;\s)]* # Since this is a "legacy" specifier, and the version
- # string can be just about anything, we match everything
- # except for whitespace, a semi-colon for marker support,
- # a closing paren since versions can be enclosed in
- # them, and a comma since it's a version separator.
- )
- """
-
- _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
-
- _operators = {
- "==": "equal",
- "!=": "not_equal",
- "<=": "less_than_equal",
- ">=": "greater_than_equal",
- "<": "less_than",
- ">": "greater_than",
- }
-
- def __init__(self, spec: str = "", prereleases: Optional[bool] = None) -> None:
- super().__init__(spec, prereleases)
-
- warnings.warn(
- "Creating a LegacyVersion has been deprecated and will be "
- "removed in the next major release",
- DeprecationWarning,
- )
-
- def _coerce_version(self, version: UnparsedVersion) -> LegacyVersion:
- if not isinstance(version, LegacyVersion):
- version = LegacyVersion(str(version))
- return version
-
- def _compare_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective == self._coerce_version(spec)
-
- def _compare_not_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective != self._coerce_version(spec)
-
- def _compare_less_than_equal(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective <= self._coerce_version(spec)
-
- def _compare_greater_than_equal(
- self, prospective: LegacyVersion, spec: str
- ) -> bool:
- return prospective >= self._coerce_version(spec)
-
- def _compare_less_than(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective < self._coerce_version(spec)
-
- def _compare_greater_than(self, prospective: LegacyVersion, spec: str) -> bool:
- return prospective > self._coerce_version(spec)
-
-
-def _require_version_compare(
- fn: Callable[["Specifier", ParsedVersion, str], bool]
-) -> Callable[["Specifier", ParsedVersion, str], bool]:
- @functools.wraps(fn)
- def wrapped(self: "Specifier", prospective: ParsedVersion, spec: str) -> bool:
- if not isinstance(prospective, Version):
- return False
- return fn(self, prospective, spec)
-
- return wrapped
-
-
-class Specifier(_IndividualSpecifier):
-
- _regex_str = r"""
+ _operator_regex_str = r"""
(?P(~=|==|!=|<=|>=|<|>|===))
+ """
+ _version_regex_str = r"""
(?P
(?:
# The identity operators allow for an escape hatch that will
@@ -309,8 +119,10 @@ class Specifier(_IndividualSpecifier):
# but included entirely as an escape hatch.
(?<====) # Only match for the identity operator
\s*
- [^\s]* # We just match everything, except for whitespace
- # since we are only testing for strict identity.
+ [^\s;)]* # The arbitrary version can be just about anything,
+ # we match everything except for whitespace, a
+ # semi-colon for marker support, and a closing paren
+ # since versions can be enclosed in them.
)
|
(?:
@@ -323,23 +135,23 @@ class Specifier(_IndividualSpecifier):
v?
(?:[0-9]+!)? # epoch
[0-9]+(?:\.[0-9]+)* # release
- (?: # pre release
- [-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
- [-_\.]?
- [0-9]*
- )?
- (?: # post release
- (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
- )?
- # You cannot use a wild card and a dev or local version
- # together so group them with a | and make them optional.
+ # You cannot use a wild card and a pre-release, post-release, a dev or
+ # local version together so group them with a | and make them optional.
(?:
+ \.\* # Wild card syntax of .*
+ |
+ (?: # pre release
+ [-_\.]?
+ (alpha|beta|preview|pre|a|b|c|rc)
+ [-_\.]?
+ [0-9]*
+ )?
+ (?: # post release
+ (?:-[0-9]+)|(?:[-_\.]?(post|rev|r)[-_\.]?[0-9]*)
+ )?
(?:[-_\.]?dev[-_\.]?[0-9]*)? # dev release
(?:\+[a-z0-9]+(?:[-_\.][a-z0-9]+)*)? # local
- |
- \.\* # Wild card syntax of .*
)?
)
|
@@ -354,7 +166,7 @@ class Specifier(_IndividualSpecifier):
[0-9]+(?:\.[0-9]+)+ # release (We have a + instead of a *)
(?: # pre release
[-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
+ (alpha|beta|preview|pre|a|b|c|rc)
[-_\.]?
[0-9]*
)?
@@ -379,7 +191,7 @@ class Specifier(_IndividualSpecifier):
[0-9]+(?:\.[0-9]+)* # release
(?: # pre release
[-_\.]?
- (a|b|c|rc|alpha|beta|pre|preview)
+ (alpha|beta|preview|pre|a|b|c|rc)
[-_\.]?
[0-9]*
)?
@@ -391,7 +203,10 @@ class Specifier(_IndividualSpecifier):
)
"""
- _regex = re.compile(r"^\s*" + _regex_str + r"\s*$", re.VERBOSE | re.IGNORECASE)
+ _regex = re.compile(
+ r"^\s*" + _operator_regex_str + _version_regex_str + r"\s*$",
+ re.VERBOSE | re.IGNORECASE,
+ )
_operators = {
"~=": "compatible",
@@ -404,9 +219,153 @@ class Specifier(_IndividualSpecifier):
"===": "arbitrary",
}
- @_require_version_compare
- def _compare_compatible(self, prospective: ParsedVersion, spec: str) -> bool:
+ def __init__(self, spec: str = "", prereleases: bool | None = None) -> None:
+ """Initialize a Specifier instance.
+ :param spec:
+ The string representation of a specifier which will be parsed and
+ normalized before use.
+ :param prereleases:
+ This tells the specifier if it should accept prerelease versions if
+ applicable or not. The default of ``None`` will autodetect it from the
+ given specifiers.
+ :raises InvalidSpecifier:
+ If the given specifier is invalid (i.e. bad syntax).
+ """
+ match = self._regex.search(spec)
+ if not match:
+ raise InvalidSpecifier(f"Invalid specifier: {spec!r}")
+
+ self._spec: tuple[str, str] = (
+ match.group("operator").strip(),
+ match.group("version").strip(),
+ )
+
+ # Store whether or not this Specifier should accept prereleases
+ self._prereleases = prereleases
+
+ # https://github.com/python/mypy/pull/13475#pullrequestreview-1079784515
+ @property # type: ignore[override]
+ def prereleases(self) -> bool:
+ # If there is an explicit prereleases set for this, then we'll just
+ # blindly use that.
+ if self._prereleases is not None:
+ return self._prereleases
+
+ # Look at all of our specifiers and determine if they are inclusive
+ # operators, and if they are if they are including an explicit
+ # prerelease.
+ operator, version = self._spec
+ if operator in ["==", ">=", "<=", "~=", "===", ">", "<"]:
+ # The == specifier can include a trailing .*, if it does we
+ # want to remove before parsing.
+ if operator == "==" and version.endswith(".*"):
+ version = version[:-2]
+
+ # Parse the version, and if it is a pre-release than this
+ # specifier allows pre-releases.
+ if Version(version).is_prerelease:
+ return True
+
+ return False
+
+ @prereleases.setter
+ def prereleases(self, value: bool) -> None:
+ self._prereleases = value
+
+ @property
+ def operator(self) -> str:
+ """The operator of this specifier.
+
+ >>> Specifier("==1.2.3").operator
+ '=='
+ """
+ return self._spec[0]
+
+ @property
+ def version(self) -> str:
+ """The version of this specifier.
+
+ >>> Specifier("==1.2.3").version
+ '1.2.3'
+ """
+ return self._spec[1]
+
+ def __repr__(self) -> str:
+ """A representation of the Specifier that shows all internal state.
+
+ >>> Specifier('>=1.0.0')
+ =1.0.0')>
+ >>> Specifier('>=1.0.0', prereleases=False)
+ =1.0.0', prereleases=False)>
+ >>> Specifier('>=1.0.0', prereleases=True)
+ =1.0.0', prereleases=True)>
+ """
+ pre = (
+ f", prereleases={self.prereleases!r}"
+ if self._prereleases is not None
+ else ""
+ )
+
+ return f"<{self.__class__.__name__}({str(self)!r}{pre})>"
+
+ def __str__(self) -> str:
+ """A string representation of the Specifier that can be round-tripped.
+
+ >>> str(Specifier('>=1.0.0'))
+ '>=1.0.0'
+ >>> str(Specifier('>=1.0.0', prereleases=False))
+ '>=1.0.0'
+ """
+ return "{}{}".format(*self._spec)
+
+ @property
+ def _canonical_spec(self) -> tuple[str, str]:
+ canonical_version = canonicalize_version(
+ self._spec[1],
+ strip_trailing_zero=(self._spec[0] != "~="),
+ )
+ return self._spec[0], canonical_version
+
+ def __hash__(self) -> int:
+ return hash(self._canonical_spec)
+
+ def __eq__(self, other: object) -> bool:
+ """Whether or not the two Specifier-like objects are equal.
+
+ :param other: The other object to check against.
+
+ The value of :attr:`prereleases` is ignored.
+
+ >>> Specifier("==1.2.3") == Specifier("== 1.2.3.0")
+ True
+ >>> (Specifier("==1.2.3", prereleases=False) ==
+ ... Specifier("==1.2.3", prereleases=True))
+ True
+ >>> Specifier("==1.2.3") == "==1.2.3"
+ True
+ >>> Specifier("==1.2.3") == Specifier("==1.2.4")
+ False
+ >>> Specifier("==1.2.3") == Specifier("~=1.2.3")
+ False
+ """
+ if isinstance(other, str):
+ try:
+ other = self.__class__(str(other))
+ except InvalidSpecifier:
+ return NotImplemented
+ elif not isinstance(other, self.__class__):
+ return NotImplemented
+
+ return self._canonical_spec == other._canonical_spec
+
+ def _get_operator(self, op: str) -> CallableOperator:
+ operator_callable: CallableOperator = getattr(
+ self, f"_compare_{self._operators[op]}"
+ )
+ return operator_callable
+
+ def _compare_compatible(self, prospective: Version, spec: str) -> bool:
# Compatible releases have an equivalent combination of >= and ==. That
# is that ~=2.2 is equivalent to >=2.2,==2.*. This allows us to
# implement this in terms of the other specifiers instead of
@@ -415,7 +374,7 @@ class Specifier(_IndividualSpecifier):
# We want everything but the last item in the version, but we want to
# ignore suffix segments.
- prefix = ".".join(
+ prefix = _version_join(
list(itertools.takewhile(_is_not_suffix, _version_split(spec)))[:-1]
)
@@ -426,34 +385,34 @@ class Specifier(_IndividualSpecifier):
prospective, prefix
)
- @_require_version_compare
- def _compare_equal(self, prospective: ParsedVersion, spec: str) -> bool:
-
+ def _compare_equal(self, prospective: Version, spec: str) -> bool:
# We need special logic to handle prefix matching
if spec.endswith(".*"):
# In the case of prefix matching we want to ignore local segment.
- prospective = Version(prospective.public)
- # Split the spec out by dots, and pretend that there is an implicit
- # dot in between a release segment and a pre-release segment.
- split_spec = _version_split(spec[:-2]) # Remove the trailing .*
+ normalized_prospective = canonicalize_version(
+ prospective.public, strip_trailing_zero=False
+ )
+ # Get the normalized version string ignoring the trailing .*
+ normalized_spec = canonicalize_version(spec[:-2], strip_trailing_zero=False)
+ # Split the spec out by bangs and dots, and pretend that there is
+ # an implicit dot in between a release segment and a pre-release segment.
+ split_spec = _version_split(normalized_spec)
- # Split the prospective version out by dots, and pretend that there
- # is an implicit dot in between a release segment and a pre-release
- # segment.
- split_prospective = _version_split(str(prospective))
+ # Split the prospective version out by bangs and dots, and pretend
+ # that there is an implicit dot in between a release segment and
+ # a pre-release segment.
+ split_prospective = _version_split(normalized_prospective)
+
+ # 0-pad the prospective version before shortening it to get the correct
+ # shortened version.
+ padded_prospective, _ = _pad_version(split_prospective, split_spec)
# Shorten the prospective version to be the same length as the spec
# so that we can determine if the specifier is a prefix of the
# prospective version or not.
- shortened_prospective = split_prospective[: len(split_spec)]
+ shortened_prospective = padded_prospective[: len(split_spec)]
- # Pad out our two sides with zeros so that they both equal the same
- # length.
- padded_spec, padded_prospective = _pad_version(
- split_spec, shortened_prospective
- )
-
- return padded_prospective == padded_spec
+ return shortened_prospective == split_spec
else:
# Convert our spec string into a Version
spec_version = Version(spec)
@@ -466,31 +425,22 @@ class Specifier(_IndividualSpecifier):
return prospective == spec_version
- @_require_version_compare
- def _compare_not_equal(self, prospective: ParsedVersion, spec: str) -> bool:
+ def _compare_not_equal(self, prospective: Version, spec: str) -> bool:
return not self._compare_equal(prospective, spec)
- @_require_version_compare
- def _compare_less_than_equal(self, prospective: ParsedVersion, spec: str) -> bool:
-
+ def _compare_less_than_equal(self, prospective: Version, spec: str) -> bool:
# NB: Local version identifiers are NOT permitted in the version
# specifier, so local version labels can be universally removed from
# the prospective version.
return Version(prospective.public) <= Version(spec)
- @_require_version_compare
- def _compare_greater_than_equal(
- self, prospective: ParsedVersion, spec: str
- ) -> bool:
-
+ def _compare_greater_than_equal(self, prospective: Version, spec: str) -> bool:
# NB: Local version identifiers are NOT permitted in the version
# specifier, so local version labels can be universally removed from
# the prospective version.
return Version(prospective.public) >= Version(spec)
- @_require_version_compare
- def _compare_less_than(self, prospective: ParsedVersion, spec_str: str) -> bool:
-
+ def _compare_less_than(self, prospective: Version, spec_str: str) -> bool:
# Convert our spec to a Version instance, since we'll want to work with
# it as a version.
spec = Version(spec_str)
@@ -514,9 +464,7 @@ class Specifier(_IndividualSpecifier):
# version in the spec.
return True
- @_require_version_compare
- def _compare_greater_than(self, prospective: ParsedVersion, spec_str: str) -> bool:
-
+ def _compare_greater_than(self, prospective: Version, spec_str: str) -> bool:
# Convert our spec to a Version instance, since we'll want to work with
# it as a version.
spec = Version(spec_str)
@@ -549,42 +497,150 @@ class Specifier(_IndividualSpecifier):
def _compare_arbitrary(self, prospective: Version, spec: str) -> bool:
return str(prospective).lower() == str(spec).lower()
- @property
- def prereleases(self) -> bool:
+ def __contains__(self, item: str | Version) -> bool:
+ """Return whether or not the item is contained in this specifier.
- # If there is an explicit prereleases set for this, then we'll just
- # blindly use that.
- if self._prereleases is not None:
- return self._prereleases
+ :param item: The item to check for.
- # Look at all of our specifiers and determine if they are inclusive
- # operators, and if they are if they are including an explicit
- # prerelease.
- operator, version = self._spec
- if operator in ["==", ">=", "<=", "~=", "==="]:
- # The == specifier can include a trailing .*, if it does we
- # want to remove before parsing.
- if operator == "==" and version.endswith(".*"):
- version = version[:-2]
+ This is used for the ``in`` operator and behaves the same as
+ :meth:`contains` with no ``prereleases`` argument passed.
- # Parse the version, and if it is a pre-release than this
- # specifier allows pre-releases.
- if parse(version).is_prerelease:
- return True
+ >>> "1.2.3" in Specifier(">=1.2.3")
+ True
+ >>> Version("1.2.3") in Specifier(">=1.2.3")
+ True
+ >>> "1.0.0" in Specifier(">=1.2.3")
+ False
+ >>> "1.3.0a1" in Specifier(">=1.2.3")
+ False
+ >>> "1.3.0a1" in Specifier(">=1.2.3", prereleases=True)
+ True
+ """
+ return self.contains(item)
- return False
+ def contains(self, item: UnparsedVersion, prereleases: bool | None = None) -> bool:
+ """Return whether or not the item is contained in this specifier.
- @prereleases.setter
- def prereleases(self, value: bool) -> None:
- self._prereleases = value
+ :param item:
+ The item to check for, which can be a version string or a
+ :class:`Version` instance.
+ :param prereleases:
+ Whether or not to match prereleases with this Specifier. If set to
+ ``None`` (the default), it uses :attr:`prereleases` to determine
+ whether or not prereleases are allowed.
+
+ >>> Specifier(">=1.2.3").contains("1.2.3")
+ True
+ >>> Specifier(">=1.2.3").contains(Version("1.2.3"))
+ True
+ >>> Specifier(">=1.2.3").contains("1.0.0")
+ False
+ >>> Specifier(">=1.2.3").contains("1.3.0a1")
+ False
+ >>> Specifier(">=1.2.3", prereleases=True).contains("1.3.0a1")
+ True
+ >>> Specifier(">=1.2.3").contains("1.3.0a1", prereleases=True)
+ True
+ """
+
+ # Determine if prereleases are to be allowed or not.
+ if prereleases is None:
+ prereleases = self.prereleases
+
+ # Normalize item to a Version, this allows us to have a shortcut for
+ # "2.0" in Specifier(">=2")
+ normalized_item = _coerce_version(item)
+
+ # Determine if we should be supporting prereleases in this specifier
+ # or not, if we do not support prereleases than we can short circuit
+ # logic if this version is a prereleases.
+ if normalized_item.is_prerelease and not prereleases:
+ return False
+
+ # Actually do the comparison to determine if this item is contained
+ # within this Specifier or not.
+ operator_callable: CallableOperator = self._get_operator(self.operator)
+ return operator_callable(normalized_item, self.version)
+
+ def filter(
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
+ """Filter items in the given iterable, that match the specifier.
+
+ :param iterable:
+ An iterable that can contain version strings and :class:`Version` instances.
+ The items in the iterable will be filtered according to the specifier.
+ :param prereleases:
+ Whether or not to allow prereleases in the returned iterator. If set to
+ ``None`` (the default), it will be intelligently decide whether to allow
+ prereleases or not (based on the :attr:`prereleases` attribute, and
+ whether the only versions matching are prereleases).
+
+ This method is smarter than just ``filter(Specifier().contains, [...])``
+ because it implements the rule from :pep:`440` that a prerelease item
+ SHOULD be accepted if no other versions match the given specifier.
+
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.2.3", "1.3", Version("1.4")]))
+ ['1.2.3', '1.3', ]
+ >>> list(Specifier(">=1.2.3").filter(["1.2", "1.5a1"]))
+ ['1.5a1']
+ >>> list(Specifier(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ >>> list(Specifier(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+ """
+
+ yielded = False
+ found_prereleases = []
+
+ kw = {"prereleases": prereleases if prereleases is not None else True}
+
+ # Attempt to iterate over all the values in the iterable and if any of
+ # them match, yield them.
+ for version in iterable:
+ parsed_version = _coerce_version(version)
+
+ if self.contains(parsed_version, **kw):
+ # If our version is a prerelease, and we were not set to allow
+ # prereleases, then we'll store it for later in case nothing
+ # else matches this specifier.
+ if parsed_version.is_prerelease and not (
+ prereleases or self.prereleases
+ ):
+ found_prereleases.append(version)
+ # Either this is not a prerelease, or we should have been
+ # accepting prereleases from the beginning.
+ else:
+ yielded = True
+ yield version
+
+ # Now that we've iterated over everything, determine if we've yielded
+ # any values, and if we have not and we have any prereleases stored up
+ # then we will go ahead and yield the prereleases.
+ if not yielded and found_prereleases:
+ for version in found_prereleases:
+ yield version
_prefix_regex = re.compile(r"^([0-9]+)((?:a|b|c|rc)[0-9]+)$")
-def _version_split(version: str) -> List[str]:
- result: List[str] = []
- for item in version.split("."):
+def _version_split(version: str) -> list[str]:
+ """Split version into components.
+
+ The split components are intended for version comparison. The logic does
+ not attempt to retain the original version string, so joining the
+ components back with :func:`_version_join` may not produce the original
+ version string.
+ """
+ result: list[str] = []
+
+ epoch, _, rest = version.rpartition("!")
+ result.append(epoch or "0")
+
+ for item in rest.split("."):
match = _prefix_regex.search(item)
if match:
result.extend(match.groups())
@@ -593,13 +649,24 @@ def _version_split(version: str) -> List[str]:
return result
+def _version_join(components: list[str]) -> str:
+ """Join split version components into a version string.
+
+ This function assumes the input came from :func:`_version_split`, where the
+ first component must be the epoch (either empty or numeric), and all other
+ components numeric.
+ """
+ epoch, *rest = components
+ return f"{epoch}!{'.'.join(rest)}"
+
+
def _is_not_suffix(segment: str) -> bool:
return not any(
segment.startswith(prefix) for prefix in ("dev", "a", "b", "rc", "post")
)
-def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str]]:
+def _pad_version(left: list[str], right: list[str]) -> tuple[list[str], list[str]]:
left_split, right_split = [], []
# Get the release segment of our versions
@@ -614,89 +681,59 @@ def _pad_version(left: List[str], right: List[str]) -> Tuple[List[str], List[str
left_split.insert(1, ["0"] * max(0, len(right_split[0]) - len(left_split[0])))
right_split.insert(1, ["0"] * max(0, len(left_split[0]) - len(right_split[0])))
- return (list(itertools.chain(*left_split)), list(itertools.chain(*right_split)))
+ return (
+ list(itertools.chain.from_iterable(left_split)),
+ list(itertools.chain.from_iterable(right_split)),
+ )
class SpecifierSet(BaseSpecifier):
+ """This class abstracts handling of a set of version specifiers.
+
+ It can be passed a single specifier (``>=3.0``), a comma-separated list of
+ specifiers (``>=3.0,!=3.1``), or no specifier at all.
+ """
+
def __init__(
- self, specifiers: str = "", prereleases: Optional[bool] = None
+ self,
+ specifiers: str | Iterable[Specifier] = "",
+ prereleases: bool | None = None,
) -> None:
+ """Initialize a SpecifierSet instance.
- # Split on , to break each individual specifier into it's own item, and
- # strip each item to remove leading/trailing whitespace.
- split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
+ :param specifiers:
+ The string representation of a specifier or a comma-separated list of
+ specifiers which will be parsed and normalized before use.
+ May also be an iterable of ``Specifier`` instances, which will be used
+ as is.
+ :param prereleases:
+ This tells the SpecifierSet if it should accept prerelease versions if
+ applicable or not. The default of ``None`` will autodetect it from the
+ given specifiers.
- # Parsed each individual specifier, attempting first to make it a
- # Specifier and falling back to a LegacySpecifier.
- parsed: Set[_IndividualSpecifier] = set()
- for specifier in split_specifiers:
- try:
- parsed.add(Specifier(specifier))
- except InvalidSpecifier:
- parsed.add(LegacySpecifier(specifier))
+ :raises InvalidSpecifier:
+ If the given ``specifiers`` are not parseable than this exception will be
+ raised.
+ """
- # Turn our parsed specifiers into a frozen set and save them for later.
- self._specs = frozenset(parsed)
+ if isinstance(specifiers, str):
+ # Split on `,` to break each individual specifier into its own item, and
+ # strip each item to remove leading/trailing whitespace.
+ split_specifiers = [s.strip() for s in specifiers.split(",") if s.strip()]
+
+ # Make each individual specifier a Specifier and save in a frozen set
+ # for later.
+ self._specs = frozenset(map(Specifier, split_specifiers))
+ else:
+ # Save the supplied specifiers in a frozen set.
+ self._specs = frozenset(specifiers)
# Store our prereleases value so we can use it later to determine if
# we accept prereleases or not.
self._prereleases = prereleases
- def __repr__(self) -> str:
- pre = (
- f", prereleases={self.prereleases!r}"
- if self._prereleases is not None
- else ""
- )
-
- return f""
-
- def __str__(self) -> str:
- return ",".join(sorted(str(s) for s in self._specs))
-
- def __hash__(self) -> int:
- return hash(self._specs)
-
- def __and__(self, other: Union["SpecifierSet", str]) -> "SpecifierSet":
- if isinstance(other, str):
- other = SpecifierSet(other)
- elif not isinstance(other, SpecifierSet):
- return NotImplemented
-
- specifier = SpecifierSet()
- specifier._specs = frozenset(self._specs | other._specs)
-
- if self._prereleases is None and other._prereleases is not None:
- specifier._prereleases = other._prereleases
- elif self._prereleases is not None and other._prereleases is None:
- specifier._prereleases = self._prereleases
- elif self._prereleases == other._prereleases:
- specifier._prereleases = self._prereleases
- else:
- raise ValueError(
- "Cannot combine SpecifierSets with True and False prerelease "
- "overrides."
- )
-
- return specifier
-
- def __eq__(self, other: object) -> bool:
- if isinstance(other, (str, _IndividualSpecifier)):
- other = SpecifierSet(str(other))
- elif not isinstance(other, SpecifierSet):
- return NotImplemented
-
- return self._specs == other._specs
-
- def __len__(self) -> int:
- return len(self._specs)
-
- def __iter__(self) -> Iterator[_IndividualSpecifier]:
- return iter(self._specs)
-
@property
- def prereleases(self) -> Optional[bool]:
-
+ def prereleases(self) -> bool | None:
# If we have been given an explicit prerelease modifier, then we'll
# pass that through here.
if self._prereleases is not None:
@@ -716,16 +753,167 @@ class SpecifierSet(BaseSpecifier):
def prereleases(self, value: bool) -> None:
self._prereleases = value
+ def __repr__(self) -> str:
+ """A representation of the specifier set that shows all internal state.
+
+ Note that the ordering of the individual specifiers within the set may not
+ match the input string.
+
+ >>> SpecifierSet('>=1.0.0,!=2.0.0')
+ =1.0.0')>
+ >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=False)
+ =1.0.0', prereleases=False)>
+ >>> SpecifierSet('>=1.0.0,!=2.0.0', prereleases=True)
+ =1.0.0', prereleases=True)>
+ """
+ pre = (
+ f", prereleases={self.prereleases!r}"
+ if self._prereleases is not None
+ else ""
+ )
+
+ return f""
+
+ def __str__(self) -> str:
+ """A string representation of the specifier set that can be round-tripped.
+
+ Note that the ordering of the individual specifiers within the set may not
+ match the input string.
+
+ >>> str(SpecifierSet(">=1.0.0,!=1.0.1"))
+ '!=1.0.1,>=1.0.0'
+ >>> str(SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False))
+ '!=1.0.1,>=1.0.0'
+ """
+ return ",".join(sorted(str(s) for s in self._specs))
+
+ def __hash__(self) -> int:
+ return hash(self._specs)
+
+ def __and__(self, other: SpecifierSet | str) -> SpecifierSet:
+ """Return a SpecifierSet which is a combination of the two sets.
+
+ :param other: The other object to combine with.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") & '<=2.0.0,!=2.0.1'
+ =1.0.0')>
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") & SpecifierSet('<=2.0.0,!=2.0.1')
+ =1.0.0')>
+ """
+ if isinstance(other, str):
+ other = SpecifierSet(other)
+ elif not isinstance(other, SpecifierSet):
+ return NotImplemented
+
+ specifier = SpecifierSet()
+ specifier._specs = frozenset(self._specs | other._specs)
+
+ if self._prereleases is None and other._prereleases is not None:
+ specifier._prereleases = other._prereleases
+ elif self._prereleases is not None and other._prereleases is None:
+ specifier._prereleases = self._prereleases
+ elif self._prereleases == other._prereleases:
+ specifier._prereleases = self._prereleases
+ else:
+ raise ValueError(
+ "Cannot combine SpecifierSets with True and False prerelease overrides."
+ )
+
+ return specifier
+
+ def __eq__(self, other: object) -> bool:
+ """Whether or not the two SpecifierSet-like objects are equal.
+
+ :param other: The other object to check against.
+
+ The value of :attr:`prereleases` is ignored.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> (SpecifierSet(">=1.0.0,!=1.0.1", prereleases=False) ==
+ ... SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True))
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == ">=1.0.0,!=1.0.1"
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1") == SpecifierSet(">=1.0.0,!=1.0.2")
+ False
+ """
+ if isinstance(other, (str, Specifier)):
+ other = SpecifierSet(str(other))
+ elif not isinstance(other, SpecifierSet):
+ return NotImplemented
+
+ return self._specs == other._specs
+
+ def __len__(self) -> int:
+ """Returns the number of specifiers in this specifier set."""
+ return len(self._specs)
+
+ def __iter__(self) -> Iterator[Specifier]:
+ """
+ Returns an iterator over all the underlying :class:`Specifier` instances
+ in this specifier set.
+
+ >>> sorted(SpecifierSet(">=1.0.0,!=1.0.1"), key=str)
+ [, =1.0.0')>]
+ """
+ return iter(self._specs)
+
def __contains__(self, item: UnparsedVersion) -> bool:
+ """Return whether or not the item is contained in this specifier.
+
+ :param item: The item to check for.
+
+ This is used for the ``in`` operator and behaves the same as
+ :meth:`contains` with no ``prereleases`` argument passed.
+
+ >>> "1.2.3" in SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> Version("1.2.3") in SpecifierSet(">=1.0.0,!=1.0.1")
+ True
+ >>> "1.0.1" in SpecifierSet(">=1.0.0,!=1.0.1")
+ False
+ >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1")
+ False
+ >>> "1.3.0a1" in SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True)
+ True
+ """
return self.contains(item)
def contains(
- self, item: UnparsedVersion, prereleases: Optional[bool] = None
+ self,
+ item: UnparsedVersion,
+ prereleases: bool | None = None,
+ installed: bool | None = None,
) -> bool:
+ """Return whether or not the item is contained in this SpecifierSet.
- # Ensure that our item is a Version or LegacyVersion instance.
- if not isinstance(item, (LegacyVersion, Version)):
- item = parse(item)
+ :param item:
+ The item to check for, which can be a version string or a
+ :class:`Version` instance.
+ :param prereleases:
+ Whether or not to match prereleases with this SpecifierSet. If set to
+ ``None`` (the default), it uses :attr:`prereleases` to determine
+ whether or not prereleases are allowed.
+
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.2.3")
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains(Version("1.2.3"))
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.0.1")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1")
+ False
+ >>> SpecifierSet(">=1.0.0,!=1.0.1", prereleases=True).contains("1.3.0a1")
+ True
+ >>> SpecifierSet(">=1.0.0,!=1.0.1").contains("1.3.0a1", prereleases=True)
+ True
+ """
+ # Ensure that our item is a Version instance.
+ if not isinstance(item, Version):
+ item = Version(item)
# Determine if we're forcing a prerelease or not, if we're not forcing
# one for this particular filter call, then we'll use whatever the
@@ -742,6 +930,9 @@ class SpecifierSet(BaseSpecifier):
if not prereleases and item.is_prerelease:
return False
+ if installed and item.is_prerelease:
+ item = Version(item.base_version)
+
# We simply dispatch to the underlying specs here to make sure that the
# given version is contained within all of them.
# Note: This use of all() here means that an empty set of specifiers
@@ -749,9 +940,46 @@ class SpecifierSet(BaseSpecifier):
return all(s.contains(item, prereleases=prereleases) for s in self._specs)
def filter(
- self, iterable: Iterable[VersionTypeVar], prereleases: Optional[bool] = None
- ) -> Iterable[VersionTypeVar]:
+ self, iterable: Iterable[UnparsedVersionVar], prereleases: bool | None = None
+ ) -> Iterator[UnparsedVersionVar]:
+ """Filter items in the given iterable, that match the specifiers in this set.
+ :param iterable:
+ An iterable that can contain version strings and :class:`Version` instances.
+ The items in the iterable will be filtered according to the specifier.
+ :param prereleases:
+ Whether or not to allow prereleases in the returned iterator. If set to
+ ``None`` (the default), it will be intelligently decide whether to allow
+ prereleases or not (based on the :attr:`prereleases` attribute, and
+ whether the only versions matching are prereleases).
+
+ This method is smarter than just ``filter(SpecifierSet(...).contains, [...])``
+ because it implements the rule from :pep:`440` that a prerelease item
+ SHOULD be accepted if no other versions match the given specifier.
+
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.3", Version("1.4")]))
+ ['1.3', ]
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.2", "1.5a1"]))
+ []
+ >>> list(SpecifierSet(">=1.2.3").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ >>> list(SpecifierSet(">=1.2.3", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+
+ An "empty" SpecifierSet will filter items based on the presence of prerelease
+ versions in the set.
+
+ >>> list(SpecifierSet("").filter(["1.3", "1.5a1"]))
+ ['1.3']
+ >>> list(SpecifierSet("").filter(["1.5a1"]))
+ ['1.5a1']
+ >>> list(SpecifierSet("", prereleases=True).filter(["1.3", "1.5a1"]))
+ ['1.3', '1.5a1']
+ >>> list(SpecifierSet("").filter(["1.3", "1.5a1"], prereleases=True))
+ ['1.3', '1.5a1']
+ """
# Determine if we're forcing a prerelease or not, if we're not forcing
# one for this particular filter call, then we'll use whatever the
# SpecifierSet thinks for whether or not we should support prereleases.
@@ -764,27 +992,16 @@ class SpecifierSet(BaseSpecifier):
if self._specs:
for spec in self._specs:
iterable = spec.filter(iterable, prereleases=bool(prereleases))
- return iterable
+ return iter(iterable)
# If we do not have any specifiers, then we need to have a rough filter
# which will filter out any pre-releases, unless there are no final
- # releases, and which will filter out LegacyVersion in general.
+ # releases.
else:
- filtered: List[VersionTypeVar] = []
- found_prereleases: List[VersionTypeVar] = []
-
- item: UnparsedVersion
- parsed_version: Union[Version, LegacyVersion]
+ filtered: list[UnparsedVersionVar] = []
+ found_prereleases: list[UnparsedVersionVar] = []
for item in iterable:
- # Ensure that we some kind of Version class for this item.
- if not isinstance(item, (LegacyVersion, Version)):
- parsed_version = parse(item)
- else:
- parsed_version = item
-
- # Filter out any item which is parsed as a LegacyVersion
- if isinstance(parsed_version, LegacyVersion):
- continue
+ parsed_version = _coerce_version(item)
# Store any item which is a pre-release for later unless we've
# already found a final version or we are accepting prereleases
@@ -797,6 +1014,6 @@ class SpecifierSet(BaseSpecifier):
# If we've found no items except for pre-releases, then we'll go
# ahead and use the pre-releases
if not filtered and found_prereleases and prereleases is None:
- return found_prereleases
+ return iter(found_prereleases)
- return filtered
+ return iter(filtered)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py
index 9a3d25a7..8522f59c 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py
@@ -2,21 +2,21 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
import logging
import platform
+import re
+import struct
+import subprocess
import sys
import sysconfig
from importlib.machinery import EXTENSION_SUFFIXES
from typing import (
- Dict,
- FrozenSet,
Iterable,
Iterator,
- List,
- Optional,
Sequence,
Tuple,
- Union,
cast,
)
@@ -25,9 +25,9 @@ from . import _manylinux, _musllinux
logger = logging.getLogger(__name__)
PythonVersion = Sequence[int]
-MacVersion = Tuple[int, int]
+AppleVersion = Tuple[int, int]
-INTERPRETER_SHORT_NAMES: Dict[str, str] = {
+INTERPRETER_SHORT_NAMES: dict[str, str] = {
"python": "py", # Generic.
"cpython": "cp",
"pypy": "pp",
@@ -36,7 +36,7 @@ INTERPRETER_SHORT_NAMES: Dict[str, str] = {
}
-_32_BIT_INTERPRETER = sys.maxsize <= 2 ** 32
+_32_BIT_INTERPRETER = struct.calcsize("P") == 4
class Tag:
@@ -47,7 +47,7 @@ class Tag:
is also supported.
"""
- __slots__ = ["_interpreter", "_abi", "_platform", "_hash"]
+ __slots__ = ["_abi", "_hash", "_interpreter", "_platform"]
def __init__(self, interpreter: str, abi: str, platform: str) -> None:
self._interpreter = interpreter.lower()
@@ -93,7 +93,7 @@ class Tag:
return f"<{self} @ {id(self)}>"
-def parse_tag(tag: str) -> FrozenSet[Tag]:
+def parse_tag(tag: str) -> frozenset[Tag]:
"""
Parses the provided tag (e.g. `py3-none-any`) into a frozenset of Tag instances.
@@ -109,8 +109,8 @@ def parse_tag(tag: str) -> FrozenSet[Tag]:
return frozenset(tags)
-def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]:
- value = sysconfig.get_config_var(name)
+def _get_config_var(name: str, warn: bool = False) -> int | str | None:
+ value: int | str | None = sysconfig.get_config_var(name)
if value is None and warn:
logger.debug(
"Config variable '%s' is unset, Python ABI tag may be incorrect", name
@@ -119,23 +119,40 @@ def _get_config_var(name: str, warn: bool = False) -> Union[int, str, None]:
def _normalize_string(string: str) -> str:
- return string.replace(".", "_").replace("-", "_")
+ return string.replace(".", "_").replace("-", "_").replace(" ", "_")
-def _abi3_applies(python_version: PythonVersion) -> bool:
+def _is_threaded_cpython(abis: list[str]) -> bool:
+ """
+ Determine if the ABI corresponds to a threaded (`--disable-gil`) build.
+
+ The threaded builds are indicated by a "t" in the abiflags.
+ """
+ if len(abis) == 0:
+ return False
+ # expect e.g., cp313
+ m = re.match(r"cp\d+(.*)", abis[0])
+ if not m:
+ return False
+ abiflags = m.group(1)
+ return "t" in abiflags
+
+
+def _abi3_applies(python_version: PythonVersion, threading: bool) -> bool:
"""
Determine if the Python version supports abi3.
- PEP 384 was first implemented in Python 3.2.
+ PEP 384 was first implemented in Python 3.2. The threaded (`--disable-gil`)
+ builds do not support abi3.
"""
- return len(python_version) > 1 and tuple(python_version) >= (3, 2)
+ return len(python_version) > 1 and tuple(python_version) >= (3, 2) and not threading
-def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
+def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> list[str]:
py_version = tuple(py_version) # To allow for version comparison.
abis = []
version = _version_nodot(py_version[:2])
- debug = pymalloc = ucs4 = ""
+ threading = debug = pymalloc = ucs4 = ""
with_debug = _get_config_var("Py_DEBUG", warn)
has_refcount = hasattr(sys, "gettotalrefcount")
# Windows doesn't set Py_DEBUG, so checking for support of debug-compiled
@@ -144,6 +161,8 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
has_ext = "_d.pyd" in EXTENSION_SUFFIXES
if with_debug or (with_debug is None and (has_refcount or has_ext)):
debug = "d"
+ if py_version >= (3, 13) and _get_config_var("Py_GIL_DISABLED", warn):
+ threading = "t"
if py_version < (3, 8):
with_pymalloc = _get_config_var("WITH_PYMALLOC", warn)
if with_pymalloc or with_pymalloc is None:
@@ -157,20 +176,15 @@ def _cpython_abis(py_version: PythonVersion, warn: bool = False) -> List[str]:
elif debug:
# Debug builds can also load "normal" extension modules.
# We can also assume no UCS-4 or pymalloc requirement.
- abis.append(f"cp{version}")
- abis.insert(
- 0,
- "cp{version}{debug}{pymalloc}{ucs4}".format(
- version=version, debug=debug, pymalloc=pymalloc, ucs4=ucs4
- ),
- )
+ abis.append(f"cp{version}{threading}")
+ abis.insert(0, f"cp{version}{threading}{debug}{pymalloc}{ucs4}")
return abis
def cpython_tags(
- python_version: Optional[PythonVersion] = None,
- abis: Optional[Iterable[str]] = None,
- platforms: Optional[Iterable[str]] = None,
+ python_version: PythonVersion | None = None,
+ abis: Iterable[str] | None = None,
+ platforms: Iterable[str] | None = None,
*,
warn: bool = False,
) -> Iterator[Tag]:
@@ -211,29 +225,66 @@ def cpython_tags(
for abi in abis:
for platform_ in platforms:
yield Tag(interpreter, abi, platform_)
- if _abi3_applies(python_version):
+
+ threading = _is_threaded_cpython(abis)
+ use_abi3 = _abi3_applies(python_version, threading)
+ if use_abi3:
yield from (Tag(interpreter, "abi3", platform_) for platform_ in platforms)
yield from (Tag(interpreter, "none", platform_) for platform_ in platforms)
- if _abi3_applies(python_version):
+ if use_abi3:
for minor_version in range(python_version[1] - 1, 1, -1):
for platform_ in platforms:
- interpreter = "cp{version}".format(
- version=_version_nodot((python_version[0], minor_version))
- )
+ version = _version_nodot((python_version[0], minor_version))
+ interpreter = f"cp{version}"
yield Tag(interpreter, "abi3", platform_)
-def _generic_abi() -> Iterator[str]:
- abi = sysconfig.get_config_var("SOABI")
- if abi:
- yield _normalize_string(abi)
+def _generic_abi() -> list[str]:
+ """
+ Return the ABI tag based on EXT_SUFFIX.
+ """
+ # The following are examples of `EXT_SUFFIX`.
+ # We want to keep the parts which are related to the ABI and remove the
+ # parts which are related to the platform:
+ # - linux: '.cpython-310-x86_64-linux-gnu.so' => cp310
+ # - mac: '.cpython-310-darwin.so' => cp310
+ # - win: '.cp310-win_amd64.pyd' => cp310
+ # - win: '.pyd' => cp37 (uses _cpython_abis())
+ # - pypy: '.pypy38-pp73-x86_64-linux-gnu.so' => pypy38_pp73
+ # - graalpy: '.graalpy-38-native-x86_64-darwin.dylib'
+ # => graalpy_38_native
+
+ ext_suffix = _get_config_var("EXT_SUFFIX", warn=True)
+ if not isinstance(ext_suffix, str) or ext_suffix[0] != ".":
+ raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')")
+ parts = ext_suffix.split(".")
+ if len(parts) < 3:
+ # CPython3.7 and earlier uses ".pyd" on Windows.
+ return _cpython_abis(sys.version_info[:2])
+ soabi = parts[1]
+ if soabi.startswith("cpython"):
+ # non-windows
+ abi = "cp" + soabi.split("-")[1]
+ elif soabi.startswith("cp"):
+ # windows
+ abi = soabi.split("-")[0]
+ elif soabi.startswith("pypy"):
+ abi = "-".join(soabi.split("-")[:2])
+ elif soabi.startswith("graalpy"):
+ abi = "-".join(soabi.split("-")[:3])
+ elif soabi:
+ # pyston, ironpython, others?
+ abi = soabi
+ else:
+ return []
+ return [_normalize_string(abi)]
def generic_tags(
- interpreter: Optional[str] = None,
- abis: Optional[Iterable[str]] = None,
- platforms: Optional[Iterable[str]] = None,
+ interpreter: str | None = None,
+ abis: Iterable[str] | None = None,
+ platforms: Iterable[str] | None = None,
*,
warn: bool = False,
) -> Iterator[Tag]:
@@ -251,8 +302,9 @@ def generic_tags(
interpreter = "".join([interp_name, interp_version])
if abis is None:
abis = _generic_abi()
+ else:
+ abis = list(abis)
platforms = list(platforms or platform_tags())
- abis = list(abis)
if "none" not in abis:
abis.append("none")
for abi in abis:
@@ -276,9 +328,9 @@ def _py_interpreter_range(py_version: PythonVersion) -> Iterator[str]:
def compatible_tags(
- python_version: Optional[PythonVersion] = None,
- interpreter: Optional[str] = None,
- platforms: Optional[Iterable[str]] = None,
+ python_version: PythonVersion | None = None,
+ interpreter: str | None = None,
+ platforms: Iterable[str] | None = None,
) -> Iterator[Tag]:
"""
Yields the sequence of tags that are compatible with a specific version of Python.
@@ -310,7 +362,7 @@ def _mac_arch(arch: str, is_32bit: bool = _32_BIT_INTERPRETER) -> str:
return "i386"
-def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]:
+def _mac_binary_formats(version: AppleVersion, cpu_arch: str) -> list[str]:
formats = [cpu_arch]
if cpu_arch == "x86_64":
if version < (10, 4):
@@ -343,7 +395,7 @@ def _mac_binary_formats(version: MacVersion, cpu_arch: str) -> List[str]:
def mac_platforms(
- version: Optional[MacVersion] = None, arch: Optional[str] = None
+ version: AppleVersion | None = None, arch: str | None = None
) -> Iterator[str]:
"""
Yields the platform tags for a macOS system.
@@ -355,7 +407,23 @@ def mac_platforms(
"""
version_str, _, cpu_arch = platform.mac_ver()
if version is None:
- version = cast("MacVersion", tuple(map(int, version_str.split(".")[:2])))
+ version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2])))
+ if version == (10, 16):
+ # When built against an older macOS SDK, Python will report macOS 10.16
+ # instead of the real version.
+ version_str = subprocess.run(
+ [
+ sys.executable,
+ "-sS",
+ "-c",
+ "import platform; print(platform.mac_ver()[0])",
+ ],
+ check=True,
+ env={"SYSTEM_VERSION_COMPAT": "0"},
+ stdout=subprocess.PIPE,
+ text=True,
+ ).stdout
+ version = cast("AppleVersion", tuple(map(int, version_str.split(".")[:2])))
else:
version = version
if arch is None:
@@ -366,24 +434,22 @@ def mac_platforms(
if (10, 0) <= version and version < (11, 0):
# Prior to Mac OS 11, each yearly release of Mac OS bumped the
# "minor" version number. The major version was always 10.
+ major_version = 10
for minor_version in range(version[1], -1, -1):
- compat_version = 10, minor_version
+ compat_version = major_version, minor_version
binary_formats = _mac_binary_formats(compat_version, arch)
for binary_format in binary_formats:
- yield "macosx_{major}_{minor}_{binary_format}".format(
- major=10, minor=minor_version, binary_format=binary_format
- )
+ yield f"macosx_{major_version}_{minor_version}_{binary_format}"
if version >= (11, 0):
# Starting with Mac OS 11, each yearly release bumps the major version
# number. The minor versions are now the midyear updates.
+ minor_version = 0
for major_version in range(version[0], 10, -1):
- compat_version = major_version, 0
+ compat_version = major_version, minor_version
binary_formats = _mac_binary_formats(compat_version, arch)
for binary_format in binary_formats:
- yield "macosx_{major}_{minor}_{binary_format}".format(
- major=major_version, minor=0, binary_format=binary_format
- )
+ yield f"macosx_{major_version}_{minor_version}_{binary_format}"
if version >= (11, 0):
# Mac OS 11 on x86_64 is compatible with binaries from previous releases.
@@ -393,38 +459,131 @@ def mac_platforms(
# However, the "universal2" binary format can have a
# macOS version earlier than 11.0 when the x86_64 part of the binary supports
# that version of macOS.
+ major_version = 10
if arch == "x86_64":
for minor_version in range(16, 3, -1):
- compat_version = 10, minor_version
+ compat_version = major_version, minor_version
binary_formats = _mac_binary_formats(compat_version, arch)
for binary_format in binary_formats:
- yield "macosx_{major}_{minor}_{binary_format}".format(
- major=compat_version[0],
- minor=compat_version[1],
- binary_format=binary_format,
- )
+ yield f"macosx_{major_version}_{minor_version}_{binary_format}"
else:
for minor_version in range(16, 3, -1):
- compat_version = 10, minor_version
+ compat_version = major_version, minor_version
binary_format = "universal2"
- yield "macosx_{major}_{minor}_{binary_format}".format(
- major=compat_version[0],
- minor=compat_version[1],
- binary_format=binary_format,
- )
+ yield f"macosx_{major_version}_{minor_version}_{binary_format}"
+
+
+def ios_platforms(
+ version: AppleVersion | None = None, multiarch: str | None = None
+) -> Iterator[str]:
+ """
+ Yields the platform tags for an iOS system.
+
+ :param version: A two-item tuple specifying the iOS version to generate
+ platform tags for. Defaults to the current iOS version.
+ :param multiarch: The CPU architecture+ABI to generate platform tags for -
+ (the value used by `sys.implementation._multiarch` e.g.,
+ `arm64_iphoneos` or `x84_64_iphonesimulator`). Defaults to the current
+ multiarch value.
+ """
+ if version is None:
+ # if iOS is the current platform, ios_ver *must* be defined. However,
+ # it won't exist for CPython versions before 3.13, which causes a mypy
+ # error.
+ _, release, _, _ = platform.ios_ver() # type: ignore[attr-defined, unused-ignore]
+ version = cast("AppleVersion", tuple(map(int, release.split(".")[:2])))
+
+ if multiarch is None:
+ multiarch = sys.implementation._multiarch
+ multiarch = multiarch.replace("-", "_")
+
+ ios_platform_template = "ios_{major}_{minor}_{multiarch}"
+
+ # Consider any iOS major.minor version from the version requested, down to
+ # 12.0. 12.0 is the first iOS version that is known to have enough features
+ # to support CPython. Consider every possible minor release up to X.9. There
+ # highest the minor has ever gone is 8 (14.8 and 15.8) but having some extra
+ # candidates that won't ever match doesn't really hurt, and it saves us from
+ # having to keep an explicit list of known iOS versions in the code. Return
+ # the results descending order of version number.
+
+ # If the requested major version is less than 12, there won't be any matches.
+ if version[0] < 12:
+ return
+
+ # Consider the actual X.Y version that was requested.
+ yield ios_platform_template.format(
+ major=version[0], minor=version[1], multiarch=multiarch
+ )
+
+ # Consider every minor version from X.0 to the minor version prior to the
+ # version requested by the platform.
+ for minor in range(version[1] - 1, -1, -1):
+ yield ios_platform_template.format(
+ major=version[0], minor=minor, multiarch=multiarch
+ )
+
+ for major in range(version[0] - 1, 11, -1):
+ for minor in range(9, -1, -1):
+ yield ios_platform_template.format(
+ major=major, minor=minor, multiarch=multiarch
+ )
+
+
+def android_platforms(
+ api_level: int | None = None, abi: str | None = None
+) -> Iterator[str]:
+ """
+ Yields the :attr:`~Tag.platform` tags for Android. If this function is invoked on
+ non-Android platforms, the ``api_level`` and ``abi`` arguments are required.
+
+ :param int api_level: The maximum `API level
+ `__ to return. Defaults
+ to the current system's version, as returned by ``platform.android_ver``.
+ :param str abi: The `Android ABI `__,
+ e.g. ``arm64_v8a``. Defaults to the current system's ABI , as returned by
+ ``sysconfig.get_platform``. Hyphens and periods will be replaced with
+ underscores.
+ """
+ if platform.system() != "Android" and (api_level is None or abi is None):
+ raise TypeError(
+ "on non-Android platforms, the api_level and abi arguments are required"
+ )
+
+ if api_level is None:
+ # Python 3.13 was the first version to return platform.system() == "Android",
+ # and also the first version to define platform.android_ver().
+ api_level = platform.android_ver().api_level # type: ignore[attr-defined]
+
+ if abi is None:
+ abi = sysconfig.get_platform().split("-")[-1]
+ abi = _normalize_string(abi)
+
+ # 16 is the minimum API level known to have enough features to support CPython
+ # without major patching. Yield every API level from the maximum down to the
+ # minimum, inclusive.
+ min_api_level = 16
+ for ver in range(api_level, min_api_level - 1, -1):
+ yield f"android_{ver}_{abi}"
def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]:
linux = _normalize_string(sysconfig.get_platform())
+ if not linux.startswith("linux_"):
+ # we should never be here, just yield the sysconfig one and return
+ yield linux
+ return
if is_32bit:
if linux == "linux_x86_64":
linux = "linux_i686"
elif linux == "linux_aarch64":
- linux = "linux_armv7l"
+ linux = "linux_armv8l"
_, arch = linux.split("_", 1)
- yield from _manylinux.platform_tags(linux, arch)
- yield from _musllinux.platform_tags(arch)
- yield linux
+ archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch])
+ yield from _manylinux.platform_tags(archs)
+ yield from _musllinux.platform_tags(archs)
+ for arch in archs:
+ yield f"linux_{arch}"
def _generic_platforms() -> Iterator[str]:
@@ -437,6 +596,10 @@ def platform_tags() -> Iterator[str]:
"""
if platform.system() == "Darwin":
return mac_platforms()
+ elif platform.system() == "iOS":
+ return ios_platforms()
+ elif platform.system() == "Android":
+ return android_platforms()
elif platform.system() == "Linux":
return _linux_platforms()
else:
@@ -446,6 +609,9 @@ def platform_tags() -> Iterator[str]:
def interpreter_name() -> str:
"""
Returns the name of the running interpreter.
+
+ Some implementations have a reserved, two-letter abbreviation which will
+ be returned when appropriate.
"""
name = sys.implementation.name
return INTERPRETER_SHORT_NAMES.get(name) or name
@@ -482,6 +648,9 @@ def sys_tags(*, warn: bool = False) -> Iterator[Tag]:
yield from generic_tags()
if interp_name == "pp":
- yield from compatible_tags(interpreter="pp3")
+ interp = "pp3"
+ elif interp_name == "cp":
+ interp = "cp" + interpreter_version(warn=warn)
else:
- yield from compatible_tags()
+ interp = None
+ yield from compatible_tags(interpreter=interp)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py
index bab11b80..23450953 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py
@@ -2,16 +2,25 @@
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+from __future__ import annotations
+
+import functools
import re
-from typing import FrozenSet, NewType, Tuple, Union, cast
+from typing import NewType, Tuple, Union, cast
from .tags import Tag, parse_tag
-from .version import InvalidVersion, Version
+from .version import InvalidVersion, Version, _TrimmedRelease
BuildTag = Union[Tuple[()], Tuple[int, str]]
NormalizedName = NewType("NormalizedName", str)
+class InvalidName(ValueError):
+ """
+ An invalid distribution name; users should refer to the packaging user guide.
+ """
+
+
class InvalidWheelFilename(ValueError):
"""
An invalid wheel filename was found, users should refer to PEP 427.
@@ -24,88 +33,99 @@ class InvalidSdistFilename(ValueError):
"""
+# Core metadata spec for `Name`
+_validate_regex = re.compile(
+ r"^([A-Z0-9]|[A-Z0-9][A-Z0-9._-]*[A-Z0-9])$", re.IGNORECASE
+)
_canonicalize_regex = re.compile(r"[-_.]+")
+_normalized_regex = re.compile(r"^([a-z0-9]|[a-z0-9]([a-z0-9-](?!--))*[a-z0-9])$")
# PEP 427: The build number must start with a digit.
_build_tag_regex = re.compile(r"(\d+)(.*)")
-def canonicalize_name(name: str) -> NormalizedName:
+def canonicalize_name(name: str, *, validate: bool = False) -> NormalizedName:
+ if validate and not _validate_regex.match(name):
+ raise InvalidName(f"name is invalid: {name!r}")
# This is taken from PEP 503.
value = _canonicalize_regex.sub("-", name).lower()
return cast(NormalizedName, value)
-def canonicalize_version(version: Union[Version, str]) -> str:
+def is_normalized_name(name: str) -> bool:
+ return _normalized_regex.match(name) is not None
+
+
+@functools.singledispatch
+def canonicalize_version(
+ version: Version | str, *, strip_trailing_zero: bool = True
+) -> str:
"""
- This is very similar to Version.__str__, but has one subtle difference
- with the way it handles the release segment.
+ Return a canonical form of a version as a string.
+
+ >>> canonicalize_version('1.0.1')
+ '1.0.1'
+
+ Per PEP 625, versions may have multiple canonical forms, differing
+ only by trailing zeros.
+
+ >>> canonicalize_version('1.0.0')
+ '1'
+ >>> canonicalize_version('1.0.0', strip_trailing_zero=False)
+ '1.0.0'
+
+ Invalid versions are returned unaltered.
+
+ >>> canonicalize_version('foo bar baz')
+ 'foo bar baz'
"""
- if isinstance(version, str):
- try:
- parsed = Version(version)
- except InvalidVersion:
- # Legacy versions cannot be normalized
- return version
- else:
- parsed = version
+ return str(_TrimmedRelease(str(version)) if strip_trailing_zero else version)
- parts = []
- # Epoch
- if parsed.epoch != 0:
- parts.append(f"{parsed.epoch}!")
-
- # Release segment
- # NB: This strips trailing '.0's to normalize
- parts.append(re.sub(r"(\.0)+$", "", ".".join(str(x) for x in parsed.release)))
-
- # Pre-release
- if parsed.pre is not None:
- parts.append("".join(str(x) for x in parsed.pre))
-
- # Post-release
- if parsed.post is not None:
- parts.append(f".post{parsed.post}")
-
- # Development release
- if parsed.dev is not None:
- parts.append(f".dev{parsed.dev}")
-
- # Local version segment
- if parsed.local is not None:
- parts.append(f"+{parsed.local}")
-
- return "".join(parts)
+@canonicalize_version.register
+def _(version: str, *, strip_trailing_zero: bool = True) -> str:
+ try:
+ parsed = Version(version)
+ except InvalidVersion:
+ # Legacy versions cannot be normalized
+ return version
+ return canonicalize_version(parsed, strip_trailing_zero=strip_trailing_zero)
def parse_wheel_filename(
filename: str,
-) -> Tuple[NormalizedName, Version, BuildTag, FrozenSet[Tag]]:
+) -> tuple[NormalizedName, Version, BuildTag, frozenset[Tag]]:
if not filename.endswith(".whl"):
raise InvalidWheelFilename(
- f"Invalid wheel filename (extension must be '.whl'): {filename}"
+ f"Invalid wheel filename (extension must be '.whl'): {filename!r}"
)
filename = filename[:-4]
dashes = filename.count("-")
if dashes not in (4, 5):
raise InvalidWheelFilename(
- f"Invalid wheel filename (wrong number of parts): {filename}"
+ f"Invalid wheel filename (wrong number of parts): {filename!r}"
)
parts = filename.split("-", dashes - 2)
name_part = parts[0]
- # See PEP 427 for the rules on escaping the project name
+ # See PEP 427 for the rules on escaping the project name.
if "__" in name_part or re.match(r"^[\w\d._]*$", name_part, re.UNICODE) is None:
- raise InvalidWheelFilename(f"Invalid project name: {filename}")
+ raise InvalidWheelFilename(f"Invalid project name: {filename!r}")
name = canonicalize_name(name_part)
- version = Version(parts[1])
+
+ try:
+ version = Version(parts[1])
+ except InvalidVersion as e:
+ raise InvalidWheelFilename(
+ f"Invalid wheel filename (invalid version): {filename!r}"
+ ) from e
+
if dashes == 5:
build_part = parts[2]
build_match = _build_tag_regex.match(build_part)
if build_match is None:
raise InvalidWheelFilename(
- f"Invalid build number: {build_part} in '{filename}'"
+ f"Invalid build number: {build_part} in {filename!r}"
)
build = cast(BuildTag, (int(build_match.group(1)), build_match.group(2)))
else:
@@ -114,7 +134,7 @@ def parse_wheel_filename(
return (name, version, build, tags)
-def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
+def parse_sdist_filename(filename: str) -> tuple[NormalizedName, Version]:
if filename.endswith(".tar.gz"):
file_stem = filename[: -len(".tar.gz")]
elif filename.endswith(".zip"):
@@ -122,15 +142,22 @@ def parse_sdist_filename(filename: str) -> Tuple[NormalizedName, Version]:
else:
raise InvalidSdistFilename(
f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):"
- f" {filename}"
+ f" {filename!r}"
)
# We are requiring a PEP 440 version, which cannot contain dashes,
# so we split on the last dash.
name_part, sep, version_part = file_stem.rpartition("-")
if not sep:
- raise InvalidSdistFilename(f"Invalid sdist filename: {filename}")
+ raise InvalidSdistFilename(f"Invalid sdist filename: {filename!r}")
name = canonicalize_name(name_part)
- version = Version(version_part)
+
+ try:
+ version = Version(version_part)
+ except InvalidVersion as e:
+ raise InvalidSdistFilename(
+ f"Invalid sdist filename (invalid version): {filename!r}"
+ ) from e
+
return (name, version)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py
index de9a09a4..21f44ca0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py
@@ -1,64 +1,73 @@
# This file is dual licensed under the terms of the Apache License, Version
# 2.0, and the BSD License. See the LICENSE file in the root of this repository
# for complete details.
+"""
+.. testsetup::
+
+ from pip._vendor.packaging.version import parse, Version
+"""
+
+from __future__ import annotations
-import collections
import itertools
import re
-import warnings
-from typing import Callable, Iterator, List, Optional, SupportsInt, Tuple, Union
+from typing import Any, Callable, NamedTuple, SupportsInt, Tuple, Union
from ._structures import Infinity, InfinityType, NegativeInfinity, NegativeInfinityType
-__all__ = ["parse", "Version", "LegacyVersion", "InvalidVersion", "VERSION_PATTERN"]
+__all__ = ["VERSION_PATTERN", "InvalidVersion", "Version", "parse"]
-InfiniteTypes = Union[InfinityType, NegativeInfinityType]
-PrePostDevType = Union[InfiniteTypes, Tuple[str, int]]
-SubLocalType = Union[InfiniteTypes, int, str]
-LocalType = Union[
+LocalType = Tuple[Union[int, str], ...]
+
+CmpPrePostDevType = Union[InfinityType, NegativeInfinityType, Tuple[str, int]]
+CmpLocalType = Union[
NegativeInfinityType,
- Tuple[
- Union[
- SubLocalType,
- Tuple[SubLocalType, str],
- Tuple[NegativeInfinityType, SubLocalType],
- ],
- ...,
- ],
+ Tuple[Union[Tuple[int, str], Tuple[NegativeInfinityType, Union[int, str]]], ...],
]
CmpKey = Tuple[
- int, Tuple[int, ...], PrePostDevType, PrePostDevType, PrePostDevType, LocalType
+ int,
+ Tuple[int, ...],
+ CmpPrePostDevType,
+ CmpPrePostDevType,
+ CmpPrePostDevType,
+ CmpLocalType,
]
-LegacyCmpKey = Tuple[int, Tuple[str, ...]]
-VersionComparisonMethod = Callable[
- [Union[CmpKey, LegacyCmpKey], Union[CmpKey, LegacyCmpKey]], bool
-]
-
-_Version = collections.namedtuple(
- "_Version", ["epoch", "release", "dev", "pre", "post", "local"]
-)
+VersionComparisonMethod = Callable[[CmpKey, CmpKey], bool]
-def parse(version: str) -> Union["LegacyVersion", "Version"]:
+class _Version(NamedTuple):
+ epoch: int
+ release: tuple[int, ...]
+ dev: tuple[str, int] | None
+ pre: tuple[str, int] | None
+ post: tuple[str, int] | None
+ local: LocalType | None
+
+
+def parse(version: str) -> Version:
+ """Parse the given version string.
+
+ >>> parse('1.0.dev1')
+
+
+ :param version: The version string to parse.
+ :raises InvalidVersion: When the version string is not a valid version.
"""
- Parse the given version string and return either a :class:`Version` object
- or a :class:`LegacyVersion` object depending on if the given version is
- a valid PEP 440 version or a legacy version.
- """
- try:
- return Version(version)
- except InvalidVersion:
- return LegacyVersion(version)
+ return Version(version)
class InvalidVersion(ValueError):
- """
- An invalid version was found, users should refer to PEP 440.
+ """Raised when a version string is not a valid version.
+
+ >>> Version("invalid")
+ Traceback (most recent call last):
+ ...
+ packaging.version.InvalidVersion: Invalid version: 'invalid'
"""
class _BaseVersion:
- _key: Union[CmpKey, LegacyCmpKey]
+ _key: tuple[Any, ...]
def __hash__(self) -> int:
return hash(self._key)
@@ -66,13 +75,13 @@ class _BaseVersion:
# Please keep the duplicated `isinstance` check
# in the six comparisons hereunder
# unless you find a way to avoid adding overhead function calls.
- def __lt__(self, other: "_BaseVersion") -> bool:
+ def __lt__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key < other._key
- def __le__(self, other: "_BaseVersion") -> bool:
+ def __le__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
@@ -84,13 +93,13 @@ class _BaseVersion:
return self._key == other._key
- def __ge__(self, other: "_BaseVersion") -> bool:
+ def __ge__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
return self._key >= other._key
- def __gt__(self, other: "_BaseVersion") -> bool:
+ def __gt__(self, other: _BaseVersion) -> bool:
if not isinstance(other, _BaseVersion):
return NotImplemented
@@ -103,133 +112,16 @@ class _BaseVersion:
return self._key != other._key
-class LegacyVersion(_BaseVersion):
- def __init__(self, version: str) -> None:
- self._version = str(version)
- self._key = _legacy_cmpkey(self._version)
-
- warnings.warn(
- "Creating a LegacyVersion has been deprecated and will be "
- "removed in the next major release",
- DeprecationWarning,
- )
-
- def __str__(self) -> str:
- return self._version
-
- def __repr__(self) -> str:
- return f""
-
- @property
- def public(self) -> str:
- return self._version
-
- @property
- def base_version(self) -> str:
- return self._version
-
- @property
- def epoch(self) -> int:
- return -1
-
- @property
- def release(self) -> None:
- return None
-
- @property
- def pre(self) -> None:
- return None
-
- @property
- def post(self) -> None:
- return None
-
- @property
- def dev(self) -> None:
- return None
-
- @property
- def local(self) -> None:
- return None
-
- @property
- def is_prerelease(self) -> bool:
- return False
-
- @property
- def is_postrelease(self) -> bool:
- return False
-
- @property
- def is_devrelease(self) -> bool:
- return False
-
-
-_legacy_version_component_re = re.compile(r"(\d+ | [a-z]+ | \.| -)", re.VERBOSE)
-
-_legacy_version_replacement_map = {
- "pre": "c",
- "preview": "c",
- "-": "final-",
- "rc": "c",
- "dev": "@",
-}
-
-
-def _parse_version_parts(s: str) -> Iterator[str]:
- for part in _legacy_version_component_re.split(s):
- part = _legacy_version_replacement_map.get(part, part)
-
- if not part or part == ".":
- continue
-
- if part[:1] in "0123456789":
- # pad for numeric comparison
- yield part.zfill(8)
- else:
- yield "*" + part
-
- # ensure that alpha/beta/candidate are before final
- yield "*final"
-
-
-def _legacy_cmpkey(version: str) -> LegacyCmpKey:
-
- # We hardcode an epoch of -1 here. A PEP 440 version can only have a epoch
- # greater than or equal to 0. This will effectively put the LegacyVersion,
- # which uses the defacto standard originally implemented by setuptools,
- # as before all PEP 440 versions.
- epoch = -1
-
- # This scheme is taken from pkg_resources.parse_version setuptools prior to
- # it's adoption of the packaging library.
- parts: List[str] = []
- for part in _parse_version_parts(version.lower()):
- if part.startswith("*"):
- # remove "-" before a prerelease tag
- if part < "*final":
- while parts and parts[-1] == "*final-":
- parts.pop()
-
- # remove trailing zeros from each series of numeric parts
- while parts and parts[-1] == "00000000":
- parts.pop()
-
- parts.append(part)
-
- return epoch, tuple(parts)
-
-
# Deliberately not anchored to the start and end of the string, to make it
# easier for 3rd party code to reuse
-VERSION_PATTERN = r"""
+_VERSION_PATTERN = r"""
v?
(?:
(?:(?P[0-9]+)!)? # epoch
(?P[0-9]+(?:\.[0-9]+)*) # release segment
(?P # pre-release
[-_\.]?
- (?P(a|b|c|rc|alpha|beta|pre|preview))
+ (?Palpha|a|beta|b|preview|pre|c|rc)
[-_\.]?
(?P[0-9]+)?
)?
@@ -253,17 +145,61 @@ VERSION_PATTERN = r"""
(?:\+(?P[a-z0-9]+(?:[-_\.][a-z0-9]+)*))? # local version
"""
+VERSION_PATTERN = _VERSION_PATTERN
+"""
+A string containing the regular expression used to match a valid version.
+
+The pattern is not anchored at either end, and is intended for embedding in larger
+expressions (for example, matching a version number as part of a file name). The
+regular expression should be compiled with the ``re.VERBOSE`` and ``re.IGNORECASE``
+flags set.
+
+:meta hide-value:
+"""
+
class Version(_BaseVersion):
+ """This class abstracts handling of a project's versions.
+
+ A :class:`Version` instance is comparison aware and can be compared and
+ sorted using the standard Python interfaces.
+
+ >>> v1 = Version("1.0a5")
+ >>> v2 = Version("1.0")
+ >>> v1
+
+ >>> v2
+
+ >>> v1 < v2
+ True
+ >>> v1 == v2
+ False
+ >>> v1 > v2
+ False
+ >>> v1 >= v2
+ False
+ >>> v1 <= v2
+ True
+ """
_regex = re.compile(r"^\s*" + VERSION_PATTERN + r"\s*$", re.VERBOSE | re.IGNORECASE)
+ _key: CmpKey
def __init__(self, version: str) -> None:
+ """Initialize a Version object.
+
+ :param version:
+ The string representation of a version which will be parsed and normalized
+ before use.
+ :raises InvalidVersion:
+ If the ``version`` does not conform to PEP 440 in any way then this
+ exception will be raised.
+ """
# Validate the version and parse it into pieces
match = self._regex.search(version)
if not match:
- raise InvalidVersion(f"Invalid version: '{version}'")
+ raise InvalidVersion(f"Invalid version: {version!r}")
# Store the parsed out pieces of the version
self._version = _Version(
@@ -288,9 +224,19 @@ class Version(_BaseVersion):
)
def __repr__(self) -> str:
+ """A representation of the Version that shows all internal state.
+
+ >>> Version('1.0.0')
+
+ """
return f""
def __str__(self) -> str:
+ """A string representation of the version that can be round-tripped.
+
+ >>> str(Version("1.0a5"))
+ '1.0a5'
+ """
parts = []
# Epoch
@@ -320,29 +266,77 @@ class Version(_BaseVersion):
@property
def epoch(self) -> int:
- _epoch: int = self._version.epoch
- return _epoch
+ """The epoch of the version.
+
+ >>> Version("2.0.0").epoch
+ 0
+ >>> Version("1!2.0.0").epoch
+ 1
+ """
+ return self._version.epoch
@property
- def release(self) -> Tuple[int, ...]:
- _release: Tuple[int, ...] = self._version.release
- return _release
+ def release(self) -> tuple[int, ...]:
+ """The components of the "release" segment of the version.
+
+ >>> Version("1.2.3").release
+ (1, 2, 3)
+ >>> Version("2.0.0").release
+ (2, 0, 0)
+ >>> Version("1!2.0.0.post0").release
+ (2, 0, 0)
+
+ Includes trailing zeroes but not the epoch or any pre-release / development /
+ post-release suffixes.
+ """
+ return self._version.release
@property
- def pre(self) -> Optional[Tuple[str, int]]:
- _pre: Optional[Tuple[str, int]] = self._version.pre
- return _pre
+ def pre(self) -> tuple[str, int] | None:
+ """The pre-release segment of the version.
+
+ >>> print(Version("1.2.3").pre)
+ None
+ >>> Version("1.2.3a1").pre
+ ('a', 1)
+ >>> Version("1.2.3b1").pre
+ ('b', 1)
+ >>> Version("1.2.3rc1").pre
+ ('rc', 1)
+ """
+ return self._version.pre
@property
- def post(self) -> Optional[int]:
+ def post(self) -> int | None:
+ """The post-release number of the version.
+
+ >>> print(Version("1.2.3").post)
+ None
+ >>> Version("1.2.3.post1").post
+ 1
+ """
return self._version.post[1] if self._version.post else None
@property
- def dev(self) -> Optional[int]:
+ def dev(self) -> int | None:
+ """The development number of the version.
+
+ >>> print(Version("1.2.3").dev)
+ None
+ >>> Version("1.2.3.dev1").dev
+ 1
+ """
return self._version.dev[1] if self._version.dev else None
@property
- def local(self) -> Optional[str]:
+ def local(self) -> str | None:
+ """The local version segment of the version.
+
+ >>> print(Version("1.2.3").local)
+ None
+ >>> Version("1.2.3+abc").local
+ 'abc'
+ """
if self._version.local:
return ".".join(str(x) for x in self._version.local)
else:
@@ -350,10 +344,31 @@ class Version(_BaseVersion):
@property
def public(self) -> str:
+ """The public portion of the version.
+
+ >>> Version("1.2.3").public
+ '1.2.3'
+ >>> Version("1.2.3+abc").public
+ '1.2.3'
+ >>> Version("1!1.2.3dev1+abc").public
+ '1!1.2.3.dev1'
+ """
return str(self).split("+", 1)[0]
@property
def base_version(self) -> str:
+ """The "base version" of the version.
+
+ >>> Version("1.2.3").base_version
+ '1.2.3'
+ >>> Version("1.2.3+abc").base_version
+ '1.2.3'
+ >>> Version("1!1.2.3dev1+abc").base_version
+ '1!1.2.3'
+
+ The "base version" is the public version of the project without any pre or post
+ release markers.
+ """
parts = []
# Epoch
@@ -367,33 +382,95 @@ class Version(_BaseVersion):
@property
def is_prerelease(self) -> bool:
+ """Whether this version is a pre-release.
+
+ >>> Version("1.2.3").is_prerelease
+ False
+ >>> Version("1.2.3a1").is_prerelease
+ True
+ >>> Version("1.2.3b1").is_prerelease
+ True
+ >>> Version("1.2.3rc1").is_prerelease
+ True
+ >>> Version("1.2.3dev1").is_prerelease
+ True
+ """
return self.dev is not None or self.pre is not None
@property
def is_postrelease(self) -> bool:
+ """Whether this version is a post-release.
+
+ >>> Version("1.2.3").is_postrelease
+ False
+ >>> Version("1.2.3.post1").is_postrelease
+ True
+ """
return self.post is not None
@property
def is_devrelease(self) -> bool:
+ """Whether this version is a development release.
+
+ >>> Version("1.2.3").is_devrelease
+ False
+ >>> Version("1.2.3.dev1").is_devrelease
+ True
+ """
return self.dev is not None
@property
def major(self) -> int:
+ """The first item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").major
+ 1
+ """
return self.release[0] if len(self.release) >= 1 else 0
@property
def minor(self) -> int:
+ """The second item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").minor
+ 2
+ >>> Version("1").minor
+ 0
+ """
return self.release[1] if len(self.release) >= 2 else 0
@property
def micro(self) -> int:
+ """The third item of :attr:`release` or ``0`` if unavailable.
+
+ >>> Version("1.2.3").micro
+ 3
+ >>> Version("1").micro
+ 0
+ """
return self.release[2] if len(self.release) >= 3 else 0
-def _parse_letter_version(
- letter: str, number: Union[str, bytes, SupportsInt]
-) -> Optional[Tuple[str, int]]:
+class _TrimmedRelease(Version):
+ @property
+ def release(self) -> tuple[int, ...]:
+ """
+ Release segment without any trailing zeros.
+ >>> _TrimmedRelease('1.0.0').release
+ (1,)
+ >>> _TrimmedRelease('0.0').release
+ (0,)
+ """
+ rel = super().release
+ nonzeros = (index for index, val in enumerate(rel) if val)
+ last_nonzero = max(nonzeros, default=0)
+ return rel[: last_nonzero + 1]
+
+
+def _parse_letter_version(
+ letter: str | None, number: str | bytes | SupportsInt | None
+) -> tuple[str, int] | None:
if letter:
# We consider there to be an implicit 0 in a pre-release if there is
# not a numeral associated with it.
@@ -416,7 +493,9 @@ def _parse_letter_version(
letter = "post"
return letter, int(number)
- if not letter and number:
+
+ assert not letter
+ if number:
# We assume if we are given a number, but we are not given a letter
# then this is using the implicit post release syntax (e.g. 1.0-1)
letter = "post"
@@ -429,7 +508,7 @@ def _parse_letter_version(
_local_version_separators = re.compile(r"[\._-]")
-def _parse_local_version(local: str) -> Optional[LocalType]:
+def _parse_local_version(local: str | None) -> LocalType | None:
"""
Takes a string like abc.1.twelve and turns it into ("abc", 1, "twelve").
"""
@@ -443,13 +522,12 @@ def _parse_local_version(local: str) -> Optional[LocalType]:
def _cmpkey(
epoch: int,
- release: Tuple[int, ...],
- pre: Optional[Tuple[str, int]],
- post: Optional[Tuple[str, int]],
- dev: Optional[Tuple[str, int]],
- local: Optional[Tuple[SubLocalType]],
+ release: tuple[int, ...],
+ pre: tuple[str, int] | None,
+ post: tuple[str, int] | None,
+ dev: tuple[str, int] | None,
+ local: LocalType | None,
) -> CmpKey:
-
# When we compare a release version, we want to compare it with all of the
# trailing zeros removed. So we'll use a reverse the list, drop all the now
# leading zeros until we come to something non zero, then take the rest
@@ -464,7 +542,7 @@ def _cmpkey(
# if there is not a pre or a post segment. If we have one of those then
# the normal sorting rules will handle this case correctly.
if pre is None and post is None and dev is not None:
- _pre: PrePostDevType = NegativeInfinity
+ _pre: CmpPrePostDevType = NegativeInfinity
# Versions without a pre-release (except as noted above) should sort after
# those with one.
elif pre is None:
@@ -474,21 +552,21 @@ def _cmpkey(
# Versions without a post segment should sort before those with one.
if post is None:
- _post: PrePostDevType = NegativeInfinity
+ _post: CmpPrePostDevType = NegativeInfinity
else:
_post = post
# Versions without a development segment should sort after those with one.
if dev is None:
- _dev: PrePostDevType = Infinity
+ _dev: CmpPrePostDevType = Infinity
else:
_dev = dev
if local is None:
# Versions without a local segment should sort before those with one.
- _local: LocalType = NegativeInfinity
+ _local: CmpLocalType = NegativeInfinity
else:
# Versions with a local segment need that segment parsed to implement
# the sorting rules in PEP440.
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
index ad279407..72f2b035 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
@@ -1,3 +1,6 @@
+# TODO: Add Generic type annotations to initialized collections.
+# For now we'd simply use implicit Any/Unknown which would add redundant annotations
+# mypy: disable-error-code="var-annotated"
"""
Package resource API
--------------------
@@ -17,12 +20,36 @@ This module is deprecated. Users are directed to :mod:`importlib.resources`,
:mod:`importlib.metadata` and :pypi:`packaging` instead.
"""
+from __future__ import annotations
+
import sys
+
+if sys.version_info < (3, 8): # noqa: UP036 # Check for unsupported versions
+ raise RuntimeError("Python 3.8 or later is required")
+
import os
import io
import time
import re
import types
+from typing import (
+ Any,
+ Literal,
+ Dict,
+ Iterator,
+ Mapping,
+ MutableSequence,
+ NamedTuple,
+ NoReturn,
+ Tuple,
+ Union,
+ TYPE_CHECKING,
+ Protocol,
+ Callable,
+ Iterable,
+ TypeVar,
+ overload,
+)
import zipfile
import zipimport
import warnings
@@ -41,21 +68,16 @@ import inspect
import ntpath
import posixpath
import importlib
+import importlib.abc
+import importlib.machinery
from pkgutil import get_importer
-try:
- import _imp
-except ImportError:
- # Python 3.2 compatibility
- import imp as _imp
-
-try:
- FileExistsError
-except NameError:
- FileExistsError = OSError
+import _imp
# capture these to bypass sandboxing
from os import utime
+from os import open as os_open
+from os.path import isdir, split
try:
from os import mkdir, rename, unlink
@@ -65,64 +87,59 @@ except ImportError:
# no write support, probably under GAE
WRITE_SUPPORT = False
-from os import open as os_open
-from os.path import isdir, split
-
-try:
- import importlib.machinery as importlib_machinery
-
- # access attribute to force import under delayed import mechanisms.
- importlib_machinery.__name__
-except ImportError:
- importlib_machinery = None
-
from pip._internal.utils._jaraco_text import (
yield_lines,
drop_comment,
join_continuation,
)
+from pip._vendor.packaging import markers as _packaging_markers
+from pip._vendor.packaging import requirements as _packaging_requirements
+from pip._vendor.packaging import utils as _packaging_utils
+from pip._vendor.packaging import version as _packaging_version
+from pip._vendor.platformdirs import user_cache_dir as _user_cache_dir
-from pip._vendor import platformdirs
-from pip._vendor import packaging
-
-__import__('pip._vendor.packaging.version')
-__import__('pip._vendor.packaging.specifiers')
-__import__('pip._vendor.packaging.requirements')
-__import__('pip._vendor.packaging.markers')
-__import__('pip._vendor.packaging.utils')
-
-if sys.version_info < (3, 5):
- raise RuntimeError("Python 3.5 or later is required")
-
-# declare some globals that will be defined later to
-# satisfy the linters.
-require = None
-working_set = None
-add_activation_listener = None
-resources_stream = None
-cleanup_resources = None
-resource_dir = None
-resource_stream = None
-set_extraction_path = None
-resource_isdir = None
-resource_string = None
-iter_entry_points = None
-resource_listdir = None
-resource_filename = None
-resource_exists = None
-_distribution_finders = None
-_namespace_handlers = None
-_namespace_packages = None
+if TYPE_CHECKING:
+ from _typeshed import BytesPath, StrPath, StrOrBytesPath
+ from typing_extensions import Self
-warnings.warn(
- "pkg_resources is deprecated as an API. "
- "See https://setuptools.pypa.io/en/latest/pkg_resources.html",
- DeprecationWarning,
- stacklevel=2
+# Patch: Remove deprecation warning from vendored pkg_resources.
+# Setting PYTHONWARNINGS=error to verify builds produce no warnings
+# causes immediate exceptions.
+# See https://github.com/pypa/pip/issues/12243
+
+
+_T = TypeVar("_T")
+_DistributionT = TypeVar("_DistributionT", bound="Distribution")
+# Type aliases
+_NestedStr = Union[str, Iterable[Union[str, Iterable["_NestedStr"]]]]
+_InstallerTypeT = Callable[["Requirement"], "_DistributionT"]
+_InstallerType = Callable[["Requirement"], Union["Distribution", None]]
+_PkgReqType = Union[str, "Requirement"]
+_EPDistType = Union["Distribution", _PkgReqType]
+_MetadataType = Union["IResourceProvider", None]
+_ResolvedEntryPoint = Any # Can be any attribute in the module
+_ResourceStream = Any # TODO / Incomplete: A readable file-like object
+# Any object works, but let's indicate we expect something like a module (optionally has __loader__ or __file__)
+_ModuleLike = Union[object, types.ModuleType]
+# Any: Should be _ModuleLike but we end up with issues where _ModuleLike doesn't have _ZipLoaderModule's __loader__
+_ProviderFactoryType = Callable[[Any], "IResourceProvider"]
+_DistFinderType = Callable[[_T, str, bool], Iterable["Distribution"]]
+_NSHandlerType = Callable[[_T, str, str, types.ModuleType], Union[str, None]]
+_AdapterT = TypeVar(
+ "_AdapterT", _DistFinderType[Any], _ProviderFactoryType, _NSHandlerType[Any]
)
+# Use _typeshed.importlib.LoaderProtocol once available https://github.com/python/typeshed/pull/11890
+class _LoaderProtocol(Protocol):
+ def load_module(self, fullname: str, /) -> types.ModuleType: ...
+
+
+class _ZipLoaderModule(Protocol):
+ __loader__: zipimport.zipimporter
+
+
_PEP440_FALLBACK = re.compile(r"^v?(?P(?:[0-9]+!)?[0-9]+(?:\.[0-9]+)*)", re.I)
@@ -133,18 +150,18 @@ class PEP440Warning(RuntimeWarning):
"""
-parse_version = packaging.version.Version
+parse_version = _packaging_version.Version
-_state_vars = {}
+_state_vars: dict[str, str] = {}
-def _declare_state(vartype, **kw):
- globals().update(kw)
- _state_vars.update(dict.fromkeys(kw, vartype))
+def _declare_state(vartype: str, varname: str, initial_value: _T) -> _T:
+ _state_vars[varname] = vartype
+ return initial_value
-def __getstate__():
+def __getstate__() -> dict[str, Any]:
state = {}
g = globals()
for k, v in _state_vars.items():
@@ -152,7 +169,7 @@ def __getstate__():
return state
-def __setstate__(state):
+def __setstate__(state: dict[str, Any]) -> dict[str, Any]:
g = globals()
for k, v in state.items():
g['_sset_' + _state_vars[k]](k, g[k], v)
@@ -307,17 +324,17 @@ class VersionConflict(ResolutionError):
_template = "{self.dist} is installed but {self.req} is required"
@property
- def dist(self):
+ def dist(self) -> Distribution:
return self.args[0]
@property
- def req(self):
+ def req(self) -> Requirement:
return self.args[1]
def report(self):
return self._template.format(**locals())
- def with_context(self, required_by):
+ def with_context(self, required_by: set[Distribution | str]):
"""
If required_by is non-empty, return a version of self that is a
ContextualVersionConflict.
@@ -337,7 +354,7 @@ class ContextualVersionConflict(VersionConflict):
_template = VersionConflict._template + ' by {self.required_by}'
@property
- def required_by(self):
+ def required_by(self) -> set[str]:
return self.args[2]
@@ -350,11 +367,11 @@ class DistributionNotFound(ResolutionError):
)
@property
- def req(self):
+ def req(self) -> Requirement:
return self.args[0]
@property
- def requirers(self):
+ def requirers(self) -> set[str] | None:
return self.args[1]
@property
@@ -374,7 +391,7 @@ class UnknownExtra(ResolutionError):
"""Distribution doesn't have an "extra feature" of the given name"""
-_provider_factories = {}
+_provider_factories: dict[type[_ModuleLike], _ProviderFactoryType] = {}
PY_MAJOR = '{}.{}'.format(*sys.version_info)
EGG_DIST = 3
@@ -384,7 +401,9 @@ CHECKOUT_DIST = 0
DEVELOP_DIST = -1
-def register_loader_type(loader_type, provider_factory):
+def register_loader_type(
+ loader_type: type[_ModuleLike], provider_factory: _ProviderFactoryType
+):
"""Register `provider_factory` to make providers for `loader_type`
`loader_type` is the type or class of a PEP 302 ``module.__loader__``,
@@ -394,7 +413,11 @@ def register_loader_type(loader_type, provider_factory):
_provider_factories[loader_type] = provider_factory
-def get_provider(moduleOrReq):
+@overload
+def get_provider(moduleOrReq: str) -> IResourceProvider: ...
+@overload
+def get_provider(moduleOrReq: Requirement) -> Distribution: ...
+def get_provider(moduleOrReq: str | Requirement) -> IResourceProvider | Distribution:
"""Return an IResourceProvider for the named module or requirement"""
if isinstance(moduleOrReq, Requirement):
return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
@@ -407,20 +430,18 @@ def get_provider(moduleOrReq):
return _find_adapter(_provider_factories, loader)(module)
-def _macos_vers(_cache=[]):
- if not _cache:
- version = platform.mac_ver()[0]
- # fallback for MacPorts
- if version == '':
- plist = '/System/Library/CoreServices/SystemVersion.plist'
- if os.path.exists(plist):
- if hasattr(plistlib, 'readPlist'):
- plist_content = plistlib.readPlist(plist)
- if 'ProductVersion' in plist_content:
- version = plist_content['ProductVersion']
-
- _cache.append(version.split('.'))
- return _cache[0]
+@functools.lru_cache(maxsize=None)
+def _macos_vers():
+ version = platform.mac_ver()[0]
+ # fallback for MacPorts
+ if version == '':
+ plist = '/System/Library/CoreServices/SystemVersion.plist'
+ if os.path.exists(plist):
+ with open(plist, 'rb') as fh:
+ plist_content = plistlib.load(fh)
+ if 'ProductVersion' in plist_content:
+ version = plist_content['ProductVersion']
+ return version.split('.')
def _macos_arch(machine):
@@ -458,7 +479,7 @@ darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
get_platform = get_build_platform
-def compatible_platforms(provided, required):
+def compatible_platforms(provided: str | None, required: str | None):
"""Can code for the `provided` platform run on the `required` platform?
Returns true if either platform is ``None``, or the platforms are equal.
@@ -507,102 +528,106 @@ def compatible_platforms(provided, required):
return False
-def run_script(dist_spec, script_name):
- """Locate distribution `dist_spec` and run its `script_name` script"""
- ns = sys._getframe(1).f_globals
- name = ns['__name__']
- ns.clear()
- ns['__name__'] = name
- require(dist_spec)[0].run_script(script_name, ns)
-
-
-# backward compatibility
-run_main = run_script
-
-
-def get_distribution(dist):
+@overload
+def get_distribution(dist: _DistributionT) -> _DistributionT: ...
+@overload
+def get_distribution(dist: _PkgReqType) -> Distribution: ...
+def get_distribution(dist: Distribution | _PkgReqType) -> Distribution:
"""Return a current distribution object for a Requirement or string"""
if isinstance(dist, str):
dist = Requirement.parse(dist)
if isinstance(dist, Requirement):
- dist = get_provider(dist)
+ # Bad type narrowing, dist has to be a Requirement here, so get_provider has to return Distribution
+ dist = get_provider(dist) # type: ignore[assignment]
if not isinstance(dist, Distribution):
- raise TypeError("Expected string, Requirement, or Distribution", dist)
+ raise TypeError("Expected str, Requirement, or Distribution", dist)
return dist
-def load_entry_point(dist, group, name):
+def load_entry_point(dist: _EPDistType, group: str, name: str) -> _ResolvedEntryPoint:
"""Return `name` entry point of `group` for `dist` or raise ImportError"""
return get_distribution(dist).load_entry_point(group, name)
-def get_entry_map(dist, group=None):
+@overload
+def get_entry_map(
+ dist: _EPDistType, group: None = None
+) -> dict[str, dict[str, EntryPoint]]: ...
+@overload
+def get_entry_map(dist: _EPDistType, group: str) -> dict[str, EntryPoint]: ...
+def get_entry_map(dist: _EPDistType, group: str | None = None):
"""Return the entry point map for `group`, or the full entry map"""
return get_distribution(dist).get_entry_map(group)
-def get_entry_info(dist, group, name):
+def get_entry_info(dist: _EPDistType, group: str, name: str):
"""Return the EntryPoint object for `group`+`name`, or ``None``"""
return get_distribution(dist).get_entry_info(group, name)
-class IMetadataProvider:
- def has_metadata(name):
+class IMetadataProvider(Protocol):
+ def has_metadata(self, name: str) -> bool:
"""Does the package's distribution contain the named metadata?"""
- def get_metadata(name):
+ def get_metadata(self, name: str) -> str:
"""The named metadata resource as a string"""
- def get_metadata_lines(name):
+ def get_metadata_lines(self, name: str) -> Iterator[str]:
"""Yield named metadata resource as list of non-blank non-comment lines
Leading and trailing whitespace is stripped from each line, and lines
with ``#`` as the first non-blank character are omitted."""
- def metadata_isdir(name):
+ def metadata_isdir(self, name: str) -> bool:
"""Is the named metadata a directory? (like ``os.path.isdir()``)"""
- def metadata_listdir(name):
+ def metadata_listdir(self, name: str) -> list[str]:
"""List of metadata names in the directory (like ``os.listdir()``)"""
- def run_script(script_name, namespace):
+ def run_script(self, script_name: str, namespace: dict[str, Any]) -> None:
"""Execute the named script in the supplied namespace dictionary"""
-class IResourceProvider(IMetadataProvider):
+class IResourceProvider(IMetadataProvider, Protocol):
"""An object that provides access to package resources"""
- def get_resource_filename(manager, resource_name):
+ def get_resource_filename(
+ self, manager: ResourceManager, resource_name: str
+ ) -> str:
"""Return a true filesystem path for `resource_name`
- `manager` must be an ``IResourceManager``"""
+ `manager` must be a ``ResourceManager``"""
- def get_resource_stream(manager, resource_name):
+ def get_resource_stream(
+ self, manager: ResourceManager, resource_name: str
+ ) -> _ResourceStream:
"""Return a readable file-like object for `resource_name`
- `manager` must be an ``IResourceManager``"""
+ `manager` must be a ``ResourceManager``"""
- def get_resource_string(manager, resource_name):
- """Return a string containing the contents of `resource_name`
+ def get_resource_string(
+ self, manager: ResourceManager, resource_name: str
+ ) -> bytes:
+ """Return the contents of `resource_name` as :obj:`bytes`
- `manager` must be an ``IResourceManager``"""
+ `manager` must be a ``ResourceManager``"""
- def has_resource(resource_name):
+ def has_resource(self, resource_name: str) -> bool:
"""Does the package contain the named resource?"""
- def resource_isdir(resource_name):
+ def resource_isdir(self, resource_name: str) -> bool:
"""Is the named resource a directory? (like ``os.path.isdir()``)"""
- def resource_listdir(resource_name):
+ def resource_listdir(self, resource_name: str) -> list[str]:
"""List of resource names in the directory (like ``os.listdir()``)"""
class WorkingSet:
"""A collection of active distributions on sys.path (or a similar list)"""
- def __init__(self, entries=None):
+ def __init__(self, entries: Iterable[str] | None = None):
"""Create working set from list of path entries (default=sys.path)"""
- self.entries = []
+ self.entries: list[str] = []
self.entry_keys = {}
self.by_key = {}
self.normalized_to_canonical_keys = {}
@@ -656,7 +681,7 @@ class WorkingSet:
sys.path[:] = ws.entries
return ws
- def add_entry(self, entry):
+ def add_entry(self, entry: str):
"""Add a path item to ``.entries``, finding any distributions on it
``find_distributions(entry, True)`` is used to find distributions
@@ -671,11 +696,11 @@ class WorkingSet:
for dist in find_distributions(entry, True):
self.add(dist, entry, False)
- def __contains__(self, dist):
+ def __contains__(self, dist: Distribution) -> bool:
"""True if `dist` is the active distribution for its project"""
return self.by_key.get(dist.key) == dist
- def find(self, req):
+ def find(self, req: Requirement) -> Distribution | None:
"""Find a distribution matching requirement `req`
If there is an active distribution for the requested project, this
@@ -699,7 +724,7 @@ class WorkingSet:
raise VersionConflict(dist, req)
return dist
- def iter_entry_points(self, group, name=None):
+ def iter_entry_points(self, group: str, name: str | None = None):
"""Yield entry point objects from `group` matching `name`
If `name` is None, yields all entry points in `group` from all
@@ -713,7 +738,7 @@ class WorkingSet:
if name is None or name == entry.name
)
- def run_script(self, requires, script_name):
+ def run_script(self, requires: str, script_name: str):
"""Locate distribution for `requires` and run `script_name` script"""
ns = sys._getframe(1).f_globals
name = ns['__name__']
@@ -721,13 +746,13 @@ class WorkingSet:
ns['__name__'] = name
self.require(requires)[0].run_script(script_name, ns)
- def __iter__(self):
+ def __iter__(self) -> Iterator[Distribution]:
"""Yield distributions for non-duplicate projects in the working set
The yield order is the order in which the items' path entries were
added to the working set.
"""
- seen = {}
+ seen = set()
for item in self.entries:
if item not in self.entry_keys:
# workaround a cache issue
@@ -735,10 +760,16 @@ class WorkingSet:
for key in self.entry_keys[item]:
if key not in seen:
- seen[key] = 1
+ seen.add(key)
yield self.by_key[key]
- def add(self, dist, entry=None, insert=True, replace=False):
+ def add(
+ self,
+ dist: Distribution,
+ entry: str | None = None,
+ insert: bool = True,
+ replace: bool = False,
+ ):
"""Add `dist` to working set, associated with `entry`
If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
@@ -762,7 +793,7 @@ class WorkingSet:
return
self.by_key[dist.key] = dist
- normalized_name = packaging.utils.canonicalize_name(dist.key)
+ normalized_name = _packaging_utils.canonicalize_name(dist.key)
self.normalized_to_canonical_keys[normalized_name] = dist.key
if dist.key not in keys:
keys.append(dist.key)
@@ -770,14 +801,42 @@ class WorkingSet:
keys2.append(dist.key)
self._added_new(dist)
+ @overload
def resolve(
self,
- requirements,
- env=None,
- installer=None,
- replace_conflicting=False,
- extras=None,
- ):
+ requirements: Iterable[Requirement],
+ env: Environment | None,
+ installer: _InstallerTypeT[_DistributionT],
+ replace_conflicting: bool = False,
+ extras: tuple[str, ...] | None = None,
+ ) -> list[_DistributionT]: ...
+ @overload
+ def resolve(
+ self,
+ requirements: Iterable[Requirement],
+ env: Environment | None = None,
+ *,
+ installer: _InstallerTypeT[_DistributionT],
+ replace_conflicting: bool = False,
+ extras: tuple[str, ...] | None = None,
+ ) -> list[_DistributionT]: ...
+ @overload
+ def resolve(
+ self,
+ requirements: Iterable[Requirement],
+ env: Environment | None = None,
+ installer: _InstallerType | None = None,
+ replace_conflicting: bool = False,
+ extras: tuple[str, ...] | None = None,
+ ) -> list[Distribution]: ...
+ def resolve(
+ self,
+ requirements: Iterable[Requirement],
+ env: Environment | None = None,
+ installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
+ replace_conflicting: bool = False,
+ extras: tuple[str, ...] | None = None,
+ ) -> list[Distribution] | list[_DistributionT]:
"""List all distributions needed to (recursively) meet `requirements`
`requirements` must be a sequence of ``Requirement`` objects. `env`,
@@ -805,7 +864,7 @@ class WorkingSet:
# set up the stack
requirements = list(requirements)[::-1]
# set of processed requirements
- processed = {}
+ processed = set()
# key -> dist
best = {}
to_activate = []
@@ -839,14 +898,14 @@ class WorkingSet:
required_by[new_requirement].add(req.project_name)
req_extras[new_requirement] = req.extras
- processed[req] = True
+ processed.add(req)
# return list of distros to activate
return to_activate
def _resolve_dist(
self, req, best, replace_conflicting, env, installer, required_by, to_activate
- ):
+ ) -> Distribution:
dist = best.get(req.key)
if dist is None:
# Find the best distribution and add it to the map
@@ -875,7 +934,41 @@ class WorkingSet:
raise VersionConflict(dist, req).with_context(dependent_req)
return dist
- def find_plugins(self, plugin_env, full_env=None, installer=None, fallback=True):
+ @overload
+ def find_plugins(
+ self,
+ plugin_env: Environment,
+ full_env: Environment | None,
+ installer: _InstallerTypeT[_DistributionT],
+ fallback: bool = True,
+ ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
+ @overload
+ def find_plugins(
+ self,
+ plugin_env: Environment,
+ full_env: Environment | None = None,
+ *,
+ installer: _InstallerTypeT[_DistributionT],
+ fallback: bool = True,
+ ) -> tuple[list[_DistributionT], dict[Distribution, Exception]]: ...
+ @overload
+ def find_plugins(
+ self,
+ plugin_env: Environment,
+ full_env: Environment | None = None,
+ installer: _InstallerType | None = None,
+ fallback: bool = True,
+ ) -> tuple[list[Distribution], dict[Distribution, Exception]]: ...
+ def find_plugins(
+ self,
+ plugin_env: Environment,
+ full_env: Environment | None = None,
+ installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
+ fallback: bool = True,
+ ) -> tuple[
+ list[Distribution] | list[_DistributionT],
+ dict[Distribution, Exception],
+ ]:
"""Find all activatable distributions in `plugin_env`
Example usage::
@@ -914,8 +1007,8 @@ class WorkingSet:
# scan project names in alphabetic order
plugin_projects.sort()
- error_info = {}
- distributions = {}
+ error_info: dict[Distribution, Exception] = {}
+ distributions: dict[Distribution, Exception | None] = {}
if full_env is None:
env = Environment(self.entries)
@@ -951,12 +1044,12 @@ class WorkingSet:
# success, no need to try any more versions of this project
break
- distributions = list(distributions)
- distributions.sort()
+ sorted_distributions = list(distributions)
+ sorted_distributions.sort()
- return distributions, error_info
+ return sorted_distributions, error_info
- def require(self, *requirements):
+ def require(self, *requirements: _NestedStr):
"""Ensure that distributions matching `requirements` are activated
`requirements` must be a string or a (possibly-nested) sequence
@@ -972,7 +1065,9 @@ class WorkingSet:
return needed
- def subscribe(self, callback, existing=True):
+ def subscribe(
+ self, callback: Callable[[Distribution], object], existing: bool = True
+ ):
"""Invoke `callback` for all distributions
If `existing=True` (default),
@@ -1008,12 +1103,12 @@ class WorkingSet:
self.callbacks = callbacks[:]
-class _ReqExtras(dict):
+class _ReqExtras(Dict["Requirement", Tuple[str, ...]]):
"""
Map each requirement to the extras that demanded it.
"""
- def markers_pass(self, req, extras=None):
+ def markers_pass(self, req: Requirement, extras: tuple[str, ...] | None = None):
"""
Evaluate markers for req against each extra that
demanded it.
@@ -1032,7 +1127,10 @@ class Environment:
"""Searchable snapshot of distributions on a search path"""
def __init__(
- self, search_path=None, platform=get_supported_platform(), python=PY_MAJOR
+ self,
+ search_path: Iterable[str] | None = None,
+ platform: str | None = get_supported_platform(),
+ python: str | None = PY_MAJOR,
):
"""Snapshot distributions available on a search path
@@ -1055,7 +1153,7 @@ class Environment:
self.python = python
self.scan(search_path)
- def can_add(self, dist):
+ def can_add(self, dist: Distribution):
"""Is distribution `dist` acceptable for this environment?
The distribution must match the platform and python version
@@ -1069,11 +1167,11 @@ class Environment:
)
return py_compat and compatible_platforms(dist.platform, self.platform)
- def remove(self, dist):
+ def remove(self, dist: Distribution):
"""Remove `dist` from the environment"""
self._distmap[dist.key].remove(dist)
- def scan(self, search_path=None):
+ def scan(self, search_path: Iterable[str] | None = None):
"""Scan `search_path` for distributions usable in this environment
Any distributions found are added to the environment.
@@ -1088,7 +1186,7 @@ class Environment:
for dist in find_distributions(item):
self.add(dist)
- def __getitem__(self, project_name):
+ def __getitem__(self, project_name: str) -> list[Distribution]:
"""Return a newest-to-oldest list of distributions for `project_name`
Uses case-insensitive `project_name` comparison, assuming all the
@@ -1099,7 +1197,7 @@ class Environment:
distribution_key = project_name.lower()
return self._distmap.get(distribution_key, [])
- def add(self, dist):
+ def add(self, dist: Distribution):
"""Add `dist` if we ``can_add()`` it and it has not already been added"""
if self.can_add(dist) and dist.has_version():
dists = self._distmap.setdefault(dist.key, [])
@@ -1107,7 +1205,29 @@ class Environment:
dists.append(dist)
dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
- def best_match(self, req, working_set, installer=None, replace_conflicting=False):
+ @overload
+ def best_match(
+ self,
+ req: Requirement,
+ working_set: WorkingSet,
+ installer: _InstallerTypeT[_DistributionT],
+ replace_conflicting: bool = False,
+ ) -> _DistributionT: ...
+ @overload
+ def best_match(
+ self,
+ req: Requirement,
+ working_set: WorkingSet,
+ installer: _InstallerType | None = None,
+ replace_conflicting: bool = False,
+ ) -> Distribution | None: ...
+ def best_match(
+ self,
+ req: Requirement,
+ working_set: WorkingSet,
+ installer: _InstallerType | None | _InstallerTypeT[_DistributionT] = None,
+ replace_conflicting: bool = False,
+ ) -> Distribution | None:
"""Find distribution best matching `req` and usable on `working_set`
This calls the ``find(req)`` method of the `working_set` to see if a
@@ -1134,7 +1254,32 @@ class Environment:
# try to download/install
return self.obtain(req, installer)
- def obtain(self, requirement, installer=None):
+ @overload
+ def obtain(
+ self,
+ requirement: Requirement,
+ installer: _InstallerTypeT[_DistributionT],
+ ) -> _DistributionT: ...
+ @overload
+ def obtain(
+ self,
+ requirement: Requirement,
+ installer: Callable[[Requirement], None] | None = None,
+ ) -> None: ...
+ @overload
+ def obtain(
+ self,
+ requirement: Requirement,
+ installer: _InstallerType | None = None,
+ ) -> Distribution | None: ...
+ def obtain(
+ self,
+ requirement: Requirement,
+ installer: Callable[[Requirement], None]
+ | _InstallerType
+ | None
+ | _InstallerTypeT[_DistributionT] = None,
+ ) -> Distribution | None:
"""Obtain a distribution matching `requirement` (e.g. via download)
Obtain a distro that matches requirement (e.g. via download). In the
@@ -1143,16 +1288,15 @@ class Environment:
None is returned instead. This method is a hook that allows subclasses
to attempt other ways of obtaining a distribution before falling back
to the `installer` argument."""
- if installer is not None:
- return installer(requirement)
+ return installer(requirement) if installer else None
- def __iter__(self):
+ def __iter__(self) -> Iterator[str]:
"""Yield the unique project names of the available distributions"""
for key in self._distmap.keys():
if self[key]:
yield key
- def __iadd__(self, other):
+ def __iadd__(self, other: Distribution | Environment):
"""In-place addition of a distribution or environment"""
if isinstance(other, Distribution):
self.add(other)
@@ -1164,7 +1308,7 @@ class Environment:
raise TypeError("Can't add %r to environment" % (other,))
return self
- def __add__(self, other):
+ def __add__(self, other: Distribution | Environment):
"""Add an environment or distribution to an environment"""
new = self.__class__([], platform=None, python=None)
for env in self, other:
@@ -1191,46 +1335,54 @@ class ExtractionError(RuntimeError):
The exception instance that caused extraction to fail
"""
+ manager: ResourceManager
+ cache_path: str
+ original_error: BaseException | None
+
class ResourceManager:
"""Manage resource extraction and packages"""
- extraction_path = None
+ extraction_path: str | None = None
def __init__(self):
self.cached_files = {}
- def resource_exists(self, package_or_requirement, resource_name):
+ def resource_exists(self, package_or_requirement: _PkgReqType, resource_name: str):
"""Does the named resource exist?"""
return get_provider(package_or_requirement).has_resource(resource_name)
- def resource_isdir(self, package_or_requirement, resource_name):
+ def resource_isdir(self, package_or_requirement: _PkgReqType, resource_name: str):
"""Is the named resource an existing directory?"""
return get_provider(package_or_requirement).resource_isdir(resource_name)
- def resource_filename(self, package_or_requirement, resource_name):
+ def resource_filename(
+ self, package_or_requirement: _PkgReqType, resource_name: str
+ ):
"""Return a true filesystem path for specified resource"""
return get_provider(package_or_requirement).get_resource_filename(
self, resource_name
)
- def resource_stream(self, package_or_requirement, resource_name):
+ def resource_stream(self, package_or_requirement: _PkgReqType, resource_name: str):
"""Return a readable file-like object for specified resource"""
return get_provider(package_or_requirement).get_resource_stream(
self, resource_name
)
- def resource_string(self, package_or_requirement, resource_name):
- """Return specified resource as a string"""
+ def resource_string(
+ self, package_or_requirement: _PkgReqType, resource_name: str
+ ) -> bytes:
+ """Return specified resource as :obj:`bytes`"""
return get_provider(package_or_requirement).get_resource_string(
self, resource_name
)
- def resource_listdir(self, package_or_requirement, resource_name):
+ def resource_listdir(self, package_or_requirement: _PkgReqType, resource_name: str):
"""List the contents of the named resource directory"""
return get_provider(package_or_requirement).resource_listdir(resource_name)
- def extraction_error(self):
+ def extraction_error(self) -> NoReturn:
"""Give an error message for problems extracting file(s)"""
old_exc = sys.exc_info()[1]
@@ -1260,7 +1412,7 @@ class ResourceManager:
err.original_error = old_exc
raise err
- def get_cache_path(self, archive_name, names=()):
+ def get_cache_path(self, archive_name: str, names: Iterable[StrPath] = ()):
"""Return absolute location in cache for `archive_name` and `names`
The parent directory of the resulting path will be created if it does
@@ -1282,7 +1434,7 @@ class ResourceManager:
self._warn_unsafe_extraction_path(extract_path)
- self.cached_files[target_path] = 1
+ self.cached_files[target_path] = True
return target_path
@staticmethod
@@ -1312,7 +1464,7 @@ class ResourceManager:
).format(**locals())
warnings.warn(msg, UserWarning)
- def postprocess(self, tempname, filename):
+ def postprocess(self, tempname: StrOrBytesPath, filename: StrOrBytesPath):
"""Perform any platform-specific postprocessing of `tempname`
This is where Mac header rewrites should be done; other platforms don't
@@ -1332,7 +1484,7 @@ class ResourceManager:
mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
os.chmod(tempname, mode)
- def set_extraction_path(self, path):
+ def set_extraction_path(self, path: str):
"""Set the base path where resources will be extracted to, if needed.
If you do not call this routine before any extractions take place, the
@@ -1356,7 +1508,7 @@ class ResourceManager:
self.extraction_path = path
- def cleanup_resources(self, force=False):
+ def cleanup_resources(self, force: bool = False) -> list[str]:
"""
Delete all extracted resource files and directories, returning a list
of the file and directory names that could not be successfully removed.
@@ -1368,20 +1520,19 @@ class ResourceManager:
directory used for extractions.
"""
# XXX
+ return []
-def get_default_cache():
+def get_default_cache() -> str:
"""
Return the ``PYTHON_EGG_CACHE`` environment variable
or a platform-relevant user cache dir for an app
named "Python-Eggs".
"""
- return os.environ.get('PYTHON_EGG_CACHE') or platformdirs.user_cache_dir(
- appname='Python-Eggs'
- )
+ return os.environ.get('PYTHON_EGG_CACHE') or _user_cache_dir(appname='Python-Eggs')
-def safe_name(name):
+def safe_name(name: str):
"""Convert an arbitrary string to a standard distribution name
Any runs of non-alphanumeric/. characters are replaced with a single '-'.
@@ -1389,14 +1540,14 @@ def safe_name(name):
return re.sub('[^A-Za-z0-9.]+', '-', name)
-def safe_version(version):
+def safe_version(version: str):
"""
Convert an arbitrary string to a standard version string
"""
try:
# normalize the version
- return str(packaging.version.Version(version))
- except packaging.version.InvalidVersion:
+ return str(_packaging_version.Version(version))
+ except _packaging_version.InvalidVersion:
version = version.replace(' ', '.')
return re.sub('[^A-Za-z0-9.]+', '-', version)
@@ -1418,7 +1569,7 @@ def _forgiving_version(version):
match = _PEP440_FALLBACK.search(version)
if match:
safe = match["safe"]
- rest = version[len(safe):]
+ rest = version[len(safe) :]
else:
safe = "0"
rest = version
@@ -1433,7 +1584,7 @@ def _safe_segment(segment):
return re.sub(r'\.[^A-Za-z0-9]+', '.', segment).strip(".-")
-def safe_extra(extra):
+def safe_extra(extra: str):
"""Convert an arbitrary string to a standard 'extra' name
Any runs of non-alphanumeric characters are replaced with a single '_',
@@ -1442,7 +1593,7 @@ def safe_extra(extra):
return re.sub('[^A-Za-z0-9.-]+', '_', extra).lower()
-def to_filename(name):
+def to_filename(name: str):
"""Convert a project or version name to its filename-escaped form
Any '-' characters are currently replaced with '_'.
@@ -1450,7 +1601,7 @@ def to_filename(name):
return name.replace('-', '_')
-def invalid_marker(text):
+def invalid_marker(text: str):
"""
Validate text as a PEP 508 environment marker; return an exception
if invalid or False otherwise.
@@ -1464,7 +1615,7 @@ def invalid_marker(text):
return False
-def evaluate_marker(text, extra=None):
+def evaluate_marker(text: str, extra: str | None = None) -> bool:
"""
Evaluate a PEP 508 environment marker.
Return a boolean indicating the marker result in this environment.
@@ -1473,46 +1624,48 @@ def evaluate_marker(text, extra=None):
This implementation uses the 'pyparsing' module.
"""
try:
- marker = packaging.markers.Marker(text)
+ marker = _packaging_markers.Marker(text)
return marker.evaluate()
- except packaging.markers.InvalidMarker as e:
+ except _packaging_markers.InvalidMarker as e:
raise SyntaxError(e) from e
class NullProvider:
"""Try to implement resources and metadata for arbitrary PEP 302 loaders"""
- egg_name = None
- egg_info = None
- loader = None
+ egg_name: str | None = None
+ egg_info: str | None = None
+ loader: _LoaderProtocol | None = None
- def __init__(self, module):
+ def __init__(self, module: _ModuleLike):
self.loader = getattr(module, '__loader__', None)
self.module_path = os.path.dirname(getattr(module, '__file__', ''))
- def get_resource_filename(self, manager, resource_name):
+ def get_resource_filename(self, manager: ResourceManager, resource_name: str):
return self._fn(self.module_path, resource_name)
- def get_resource_stream(self, manager, resource_name):
+ def get_resource_stream(self, manager: ResourceManager, resource_name: str):
return io.BytesIO(self.get_resource_string(manager, resource_name))
- def get_resource_string(self, manager, resource_name):
+ def get_resource_string(
+ self, manager: ResourceManager, resource_name: str
+ ) -> bytes:
return self._get(self._fn(self.module_path, resource_name))
- def has_resource(self, resource_name):
+ def has_resource(self, resource_name: str):
return self._has(self._fn(self.module_path, resource_name))
def _get_metadata_path(self, name):
return self._fn(self.egg_info, name)
- def has_metadata(self, name):
+ def has_metadata(self, name: str) -> bool:
if not self.egg_info:
- return self.egg_info
+ return False
path = self._get_metadata_path(name)
return self._has(path)
- def get_metadata(self, name):
+ def get_metadata(self, name: str):
if not self.egg_info:
return ""
path = self._get_metadata_path(name)
@@ -1525,24 +1678,24 @@ class NullProvider:
exc.reason += ' in {} file at path: {}'.format(name, path)
raise
- def get_metadata_lines(self, name):
+ def get_metadata_lines(self, name: str) -> Iterator[str]:
return yield_lines(self.get_metadata(name))
- def resource_isdir(self, resource_name):
+ def resource_isdir(self, resource_name: str):
return self._isdir(self._fn(self.module_path, resource_name))
- def metadata_isdir(self, name):
- return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+ def metadata_isdir(self, name: str) -> bool:
+ return bool(self.egg_info and self._isdir(self._fn(self.egg_info, name)))
- def resource_listdir(self, resource_name):
+ def resource_listdir(self, resource_name: str):
return self._listdir(self._fn(self.module_path, resource_name))
- def metadata_listdir(self, name):
+ def metadata_listdir(self, name: str) -> list[str]:
if self.egg_info:
return self._listdir(self._fn(self.egg_info, name))
return []
- def run_script(self, script_name, namespace):
+ def run_script(self, script_name: str, namespace: dict[str, Any]):
script = 'scripts/' + script_name
if not self.has_metadata(script):
raise ResolutionError(
@@ -1550,13 +1703,13 @@ class NullProvider:
**locals()
),
)
+
script_text = self.get_metadata(script).replace('\r\n', '\n')
script_text = script_text.replace('\r', '\n')
script_filename = self._fn(self.egg_info, script)
namespace['__file__'] = script_filename
if os.path.exists(script_filename):
- with open(script_filename) as fid:
- source = fid.read()
+ source = _read_utf8_with_fallback(script_filename)
code = compile(source, script_filename, 'exec')
exec(code, namespace, namespace)
else:
@@ -1571,22 +1724,26 @@ class NullProvider:
script_code = compile(script_text, script_filename, 'exec')
exec(script_code, namespace, namespace)
- def _has(self, path):
+ def _has(self, path) -> bool:
raise NotImplementedError(
"Can't perform this operation for unregistered loader type"
)
- def _isdir(self, path):
+ def _isdir(self, path) -> bool:
raise NotImplementedError(
"Can't perform this operation for unregistered loader type"
)
- def _listdir(self, path):
+ def _listdir(self, path) -> list[str]:
raise NotImplementedError(
"Can't perform this operation for unregistered loader type"
)
- def _fn(self, base, resource_name):
+ def _fn(self, base: str | None, resource_name: str):
+ if base is None:
+ raise TypeError(
+ "`base` parameter in `_fn` is `None`. Either override this method or check the parameter first."
+ )
self._validate_resource_path(resource_name)
if resource_name:
return os.path.join(base, *resource_name.split('/'))
@@ -1649,6 +1806,7 @@ is not allowed.
os.path.pardir in path.split(posixpath.sep)
or posixpath.isabs(path)
or ntpath.isabs(path)
+ or path.startswith("\\")
)
if not invalid:
return
@@ -1656,7 +1814,7 @@ is not allowed.
msg = "Use of .. or absolute path in a resource path is not allowed."
# Aggressively disallow Windows absolute paths
- if ntpath.isabs(path) and not posixpath.isabs(path):
+ if (path.startswith("\\") or ntpath.isabs(path)) and not posixpath.isabs(path):
raise ValueError(msg)
# for compatibility, warn; in future
@@ -1666,9 +1824,10 @@ is not allowed.
DeprecationWarning,
)
- def _get(self, path):
- if hasattr(self.loader, 'get_data'):
- return self.loader.get_data(path)
+ def _get(self, path) -> bytes:
+ if hasattr(self.loader, 'get_data') and self.loader:
+ # Already checked get_data exists
+ return self.loader.get_data(path) # type: ignore[attr-defined]
raise NotImplementedError(
"Can't perform this operation for loaders without 'get_data()'"
)
@@ -1691,7 +1850,7 @@ def _parents(path):
class EggProvider(NullProvider):
"""Provider based on a virtual filesystem"""
- def __init__(self, module):
+ def __init__(self, module: _ModuleLike):
super().__init__(module)
self._setup_prefix()
@@ -1702,7 +1861,7 @@ class EggProvider(NullProvider):
egg = next(eggs, None)
egg and self._set_egg(egg)
- def _set_egg(self, path):
+ def _set_egg(self, path: str):
self.egg_name = os.path.basename(path)
self.egg_info = os.path.join(path, 'EGG-INFO')
self.egg_root = path
@@ -1711,19 +1870,19 @@ class EggProvider(NullProvider):
class DefaultProvider(EggProvider):
"""Provides access to package resources in the filesystem"""
- def _has(self, path):
+ def _has(self, path) -> bool:
return os.path.exists(path)
- def _isdir(self, path):
+ def _isdir(self, path) -> bool:
return os.path.isdir(path)
def _listdir(self, path):
return os.listdir(path)
- def get_resource_stream(self, manager, resource_name):
+ def get_resource_stream(self, manager: object, resource_name: str):
return open(self._fn(self.module_path, resource_name), 'rb')
- def _get(self, path):
+ def _get(self, path) -> bytes:
with open(path, 'rb') as stream:
return stream.read()
@@ -1734,7 +1893,7 @@ class DefaultProvider(EggProvider):
'SourcelessFileLoader',
)
for name in loader_names:
- loader_cls = getattr(importlib_machinery, name, type(None))
+ loader_cls = getattr(importlib.machinery, name, type(None))
register_loader_type(loader_cls, cls)
@@ -1744,12 +1903,13 @@ DefaultProvider._register()
class EmptyProvider(NullProvider):
"""Provider that returns nothing for all requests"""
- module_path = None
+ # A special case, we don't want all Providers inheriting from NullProvider to have a potentially None module_path
+ module_path: str | None = None # type: ignore[assignment]
_isdir = _has = lambda self, path: False
- def _get(self, path):
- return ''
+ def _get(self, path) -> bytes:
+ return b''
def _listdir(self, path):
return []
@@ -1761,13 +1921,14 @@ class EmptyProvider(NullProvider):
empty_provider = EmptyProvider()
-class ZipManifests(dict):
+class ZipManifests(Dict[str, "MemoizedZipManifests.manifest_mod"]):
"""
zip manifest builder
"""
+ # `path` could be `StrPath | IO[bytes]` but that violates the LSP for `MemoizedZipManifests.load`
@classmethod
- def build(cls, path):
+ def build(cls, path: str):
"""
Build a dictionary similar to the zipimport directory
caches, except instead of tuples, store ZipInfo objects.
@@ -1793,9 +1954,11 @@ class MemoizedZipManifests(ZipManifests):
Memoized zipfile manifests.
"""
- manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
+ class manifest_mod(NamedTuple):
+ manifest: dict[str, zipfile.ZipInfo]
+ mtime: float
- def load(self, path):
+ def load(self, path: str) -> dict[str, zipfile.ZipInfo]: # type: ignore[override] # ZipManifests.load is a classmethod
"""
Load a manifest at path or return a suitable manifest already loaded.
"""
@@ -1812,10 +1975,12 @@ class MemoizedZipManifests(ZipManifests):
class ZipProvider(EggProvider):
"""Resource support for zips and eggs"""
- eagers = None
+ eagers: list[str] | None = None
_zip_manifests = MemoizedZipManifests()
+ # ZipProvider's loader should always be a zipimporter or equivalent
+ loader: zipimport.zipimporter
- def __init__(self, module):
+ def __init__(self, module: _ZipLoaderModule):
super().__init__(module)
self.zip_pre = self.loader.archive + os.sep
@@ -1841,7 +2006,7 @@ class ZipProvider(EggProvider):
def zipinfo(self):
return self._zip_manifests.load(self.loader.archive)
- def get_resource_filename(self, manager, resource_name):
+ def get_resource_filename(self, manager: ResourceManager, resource_name: str):
if not self.egg_name:
raise NotImplementedError(
"resource_filename() only supported for .egg, not .zip"
@@ -1864,7 +2029,7 @@ class ZipProvider(EggProvider):
return timestamp, size
# FIXME: 'ZipProvider._extract_resource' is too complex (12)
- def _extract_resource(self, manager, zip_path): # noqa: C901
+ def _extract_resource(self, manager: ResourceManager, zip_path) -> str: # noqa: C901
if zip_path in self._index():
for name in self._index()[zip_path]:
last = self._extract_resource(manager, os.path.join(zip_path, name))
@@ -1874,10 +2039,14 @@ class ZipProvider(EggProvider):
timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
if not WRITE_SUPPORT:
- raise IOError(
- '"os.rename" and "os.unlink" are not supported ' 'on this platform'
+ raise OSError(
+ '"os.rename" and "os.unlink" are not supported on this platform'
)
try:
+ if not self.egg_name:
+ raise OSError(
+ '"egg_name" is empty. This likely means no egg could be found from the "module_path".'
+ )
real_path = manager.get_cache_path(self.egg_name, self._parts(zip_path))
if self._is_current(real_path, zip_path):
@@ -1895,7 +2064,7 @@ class ZipProvider(EggProvider):
try:
rename(tmpnam, real_path)
- except os.error:
+ except OSError:
if os.path.isfile(real_path):
if self._is_current(real_path, zip_path):
# the file became current since it was checked above,
@@ -1908,7 +2077,7 @@ class ZipProvider(EggProvider):
return real_path
raise
- except os.error:
+ except OSError:
# report a user-friendly error
manager.extraction_error()
@@ -1956,20 +2125,20 @@ class ZipProvider(EggProvider):
self._dirindex = ind
return ind
- def _has(self, fspath):
+ def _has(self, fspath) -> bool:
zip_path = self._zipinfo_name(fspath)
return zip_path in self.zipinfo or zip_path in self._index()
- def _isdir(self, fspath):
+ def _isdir(self, fspath) -> bool:
return self._zipinfo_name(fspath) in self._index()
def _listdir(self, fspath):
return list(self._index().get(self._zipinfo_name(fspath), ()))
- def _eager_to_zip(self, resource_name):
+ def _eager_to_zip(self, resource_name: str):
return self._zipinfo_name(self._fn(self.egg_root, resource_name))
- def _resource_to_zip(self, resource_name):
+ def _resource_to_zip(self, resource_name: str):
return self._zipinfo_name(self._fn(self.module_path, resource_name))
@@ -1988,20 +2157,20 @@ class FileMetadata(EmptyProvider):
the provided location.
"""
- def __init__(self, path):
+ def __init__(self, path: StrPath):
self.path = path
def _get_metadata_path(self, name):
return self.path
- def has_metadata(self, name):
+ def has_metadata(self, name: str) -> bool:
return name == 'PKG-INFO' and os.path.isfile(self.path)
- def get_metadata(self, name):
+ def get_metadata(self, name: str):
if name != 'PKG-INFO':
raise KeyError("No metadata except PKG-INFO is available")
- with io.open(self.path, encoding='utf-8', errors="replace") as f:
+ with open(self.path, encoding='utf-8', errors="replace") as f:
metadata = f.read()
self._warn_on_replacement(metadata)
return metadata
@@ -2013,7 +2182,7 @@ class FileMetadata(EmptyProvider):
msg = tmpl.format(**locals())
warnings.warn(msg)
- def get_metadata_lines(self, name):
+ def get_metadata_lines(self, name: str) -> Iterator[str]:
return yield_lines(self.get_metadata(name))
@@ -2037,7 +2206,7 @@ class PathMetadata(DefaultProvider):
dist = Distribution.from_filename(egg_path, metadata=metadata)
"""
- def __init__(self, path, egg_info):
+ def __init__(self, path: str, egg_info: str):
self.module_path = path
self.egg_info = egg_info
@@ -2045,7 +2214,7 @@ class PathMetadata(DefaultProvider):
class EggMetadata(ZipProvider):
"""Metadata provider for .egg files"""
- def __init__(self, importer):
+ def __init__(self, importer: zipimport.zipimporter):
"""Create a metadata provider from a zipimporter"""
self.zip_pre = importer.archive + os.sep
@@ -2057,10 +2226,12 @@ class EggMetadata(ZipProvider):
self._setup_prefix()
-_declare_state('dict', _distribution_finders={})
+_distribution_finders: dict[type, _DistFinderType[Any]] = _declare_state(
+ 'dict', '_distribution_finders', {}
+)
-def register_finder(importer_type, distribution_finder):
+def register_finder(importer_type: type[_T], distribution_finder: _DistFinderType[_T]):
"""Register `distribution_finder` to find distributions in sys.path items
`importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
@@ -2070,14 +2241,16 @@ def register_finder(importer_type, distribution_finder):
_distribution_finders[importer_type] = distribution_finder
-def find_distributions(path_item, only=False):
+def find_distributions(path_item: str, only: bool = False):
"""Yield distributions accessible via `path_item`"""
importer = get_importer(path_item)
finder = _find_adapter(_distribution_finders, importer)
return finder(importer, path_item, only)
-def find_eggs_in_zip(importer, path_item, only=False):
+def find_eggs_in_zip(
+ importer: zipimport.zipimporter, path_item: str, only: bool = False
+) -> Iterator[Distribution]:
"""
Find eggs in zip files; possibly multiple nested eggs.
"""
@@ -2095,8 +2268,7 @@ def find_eggs_in_zip(importer, path_item, only=False):
if _is_egg_path(subitem):
subpath = os.path.join(path_item, subitem)
dists = find_eggs_in_zip(zipimport.zipimporter(subpath), subpath)
- for dist in dists:
- yield dist
+ yield from dists
elif subitem.lower().endswith(('.dist-info', '.egg-info')):
subpath = os.path.join(path_item, subitem)
submeta = EggMetadata(zipimport.zipimporter(subpath))
@@ -2107,14 +2279,16 @@ def find_eggs_in_zip(importer, path_item, only=False):
register_finder(zipimport.zipimporter, find_eggs_in_zip)
-def find_nothing(importer, path_item, only=False):
+def find_nothing(
+ importer: object | None, path_item: str | None, only: bool | None = False
+):
return ()
register_finder(object, find_nothing)
-def find_on_path(importer, path_item, only=False):
+def find_on_path(importer: object | None, path_item, only=False):
"""Yield distributions accessible on a sys.path directory"""
path_item = _normalize_cached(path_item)
@@ -2131,8 +2305,7 @@ def find_on_path(importer, path_item, only=False):
for entry in sorted(entries):
fullpath = os.path.join(path_item, entry)
factory = dist_factory(path_item, entry, only)
- for dist in factory(fullpath):
- yield dist
+ yield from factory(fullpath)
def dist_factory(path_item, entry, only):
@@ -2170,7 +2343,7 @@ class NoDists:
return iter(())
-def safe_listdir(path):
+def safe_listdir(path: StrOrBytesPath):
"""
Attempt to list contents of path, but suppress some exceptions.
"""
@@ -2186,13 +2359,13 @@ def safe_listdir(path):
return ()
-def distributions_from_metadata(path):
+def distributions_from_metadata(path: str):
root = os.path.dirname(path)
if os.path.isdir(path):
if len(os.listdir(path)) == 0:
# empty metadata dir; skip
return
- metadata = PathMetadata(root, path)
+ metadata: _MetadataType = PathMetadata(root, path)
else:
metadata = FileMetadata(path)
entry = os.path.basename(path)
@@ -2208,11 +2381,10 @@ def non_empty_lines(path):
"""
Yield non-empty lines from file at path
"""
- with open(path) as f:
- for line in f:
- line = line.strip()
- if line:
- yield line
+ for line in _read_utf8_with_fallback(path).splitlines():
+ line = line.strip()
+ if line:
+ yield line
def resolve_egg_link(path):
@@ -2231,13 +2403,19 @@ def resolve_egg_link(path):
if hasattr(pkgutil, 'ImpImporter'):
register_finder(pkgutil.ImpImporter, find_on_path)
-register_finder(importlib_machinery.FileFinder, find_on_path)
+register_finder(importlib.machinery.FileFinder, find_on_path)
-_declare_state('dict', _namespace_handlers={})
-_declare_state('dict', _namespace_packages={})
+_namespace_handlers: dict[type, _NSHandlerType[Any]] = _declare_state(
+ 'dict', '_namespace_handlers', {}
+)
+_namespace_packages: dict[str | None, list[str]] = _declare_state(
+ 'dict', '_namespace_packages', {}
+)
-def register_namespace_handler(importer_type, namespace_handler):
+def register_namespace_handler(
+ importer_type: type[_T], namespace_handler: _NSHandlerType[_T]
+):
"""Register `namespace_handler` to declare namespace packages
`importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
@@ -2292,7 +2470,7 @@ def _handle_ns(packageName, path_item):
return subpath
-def _rebuild_mod_path(orig_path, package_name, module):
+def _rebuild_mod_path(orig_path, package_name, module: types.ModuleType):
"""
Rebuild module.__path__ ensuring that all entries are ordered
corresponding to their sys.path order
@@ -2326,7 +2504,7 @@ def _rebuild_mod_path(orig_path, package_name, module):
module.__path__ = new_path
-def declare_namespace(packageName):
+def declare_namespace(packageName: str):
"""Declare that package 'packageName' is a namespace package"""
msg = (
@@ -2343,7 +2521,7 @@ def declare_namespace(packageName):
if packageName in _namespace_packages:
return
- path = sys.path
+ path: MutableSequence[str] = sys.path
parent, _, _ = packageName.rpartition('.')
if parent:
@@ -2369,7 +2547,7 @@ def declare_namespace(packageName):
_imp.release_lock()
-def fixup_namespace_packages(path_item, parent=None):
+def fixup_namespace_packages(path_item: str, parent: str | None = None):
"""Ensure that previously-declared namespace packages include path_item"""
_imp.acquire_lock()
try:
@@ -2381,7 +2559,12 @@ def fixup_namespace_packages(path_item, parent=None):
_imp.release_lock()
-def file_ns_handler(importer, path_item, packageName, module):
+def file_ns_handler(
+ importer: object,
+ path_item: StrPath,
+ packageName: str,
+ module: types.ModuleType,
+):
"""Compute an ns-package subpath for a filesystem or zipfile importer"""
subpath = os.path.join(path_item, packageName.split('.')[-1])
@@ -2398,22 +2581,31 @@ if hasattr(pkgutil, 'ImpImporter'):
register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
register_namespace_handler(zipimport.zipimporter, file_ns_handler)
-register_namespace_handler(importlib_machinery.FileFinder, file_ns_handler)
+register_namespace_handler(importlib.machinery.FileFinder, file_ns_handler)
-def null_ns_handler(importer, path_item, packageName, module):
+def null_ns_handler(
+ importer: object,
+ path_item: str | None,
+ packageName: str | None,
+ module: _ModuleLike | None,
+):
return None
register_namespace_handler(object, null_ns_handler)
-def normalize_path(filename):
+@overload
+def normalize_path(filename: StrPath) -> str: ...
+@overload
+def normalize_path(filename: BytesPath) -> bytes: ...
+def normalize_path(filename: StrOrBytesPath):
"""Normalize a file/dir name for comparison purposes"""
return os.path.normcase(os.path.realpath(os.path.normpath(_cygwin_patch(filename))))
-def _cygwin_patch(filename): # pragma: nocover
+def _cygwin_patch(filename: StrOrBytesPath): # pragma: nocover
"""
Contrary to POSIX 2008, on Cygwin, getcwd (3) contains
symlink components. Using
@@ -2424,12 +2616,19 @@ def _cygwin_patch(filename): # pragma: nocover
return os.path.abspath(filename) if sys.platform == 'cygwin' else filename
-def _normalize_cached(filename, _cache={}):
- try:
- return _cache[filename]
- except KeyError:
- _cache[filename] = result = normalize_path(filename)
- return result
+if TYPE_CHECKING:
+ # https://github.com/python/mypy/issues/16261
+ # https://github.com/python/typeshed/issues/6347
+ @overload
+ def _normalize_cached(filename: StrPath) -> str: ...
+ @overload
+ def _normalize_cached(filename: BytesPath) -> bytes: ...
+ def _normalize_cached(filename: StrOrBytesPath) -> str | bytes: ...
+else:
+
+ @functools.lru_cache(maxsize=None)
+ def _normalize_cached(filename):
+ return normalize_path(filename)
def _is_egg_path(path):
@@ -2482,7 +2681,14 @@ EGG_NAME = re.compile(
class EntryPoint:
"""Object representing an advertised importable object"""
- def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
+ def __init__(
+ self,
+ name: str,
+ module_name: str,
+ attrs: Iterable[str] = (),
+ extras: Iterable[str] = (),
+ dist: Distribution | None = None,
+ ):
if not MODULE(module_name):
raise ValueError("Invalid module name", module_name)
self.name = name
@@ -2502,7 +2708,26 @@ class EntryPoint:
def __repr__(self):
return "EntryPoint.parse(%r)" % str(self)
- def load(self, require=True, *args, **kwargs):
+ @overload
+ def load(
+ self,
+ require: Literal[True] = True,
+ env: Environment | None = None,
+ installer: _InstallerType | None = None,
+ ) -> _ResolvedEntryPoint: ...
+ @overload
+ def load(
+ self,
+ require: Literal[False],
+ *args: Any,
+ **kwargs: Any,
+ ) -> _ResolvedEntryPoint: ...
+ def load(
+ self,
+ require: bool = True,
+ *args: Environment | _InstallerType | None,
+ **kwargs: Environment | _InstallerType | None,
+ ) -> _ResolvedEntryPoint:
"""
Require packages for this EntryPoint, then resolve it.
"""
@@ -2514,10 +2739,12 @@ class EntryPoint:
stacklevel=2,
)
if require:
- self.require(*args, **kwargs)
+ # We could pass `env` and `installer` directly,
+ # but keeping `*args` and `**kwargs` for backwards compatibility
+ self.require(*args, **kwargs) # type: ignore
return self.resolve()
- def resolve(self):
+ def resolve(self) -> _ResolvedEntryPoint:
"""
Resolve the entry point from its module and attrs.
"""
@@ -2527,9 +2754,14 @@ class EntryPoint:
except AttributeError as exc:
raise ImportError(str(exc)) from exc
- def require(self, env=None, installer=None):
- if self.extras and not self.dist:
- raise UnknownExtra("Can't require() without a distribution", self)
+ def require(
+ self,
+ env: Environment | None = None,
+ installer: _InstallerType | None = None,
+ ):
+ if not self.dist:
+ error_cls = UnknownExtra if self.extras else AttributeError
+ raise error_cls("Can't require() without a distribution", self)
# Get the requirements for this entry point with all its extras and
# then resolve them. We have to pass `extras` along when resolving so
@@ -2550,7 +2782,7 @@ class EntryPoint:
)
@classmethod
- def parse(cls, src, dist=None):
+ def parse(cls, src: str, dist: Distribution | None = None):
"""Parse a single entry point from string `src`
Entry point syntax follows the form::
@@ -2575,15 +2807,20 @@ class EntryPoint:
return ()
req = Requirement.parse('x' + extras_spec)
if req.specs:
- raise ValueError()
+ raise ValueError
return req.extras
@classmethod
- def parse_group(cls, group, lines, dist=None):
+ def parse_group(
+ cls,
+ group: str,
+ lines: _NestedStr,
+ dist: Distribution | None = None,
+ ):
"""Parse an entry point group"""
if not MODULE(group):
raise ValueError("Invalid group name", group)
- this = {}
+ this: dict[str, Self] = {}
for line in yield_lines(lines):
ep = cls.parse(line, dist)
if ep.name in this:
@@ -2592,14 +2829,19 @@ class EntryPoint:
return this
@classmethod
- def parse_map(cls, data, dist=None):
+ def parse_map(
+ cls,
+ data: str | Iterable[str] | dict[str, str | Iterable[str]],
+ dist: Distribution | None = None,
+ ):
"""Parse a map of entry point groups"""
+ _data: Iterable[tuple[str | None, str | Iterable[str]]]
if isinstance(data, dict):
- data = data.items()
+ _data = data.items()
else:
- data = split_sections(data)
- maps = {}
- for group, lines in data:
+ _data = split_sections(data)
+ maps: dict[str, dict[str, Self]] = {}
+ for group, lines in _data:
if group is None:
if not lines:
continue
@@ -2633,13 +2875,13 @@ class Distribution:
def __init__(
self,
- location=None,
- metadata=None,
- project_name=None,
- version=None,
- py_version=PY_MAJOR,
- platform=None,
- precedence=EGG_DIST,
+ location: str | None = None,
+ metadata: _MetadataType = None,
+ project_name: str | None = None,
+ version: str | None = None,
+ py_version: str | None = PY_MAJOR,
+ platform: str | None = None,
+ precedence: int = EGG_DIST,
):
self.project_name = safe_name(project_name or 'Unknown')
if version is not None:
@@ -2651,7 +2893,13 @@ class Distribution:
self._provider = metadata or empty_provider
@classmethod
- def from_location(cls, location, basename, metadata=None, **kw):
+ def from_location(
+ cls,
+ location: str,
+ basename: StrPath,
+ metadata: _MetadataType = None,
+ **kw: int, # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
+ ) -> Distribution:
project_name, version, py_version, platform = [None] * 4
basename, ext = os.path.splitext(basename)
if ext.lower() in _distributionImpl:
@@ -2689,25 +2937,25 @@ class Distribution:
def __hash__(self):
return hash(self.hashcmp)
- def __lt__(self, other):
+ def __lt__(self, other: Distribution):
return self.hashcmp < other.hashcmp
- def __le__(self, other):
+ def __le__(self, other: Distribution):
return self.hashcmp <= other.hashcmp
- def __gt__(self, other):
+ def __gt__(self, other: Distribution):
return self.hashcmp > other.hashcmp
- def __ge__(self, other):
+ def __ge__(self, other: Distribution):
return self.hashcmp >= other.hashcmp
- def __eq__(self, other):
+ def __eq__(self, other: object):
if not isinstance(other, self.__class__):
# It's not a Distribution, so they are not equal
return False
return self.hashcmp == other.hashcmp
- def __ne__(self, other):
+ def __ne__(self, other: object):
return not self == other
# These properties have to be lazy so that we don't have to load any
@@ -2727,12 +2975,12 @@ class Distribution:
if not hasattr(self, "_parsed_version"):
try:
self._parsed_version = parse_version(self.version)
- except packaging.version.InvalidVersion as ex:
+ except _packaging_version.InvalidVersion as ex:
info = f"(package: {self.project_name})"
if hasattr(ex, "add_note"):
ex.add_note(info) # PEP 678
raise
- raise packaging.version.InvalidVersion(f"{str(ex)} {info}") from None
+ raise _packaging_version.InvalidVersion(f"{str(ex)} {info}") from None
return self._parsed_version
@@ -2740,7 +2988,7 @@ class Distribution:
def _forgiving_parsed_version(self):
try:
return self.parsed_version
- except packaging.version.InvalidVersion as ex:
+ except _packaging_version.InvalidVersion as ex:
self._parsed_version = parse_version(_forgiving_version(self.version))
notes = "\n".join(getattr(ex, "__notes__", [])) # PEP 678
@@ -2790,14 +3038,14 @@ class Distribution:
return self.__dep_map
@staticmethod
- def _filter_extras(dm):
+ def _filter_extras(dm: dict[str | None, list[Requirement]]):
"""
Given a mapping of extras to dependencies, strip off
environment markers and filter out any dependencies
not matching the markers.
"""
for extra in list(filter(None, dm)):
- new_extra = extra
+ new_extra: str | None = extra
reqs = dm.pop(extra)
new_extra, _, marker = extra.partition(':')
fails_marker = marker and (
@@ -2817,10 +3065,10 @@ class Distribution:
dm.setdefault(extra, []).extend(parse_requirements(reqs))
return dm
- def requires(self, extras=()):
+ def requires(self, extras: Iterable[str] = ()):
"""List of Requirements needed for this distro if `extras` are used"""
dm = self._dep_map
- deps = []
+ deps: list[Requirement] = []
deps.extend(dm.get(None, ()))
for ext in extras:
try:
@@ -2850,21 +3098,18 @@ class Distribution:
def _get_metadata(self, name):
if self.has_metadata(name):
- for line in self.get_metadata_lines(name):
- yield line
+ yield from self.get_metadata_lines(name)
def _get_version(self):
lines = self._get_metadata(self.PKG_INFO)
- version = _version_from_file(lines)
+ return _version_from_file(lines)
- return version
-
- def activate(self, path=None, replace=False):
+ def activate(self, path: list[str] | None = None, replace: bool = False):
"""Ensure distribution is importable on `path` (default=sys.path)"""
if path is None:
path = sys.path
self.insert_on(path, replace=replace)
- if path is sys.path:
+ if path is sys.path and self.location is not None:
fixup_namespace_packages(self.location)
for pkg in self._get_metadata('namespace_packages.txt'):
if pkg in sys.modules:
@@ -2904,50 +3149,62 @@ class Distribution:
def __dir__(self):
return list(
- set(super(Distribution, self).__dir__())
+ set(super().__dir__())
| set(attr for attr in self._provider.__dir__() if not attr.startswith('_'))
)
@classmethod
- def from_filename(cls, filename, metadata=None, **kw):
+ def from_filename(
+ cls,
+ filename: StrPath,
+ metadata: _MetadataType = None,
+ **kw: int, # We could set `precedence` explicitly, but keeping this as `**kw` for full backwards and subclassing compatibility
+ ):
return cls.from_location(
_normalize_cached(filename), os.path.basename(filename), metadata, **kw
)
def as_requirement(self):
"""Return a ``Requirement`` that matches this distribution exactly"""
- if isinstance(self.parsed_version, packaging.version.Version):
+ if isinstance(self.parsed_version, _packaging_version.Version):
spec = "%s==%s" % (self.project_name, self.parsed_version)
else:
spec = "%s===%s" % (self.project_name, self.parsed_version)
return Requirement.parse(spec)
- def load_entry_point(self, group, name):
+ def load_entry_point(self, group: str, name: str) -> _ResolvedEntryPoint:
"""Return the `name` entry point of `group` or raise ImportError"""
ep = self.get_entry_info(group, name)
if ep is None:
raise ImportError("Entry point %r not found" % ((group, name),))
return ep.load()
- def get_entry_map(self, group=None):
+ @overload
+ def get_entry_map(self, group: None = None) -> dict[str, dict[str, EntryPoint]]: ...
+ @overload
+ def get_entry_map(self, group: str) -> dict[str, EntryPoint]: ...
+ def get_entry_map(self, group: str | None = None):
"""Return the entry point map for `group`, or the full entry map"""
- try:
- ep_map = self._ep_map
- except AttributeError:
- ep_map = self._ep_map = EntryPoint.parse_map(
+ if not hasattr(self, "_ep_map"):
+ self._ep_map = EntryPoint.parse_map(
self._get_metadata('entry_points.txt'), self
)
if group is not None:
- return ep_map.get(group, {})
- return ep_map
+ return self._ep_map.get(group, {})
+ return self._ep_map
- def get_entry_info(self, group, name):
+ def get_entry_info(self, group: str, name: str):
"""Return the EntryPoint object for `group`+`name`, or ``None``"""
return self.get_entry_map(group).get(name)
# FIXME: 'Distribution.insert_on' is too complex (13)
- def insert_on(self, path, loc=None, replace=False): # noqa: C901
+ def insert_on( # noqa: C901
+ self,
+ path: list[str],
+ loc=None,
+ replace: bool = False,
+ ):
"""Ensure self.location is on path
If replace=False (default):
@@ -3052,13 +3309,14 @@ class Distribution:
return False
return True
- def clone(self, **kw):
+ def clone(self, **kw: str | int | IResourceProvider | None):
"""Copy this distribution, substituting in any changed keyword args"""
names = 'project_name version py_version platform location precedence'
for attr in names.split():
kw.setdefault(attr, getattr(self, attr, None))
kw.setdefault('metadata', self._provider)
- return self.__class__(**kw)
+ # Unsafely unpacking. But keeping **kw for backwards and subclassing compatibility
+ return self.__class__(**kw) # type:ignore[arg-type]
@property
def extras(self):
@@ -3111,11 +3369,11 @@ class DistInfoDistribution(Distribution):
self.__dep_map = self._compute_dependencies()
return self.__dep_map
- def _compute_dependencies(self):
+ def _compute_dependencies(self) -> dict[str | None, list[Requirement]]:
"""Recompute this distribution's dependencies."""
- dm = self.__dep_map = {None: []}
+ self.__dep_map: dict[str | None, list[Requirement]] = {None: []}
- reqs = []
+ reqs: list[Requirement] = []
# Including any condition expressions
for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
reqs.extend(parse_requirements(req))
@@ -3126,13 +3384,15 @@ class DistInfoDistribution(Distribution):
yield req
common = types.MappingProxyType(dict.fromkeys(reqs_for_extra(None)))
- dm[None].extend(common)
+ self.__dep_map[None].extend(common)
for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
s_extra = safe_extra(extra.strip())
- dm[s_extra] = [r for r in reqs_for_extra(extra) if r not in common]
+ self.__dep_map[s_extra] = [
+ r for r in reqs_for_extra(extra) if r not in common
+ ]
- return dm
+ return self.__dep_map
_distributionImpl = {
@@ -3155,7 +3415,7 @@ def issue_warning(*args, **kw):
warnings.warn(stacklevel=level + 1, *args, **kw)
-def parse_requirements(strs):
+def parse_requirements(strs: _NestedStr):
"""
Yield ``Requirement`` objects for each specification in `strs`.
@@ -3164,19 +3424,20 @@ def parse_requirements(strs):
return map(Requirement, join_continuation(map(drop_comment, yield_lines(strs))))
-class RequirementParseError(packaging.requirements.InvalidRequirement):
+class RequirementParseError(_packaging_requirements.InvalidRequirement):
"Compatibility wrapper for InvalidRequirement"
-class Requirement(packaging.requirements.Requirement):
- def __init__(self, requirement_string):
+class Requirement(_packaging_requirements.Requirement):
+ def __init__(self, requirement_string: str):
"""DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
- super(Requirement, self).__init__(requirement_string)
+ super().__init__(requirement_string)
self.unsafe_name = self.name
project_name = safe_name(self.name)
self.project_name, self.key = project_name, project_name.lower()
self.specs = [(spec.operator, spec.version) for spec in self.specifier]
- self.extras = tuple(map(safe_extra, self.extras))
+ # packaging.requirements.Requirement uses a set for its extras. We use a variable-length tuple
+ self.extras: tuple[str] = tuple(map(safe_extra, self.extras))
self.hashCmp = (
self.key,
self.url,
@@ -3186,13 +3447,13 @@ class Requirement(packaging.requirements.Requirement):
)
self.__hash = hash(self.hashCmp)
- def __eq__(self, other):
+ def __eq__(self, other: object):
return isinstance(other, Requirement) and self.hashCmp == other.hashCmp
def __ne__(self, other):
return not self == other
- def __contains__(self, item):
+ def __contains__(self, item: Distribution | str | tuple[str, ...]) -> bool:
if isinstance(item, Distribution):
if item.key != self.key:
return False
@@ -3211,7 +3472,7 @@ class Requirement(packaging.requirements.Requirement):
return "Requirement.parse(%r)" % str(self)
@staticmethod
- def parse(s):
+ def parse(s: str | Iterable[str]):
(req,) = parse_requirements(s)
return req
@@ -3226,15 +3487,18 @@ def _always_object(classes):
return classes
-def _find_adapter(registry, ob):
+def _find_adapter(registry: Mapping[type, _AdapterT], ob: object) -> _AdapterT:
"""Return an adapter factory for `ob` from `registry`"""
types = _always_object(inspect.getmro(getattr(ob, '__class__', type(ob))))
for t in types:
if t in registry:
return registry[t]
+ # _find_adapter would previously return None, and immediately be called.
+ # So we're raising a TypeError to keep backward compatibility if anyone depended on that behaviour.
+ raise TypeError(f"Could not find adapter for {registry} and {ob}")
-def ensure_directory(path):
+def ensure_directory(path: StrOrBytesPath):
"""Ensure that the parent directory of `path` exists"""
dirname = os.path.dirname(path)
os.makedirs(dirname, exist_ok=True)
@@ -3243,7 +3507,7 @@ def ensure_directory(path):
def _bypass_ensure_directory(path):
"""Sandbox-bypassing version of ensure_directory()"""
if not WRITE_SUPPORT:
- raise IOError('"os.mkdir" not supported on this platform.')
+ raise OSError('"os.mkdir" not supported on this platform.')
dirname, filename = split(path)
if dirname and filename and not isdir(dirname):
_bypass_ensure_directory(dirname)
@@ -3253,7 +3517,7 @@ def _bypass_ensure_directory(path):
pass
-def split_sections(s):
+def split_sections(s: _NestedStr) -> Iterator[tuple[str | None, list[str]]]:
"""Split a string or iterable thereof into (section, content) pairs
Each ``section`` is a stripped version of the section header ("[section]")
@@ -3297,6 +3561,47 @@ def _mkstemp(*args, **kw):
warnings.filterwarnings("ignore", category=PEP440Warning, append=True)
+class PkgResourcesDeprecationWarning(Warning):
+ """
+ Base class for warning about deprecations in ``pkg_resources``
+
+ This class is not derived from ``DeprecationWarning``, and as such is
+ visible by default.
+ """
+
+
+# Ported from ``setuptools`` to avoid introducing an import inter-dependency:
+_LOCALE_ENCODING = "locale" if sys.version_info >= (3, 10) else None
+
+
+def _read_utf8_with_fallback(file: str, fallback_encoding=_LOCALE_ENCODING) -> str:
+ """See setuptools.unicode_utils._read_utf8_with_fallback"""
+ try:
+ with open(file, "r", encoding="utf-8") as f:
+ return f.read()
+ except UnicodeDecodeError: # pragma: no cover
+ msg = f"""\
+ ********************************************************************************
+ `encoding="utf-8"` fails with {file!r}, trying `encoding={fallback_encoding!r}`.
+
+ This fallback behaviour is considered **deprecated** and future versions of
+ `setuptools/pkg_resources` may not implement it.
+
+ Please encode {file!r} with "utf-8" to ensure future builds will succeed.
+
+ If this file was produced by `setuptools` itself, cleaning up the cached files
+ and re-building/re-installing the package with a newer version of `setuptools`
+ (e.g. by updating `build-system.requires` in its `pyproject.toml`)
+ might solve the problem.
+ ********************************************************************************
+ """
+ # TODO: Add a deadline?
+ # See comment in setuptools.unicode_utils._Utf8EncodingNeeded
+ warnings.warn(msg, PkgResourcesDeprecationWarning, stacklevel=2)
+ with open(file, "r", encoding=fallback_encoding) as f:
+ return f.read()
+
+
# from jaraco.functools 1.3
def _call_aside(f, *args, **kwargs):
f(*args, **kwargs)
@@ -3315,15 +3620,6 @@ def _initialize(g=globals()):
)
-class PkgResourcesDeprecationWarning(Warning):
- """
- Base class for warning about deprecations in ``pkg_resources``
-
- This class is not derived from ``DeprecationWarning``, and as such is
- visible by default.
- """
-
-
@_call_aside
def _initialize_master_working_set():
"""
@@ -3337,8 +3633,7 @@ def _initialize_master_working_set():
Invocation by other packages is unsupported and done
at their own risk.
"""
- working_set = WorkingSet._build_master()
- _declare_state('object', working_set=working_set)
+ working_set = _declare_state('object', 'working_set', WorkingSet._build_master())
require = working_set.require
iter_entry_points = working_set.iter_entry_points
@@ -3359,3 +3654,23 @@ def _initialize_master_working_set():
# match order
list(map(working_set.add_entry, sys.path))
globals().update(locals())
+
+
+if TYPE_CHECKING:
+ # All of these are set by the @_call_aside methods above
+ __resource_manager = ResourceManager() # Won't exist at runtime
+ resource_exists = __resource_manager.resource_exists
+ resource_isdir = __resource_manager.resource_isdir
+ resource_filename = __resource_manager.resource_filename
+ resource_stream = __resource_manager.resource_stream
+ resource_string = __resource_manager.resource_string
+ resource_listdir = __resource_manager.resource_listdir
+ set_extraction_path = __resource_manager.set_extraction_path
+ cleanup_resources = __resource_manager.cleanup_resources
+
+ working_set = WorkingSet()
+ require = working_set.require
+ iter_entry_points = working_set.iter_entry_points
+ add_activation_listener = working_set.subscribe
+ run_script = working_set.run_script
+ run_main = run_script
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc
index c7eced82..e700d911 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
index 5ebf5957..2325ec2e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py
@@ -1,7 +1,10 @@
"""
-Utilities for determining application-specific dirs. See for details and
-usage.
+Utilities for determining application-specific dirs.
+
+See for details and usage.
+
"""
+
from __future__ import annotations
import os
@@ -14,42 +17,42 @@ from .version import __version_tuple__ as __version_info__
if TYPE_CHECKING:
from pathlib import Path
+ from typing import Literal
- if sys.version_info >= (3, 8): # pragma: no cover (py38+)
- from typing import Literal
- else: # pragma: no cover (py38+)
- from pip._vendor.typing_extensions import Literal
+if sys.platform == "win32":
+ from pip._vendor.platformdirs.windows import Windows as _Result
+elif sys.platform == "darwin":
+ from pip._vendor.platformdirs.macos import MacOS as _Result
+else:
+ from pip._vendor.platformdirs.unix import Unix as _Result
def _set_platform_dir_class() -> type[PlatformDirsABC]:
- if sys.platform == "win32":
- from pip._vendor.platformdirs.windows import Windows as Result
- elif sys.platform == "darwin":
- from pip._vendor.platformdirs.macos import MacOS as Result
- else:
- from pip._vendor.platformdirs.unix import Unix as Result
-
if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
if os.getenv("SHELL") or os.getenv("PREFIX"):
- return Result
+ return _Result
- from pip._vendor.platformdirs.android import _android_folder
+ from pip._vendor.platformdirs.android import _android_folder # noqa: PLC0415
if _android_folder() is not None:
- from pip._vendor.platformdirs.android import Android
+ from pip._vendor.platformdirs.android import Android # noqa: PLC0415
- return Android # return to avoid redefinition of result
+ return Android # return to avoid redefinition of a result
- return Result
+ return _Result
-PlatformDirs = _set_platform_dir_class() #: Currently active platform
+if TYPE_CHECKING:
+ # Work around mypy issue: https://github.com/python/mypy/issues/10962
+ PlatformDirs = _Result
+else:
+ PlatformDirs = _set_platform_dir_class() #: Currently active platform
AppDirs = PlatformDirs #: Backwards compatibility with appdirs
def user_data_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -73,7 +76,7 @@ def user_data_dir(
def site_data_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
multipath: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -97,7 +100,7 @@ def site_data_dir(
def user_config_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -121,7 +124,7 @@ def user_config_dir(
def site_config_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
multipath: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -145,7 +148,7 @@ def site_config_dir(
def user_cache_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -169,7 +172,7 @@ def user_cache_dir(
def site_cache_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -193,7 +196,7 @@ def site_cache_dir(
def user_state_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -217,7 +220,7 @@ def user_state_dir(
def user_log_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -264,9 +267,14 @@ def user_music_dir() -> str:
return PlatformDirs().user_music_dir
+def user_desktop_dir() -> str:
+ """:returns: desktop directory tied to the user"""
+ return PlatformDirs().user_desktop_dir
+
+
def user_runtime_dir(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -288,9 +296,33 @@ def user_runtime_dir(
).user_runtime_dir
+def site_runtime_dir(
+ appname: str | None = None,
+ appauthor: str | Literal[False] | None = None,
+ version: str | None = None,
+ opinion: bool = True, # noqa: FBT001, FBT002
+ ensure_exists: bool = False, # noqa: FBT001, FBT002
+) -> str:
+ """
+ :param appname: See `appname `.
+ :param appauthor: See `appauthor `.
+ :param version: See `version `.
+ :param opinion: See `opinion `.
+ :param ensure_exists: See `ensure_exists `.
+ :returns: runtime directory shared by users
+ """
+ return PlatformDirs(
+ appname=appname,
+ appauthor=appauthor,
+ version=version,
+ opinion=opinion,
+ ensure_exists=ensure_exists,
+ ).site_runtime_dir
+
+
def user_data_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -314,7 +346,7 @@ def user_data_path(
def site_data_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
multipath: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -338,7 +370,7 @@ def site_data_path(
def user_config_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -362,7 +394,7 @@ def user_config_path(
def site_config_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
multipath: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -386,7 +418,7 @@ def site_config_path(
def site_cache_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -410,7 +442,7 @@ def site_cache_path(
def user_cache_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -434,7 +466,7 @@ def user_cache_path(
def user_state_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -458,7 +490,7 @@ def user_state_path(
def user_log_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -481,7 +513,7 @@ def user_log_path(
def user_documents_path() -> Path:
- """:returns: documents path tied to the user"""
+ """:returns: documents a path tied to the user"""
return PlatformDirs().user_documents_path
@@ -505,9 +537,14 @@ def user_music_path() -> Path:
return PlatformDirs().user_music_path
+def user_desktop_path() -> Path:
+ """:returns: desktop path tied to the user"""
+ return PlatformDirs().user_desktop_path
+
+
def user_runtime_path(
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
opinion: bool = True, # noqa: FBT001, FBT002
ensure_exists: bool = False, # noqa: FBT001, FBT002
@@ -529,38 +566,66 @@ def user_runtime_path(
).user_runtime_path
+def site_runtime_path(
+ appname: str | None = None,
+ appauthor: str | Literal[False] | None = None,
+ version: str | None = None,
+ opinion: bool = True, # noqa: FBT001, FBT002
+ ensure_exists: bool = False, # noqa: FBT001, FBT002
+) -> Path:
+ """
+ :param appname: See `appname `.
+ :param appauthor: See `appauthor `.
+ :param version: See `version `.
+ :param opinion: See `opinion `.
+ :param ensure_exists: See `ensure_exists `.
+ :returns: runtime path shared by users
+ """
+ return PlatformDirs(
+ appname=appname,
+ appauthor=appauthor,
+ version=version,
+ opinion=opinion,
+ ensure_exists=ensure_exists,
+ ).site_runtime_path
+
+
__all__ = [
+ "AppDirs",
+ "PlatformDirs",
+ "PlatformDirsABC",
"__version__",
"__version_info__",
- "PlatformDirs",
- "AppDirs",
- "PlatformDirsABC",
- "user_data_dir",
- "user_config_dir",
- "user_cache_dir",
- "user_state_dir",
- "user_log_dir",
- "user_documents_dir",
- "user_downloads_dir",
- "user_pictures_dir",
- "user_videos_dir",
- "user_music_dir",
- "user_runtime_dir",
- "site_data_dir",
- "site_config_dir",
"site_cache_dir",
- "user_data_path",
- "user_config_path",
- "user_cache_path",
- "user_state_path",
- "user_log_path",
- "user_documents_path",
- "user_downloads_path",
- "user_pictures_path",
- "user_videos_path",
- "user_music_path",
- "user_runtime_path",
- "site_data_path",
- "site_config_path",
"site_cache_path",
+ "site_config_dir",
+ "site_config_path",
+ "site_data_dir",
+ "site_data_path",
+ "site_runtime_dir",
+ "site_runtime_path",
+ "user_cache_dir",
+ "user_cache_path",
+ "user_config_dir",
+ "user_config_path",
+ "user_data_dir",
+ "user_data_path",
+ "user_desktop_dir",
+ "user_desktop_path",
+ "user_documents_dir",
+ "user_documents_path",
+ "user_downloads_dir",
+ "user_downloads_path",
+ "user_log_dir",
+ "user_log_path",
+ "user_music_dir",
+ "user_music_path",
+ "user_pictures_dir",
+ "user_pictures_path",
+ "user_runtime_dir",
+ "user_runtime_path",
+ "user_state_dir",
+ "user_state_path",
+ "user_videos_dir",
+ "user_videos_path",
]
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
index 6a0d6dd1..fa8a677a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py
@@ -1,4 +1,5 @@
"""Main entry point."""
+
from __future__ import annotations
from pip._vendor.platformdirs import PlatformDirs, __version__
@@ -18,11 +19,12 @@ PROPS = (
"site_data_dir",
"site_config_dir",
"site_cache_dir",
+ "site_runtime_dir",
)
def main() -> None:
- """Run main entry point."""
+ """Run the main entry point."""
app_name = "MyApp"
app_author = "MyCompany"
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc
index 7520659c..62053005 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc
index 38039844..5f8caf98 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc
index 722fe26b..09f9e2cc 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc
index 82a7c456..7638f876 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc
index 0b2c18dd..f508d4c8 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc
index af13c125..33df16c2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc
index 654df695..d9227d72 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc
index f0939693..ba46a4f2 100644
Binary files a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc and b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-312.pyc differ
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py
index 76527dda..92efc852 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py
@@ -1,27 +1,29 @@
"""Android."""
+
from __future__ import annotations
import os
import re
import sys
from functools import lru_cache
-from typing import cast
+from typing import TYPE_CHECKING, cast
from .api import PlatformDirsABC
class Android(PlatformDirsABC):
"""
- Follows the guidance `from here `_. Makes use of the
- `appname `,
- `version `,
- `ensure_exists `.
+ Follows the guidance `from here `_.
+
+ Makes use of the `appname `, `version
+ `, `ensure_exists `.
+
"""
@property
def user_data_dir(self) -> str:
""":return: data directory tied to the user, e.g. ``/data/user///files/``"""
- return self._append_app_name_and_version(cast(str, _android_folder()), "files")
+ return self._append_app_name_and_version(cast("str", _android_folder()), "files")
@property
def site_data_dir(self) -> str:
@@ -34,7 +36,7 @@ class Android(PlatformDirsABC):
:return: config directory tied to the user, e.g. \
``/data/user///shared_prefs/``
"""
- return self._append_app_name_and_version(cast(str, _android_folder()), "shared_prefs")
+ return self._append_app_name_and_version(cast("str", _android_folder()), "shared_prefs")
@property
def site_config_dir(self) -> str:
@@ -43,8 +45,8 @@ class Android(PlatformDirsABC):
@property
def user_cache_dir(self) -> str:
- """:return: cache directory tied to the user, e.g. e.g. ``/data/user///cache/``"""
- return self._append_app_name_and_version(cast(str, _android_folder()), "cache")
+ """:return: cache directory tied to the user, e.g.,``/data/user///cache/``"""
+ return self._append_app_name_and_version(cast("str", _android_folder()), "cache")
@property
def site_cache_dir(self) -> str:
@@ -92,6 +94,11 @@ class Android(PlatformDirsABC):
""":return: music directory tied to the user e.g. ``/storage/emulated/0/Music``"""
return _android_music_folder()
+ @property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user e.g. ``/storage/emulated/0/Desktop``"""
+ return "/storage/emulated/0/Desktop"
+
@property
def user_runtime_dir(self) -> str:
"""
@@ -103,18 +110,40 @@ class Android(PlatformDirsABC):
path = os.path.join(path, "tmp") # noqa: PTH118
return path
+ @property
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users, same as `user_runtime_dir`"""
+ return self.user_runtime_dir
+
@lru_cache(maxsize=1)
-def _android_folder() -> str | None:
+def _android_folder() -> str | None: # noqa: C901
""":return: base folder for the Android OS or None if it cannot be found"""
- try:
- # First try to get path to android app via pyjnius
- from jnius import autoclass
+ result: str | None = None
+ # type checker isn't happy with our "import android", just don't do this when type checking see
+ # https://stackoverflow.com/a/61394121
+ if not TYPE_CHECKING:
+ try:
+ # First try to get a path to android app using python4android (if available)...
+ from android import mActivity # noqa: PLC0415
- context = autoclass("android.content.Context")
- result: str | None = context.getFilesDir().getParentFile().getAbsolutePath()
- except Exception: # noqa: BLE001
- # if fails find an android folder looking path on the sys.path
+ context = cast("android.content.Context", mActivity.getApplicationContext()) # noqa: F821
+ result = context.getFilesDir().getParentFile().getAbsolutePath()
+ except Exception: # noqa: BLE001
+ result = None
+ if result is None:
+ try:
+ # ...and fall back to using plain pyjnius, if python4android isn't available or doesn't deliver any useful
+ # result...
+ from jnius import autoclass # noqa: PLC0415
+
+ context = autoclass("android.content.Context")
+ result = context.getFilesDir().getParentFile().getAbsolutePath()
+ except Exception: # noqa: BLE001
+ result = None
+ if result is None:
+ # and if that fails, too, find an android folder looking at path on the sys.path
+ # warning: only works for apps installed under /data, not adopted storage etc.
pattern = re.compile(r"/data/(data|user/\d+)/(.+)/files")
for path in sys.path:
if pattern.match(path):
@@ -122,6 +151,16 @@ def _android_folder() -> str | None:
break
else:
result = None
+ if result is None:
+ # one last try: find an android folder looking at path on the sys.path taking adopted storage paths into
+ # account
+ pattern = re.compile(r"/mnt/expand/[a-fA-F0-9-]{36}/(data|user/\d+)/(.+)/files")
+ for path in sys.path:
+ if pattern.match(path):
+ result = path.split("/files")[0]
+ break
+ else:
+ result = None
return result
@@ -130,7 +169,7 @@ def _android_documents_folder() -> str:
""":return: documents folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -146,7 +185,7 @@ def _android_downloads_folder() -> str:
""":return: downloads folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -162,7 +201,7 @@ def _android_pictures_folder() -> str:
""":return: pictures folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -178,7 +217,7 @@ def _android_videos_folder() -> str:
""":return: videos folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
@@ -194,7 +233,7 @@ def _android_music_folder() -> str:
""":return: music folder for the Android OS"""
# Get directories with pyjnius
try:
- from jnius import autoclass
+ from jnius import autoclass # noqa: PLC0415
context = autoclass("android.content.Context")
environment = autoclass("android.os.Environment")
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py
index d64ebb9d..a352035e 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py
@@ -1,4 +1,5 @@
"""Base API."""
+
from __future__ import annotations
import os
@@ -7,21 +8,17 @@ from pathlib import Path
from typing import TYPE_CHECKING
if TYPE_CHECKING:
- import sys
-
- if sys.version_info >= (3, 8): # pragma: no cover (py38+)
- from typing import Literal
- else: # pragma: no cover (py38+)
- from pip._vendor.typing_extensions import Literal
+ from collections.abc import Iterator
+ from typing import Literal
-class PlatformDirsABC(ABC):
+class PlatformDirsABC(ABC): # noqa: PLR0904
"""Abstract base class for platform directories."""
- def __init__( # noqa: PLR0913
+ def __init__( # noqa: PLR0913, PLR0917
self,
appname: str | None = None,
- appauthor: str | None | Literal[False] = None,
+ appauthor: str | Literal[False] | None = None,
version: str | None = None,
roaming: bool = False, # noqa: FBT001, FBT002
multipath: bool = False, # noqa: FBT001, FBT002
@@ -38,34 +35,47 @@ class PlatformDirsABC(ABC):
:param multipath: See `multipath`.
:param opinion: See `opinion`.
:param ensure_exists: See `ensure_exists`.
+
"""
self.appname = appname #: The name of application.
self.appauthor = appauthor
"""
- The name of the app author or distributing body for this application. Typically, it is the owning company name.
- Defaults to `appname`. You may pass ``False`` to disable it.
+ The name of the app author or distributing body for this application.
+
+ Typically, it is the owning company name. Defaults to `appname`. You may pass ``False`` to disable it.
+
"""
self.version = version
"""
- An optional version path element to append to the path. You might want to use this if you want multiple versions
- of your app to be able to run independently. If used, this would typically be ``.``.
+ An optional version path element to append to the path.
+
+ You might want to use this if you want multiple versions of your app to be able to run independently. If used,
+ this would typically be ``.``.
+
"""
self.roaming = roaming
"""
- Whether to use the roaming appdata directory on Windows. That means that for users on a Windows network setup
- for roaming profiles, this user data will be synced on login (see
- `here `_).
+ Whether to use the roaming appdata directory on Windows.
+
+ That means that for users on a Windows network setup for roaming profiles, this user data will be synced on
+ login (see
+ `here `_).
+
"""
self.multipath = multipath
"""
- An optional parameter only applicable to Unix/Linux which indicates that the entire list of data dirs should be
- returned. By default, the first item would only be returned.
+ An optional parameter which indicates that the entire list of data dirs should be returned.
+
+ By default, the first item would only be returned.
+
"""
self.opinion = opinion #: A flag to indicating to use opinionated values.
self.ensure_exists = ensure_exists
"""
Optionally create the directory (and any missing parents) upon access if it does not exist.
+
By default, no directories are created.
+
"""
def _append_app_name_and_version(self, *base: str) -> str:
@@ -82,6 +92,12 @@ class PlatformDirsABC(ABC):
if self.ensure_exists:
Path(path).mkdir(parents=True, exist_ok=True)
+ def _first_item_as_path_if_multipath(self, directory: str) -> Path:
+ if self.multipath:
+ # If multipath is True, the first path is returned.
+ directory = directory.split(os.pathsep)[0]
+ return Path(directory)
+
@property
@abstractmethod
def user_data_dir(self) -> str:
@@ -147,11 +163,21 @@ class PlatformDirsABC(ABC):
def user_music_dir(self) -> str:
""":return: music directory tied to the user"""
+ @property
+ @abstractmethod
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user"""
+
@property
@abstractmethod
def user_runtime_dir(self) -> str:
""":return: runtime directory tied to the user"""
+ @property
+ @abstractmethod
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users"""
+
@property
def user_data_path(self) -> Path:
""":return: data path tied to the user"""
@@ -194,7 +220,7 @@ class PlatformDirsABC(ABC):
@property
def user_documents_path(self) -> Path:
- """:return: documents path tied to the user"""
+ """:return: documents a path tied to the user"""
return Path(self.user_documents_dir)
@property
@@ -217,7 +243,57 @@ class PlatformDirsABC(ABC):
""":return: music path tied to the user"""
return Path(self.user_music_dir)
+ @property
+ def user_desktop_path(self) -> Path:
+ """:return: desktop path tied to the user"""
+ return Path(self.user_desktop_dir)
+
@property
def user_runtime_path(self) -> Path:
""":return: runtime path tied to the user"""
return Path(self.user_runtime_dir)
+
+ @property
+ def site_runtime_path(self) -> Path:
+ """:return: runtime path shared by users"""
+ return Path(self.site_runtime_dir)
+
+ def iter_config_dirs(self) -> Iterator[str]:
+ """:yield: all user and site configuration directories."""
+ yield self.user_config_dir
+ yield self.site_config_dir
+
+ def iter_data_dirs(self) -> Iterator[str]:
+ """:yield: all user and site data directories."""
+ yield self.user_data_dir
+ yield self.site_data_dir
+
+ def iter_cache_dirs(self) -> Iterator[str]:
+ """:yield: all user and site cache directories."""
+ yield self.user_cache_dir
+ yield self.site_cache_dir
+
+ def iter_runtime_dirs(self) -> Iterator[str]:
+ """:yield: all user and site runtime directories."""
+ yield self.user_runtime_dir
+ yield self.site_runtime_dir
+
+ def iter_config_paths(self) -> Iterator[Path]:
+ """:yield: all user and site configuration paths."""
+ for path in self.iter_config_dirs():
+ yield Path(path)
+
+ def iter_data_paths(self) -> Iterator[Path]:
+ """:yield: all user and site data paths."""
+ for path in self.iter_data_dirs():
+ yield Path(path)
+
+ def iter_cache_paths(self) -> Iterator[Path]:
+ """:yield: all user and site cache paths."""
+ for path in self.iter_cache_dirs():
+ yield Path(path)
+
+ def iter_runtime_paths(self) -> Iterator[Path]:
+ """:yield: all user and site runtime paths."""
+ for path in self.iter_runtime_dirs():
+ yield Path(path)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py
index a753e2a3..e4b0391a 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py
@@ -1,18 +1,27 @@
"""macOS."""
+
from __future__ import annotations
import os.path
+import sys
+from typing import TYPE_CHECKING
from .api import PlatformDirsABC
+if TYPE_CHECKING:
+ from pathlib import Path
+
class MacOS(PlatformDirsABC):
"""
- Platform directories for the macOS operating system. Follows the guidance from `Apple documentation
- `_.
+ Platform directories for the macOS operating system.
+
+ Follows the guidance from
+ `Apple documentation `_.
Makes use of the `appname `,
`version `,
`ensure_exists `.
+
"""
@property
@@ -22,8 +31,25 @@ class MacOS(PlatformDirsABC):
@property
def site_data_dir(self) -> str:
- """:return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``"""
- return self._append_app_name_and_version("/Library/Application Support")
+ """
+ :return: data directory shared by users, e.g. ``/Library/Application Support/$appname/$version``.
+ If we're using a Python binary managed by `Homebrew `_, the directory
+ will be under the Homebrew prefix, e.g. ``/opt/homebrew/share/$appname/$version``.
+ If `multipath ` is enabled, and we're in Homebrew,
+ the response is a multi-path string separated by ":", e.g.
+ ``/opt/homebrew/share/$appname/$version:/Library/Application Support/$appname/$version``
+ """
+ is_homebrew = sys.prefix.startswith("/opt/homebrew")
+ path_list = [self._append_app_name_and_version("/opt/homebrew/share")] if is_homebrew else []
+ path_list.append(self._append_app_name_and_version("/Library/Application Support"))
+ if self.multipath:
+ return os.pathsep.join(path_list)
+ return path_list[0]
+
+ @property
+ def site_data_path(self) -> Path:
+ """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
+ return self._first_item_as_path_if_multipath(self.site_data_dir)
@property
def user_config_dir(self) -> str:
@@ -42,8 +68,25 @@ class MacOS(PlatformDirsABC):
@property
def site_cache_dir(self) -> str:
- """:return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``"""
- return self._append_app_name_and_version("/Library/Caches")
+ """
+ :return: cache directory shared by users, e.g. ``/Library/Caches/$appname/$version``.
+ If we're using a Python binary managed by `Homebrew `_, the directory
+ will be under the Homebrew prefix, e.g. ``/opt/homebrew/var/cache/$appname/$version``.
+ If `multipath ` is enabled, and we're in Homebrew,
+ the response is a multi-path string separated by ":", e.g.
+ ``/opt/homebrew/var/cache/$appname/$version:/Library/Caches/$appname/$version``
+ """
+ is_homebrew = sys.prefix.startswith("/opt/homebrew")
+ path_list = [self._append_app_name_and_version("/opt/homebrew/var/cache")] if is_homebrew else []
+ path_list.append(self._append_app_name_and_version("/Library/Caches"))
+ if self.multipath:
+ return os.pathsep.join(path_list)
+ return path_list[0]
+
+ @property
+ def site_cache_path(self) -> Path:
+ """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
+ return self._first_item_as_path_if_multipath(self.site_cache_dir)
@property
def user_state_dir(self) -> str:
@@ -80,11 +123,21 @@ class MacOS(PlatformDirsABC):
""":return: music directory tied to the user, e.g. ``~/Music``"""
return os.path.expanduser("~/Music") # noqa: PTH111
+ @property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
+ return os.path.expanduser("~/Desktop") # noqa: PTH111
+
@property
def user_runtime_dir(self) -> str:
""":return: runtime directory tied to the user, e.g. ``~/Library/Caches/TemporaryItems/$appname/$version``"""
return self._append_app_name_and_version(os.path.expanduser("~/Library/Caches/TemporaryItems")) # noqa: PTH111
+ @property
+ def site_runtime_dir(self) -> str:
+ """:return: runtime directory shared by users, same as `user_runtime_dir`"""
+ return self.user_runtime_dir
+
__all__ = [
"MacOS",
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
index 468b0ab4..fc75d8d0 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
@@ -1,16 +1,21 @@
"""Unix."""
+
from __future__ import annotations
import os
import sys
from configparser import ConfigParser
from pathlib import Path
+from typing import TYPE_CHECKING, NoReturn
from .api import PlatformDirsABC
+if TYPE_CHECKING:
+ from collections.abc import Iterator
+
if sys.platform == "win32":
- def getuid() -> int:
+ def getuid() -> NoReturn:
msg = "should only be used on Unix"
raise RuntimeError(msg)
@@ -18,17 +23,17 @@ else:
from os import getuid
-class Unix(PlatformDirsABC):
+class Unix(PlatformDirsABC): # noqa: PLR0904
"""
- On Unix/Linux, we follow the
- `XDG Basedir Spec `_. The spec allows
- overriding directories with environment variables. The examples show are the default values, alongside the name of
- the environment variable that overrides them. Makes use of the
- `appname `,
- `version `,
- `multipath `,
- `opinion `,
- `ensure_exists `.
+ On Unix/Linux, we follow the `XDG Basedir Spec `_.
+
+ The spec allows overriding directories with environment variables. The examples shown are the default values,
+ alongside the name of the environment variable that overrides them. Makes use of the `appname
+ `, `version `, `multipath
+ `, `opinion `, `ensure_exists
+ `.
+
"""
@property
@@ -43,24 +48,24 @@ class Unix(PlatformDirsABC):
return self._append_app_name_and_version(path)
@property
- def site_data_dir(self) -> str:
- """
- :return: data directories shared by users (if `multipath ` is
- enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
- path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
- """
- # XDG default for $XDG_DATA_DIRS; only first, if multipath is False
+ def _site_data_dirs(self) -> list[str]:
path = os.environ.get("XDG_DATA_DIRS", "")
if not path.strip():
path = f"/usr/local/share{os.pathsep}/usr/share"
- return self._with_multi_path(path)
+ return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
- def _with_multi_path(self, path: str) -> str:
- path_list = path.split(os.pathsep)
+ @property
+ def site_data_dir(self) -> str:
+ """
+ :return: data directories shared by users (if `multipath ` is
+ enabled and ``XDG_DATA_DIRS`` is set and a multi path the response is also a multi path separated by the
+ OS path separator), e.g. ``/usr/local/share/$appname/$version`` or ``/usr/share/$appname/$version``
+ """
+ # XDG default for $XDG_DATA_DIRS; only first, if multipath is False
+ dirs = self._site_data_dirs
if not self.multipath:
- path_list = path_list[0:1]
- path_list = [self._append_app_name_and_version(os.path.expanduser(p)) for p in path_list] # noqa: PTH111
- return os.pathsep.join(path_list)
+ return dirs[0]
+ return os.pathsep.join(dirs)
@property
def user_config_dir(self) -> str:
@@ -74,17 +79,24 @@ class Unix(PlatformDirsABC):
return self._append_app_name_and_version(path)
@property
- def site_config_dir(self) -> str:
- """
- :return: config directories shared by users (if `multipath `
- is enabled and ``XDG_DATA_DIR`` is set and a multi path the response is also a multi path separated by the OS
- path separator), e.g. ``/etc/xdg/$appname/$version``
- """
- # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False
+ def _site_config_dirs(self) -> list[str]:
path = os.environ.get("XDG_CONFIG_DIRS", "")
if not path.strip():
path = "/etc/xdg"
- return self._with_multi_path(path)
+ return [self._append_app_name_and_version(p) for p in path.split(os.pathsep)]
+
+ @property
+ def site_config_dir(self) -> str:
+ """
+ :return: config directories shared by users (if `multipath `
+ is enabled and ``XDG_CONFIG_DIRS`` is set and a multi path the response is also a multi path separated by
+ the OS path separator), e.g. ``/etc/xdg/$appname/$version``
+ """
+ # XDG default for $XDG_CONFIG_DIRS only first, if multipath is False
+ dirs = self._site_config_dirs
+ if not self.multipath:
+ return dirs[0]
+ return os.pathsep.join(dirs)
@property
def user_cache_dir(self) -> str:
@@ -99,8 +111,8 @@ class Unix(PlatformDirsABC):
@property
def site_cache_dir(self) -> str:
- """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``"""
- return self._append_app_name_and_version("/var/tmp") # noqa: S108
+ """:return: cache directory shared by users, e.g. ``/var/cache/$appname/$version``"""
+ return self._append_app_name_and_version("/var/cache")
@property
def user_state_dir(self) -> str:
@@ -119,6 +131,7 @@ class Unix(PlatformDirsABC):
path = self.user_state_dir
if self.opinion:
path = os.path.join(path, "log") # noqa: PTH118
+ self._optionally_create_directory(path)
return path
@property
@@ -146,6 +159,11 @@ class Unix(PlatformDirsABC):
""":return: music directory tied to the user, e.g. ``~/Music``"""
return _get_user_media_dir("XDG_MUSIC_DIR", "~/Music")
+ @property
+ def user_desktop_dir(self) -> str:
+ """:return: desktop directory tied to the user, e.g. ``~/Desktop``"""
+ return _get_user_media_dir("XDG_DESKTOP_DIR", "~/Desktop")
+
@property
def user_runtime_dir(self) -> str:
"""
@@ -166,26 +184,52 @@ class Unix(PlatformDirsABC):
path = f"/run/user/{getuid()}"
return self._append_app_name_and_version(path)
+ @property
+ def site_runtime_dir(self) -> str:
+ """
+ :return: runtime directory shared by users, e.g. ``/run/$appname/$version`` or \
+ ``$XDG_RUNTIME_DIR/$appname/$version``.
+
+ Note that this behaves almost exactly like `user_runtime_dir` if ``$XDG_RUNTIME_DIR`` is set, but will
+ fall back to paths associated to the root user instead of a regular logged-in user if it's not set.
+
+ If you wish to ensure that a logged-in root user path is returned e.g. ``/run/user/0``, use `user_runtime_dir`
+ instead.
+
+ For FreeBSD/OpenBSD/NetBSD, it would return ``/var/run/$appname/$version`` if ``$XDG_RUNTIME_DIR`` is not set.
+ """
+ path = os.environ.get("XDG_RUNTIME_DIR", "")
+ if not path.strip():
+ if sys.platform.startswith(("freebsd", "openbsd", "netbsd")):
+ path = "/var/run"
+ else:
+ path = "/run"
+ return self._append_app_name_and_version(path)
+
@property
def site_data_path(self) -> Path:
- """:return: data path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: data path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_data_dir)
@property
def site_config_path(self) -> Path:
- """:return: config path shared by the users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: config path shared by the users, returns the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_config_dir)
@property
def site_cache_path(self) -> Path:
- """:return: cache path shared by users. Only return first item, even if ``multipath`` is set to ``True``"""
+ """:return: cache path shared by users. Only return the first item, even if ``multipath`` is set to ``True``"""
return self._first_item_as_path_if_multipath(self.site_cache_dir)
- def _first_item_as_path_if_multipath(self, directory: str) -> Path:
- if self.multipath:
- # If multipath is True, the first path is returned.
- directory = directory.split(os.pathsep)[0]
- return Path(directory)
+ def iter_config_dirs(self) -> Iterator[str]:
+ """:yield: all user and site configuration directories."""
+ yield self.user_config_dir
+ yield from self._site_config_dirs
+
+ def iter_data_dirs(self) -> Iterator[str]:
+ """:yield: all user and site data directories."""
+ yield self.user_data_dir
+ yield from self._site_data_dirs
def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
@@ -199,7 +243,12 @@ def _get_user_media_dir(env_var: str, fallback_tilde_path: str) -> str:
def _get_user_dirs_folder(key: str) -> str | None:
- """Return directory from user-dirs.dirs config file. See https://freedesktop.org/wiki/Software/xdg-user-dirs/."""
+ """
+ Return directory from user-dirs.dirs config file.
+
+ See https://freedesktop.org/wiki/Software/xdg-user-dirs/.
+
+ """
user_dirs_config_path = Path(Unix().user_config_dir) / "user-dirs.dirs"
if user_dirs_config_path.exists():
parser = ConfigParser()
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py
index dc8c44cf..611ac615 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py
@@ -1,4 +1,21 @@
-# file generated by setuptools_scm
+# file generated by setuptools-scm
# don't change, don't track in version control
-__version__ = version = '3.8.1'
-__version_tuple__ = version_tuple = (3, 8, 1)
+
+__all__ = ["__version__", "__version_tuple__", "version", "version_tuple"]
+
+TYPE_CHECKING = False
+if TYPE_CHECKING:
+ from typing import Tuple
+ from typing import Union
+
+ VERSION_TUPLE = Tuple[Union[int, str], ...]
+else:
+ VERSION_TUPLE = object
+
+version: str
+__version__: str
+__version_tuple__: VERSION_TUPLE
+version_tuple: VERSION_TUPLE
+
+__version__ = version = '4.3.8'
+__version_tuple__ = version_tuple = (4, 3, 8)
diff --git a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py
index b52c9c6e..d7bc9609 100644
--- a/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py
+++ b/gnx-react/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py
@@ -1,7 +1,7 @@
"""Windows."""
+
from __future__ import annotations
-import ctypes
import os
import sys
from functools import lru_cache
@@ -15,15 +15,13 @@ if TYPE_CHECKING:
class Windows(PlatformDirsABC):
"""
- `MSDN on where to store app data files
- `_.
- Makes use of the
- `appname