diff --git a/.gitignore b/.gitignore index 2915784d..adff65f4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ dbtest.sqlite3 db.sqlite3 db.sqlite3.backup db.sqlite* +*.sqlite3 media car*.json car_inventory/settings.py diff --git a/car_inventory/urls.py b/car_inventory/urls.py index 74198b9d..0c31a49c 100644 --- a/car_inventory/urls.py +++ b/car_inventory/urls.py @@ -34,5 +34,3 @@ urlpatterns += i18n_patterns( ) urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - - diff --git a/haikalbot/migrations/0001_initial.py b/haikalbot/migrations/0001_initial.py index 6d70604b..cd7b2ba0 100644 --- a/haikalbot/migrations/0001_initial.py +++ b/haikalbot/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-07-10 12:55 +# Generated by Django 5.2.4 on 2025-07-14 15:04 import django.db.models.deletion import django.utils.timezone diff --git a/haikalbot/migrations/0002_initial.py b/haikalbot/migrations/0002_initial.py index dd38a5d5..c99c48d9 100644 --- a/haikalbot/migrations/0002_initial.py +++ b/haikalbot/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-07-10 12:55 +# Generated by Django 5.2.4 on 2025-07-14 15:04 import django.db.models.deletion from django.db import migrations, models diff --git a/inventory/forms.py b/inventory/forms.py index 04400017..dbb1e181 100644 --- a/inventory/forms.py +++ b/inventory/forms.py @@ -144,7 +144,7 @@ class StaffForm(forms.ModelForm): ) class Meta: model = Staff - fields = ["name", "arabic_name", "phone_number", "address","image","group"] + fields = ["name", "arabic_name", "phone_number", "address","logo","group"] # Dealer Form diff --git a/inventory/management/commands/set_vat.py b/inventory/management/commands/set_vat.py deleted file mode 100644 index d80c9293..00000000 --- a/inventory/management/commands/set_vat.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.core.management.base import BaseCommand -from inventory.models import VatRate -from decimal import Decimal - - -class Command(BaseCommand): - def handle(self, *args, **kwargs): - VatRate.objects.get_or_create(rate=Decimal("0.15"), is_active=True) diff --git a/inventory/migrations/0001_initial.py b/inventory/migrations/0001_initial.py index b53295ed..117ccfc0 100644 --- a/inventory/migrations/0001_initial.py +++ b/inventory/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.7 on 2025-07-10 12:55 +# Generated by Django 5.2.4 on 2025-07-14 15:04 import datetime import django.core.serializers.json @@ -19,10 +19,10 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('appointment', '__first__'), + ('appointment', '0001_initial'), ('auth', '0012_alter_user_first_name_max_length'), ('contenttypes', '0002_remove_content_type_name'), - ('django_ledger', '0021_alter_bankaccountmodel_account_model_and_more'), + ('django_ledger', '0022_alter_billmodel_bill_items_and_more'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] @@ -54,61 +54,21 @@ class Migration(migrations.Migration): ], options={ 'verbose_name': 'Make', + 'indexes': [models.Index(fields=['name'], name='car_make_name_idx'), models.Index(fields=['is_sa_import'], name='car_make_sa_import_idx'), models.Index(fields=['car_type'], name='car_make_type_idx')], }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( - name='ExteriorColors', + name='CarModel', fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), + ('id_car_model', models.AutoField(primary_key=True, serialize=False)), + ('name', models.CharField(blank=True, max_length=255, null=True)), + ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), + ('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)), + ('id_car_make', models.ForeignKey(db_column='id_car_make', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake')), ], options={ - 'verbose_name': 'Exterior Colors', - 'verbose_name_plural': 'Exterior Colors', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='InteriorColors', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), - ], - options={ - 'verbose_name': 'Interior Colors', - 'verbose_name_plural': 'Interior Colors', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.CreateModel( - name='VatRate', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('rate', models.DecimalField(decimal_places=2, default=Decimal('0.15'), max_digits=5)), - ('is_active', models.BooleanField(default=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ], - ), - migrations.CreateModel( - name='AdditionalServices', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255, verbose_name='Name')), - ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), - ('description', models.TextField(verbose_name='Description')), - ('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Price')), - ('taxable', models.BooleanField(default=False, verbose_name='taxable')), - ('uom', models.CharField(choices=[('EA', 'Each'), ('PR', 'Pair'), ('SET', 'Set'), ('GAL', 'Gallon'), ('L', 'Liter'), ('M', 'Meter'), ('KG', 'Kilogram'), ('HR', 'Hour'), ('BX', 'Box'), ('RL', 'Roll'), ('PKG', 'Package'), ('DZ', 'Dozen'), ('SQ_M', 'Square Meter'), ('PC', 'Piece'), ('BDL', 'Bundle')], max_length=10, verbose_name='Unit of Measurement')), - ('item', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.itemmodel', verbose_name='Item')), - ], - options={ - 'verbose_name': 'Additional Services', - 'verbose_name_plural': 'Additional Services', + 'verbose_name': 'Model', }, bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), @@ -129,47 +89,13 @@ class Migration(migrations.Migration): ('hash', models.CharField(blank=True, max_length=64, null=True, verbose_name='Hash')), ('item_model', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='django_ledger.itemmodel', verbose_name='Item Model')), ('id_car_make', models.ForeignKey(blank=True, db_column='id_car_make', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake', verbose_name='Make')), + ('id_car_model', models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model')), ], options={ 'verbose_name': 'Car', 'verbose_name_plural': 'Cars', }, ), - migrations.CreateModel( - name='CarFinance', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cost_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Cost Price')), - ('selling_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Selling Price')), - ('discount_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Discount Amount')), - ('is_sold', models.BooleanField(default=False)), - ('additional_services', models.ManyToManyField(blank=True, related_name='additional_finances', to='inventory.additionalservices')), - ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car')), - ], - options={ - 'verbose_name': 'Car Financial Details', - 'verbose_name_plural': 'Car Financial Details', - }, - ), - migrations.CreateModel( - name='CarModel', - fields=[ - ('id_car_model', models.AutoField(primary_key=True, serialize=False)), - ('name', models.CharField(blank=True, max_length=255, null=True)), - ('arabic_name', models.CharField(blank=True, max_length=255, null=True)), - ('slug', models.SlugField(blank=True, max_length=255, null=True, unique=True)), - ('id_car_make', models.ForeignKey(db_column='id_car_make', on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmake')), - ], - options={ - 'verbose_name': 'Model', - }, - bases=(models.Model, inventory.mixins.LocalizedNameMixin), - ), - migrations.AddField( - model_name='car', - name='id_car_model', - field=models.ForeignKey(blank=True, db_column='id_car_model', null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='inventory.carmodel', verbose_name='Model'), - ), migrations.CreateModel( name='CarOption', fields=[ @@ -214,6 +140,21 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Registrations', }, ), + migrations.CreateModel( + name='CarReservation', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('reserved_at', models.DateTimeField(auto_now_add=True, verbose_name='Reserved At')), + ('reserved_until', models.DateTimeField(verbose_name='Reserved Until')), + ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car', verbose_name='Car')), + ('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to=settings.AUTH_USER_MODEL, verbose_name='Reserved By')), + ], + options={ + 'verbose_name': 'Car Reservation', + 'verbose_name_plural': 'Car Reservations', + 'ordering': ['-reserved_at'], + }, + ), migrations.CreateModel( name='CarSerie', fields=[ @@ -336,6 +277,10 @@ class Migration(migrations.Migration): ('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='auth.group', verbose_name='Group')), ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='groups', to='inventory.dealer')), ], + options={ + 'verbose_name': 'Custom Group', + 'verbose_name_plural': 'Custom Groups', + }, ), migrations.CreateModel( name='Customer', @@ -406,10 +351,24 @@ class Migration(migrations.Migration): name='dealer', field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.dealer', verbose_name='Dealer'), ), - migrations.AddField( - model_name='additionalservices', - name='dealer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer', verbose_name='Dealer'), + migrations.CreateModel( + name='AdditionalServices', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), + ('description', models.TextField(verbose_name='Description')), + ('price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Price')), + ('taxable', models.BooleanField(default=False, verbose_name='taxable')), + ('uom', models.CharField(choices=[('EA', 'Each'), ('PR', 'Pair'), ('SET', 'Set'), ('GAL', 'Gallon'), ('L', 'Liter'), ('M', 'Meter'), ('KG', 'Kilogram'), ('HR', 'Hour'), ('BX', 'Box'), ('RL', 'Roll'), ('PKG', 'Package'), ('DZ', 'Dozen'), ('SQ_M', 'Square Meter'), ('PC', 'Piece'), ('BDL', 'Bundle')], max_length=10, verbose_name='Unit of Measurement')), + ('item', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='django_ledger.itemmodel', verbose_name='Item')), + ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer', verbose_name='Dealer')), + ], + options={ + 'verbose_name': 'Additional Services', + 'verbose_name_plural': 'Additional Services', + }, + bases=(models.Model, inventory.mixins.LocalizedNameMixin), ), migrations.CreateModel( name='Activity', @@ -443,6 +402,15 @@ class Migration(migrations.Migration): ('invoice_unearned_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='invoice_unearned', to='django_ledger.accountmodel')), ], ), + migrations.CreateModel( + name='DealersMake', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('added_at', models.DateTimeField(auto_now_add=True)), + ('car_make', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='car_dealers', to='inventory.carmake')), + ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dealer_makes', to='inventory.dealer')), + ], + ), migrations.CreateModel( name='Email', fields=[ @@ -463,6 +431,68 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Emails', }, ), + migrations.CreateModel( + name='ExteriorColors', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), + ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), + ], + options={ + 'verbose_name': 'Exterior Colors', + 'verbose_name_plural': 'Exterior Colors', + 'indexes': [models.Index(fields=['name'], name='exterior_color_name_idx'), models.Index(fields=['arabic_name'], name='exterior_color_arabic_name_idx')], + }, + bases=(models.Model, inventory.mixins.LocalizedNameMixin), + ), + migrations.CreateModel( + name='ExtraInfo', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object_id', models.CharField(blank=True, max_length=255, null=True)), + ('related_object_id', models.CharField(blank=True, max_length=255, null=True)), + ('data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_info_primary', to='contenttypes.contenttype')), + ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_extra_info', to=settings.AUTH_USER_MODEL)), + ('dealer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='extra_info', to='inventory.dealer')), + ('related_content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='extra_info_secondary', to='contenttypes.contenttype')), + ], + options={ + 'verbose_name': 'Extra Info', + 'verbose_name_plural': 'Extra Info', + }, + ), + migrations.CreateModel( + name='InteriorColors', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255, verbose_name='Name')), + ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), + ('rgb', models.CharField(blank=True, max_length=24, null=True, verbose_name='RGB')), + ], + options={ + 'verbose_name': 'Interior Colors', + 'verbose_name_plural': 'Interior Colors', + 'indexes': [models.Index(fields=['name'], name='interior_color_name_idx'), models.Index(fields=['arabic_name'], name='interior_color_arabic_name_idx')], + }, + bases=(models.Model, inventory.mixins.LocalizedNameMixin), + ), + migrations.CreateModel( + name='CarColors', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.car')), + ('exterior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.exteriorcolors')), + ('interior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.interiorcolors')), + ], + options={ + 'verbose_name': 'Color', + 'verbose_name_plural': 'Colors', + }, + ), migrations.CreateModel( name='Lead', fields=[ @@ -602,6 +632,35 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'payments', }, ), + migrations.CreateModel( + name='PaymentHistory', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('user_data', models.JSONField(blank=True, null=True)), + ('amount', models.DecimalField(decimal_places=2, max_digits=10, validators=[django.core.validators.MinValueValidator(0.01)])), + ('currency', models.CharField(default='SAR', max_length=3)), + ('payment_date', models.DateTimeField(default=django.utils.timezone.now)), + ('status', models.CharField(choices=[('initiated', 'initiated'), ('pending', 'Pending'), ('completed', 'Completed'), ('paid', 'Paid'), ('failed', 'Failed'), ('refunded', 'Refunded'), ('cancelled', 'Cancelled')], default='pending', max_length=10)), + ('payment_method', models.CharField(choices=[('credit_card', 'Credit Card'), ('debit_card', 'Debit Card'), ('paypal', 'PayPal'), ('bank_transfer', 'Bank Transfer'), ('crypto', 'Cryptocurrency'), ('other', 'Other')], max_length=20)), + ('transaction_id', models.CharField(blank=True, max_length=100, null=True, unique=True)), + ('invoice_number', models.CharField(blank=True, max_length=50, null=True)), + ('order_reference', models.CharField(blank=True, max_length=100, null=True)), + ('gateway_response', models.JSONField(blank=True, null=True)), + ('gateway_name', models.CharField(blank=True, max_length=50, null=True)), + ('description', models.TextField(blank=True, null=True)), + ('is_recurring', models.BooleanField(default=False)), + ('billing_email', models.EmailField(blank=True, max_length=254, null=True)), + ('billing_address', models.TextField(blank=True, null=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('updated_at', models.DateTimeField(auto_now=True)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Payment History', + 'verbose_name_plural': 'Payment Histories', + 'ordering': ['-payment_date'], + }, + ), migrations.CreateModel( name='PoItemsUploaded', fields=[ @@ -613,6 +672,10 @@ class Migration(migrations.Migration): ('item', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='po_items', to='django_ledger.itemtransactionmodel')), ('po', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='items', to='django_ledger.purchaseordermodel')), ], + options={ + 'verbose_name': 'PO Items', + 'verbose_name_plural': 'PO Items', + }, ), migrations.CreateModel( name='Refund', @@ -695,6 +758,8 @@ class Migration(migrations.Migration): ('scheduled_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ + 'verbose_name': 'Schedule', + 'verbose_name_plural': 'Schedules', 'ordering': ['-scheduled_at'], }, ), @@ -706,6 +771,8 @@ class Migration(migrations.Migration): ('arabic_name', models.CharField(max_length=255, verbose_name='Arabic Name')), ('phone_number', phonenumber_field.modelfields.PhoneNumberField(max_length=128, region='SA', verbose_name='Phone Number')), ('staff_type', models.CharField(choices=[('inventory', 'Inventory'), ('accountant', 'Accountant'), ('sales', 'Sales')], max_length=255, verbose_name='Staff Type')), + ('address', models.CharField(blank=True, max_length=200, null=True, verbose_name='Address')), + ('image', models.ImageField(blank=True, null=True, upload_to='staff/', verbose_name='Image')), ('active', models.BooleanField(default=True, verbose_name='Active')), ('created', models.DateTimeField(auto_now_add=True, verbose_name='Created')), ('updated', models.DateTimeField(auto_now=True, verbose_name='Updated')), @@ -783,6 +850,16 @@ class Migration(migrations.Migration): 'ordering': ['-timestamp'], }, ), + migrations.CreateModel( + name='VatRate', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('rate', models.DecimalField(decimal_places=2, default=Decimal('0.15'), max_digits=5)), + ('is_active', models.BooleanField(default=True)), + ('created_at', models.DateTimeField(auto_now_add=True)), + ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='inventory.dealer')), + ], + ), migrations.CreateModel( name='Vendor', fields=[ @@ -814,93 +891,545 @@ class Migration(migrations.Migration): field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='cars', to='inventory.vendor', verbose_name='Vendor'), ), migrations.CreateModel( - name='CarReservation', + name='CarFinance', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('reserved_at', models.DateTimeField(auto_now_add=True, verbose_name='Reserved At')), - ('reserved_until', models.DateTimeField(verbose_name='Reserved Until')), - ('car', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to='inventory.car', verbose_name='Car')), - ('reserved_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reservations', to=settings.AUTH_USER_MODEL, verbose_name='Reserved By')), + ('cost_price', models.DecimalField(decimal_places=2, max_digits=14, verbose_name='Cost Price')), + ('selling_price', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Selling Price')), + ('marked_price', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Marked Price')), + ('discount_amount', models.DecimalField(decimal_places=2, default=Decimal('0.00'), max_digits=14, verbose_name='Discount Amount')), + ('is_sold', models.BooleanField(default=False)), + ('additional_services', models.ManyToManyField(blank=True, related_name='additional_finances', to='inventory.additionalservices')), + ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='finances', to='inventory.car')), ], options={ - 'verbose_name': 'Car Reservation', - 'verbose_name_plural': 'Car Reservations', - 'ordering': ['-reserved_at'], - 'unique_together': {('car', 'reserved_until')}, + 'verbose_name': 'Car Financial Details', + 'verbose_name_plural': 'Car Financial Details', + 'indexes': [models.Index(fields=['car'], name='car_finance_car_idx'), models.Index(fields=['cost_price'], name='car_finance_cost_price_idx'), models.Index(fields=['selling_price'], name='car_finance_selling_price_idx'), models.Index(fields=['discount_amount'], name='car_finance_discount_idx')], }, ), - migrations.CreateModel( - name='DealersMake', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('added_at', models.DateTimeField(auto_now_add=True)), - ('car_make', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='car_dealers', to='inventory.carmake')), - ('dealer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='dealer_makes', to='inventory.dealer')), - ], - options={ - 'unique_together': {('dealer', 'car_make')}, - }, + migrations.AddIndex( + model_name='carmodel', + index=models.Index(fields=['id_car_make'], name='car_model_make_idx'), ), - migrations.CreateModel( - name='ExtraInfo', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('object_id', models.CharField(blank=True, max_length=255, null=True)), - ('related_object_id', models.CharField(blank=True, max_length=255, null=True)), - ('data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_info_primary', to='contenttypes.contenttype')), - ('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_extra_info', to=settings.AUTH_USER_MODEL)), - ('related_content_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='extra_info_secondary', to='contenttypes.contenttype')), - ], - options={ - 'verbose_name_plural': 'Extra Info', - 'indexes': [models.Index(fields=['content_type', 'object_id'], name='inventory_e_content_2ecbed_idx'), models.Index(fields=['related_content_type', 'related_object_id'], name='inventory_e_related_8680bb_idx')], - }, + migrations.AddIndex( + model_name='carmodel', + index=models.Index(fields=['name'], name='car_model_name_idx'), ), - migrations.CreateModel( - name='CarColors', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('car', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.car')), - ('exterior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.exteriorcolors')), - ('interior', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='colors', to='inventory.interiorcolors')), - ], - options={ - 'verbose_name': 'Color', - 'verbose_name_plural': 'Colors', - 'unique_together': {('car', 'exterior', 'interior')}, - }, + migrations.AddIndex( + model_name='carmodel', + index=models.Index(fields=['id_car_make', 'name'], name='car_model_make_name_idx'), ), - migrations.CreateModel( - name='PaymentHistory', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('user_data', models.JSONField(blank=True, null=True)), - ('amount', models.DecimalField(decimal_places=2, max_digits=10, validators=[django.core.validators.MinValueValidator(0.01)])), - ('currency', models.CharField(default='SAR', max_length=3)), - ('payment_date', models.DateTimeField(default=django.utils.timezone.now)), - ('status', models.CharField(choices=[('initiated', 'initiated'), ('pending', 'Pending'), ('completed', 'Completed'), ('paid', 'Paid'), ('failed', 'Failed'), ('refunded', 'Refunded'), ('cancelled', 'Cancelled')], default='pending', max_length=10)), - ('payment_method', models.CharField(choices=[('credit_card', 'Credit Card'), ('debit_card', 'Debit Card'), ('paypal', 'PayPal'), ('bank_transfer', 'Bank Transfer'), ('crypto', 'Cryptocurrency'), ('other', 'Other')], max_length=20)), - ('transaction_id', models.CharField(blank=True, max_length=100, null=True, unique=True)), - ('invoice_number', models.CharField(blank=True, max_length=50, null=True)), - ('order_reference', models.CharField(blank=True, max_length=100, null=True)), - ('gateway_response', models.JSONField(blank=True, null=True)), - ('gateway_name', models.CharField(blank=True, max_length=50, null=True)), - ('description', models.TextField(blank=True, null=True)), - ('is_recurring', models.BooleanField(default=False)), - ('billing_email', models.EmailField(blank=True, max_length=254, null=True)), - ('billing_address', models.TextField(blank=True, null=True)), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='payments', to=settings.AUTH_USER_MODEL)), - ], - options={ - 'verbose_name': 'Payment History', - 'verbose_name_plural': 'Payment Histories', - 'ordering': ['-payment_date'], - 'indexes': [models.Index(fields=['transaction_id'], name='inventory_p_transac_9469f3_idx'), models.Index(fields=['user'], name='inventory_p_user_id_c31626_idx'), models.Index(fields=['status'], name='inventory_p_status_abcb77_idx'), models.Index(fields=['payment_date'], name='inventory_p_payment_b3068c_idx')], - }, + migrations.AddIndex( + model_name='caroption', + index=models.Index(fields=['id_parent'], name='car_option_parent_idx'), + ), + migrations.AddIndex( + model_name='caroption', + index=models.Index(fields=['name'], name='car_option_name_idx'), + ), + migrations.AddIndex( + model_name='caroptionvalue', + index=models.Index(fields=['id_car_option'], name='car_opt_val_option_idx'), + ), + migrations.AddIndex( + model_name='caroptionvalue', + index=models.Index(fields=['id_car_equipment'], name='car_opt_val_equipment_idx'), + ), + migrations.AddIndex( + model_name='caroptionvalue', + index=models.Index(fields=['is_base'], name='car_opt_val_is_base_idx'), + ), + migrations.AddIndex( + model_name='caroptionvalue', + index=models.Index(fields=['id_car_option', 'id_car_equipment'], name='cov_option_equipment_idx'), + ), + migrations.AlterUniqueTogether( + name='carreservation', + unique_together={('car', 'reserved_until')}, + ), + migrations.AddIndex( + model_name='carserie', + index=models.Index(fields=['id_car_model'], name='car_serie_model_idx'), + ), + migrations.AddIndex( + model_name='carserie', + index=models.Index(fields=['year_begin', 'year_end'], name='car_serie_years_idx'), + ), + migrations.AddIndex( + model_name='carserie', + index=models.Index(fields=['name'], name='car_serie_name_idx'), + ), + migrations.AddIndex( + model_name='carserie', + index=models.Index(fields=['generation_name'], name='car_serie_generation_idx'), + ), + migrations.AddIndex( + model_name='carspecification', + index=models.Index(fields=['id_parent'], name='car_spec_parent_idx'), + ), + migrations.AddIndex( + model_name='carspecification', + index=models.Index(fields=['name'], name='car_spec_name_idx'), + ), + migrations.AddIndex( + model_name='cartrim', + index=models.Index(fields=['id_car_serie'], name='car_trim_serie_idx'), + ), + migrations.AddIndex( + model_name='cartrim', + index=models.Index(fields=['start_production_year', 'end_production_year'], name='car_trim_prod_years_idx'), + ), + migrations.AddIndex( + model_name='cartrim', + index=models.Index(fields=['name'], name='car_trim_name_idx'), + ), + migrations.AddIndex( + model_name='carspecificationvalue', + index=models.Index(fields=['id_car_trim'], name='car_spec_val_trim_idx'), + ), + migrations.AddIndex( + model_name='carspecificationvalue', + index=models.Index(fields=['id_car_specification'], name='car_spec_val_spec_idx'), + ), + migrations.AddIndex( + model_name='carspecificationvalue', + index=models.Index(fields=['id_car_trim', 'id_car_specification'], name='car_spec_val_trim_spec_idx'), + ), + migrations.AddIndex( + model_name='carequipment', + index=models.Index(fields=['id_car_trim'], name='car_equipment_trim_idx'), + ), + migrations.AddIndex( + model_name='carequipment', + index=models.Index(fields=['year_begin'], name='car_equipment_year_idx'), + ), + migrations.AddIndex( + model_name='carequipment', + index=models.Index(fields=['name'], name='car_equipment_name_idx'), + ), + migrations.AddIndex( + model_name='dealer', + index=models.Index(fields=['name'], name='inventory_d_name_c4ba31_idx'), + ), + migrations.AddIndex( + model_name='customgroup', + index=models.Index(fields=['name'], name='inventory_c_name_65f272_idx'), + ), + migrations.AddIndex( + model_name='customgroup', + index=models.Index(fields=['dealer'], name='inventory_c_dealer__313a5a_idx'), + ), + migrations.AddIndex( + model_name='customgroup', + index=models.Index(fields=['group'], name='inventory_c_group_i_5f1074_idx'), + ), + migrations.AddIndex( + model_name='customer', + index=models.Index(fields=['title'], name='inventory_c_title_f01e78_idx'), + ), + migrations.AddIndex( + model_name='customer', + index=models.Index(fields=['first_name'], name='inventory_c_first_n_fd5078_idx'), + ), + migrations.AddIndex( + model_name='customer', + index=models.Index(fields=['last_name'], name='inventory_c_last_na_4bf5bd_idx'), + ), + migrations.AddIndex( + model_name='customer', + index=models.Index(fields=['email'], name='inventory_c_email_c8fd29_idx'), + ), + migrations.AddIndex( + model_name='customer', + index=models.Index(fields=['phone_number'], name='inventory_c_phone_n_1a4571_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['created_by'], name='activity_created_by_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['content_type'], name='activity_content_type_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['content_type', 'object_id'], name='activity_content_object_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['created'], name='activity_created_date_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['updated'], name='activity_updated_date_idx'), + ), + migrations.AddIndex( + model_name='activity', + index=models.Index(fields=['content_type', 'object_id', 'created'], name='a_content_obj_created_idx'), + ), + migrations.AlterUniqueTogether( + name='dealersmake', + unique_together={('dealer', 'car_make')}, + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['created_by'], name='email_created_by_idx'), + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['content_type'], name='email_content_type_idx'), + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['content_type', 'object_id'], name='email_content_object_idx'), + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['created'], name='email_created_date_idx'), + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['updated'], name='email_updated_date_idx'), + ), + migrations.AddIndex( + model_name='email', + index=models.Index(fields=['content_type', 'object_id', 'created'], name='email_content_obj_created_idx'), + ), + migrations.AddIndex( + model_name='extrainfo', + index=models.Index(fields=['content_type', 'object_id'], name='inventory_e_content_2ecbed_idx'), + ), + migrations.AddIndex( + model_name='extrainfo', + index=models.Index(fields=['related_content_type', 'related_object_id'], name='inventory_e_related_8680bb_idx'), + ), + migrations.AddIndex( + model_name='carcolors', + index=models.Index(fields=['exterior'], name='car_colors_exterior_idx'), + ), + migrations.AddIndex( + model_name='carcolors', + index=models.Index(fields=['interior'], name='car_colors_interior_idx'), + ), + migrations.AddIndex( + model_name='carcolors', + index=models.Index(fields=['exterior', 'interior'], name='car_colors_ext_int_combo_idx'), + ), + migrations.AlterUniqueTogether( + name='carcolors', + unique_together={('car', 'exterior', 'interior')}, + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['dealer'], name='note_dealer_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['created_by'], name='note_created_by_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['content_type'], name='note_content_type_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['content_type', 'object_id'], name='note_content_object_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['created'], name='note_created_date_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['updated'], name='note_updated_date_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['dealer', 'created'], name='note_dealer_created_idx'), + ), + migrations.AddIndex( + model_name='notes', + index=models.Index(fields=['content_type', 'object_id', 'created'], name='note_content_obj_created_idx'), + ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['user'], name='notification_user_idx'), + ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['is_read'], name='notification_is_read_idx'), + ), + migrations.AddIndex( + model_name='notification', + index=models.Index(fields=['created'], name='notification_created_date_idx'), + ), + migrations.AddIndex( + model_name='organization', + index=models.Index(fields=['name'], name='inventory_o_name_cc18e2_idx'), + ), + migrations.AddIndex( + model_name='organization', + index=models.Index(fields=['email'], name='inventory_o_email_d6e7dd_idx'), + ), + migrations.AddIndex( + model_name='organization', + index=models.Index(fields=['phone_number'], name='inventory_o_phone_n_7cb3d4_idx'), + ), + migrations.AddIndex( + model_name='paymenthistory', + index=models.Index(fields=['transaction_id'], name='inventory_p_transac_9469f3_idx'), + ), + migrations.AddIndex( + model_name='paymenthistory', + index=models.Index(fields=['user'], name='inventory_p_user_id_c31626_idx'), + ), + migrations.AddIndex( + model_name='paymenthistory', + index=models.Index(fields=['status'], name='inventory_p_status_abcb77_idx'), + ), + migrations.AddIndex( + model_name='paymenthistory', + index=models.Index(fields=['payment_date'], name='inventory_p_payment_b3068c_idx'), + ), + migrations.AddIndex( + model_name='poitemsuploaded', + index=models.Index(fields=['po'], name='inventory_p_po_id_762198_idx'), + ), + migrations.AddIndex( + model_name='poitemsuploaded', + index=models.Index(fields=['item'], name='inventory_p_item_id_6dae83_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['dealer'], name='inventory_s_dealer__9eeebf_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['estimate'], name='inventory_s_estimat_82cc8d_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['invoice'], name='inventory_s_invoice_972b40_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['opportunity'], name='inventory_s_opportu_e6990d_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['customer'], name='inventory_s_custome_d75f5f_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['status'], name='inventory_s_status_34054d_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['order_date'], name='inventory_s_order_d_24f877_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['expected_delivery_date'], name='inventory_s_expecte_6facc1_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['actual_delivery_date'], name='inventory_s_actual__bb0b80_idx'), + ), + migrations.AddIndex( + model_name='saleorder', + index=models.Index(fields=['cancelled_date'], name='inventory_s_cancell_cf8528_idx'), + ), + migrations.AddIndex( + model_name='schedule', + index=models.Index(fields=['dealer'], name='inventory_s_dealer__879e62_idx'), + ), + migrations.AddIndex( + model_name='schedule', + index=models.Index(fields=['customer'], name='inventory_s_custome_19a62e_idx'), + ), + migrations.AddIndex( + model_name='schedule', + index=models.Index(fields=['content_type', 'object_id'], name='inventory_s_content_d3912b_idx'), + ), + migrations.AddIndex( + model_name='schedule', + index=models.Index(fields=['scheduled_at'], name='inventory_s_schedul_04d173_idx'), + ), + migrations.AddIndex( + model_name='staff', + index=models.Index(fields=['name'], name='inventory_s_name_da615c_idx'), + ), + migrations.AddIndex( + model_name='staff', + index=models.Index(fields=['staff_type'], name='inventory_s_staff_t_680ea0_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['dealer'], name='inventory_o_dealer__74a272_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['customer'], name='inventory_o_custome_dffe96_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['car'], name='inventory_o_car_id_9b4f5f_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['lead'], name='inventory_o_lead_id_7b2f47_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['organization'], name='inventory_o_organiz_82d31b_idx'), + ), + migrations.AddIndex( + model_name='opportunity', + index=models.Index(fields=['created'], name='inventory_o_created_124e5d_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['dealer'], name='inventory_l_dealer__ce2dfd_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['customer'], name='inventory_l_custome_b7dfe3_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['organization'], name='inventory_l_organiz_990f08_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['staff'], name='inventory_l_staff_i_01ba72_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['first_name'], name='inventory_l_first_n_77bb1b_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['last_name'], name='inventory_l_last_na_730f4a_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['email'], name='inventory_l_email_e502f1_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['phone_number'], name='inventory_l_phone_n_d9dab8_idx'), + ), + migrations.AddIndex( + model_name='lead', + index=models.Index(fields=['created'], name='inventory_l_created_24d483_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['dealer'], name='task_dealer_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['created_by'], name='task_created_by_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['content_type'], name='task_content_type_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['content_type', 'object_id'], name='task_content_object_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['created'], name='task_created_date_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['updated'], name='task_updated_date_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['dealer', 'created'], name='task_dealer_created_idx'), + ), + migrations.AddIndex( + model_name='tasks', + index=models.Index(fields=['content_type', 'object_id', 'created'], name='task_content_obj_created_idx'), + ), + migrations.AddIndex( + model_name='vendor', + index=models.Index(fields=['slug'], name='vendor_slug_idx'), + ), + migrations.AddIndex( + model_name='vendor', + index=models.Index(fields=['active'], name='vendor_active_idx'), + ), + migrations.AddIndex( + model_name='vendor', + index=models.Index(fields=['crn'], name='vendor_crn_idx'), + ), + migrations.AddIndex( + model_name='vendor', + index=models.Index(fields=['vrn'], name='vendor_vrn_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['vin'], name='car_vin_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['year'], name='car_year_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['status'], name='car_status_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['dealer'], name='car_dealer_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['vendor'], name='car_vendor_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_make'], name='car_make_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_model'], name='car_model_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_serie'], name='car_serie_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_trim'], name='car_trim_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_make', 'id_car_model'], name='car_make_model_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['id_car_make', 'year'], name='car_make_year_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['dealer', 'status'], name='car_dealer_status_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['vendor', 'status'], name='car_vendor_status_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(fields=['year', 'status'], name='car_year_status_idx'), + ), + migrations.AddIndex( + model_name='car', + index=models.Index(condition=models.Q(('status', 'available')), fields=['status'], name='car_active_status_idx'), ), ] diff --git a/inventory/models.py b/inventory/models.py index d1cd90f1..71ac33e9 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -44,6 +44,8 @@ from appointment.models import StaffMember from plans.quota import get_user_quota from plans.models import UserPlan from django.db.models import Q +from imagekit.models import ImageSpecField +from imagekit.processors import ResizeToFill # from plans.models import AbstractPlan # from simple_history.models import HistoricalRecords @@ -706,7 +708,7 @@ class Car(Base): [ self.colors, self.finances, - self.finances.selling_price > 0, + self.finances.marked_price > 0, ] ) except Exception: @@ -903,7 +905,7 @@ class CarFinance(models.Model): @property def total(self): - return self.selling_price + return self.marked_price @property def total_additionals_no_vat(self): @@ -916,8 +918,8 @@ class CarFinance(models.Model): @property def total_discount(self): if self.discount_amount > 0: - return self.selling_price - self.discount_amount - return self.selling_price + return self.marked_price - self.discount_amount + return self.marked_price @property def total_vat(self): @@ -932,12 +934,13 @@ class CarFinance(models.Model): @property def revenue(self): - return self.selling_price - self.cost_price + return self.marked_price - self.cost_price def to_dict(self): return { "cost_price": str(self.cost_price), "selling_price": str(self.selling_price), + "marked_price": str(self.marked_price), "discount_amount": str(self.discount_amount), "total": str(self.total), "total_discount": str(self.total_discount), @@ -946,7 +949,7 @@ class CarFinance(models.Model): } def __str__(self): - return f"Car: {self.car}, Selling Price: {self.selling_price}" + return f"Car: {self.car}, Marked Price: {self.marked_price}" # def save(self, *args, **kwargs): # self.full_clean() @@ -965,6 +968,7 @@ class CarFinance(models.Model): models.Index(fields=['car'], name='car_finance_car_idx'), models.Index(fields=['cost_price'], name='car_finance_cost_price_idx'), models.Index(fields=['selling_price'], name='car_finance_selling_price_idx'), + models.Index(fields=['marked_price'], name='car_finance_marked_price_idx'), models.Index(fields=['discount_amount'], name='car_finance_discount_idx'), ] @@ -1137,7 +1141,7 @@ class Dealer(models.Model, LocalizedNameMixin): max_length=200, blank=True, null=True, verbose_name=_("Address") ) logo = models.ImageField( - upload_to="logos/users", blank=True, null=True, verbose_name=_("Logo") + upload_to="logos/users", blank=True, null=True, verbose_name=_("Logo"),default="logo.png" ) entity = models.ForeignKey( EntityModel, on_delete=models.SET_NULL, null=True, blank=True @@ -1233,8 +1237,14 @@ class Staff(models.Model, LocalizedNameMixin): address = models.CharField( max_length=200, blank=True, null=True, verbose_name=_("Address") ) - image = models.ImageField( - upload_to="staff/", blank=True, null=True, verbose_name=_("Image") + logo = models.ImageField( + upload_to="logos/staff", blank=True, null=True, verbose_name=_("Image") + ) + thumbnail = ImageSpecField( + source='logo', + processors=[ResizeToFill(40, 40)], + format='WEBP', + options={'quality': 80} ) active = models.BooleanField(default=True, verbose_name=_("Active")) created = models.DateTimeField(auto_now_add=True, verbose_name=_("Created")) @@ -2713,7 +2723,7 @@ class SaleOrder(models.Model): @property def price(self): - return self.car.finances.selling_price + return self.car.finances.marked_price @property def items(self): diff --git a/inventory/signals.py b/inventory/signals.py index d95a93e6..3eec0df6 100644 --- a/inventory/signals.py +++ b/inventory/signals.py @@ -366,7 +366,7 @@ def update_item_model_cost(sender, instance, created, **kwargs): description="", ) - instance.car.item_model.default_amount = instance.selling_price + instance.car.item_model.default_amount = instance.marked_price if not isinstance(instance.car.item_model.additional_info, dict): instance.car.item_model.additional_info = {} instance.car.item_model.additional_info.update({"car_finance": instance.to_dict()}) @@ -975,7 +975,7 @@ def car_created_notification(sender, instance, created, **kwargs): models.Notification.objects.create( user=accountant, message=f""" - New Car {instance.vin} has been added to dealer {instance.dealer.name}. + New Car {instance.id_car_make}-{instance.id_car_model}-{instance.year}-{instance.vin} has been added to the inventory. View """, ) diff --git a/inventory/utils.py b/inventory/utils.py index 18b8866a..ef9d73c6 100644 --- a/inventory/utils.py +++ b/inventory/utils.py @@ -282,7 +282,7 @@ def get_car_finance_data(model): data = model.get_itemtxs_data()[0].all() total = sum( [ - Decimal(item.item_model.additional_info["car_finance"]["selling_price"]) + Decimal(item.item_model.additional_info["car_finance"]["marked_price"]) * Decimal(item.ce_quantity or item.quantity) for item in data ] @@ -308,8 +308,8 @@ def get_car_finance_data(model): "year": x.item_model.additional_info["car_info"]["year"], "trim": x.item_model.additional_info["car_info"]["mileage"], "cost_price": x.item_model.additional_info["car_finance"]["cost_price"], - "selling_price": x.item_model.additional_info["car_finance"][ - "selling_price" + "marked_price": x.item_model.additional_info["car_finance"][ + "marked_price" ], "discount": x.item_model.additional_info["car_finance"][ "discount_amount" @@ -404,7 +404,7 @@ def get_financial_values(model): data = model.get_itemtxs_data()[0].all() total = sum( [ - Decimal(item.item_model.additional_info["car_finance"]["selling_price"]) + Decimal(item.item_model.additional_info["car_finance"]["marked_price"]) * Decimal(item.ce_quantity or item.quantity) for item in data ] @@ -435,7 +435,7 @@ def get_financial_values(model): "finances": x.item_model.additional_info["car_finance"], "quantity": x.ce_quantity or x.quantity, "total": Decimal( - x.item_model.additional_info["car_finance"]["selling_price"] + x.item_model.additional_info["car_finance"]["marked_price"] ) * Decimal(x.ce_quantity or x.quantity), } @@ -787,7 +787,7 @@ class CarTransfer: self.car.custom_cards.delete() self.car.finances.cost_price = self.transfer.total_price - self.car.finances.selling_price = 0 + self.car.finances.marked_price = 0 self.car.finances.discount_amount = 0 self.car.finances.save() self.car.location.owner = self.to_dealer @@ -1027,7 +1027,7 @@ class CarFinanceCalculator: quantity = self._get_quantity(item) car_finance = self._get_nested_value(item, self.CAR_FINANCE_KEY) car_info = self._get_nested_value(item, self.CAR_INFO_KEY) - unit_price = Decimal(car_finance.get("selling_price", 0)) + unit_price = Decimal(car_finance.get("marked_price", 0)) return { "item_number": item.item_model.item_number, "vin": car_info.get("vin"), @@ -1065,7 +1065,7 @@ class CarFinanceCalculator: def calculate_totals(self): total_price = sum( - Decimal(self._get_nested_value(item, self.CAR_FINANCE_KEY, "selling_price")) + Decimal(self._get_nested_value(item, self.CAR_FINANCE_KEY, "marked_price")) * int(self._get_quantity(item)) for item in self.item_transactions ) @@ -1073,7 +1073,7 @@ class CarFinanceCalculator: Decimal(x.get("price_")) for x in self._get_additional_services() ) - total_discount = self.extra_info.data.get("discount") + total_discount = self.extra_info.data.get("discount",0) # total_discount = sum( # Decimal( @@ -1081,7 +1081,9 @@ class CarFinanceCalculator: # ) # for item in self.item_transactions # ) - total_price_discounted = total_price - Decimal(total_discount) + total_price_discounted = total_price + if total_discount: + total_price_discounted = total_price - Decimal(total_discount) total_vat_amount = total_price_discounted * self.vat_rate return { diff --git a/inventory/views.py b/inventory/views.py index d96b39db..ad7b2b0e 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -449,7 +449,7 @@ class ManagerDashboard(LoginRequiredMixin, TemplateView): except ZeroDivisionError as e: print(f"error: {e}") - + qs = ( models.Car.objects.values("id_car_make__name") .annotate(count=Count("id")) @@ -2140,6 +2140,7 @@ class DealerDetailView(LoginRequiredMixin, PermissionRequiredMixin,DetailView): def dealer_vat_rate_update(request,slug): dealer = get_object_or_404(models.Dealer,slug=slug) models.VatRate.objects.filter(dealer=dealer).update(rate=request.POST.get("rate")) + messages.success(request, _("VAT rate updated successfully")) return redirect("dealer_detail", slug=slug) class DealerUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessMessageMixin, UpdateView): @@ -2527,8 +2528,8 @@ def vendorDetailView(request, dealer_slug,slug): return render( request, template_name="vendors/view_vendor.html", context={"vendor": vendor} ) - - + + class VendorCreateView( @@ -3403,6 +3404,7 @@ class UserUpdateView( # self.object.staff_member.services_offered.add(service) staff = form.save(commit=False) + print(form.cleaned_data) staff.name = form.cleaned_data["name"] staff.arabic_name = form.cleaned_data["arabic_name"] staff.phone_number = form.cleaned_data["phone_number"] @@ -3875,7 +3877,7 @@ class BankAccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailV template_name = "ledger/bank_accounts/bank_account_detail.html" context_object_name = "bank_account" permission_required = ["django_ledger.view_bankaccountmodel"] - + def get_queryset(self): dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) query=self.request.GET.get('q') @@ -4468,7 +4470,7 @@ def create_estimate(request, dealer_slug, slug=None): finances__is_sold=False, colors__isnull=False, finances__isnull=False, - finances__selling_price__gt=1, + finances__marked_price__gt=1, status="available", ).all() @@ -4477,8 +4479,8 @@ def create_estimate(request, dealer_slug, slug=None): { "item_number": i.item_model.item_number, "quantity": 1, - "unit_cost": round(float(i.finances.selling_price)), - "unit_revenue": round(float(i.finances.selling_price)), + "unit_cost": round(float(i.finances.marked_price)), + "unit_revenue": round(float(i.finances.marked_price)), "total_amount": round(float(i.finances.total_vat)), } ) @@ -4498,7 +4500,7 @@ def create_estimate(request, dealer_slug, slug=None): # estimate_itemtxs = { # item.item_number: { # "unit_cost": instance.finances.cost_price, - # "unit_revenue": instance.finances.selling_price, + # "unit_revenue": instance.finances.marked_price, # "quantity": Decimal(quantities), # "total_amount": instance.finances.total_vat * int(quantities), # } @@ -4581,7 +4583,7 @@ def create_estimate(request, dealer_slug, slug=None): dealer=dealer, colors__isnull=False, finances__isnull=False, - finances__selling_price__gt=1, + finances__marked_price__gt=1, status="available", ) .annotate( @@ -5678,8 +5680,8 @@ class LeadListView(LoginRequiredMixin, PermissionRequiredMixin, ListView): if self.request.is_staff: return qs.filter(staff=self.request.staff) return models.Lead.objects.none() - - + + class LeadDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView): """ @@ -6586,7 +6588,7 @@ class OpportunityCreateView(LoginRequiredMixin,PermissionRequiredMixin,CreateVie dealer = get_object_or_404(models.Dealer,slug=self.kwargs.get("dealer_slug")) staff = getattr(self.request.user.staffmember, "staff", None) form = super().get_form(form_class) - form.fields["car"].queryset = models.Car.objects.filter(dealer=dealer,status='available',finances__selling_price__gt=0) + form.fields["car"].queryset = models.Car.objects.filter(dealer=dealer,status='available',finances__marked_price__gt=0) form.fields["lead"].queryset = models.Lead.objects.filter(dealer=dealer,staff=staff) return form @@ -6627,7 +6629,7 @@ class OpportunityUpdateView(LoginRequiredMixin,PermissionRequiredMixin, SuccessM form = super().get_form(form_class) dealer = get_object_or_404(models.Dealer,slug=self.kwargs.get("dealer_slug")) staff = getattr(self.request.user.staffmember, "staff", None) - form.fields["car"].queryset = models.Car.objects.filter(dealer=dealer,status='available',finances__selling_price__gt=0) + form.fields["car"].queryset = models.Car.objects.filter(dealer=dealer,status='available',finances__marked_price__gt=0) form.fields["lead"].queryset = models.Lead.objects.filter(dealer=dealer,staff=staff) return form @@ -6745,9 +6747,9 @@ class OpportunityListView(LoginRequiredMixin,PermissionRequiredMixin, ListView): Q(customer__first_name__icontains=search) | Q(customer__last_name__icontains=search) | Q(customer__email__icontains=search) - + ) - + # Stage filter stage = self.request.GET.get("stage") @@ -6951,6 +6953,7 @@ class ItemServiceCreateView( permission_required = ["inventory.add_additionalservices"] def form_valid(self, form): + sleep(5) dealer = get_user_type(self.request) vat = models.VatRate.objects.get(dealer=dealer,is_active=True) form.instance.dealer = dealer @@ -7166,7 +7169,7 @@ class ItemExpenseListView(LoginRequiredMixin, PermissionRequiredMixin, ListView) # def get_queryset(self): # dealer = get_user_type(self.request) # return dealer.entity.get_items_expenses() - + def get_queryset(self): dealer = get_user_type(self.request) query=self.request.GET.get('q') @@ -8747,7 +8750,7 @@ class LedgerModelListView(LoginRequiredMixin,PermissionRequiredMixin, ListView, show_visible = False allow_empty = True paginate_by = 30 - + def get_queryset(self): qs = super().get_queryset() @@ -9064,7 +9067,7 @@ class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase): """ template_name = "ledger/journal_entry/journal_entry_txs.html" - + @login_required @permission_required("django_ledger.change_ledgermodel", raise_exception=True) @@ -10040,9 +10043,9 @@ class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListVie if query: qs=apply_search_filters(qs,query) return qs - - - + + + # def get_queryset(self): # dealer = get_user_type(self.request) # entity = dealer.entity @@ -10431,11 +10434,10 @@ def bulk_update_car_price(request): car = models.Car.objects.get(pk=car_pk) if not hasattr(car, "finances"): models.CarFinance.objects.create( - car=car, cost_price=Decimal(price), selling_price=0 + car=car, cost_price=Decimal(price) ) else: car.finances.cost_price = Decimal(price) - car.finances.selling_price = 0 car.finances.save() messages.success(request, "Price updated successfully") diff --git a/load_initial_data.sh b/load_initial_data.sh index 83a7bec2..32d562de 100755 --- a/load_initial_data.sh +++ b/load_initial_data.sh @@ -24,8 +24,6 @@ python3 manage.py populate_colors python3 manage.py tenhal_plan -python3 manage.py set_vat - python3 manage.py set_custom_permissions python3 manage.py initial_services_offered diff --git a/requirements_dev.txt b/requirements_dev.txt index 459bd6fd..6e4c567b 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,126 +1,132 @@ -annotated-types -anyio -arrow -asgiref -attrs -Babel -beautifulsoup4 -blessed -cattrs -certifi -cffi -charset-normalizer -click -colorama -crispy-bootstrap5 -cryptography -cssbeautifier -defusedxml -diff-match-patch -distro -Django -django-allauth -django-appointment -django-background-tasks -django-bootstrap5 -django-ckeditor -django-cors-headers -django-countries -django-crispy-forms -django-easy-audit -django-extensions -django-filter -django-import-export -django-js-asset -django-ledger -django-manager-utils -django-next-url-mixin -django-ordered-model -django-phonenumber-field -django-picklefield -django-plans -django-q2 -django-query-builder -django-schema-graph -django-sequences -django-tables2 -django-treebeard -django-widget-tweaks -djangorestframework -djhtml -djlint -docopt -EditorConfig -Faker -fleming -fonttools -fpdf -fpdf2 -greenlet -h11 -httpcore -httpx -icalendar -idna -jiter -jsbeautifier -json5 -jsonpatch -jsonpointer -jwt -langchain -langchain-core -langchain-ollama -langchain-text-splitters -langsmith -luhnchecker -Markdown -markdown-it-py -mdurl -num2words -numpy -ofxtools -ollama -openai -opencv-python -orjson -packaging -pandas -pathspec -phonenumbers -pillow -pycparser -pydantic -pydantic_core -Pygments -python-dateutil -python-slugify -python-stdnum -pytz -pyvin -PyYAML -pyzbar -redis -regex -requests -requests-toolbelt -rich -ruff -setuptools -six -sniffio -soupsieve -SQLAlchemy -sqlparse -suds -swapper -tablib -tenacity -text-unidecode -tqdm -types-python-dateutil -typing_extensions -tzdata -urllib3 -wcwidth -zstandard +annotated-types==0.7.0 +anyio==4.9.0 +arrow==1.3.0 +asgiref==3.9.1 +attrs==25.3.0 +Babel==2.15.0 +beautifulsoup4==4.13.4 +blessed==1.21.0 +cattrs==25.1.1 +certifi==2025.7.9 +cffi==1.17.1 +charset-normalizer==3.4.2 +click==8.2.1 +colorama==0.4.6 +crispy-bootstrap5==2025.6 +cryptography==45.0.5 +cssbeautifier==1.15.4 +defusedxml==0.7.1 +diff-match-patch==20241021 +distro==1.9.0 +Django==5.2.4 +django-allauth==65.10.0 +django-appconf==1.1.0 +django-appointment==3.8.0 +django-background-tasks==1.2.8 +django-bootstrap5==25.1 +django-ckeditor==6.7.3 +django-cors-headers==4.7.0 +django-countries==7.6.1 +django-crispy-forms==2.4 +django-debug-toolbar==5.2.0 +django-easy-audit==1.3.7 +django-extensions==4.1 +django-filter==25.1 +django-imagekit==5.0.0 +django-import-export==4.3.8 +django-js-asset==3.1.2 +django-ledger==0.7.6.1 +django-manager-utils==3.1.5 +django-next-url-mixin==0.4.0 +django-ordered-model==3.7.4 +django-phonenumber-field==8.0.0 +django-picklefield==3.3 +django-plans==2.0.0 +django-q2==1.8.0 +django-query-builder==3.2.0 +django-schema-graph==3.1.0 +django-sequences==3.0 +django-tables2==2.7.5 +django-treebeard==4.7.1 +django-widget-tweaks==1.5.0 +djangorestframework==3.16.0 +djhtml==3.0.8 +djlint==1.36.4 +docopt==0.6.2 +EditorConfig==0.17.1 +Faker==37.4.0 +fleming==0.7.0 +fonttools==4.58.5 +fpdf==1.7.2 +fpdf2==2.8.3 +greenlet==3.2.3 +h11==0.16.0 +httpcore==1.0.9 +httpx==0.28.1 +icalendar==6.3.1 +idna==3.10 +jiter==0.10.0 +jsbeautifier==1.15.4 +json5==0.12.0 +jsonpatch==1.33 +jsonpointer==3.0.0 +jwt==1.4.0 +langchain==0.3.26 +langchain-core==0.3.68 +langchain-ollama==0.3.4 +langchain-text-splitters==0.3.8 +langsmith==0.4.4 +luhnchecker==0.0.12 +Markdown==3.8.2 +markdown-it-py==3.0.0 +mdurl==0.1.2 +num2words==0.5.14 +numpy==2.3.1 +ofxtools==0.9.5 +ollama==0.5.1 +openai==1.93.3 +opencv-python==4.11.0.86 +orjson==3.10.18 +packaging==24.2 +pandas==2.3.1 +pathspec==0.12.1 +phonenumbers==8.13.42 +pilkit==3.0 +pillow==10.4.0 +psycopg2-binary==2.9.10 +pycparser==2.22 +pydantic==2.11.7 +pydantic_core==2.33.2 +Pygments==2.19.2 +python-dateutil==2.9.0.post0 +python-slugify==8.0.4 +python-stdnum==2.1 +pytz==2025.2 +pyvin==0.0.2 +PyYAML==6.0.2 +pyzbar==0.1.9 +redis==6.2.0 +regex==2024.11.6 +requests==2.32.4 +requests-toolbelt==1.0.0 +rich==14.0.0 +ruff==0.12.2 +setuptools==80.9.0 +six==1.17.0 +sniffio==1.3.1 +soupsieve==2.7 +SQLAlchemy==2.0.41 +sqlparse==0.5.3 +suds==1.2.0 +swapper==1.3.0 +tablib==3.8.0 +tenacity==9.1.2 +text-unidecode==1.3 +tqdm==4.67.1 +types-python-dateutil==2.9.0.20250708 +typing-inspection==0.4.1 +typing_extensions==4.14.1 +tzdata==2025.2 +urllib3==2.5.0 +wcwidth==0.2.13 +zstandard==0.23.0 diff --git a/static/images/CACHE/images/logos/staff/customer3/f0604875fc856cde73376cf5be2f8006.webp b/static/images/CACHE/images/logos/staff/customer3/f0604875fc856cde73376cf5be2f8006.webp new file mode 100644 index 00000000..409beed7 Binary files /dev/null and b/static/images/CACHE/images/logos/staff/customer3/f0604875fc856cde73376cf5be2f8006.webp differ diff --git a/static/images/CACHE/images/logos/staff/customer4_VhAPbzd/4733e9e221c3c7dd5ed4313c61199645.webp b/static/images/CACHE/images/logos/staff/customer4_VhAPbzd/4733e9e221c3c7dd5ed4313c61199645.webp new file mode 100644 index 00000000..dafce03f Binary files /dev/null and b/static/images/CACHE/images/logos/staff/customer4_VhAPbzd/4733e9e221c3c7dd5ed4313c61199645.webp differ diff --git a/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/9826bd079dc1b79c2f0d6381a7417286.jpg b/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/9826bd079dc1b79c2f0d6381a7417286.jpg new file mode 100644 index 00000000..ca8ad233 Binary files /dev/null and b/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/9826bd079dc1b79c2f0d6381a7417286.jpg differ diff --git a/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/bd59d813892f71a8b64024961f32cf41.webp b/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/bd59d813892f71a8b64024961f32cf41.webp new file mode 100644 index 00000000..472540ca Binary files /dev/null and b/static/images/CACHE/images/logos/staff/customer4_yoUBW1d/bd59d813892f71a8b64024961f32cf41.webp differ diff --git a/static/images/logos/staff/customer3.jpg b/static/images/logos/staff/customer3.jpg new file mode 100644 index 00000000..772b91d9 Binary files /dev/null and b/static/images/logos/staff/customer3.jpg differ diff --git a/static/images/logos/staff/customer4.jpg b/static/images/logos/staff/customer4.jpg new file mode 100644 index 00000000..5a6f08c5 Binary files /dev/null and b/static/images/logos/staff/customer4.jpg differ diff --git a/static/images/logos/staff/customer4_VhAPbzd.jpg b/static/images/logos/staff/customer4_VhAPbzd.jpg new file mode 100644 index 00000000..5a6f08c5 Binary files /dev/null and b/static/images/logos/staff/customer4_VhAPbzd.jpg differ diff --git a/static/images/logos/staff/customer4_yoUBW1d.jpg b/static/images/logos/staff/customer4_yoUBW1d.jpg new file mode 100644 index 00000000..5a6f08c5 Binary files /dev/null and b/static/images/logos/staff/customer4_yoUBW1d.jpg differ diff --git a/static/sounds/tone.wav b/static/sounds/tone.wav new file mode 100644 index 00000000..88a18e15 Binary files /dev/null and b/static/sounds/tone.wav differ diff --git a/staticfiles/css/all.min.css b/staticfiles/css/all.min.css new file mode 100644 index 00000000..29542ac5 --- /dev/null +++ b/staticfiles/css/all.min.css @@ -0,0 +1,9 @@ +/*! + * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + * Copyright 2024 Fonticons, Inc. + */ +.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} + +.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"} +.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index fd4b7369..424f319d 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -45,7 +45,7 @@ } .form-control, .form-select { - text-align: center; + /* text-align: center; */ display: flex; align-items: center; justify-content: center; @@ -130,4 +130,5 @@ html[dir="rtl"] .form-icon-container .form-control { @keyframes spin { to { transform: rotate(360deg); } -} \ No newline at end of file +} + diff --git a/staticfiles/debug_toolbar/css/print.css b/staticfiles/debug_toolbar/css/print.css new file mode 100644 index 00000000..58d30847 --- /dev/null +++ b/staticfiles/debug_toolbar/css/print.css @@ -0,0 +1,3 @@ +#djDebug { + display: none !important; +} diff --git a/staticfiles/debug_toolbar/css/toolbar.css b/staticfiles/debug_toolbar/css/toolbar.css new file mode 100644 index 00000000..f147bcdf --- /dev/null +++ b/staticfiles/debug_toolbar/css/toolbar.css @@ -0,0 +1,1181 @@ +/* Variable definitions */ +:root { + /* Font families are the same as in Django admin/css/base.css */ + --djdt-font-family-primary: "Segoe UI", system-ui, Roboto, "Helvetica Neue", + Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", + "Segoe UI Symbol", "Noto Color Emoji"; + --djdt-font-family-monospace: + ui-monospace, Menlo, Monaco, "Cascadia Mono", + "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", + "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", + monospace, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; +} + +:root, +#djDebug[data-theme="light"] { + --djdt-font-color: black; + --djdt-background-color: white; + --djdt-panel-content-background-color: #eee; + --djdt-panel-content-table-background-color: var(--djdt-background-color); + --djdt-panel-title-background-color: #ffc; + --djdt-djdt-panel-content-table-strip-background-color: #f5f5f5; + --djdt--highlighted-background-color: lightgrey; + --djdt-toggle-template-background-color: #bbb; + + --djdt-sql-font-color: #333; + --djdt-pre-text-color: #555; + --djdt-path-and-locals: #777; + --djdt-stack-span-color: black; + --djdt-template-highlight-color: #333; + + --djdt-table-border-color: #ccc; + --djdt-button-border-color: var(--djdt-table-border-color); + --djdt-pre-border-color: var(--djdt-table-border-color); + --djdt-raw-border-color: var(--djdt-table-border-color); +} + +#djDebug[data-theme="dark"] { + --djdt-font-color: #f8f8f2; + --djdt-background-color: #1e293bff; + --djdt-panel-content-background-color: #0f1729ff; + --djdt-panel-content-table-background-color: var(--djdt-background-color); + --djdt-panel-title-background-color: #242432; + --djdt-djdt-panel-content-table-strip-background-color: #324154ff; + --djdt--highlighted-background-color: #2c2a7dff; + --djdt-toggle-template-background-color: #282755; + + --djdt-sql-font-color: var(--djdt-font-color); + --djdt-pre-text-color: var(--djdt-font-color); + --djdt-path-and-locals: #65758cff; + --djdt-stack-span-color: #7c8fa4; + --djdt-template-highlight-color: var(--djdt-stack-span-color); + + --djdt-table-border-color: #324154ff; + --djdt-button-border-color: var(--djdt-table-border-color); + --djdt-pre-border-color: var(--djdt-table-border-color); + --djdt-raw-border-color: var(--djdt-table-border-color); +} + +/* Debug Toolbar CSS Reset, adapted from Eric Meyer's CSS Reset */ +#djDebug { + color: var(--djdt-font-color); + background: var(--djdt-background-color); +} +#djDebug, +#djDebug div, +#djDebug span, +#djDebug applet, +#djDebug object, +#djDebug iframe, +#djDebug h1, +#djDebug h2, +#djDebug h3, +#djDebug h4, +#djDebug h5, +#djDebug h6, +#djDebug p, +#djDebug blockquote, +#djDebug pre, +#djDebug a, +#djDebug abbr, +#djDebug acronym, +#djDebug address, +#djDebug big, +#djDebug cite, +#djDebug code, +#djDebug del, +#djDebug dfn, +#djDebug em, +#djDebug font, +#djDebug img, +#djDebug ins, +#djDebug kbd, +#djDebug q, +#djDebug s, +#djDebug samp, +#djDebug small, +#djDebug strike, +#djDebug strong, +#djDebug sub, +#djDebug sup, +#djDebug tt, +#djDebug var, +#djDebug b, +#djDebug u, +#djDebug i, +#djDebug center, +#djDebug dl, +#djDebug dt, +#djDebug dd, +#djDebug ol, +#djDebug ul, +#djDebug li, +#djDebug fieldset, +#djDebug form, +#djDebug label, +#djDebug legend, +#djDebug table, +#djDebug caption, +#djDebug tbody, +#djDebug tfoot, +#djDebug thead, +#djDebug tr, +#djDebug th, +#djDebug td, +#djDebug summary, +#djDebug button { + margin: 0; + padding: 0; + min-width: auto; + width: auto; + min-height: auto; + height: auto; + border: 0; + outline: 0; + font-size: 12px; + line-height: 1.5em; + color: var(--djdt-font-color); + vertical-align: baseline; + background-color: transparent; + font-family: var(--djdt-font-family-primary); + text-align: left; + text-shadow: none; + white-space: normal; + transition: none; +} + +#djDebug button { + background-color: #eee; + background-image: linear-gradient(to bottom, #eee, #cccccc); + border: 1px solid var(--djdt-button-border-color); + border-bottom: 1px solid #bbb; + border-radius: 3px; + color: #333; + line-height: 1; + padding: 0 8px; + text-align: center; + text-shadow: 0 1px 0 #eee; +} + +#djDebug button:hover { + background-color: #ddd; + background-image: linear-gradient(to bottom, #ddd, #bbb); + border-color: #bbb; + border-bottom-color: #999; + cursor: pointer; + text-shadow: 0 1px 0 #ddd; +} + +#djDebug button:active { + border: 1px solid #aaa; + border-bottom: 1px solid #888; + box-shadow: inset 0 0 5px 2px #aaa, 0 1px 0 0 #eee; +} + +#djDebug #djDebugToolbar { + background-color: #111; + width: 220px; + z-index: 100000000; + position: fixed; + top: 0; + bottom: 0; + right: 0; + opacity: 0.9; + overflow-y: auto; +} + +#djDebug #djDebugToolbar small { + color: #999; +} + +#djDebug #djDebugToolbar ul { + margin: 0; + padding: 0; + list-style: none; +} + +#djDebug #djDebugToolbar li { + border-bottom: 1px solid #222; + color: #fff; + display: block; + font-weight: bold; + float: none; + margin: 0; + padding: 0; + position: relative; + width: auto; +} + +#djDebug #djDebugToolbar input[type="checkbox"] { + float: right; + margin: 10px; +} + +#djDebug #djDebugToolbar li > a, +#djDebug #djDebugToolbar li > div.djdt-contentless { + font-weight: normal; + font-style: normal; + text-decoration: none; + display: block; + font-size: 16px; + padding: 7px 10px 8px 25px; + color: #fff; +} +#djDebug #djDebugToolbar li > div.djdt-disabled { + font-style: italic; + color: #999; +} + +#djDebug #djDebugToolbar li a:hover { + color: #111; + background-color: #ffc; +} + +#djDebug #djDebugToolbar li.djdt-active { + background: #333; +} + +#djDebug #djDebugToolbar li.djdt-active:before { + content: "â–¶"; + font-family: var(--djdt-font-family-primary); + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + color: #eee; + font-size: 150%; +} + +#djDebug #djDebugToolbar li.djdt-active a:hover { + color: #b36a60; + background-color: transparent; +} + +#djDebug #djDebugToolbar li small { + font-size: 12px; + color: #999; + font-style: normal; + text-decoration: none; +} + +#djDebug #djDebugToolbarHandle { + position: fixed; + transform: translateY(-100%) rotate(-90deg); + transform-origin: right bottom; + background-color: #fff; + border: 1px solid #111; + border-bottom: 0; + top: 0; + right: 0; + z-index: 100000000; + opacity: 0.75; +} + +#djDebug #djShowToolBarButton { + padding: 0 5px; + border: 4px solid #fff; + border-bottom-width: 0; + color: #fff; + font-size: 22px; + font-weight: bold; + background: #000; + opacity: 0.6; +} + +#djDebug #djShowToolBarButton:hover { + background-color: #111; + border-color: #ffe761; + cursor: move; + opacity: 1; +} + +#djDebug #djShowToolBarD { + color: #cf9; + font-size: 22px; +} + +#djDebug #djShowToolBarJ { + color: #cf9; + font-size: 16px; +} + +#djDebug pre, +#djDebug code { + display: block; + font-family: var(--djdt-font-family-monospace); + overflow: auto; +} + +#djDebug code { + font-size: 12px; + white-space: pre; +} + +#djDebug pre { + white-space: pre-wrap; + color: var(--djdt-pre-text-color); + border: 1px solid var(--djdt-pre-border-color); + border-collapse: collapse; + background-color: var(--djdt-background-color); + padding: 2px 3px; + margin-bottom: 3px; +} + +#djDebug .djdt-panelContent { + position: fixed; + margin: 0; + top: 0; + right: 220px; + bottom: 0; + left: 0px; + background-color: var(--djdt-panel-content-background-color); + color: #666; + z-index: 100000000; +} + +#djDebug .djdt-panelContent > div { + border-bottom: 1px solid #ddd; +} + +#djDebug .djDebugPanelTitle { + position: absolute; + background-color: var(--djdt-panel-title-background-color); + color: #666; + padding-left: 20px; + top: 0; + right: 0; + left: 0; + height: 50px; +} + +#djDebug .djDebugPanelTitle code { + display: inline; + font-size: inherit; +} + +#djDebug .djDebugPanelContent { + position: absolute; + top: 50px; + right: 0; + bottom: 0; + left: 0; + height: auto; + padding: 5px 0 0 20px; +} + +#djDebug .djDebugPanelContent .djdt-loader { + margin: 80px auto; + border: 6px solid white; + border-radius: 50%; + border-top: 6px solid #ffe761; + width: 38px; + height: 38px; + animation: spin 2s linear infinite; +} + +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +#djDebug .djDebugPanelContent .djdt-scroll { + height: 100%; + overflow: auto; + display: block; + padding: 0 10px 0 0; +} + +#djDebug h3 { + font-size: 24px; + font-weight: normal; + line-height: 50px; +} + +#djDebug h4 { + font-size: 20px; + font-weight: bold; + margin-top: 0.8em; +} + +#djDebug .djdt-panelContent table { + border: 1px solid var(--djdt-table-border-color); + border-collapse: collapse; + width: 100%; + background-color: var(--djdt-panel-content-table-background-color); + display: table; + margin-top: 0.8em; + overflow: auto; +} +#djDebug .djdt-panelContent tbody > tr:nth-child(odd):not(.djdt-highlighted) { + background-color: var(--djdt-panel-content-table-strip-background-color); +} +#djDebug .djdt-panelContent tbody td, +#djDebug .djdt-panelContent tbody th { + vertical-align: top; + padding: 2px 3px; +} +#djDebug .djdt-panelContent tbody td.djdt-time { + text-align: center; +} + +#djDebug .djdt-panelContent thead th { + padding: 1px 6px 1px 3px; + text-align: left; + font-weight: bold; + font-size: 14px; + white-space: nowrap; +} +#djDebug .djdt-panelContent tbody th { + width: 12em; + text-align: right; + color: #666; + padding-right: 0.5em; +} + +#djDebug .djTemplateContext { + background-color: var(--djdt-background-color); +} + +#djDebug .djdt-panelContent .djDebugClose { + position: absolute; + top: 4px; + right: 15px; + line-height: 16px; + border: 6px solid #ddd; + border-radius: 50%; + background: #fff; + color: #ddd; + font-weight: 900; + font-size: 20px; + height: 36px; + width: 36px; + padding: 0 0 5px; + box-sizing: border-box; + display: grid; + place-items: center; +} + +#djDebug .djdt-panelContent .djDebugClose:hover { + background: #c0695d; +} + +#djDebug .djdt-panelContent dt, +#djDebug .djdt-panelContent dd { + display: block; +} + +#djDebug .djdt-panelContent dt { + margin-top: 0.75em; +} + +#djDebug .djdt-panelContent dd { + margin-left: 10px; +} + +#djDebug a.toggleTemplate { + padding: 4px; + background-color: var(--djdt-toggle-template-background-color); + border-radius: 3px; +} + +#djDebug a.toggleTemplate:hover { + padding: 4px; + background-color: #444; + color: #ffe761; + border-radius: 3px; +} + +#djDebug .djDebugCollapsed { + color: var(--djdt-sql-font-color); +} + +#djDebug .djDebugUncollapsed { + color: var(--djdt-sql-font-color); +} + +#djDebug .djUnselected { + display: none; +} + +#djDebug tr.djSelected { + display: table-row; +} + +#djDebug .djDebugSql { + overflow-wrap: anywhere; +} + +#djDebug .djSQLDetailsDiv tbody th { + text-align: left; +} + +#djDebug span.djDebugLineChart { + background-color: #777; + height: 3px; + position: absolute; + bottom: 0; + top: 0; + left: 0; + display: block; + z-index: 1000000001; +} +#djDebug span.djDebugLineChartWarning { + background-color: #900; +} + +#djDebug .highlight { + color: var(--djdt-font-color); +} +#djDebug .highlight .err { + color: var(--djdt-font-color); +} /* Error */ + +/* +Styles for pygments HTMLFormatter + +- This should match debug_toolbar/panels/templates/views.py::template_source +- Each line needs to be prefixed with #djDebug .highlight as well. +- The .w definition needs to include: + white-space: pre-wrap + +To regenerate: + + from pygments.formatters import HtmlFormatter + print(HtmlFormatter(wrapcode=True).get_style_defs()) + */ +#djDebug[data-theme="light"] .highlight pre { + line-height: 125%; +} +#djDebug[data-theme="light"] .highlight td.linenos .normal { + color: inherit; + background-color: transparent; + padding-left: 5px; + padding-right: 5px; +} +#djDebug[data-theme="light"] .highlight span.linenos { + color: inherit; + background-color: transparent; + padding-left: 5px; + padding-right: 5px; +} +#djDebug[data-theme="light"] .highlight td.linenos .special { + color: #000000; + background-color: #ffffc0; + padding-left: 5px; + padding-right: 5px; +} +#djDebug[data-theme="light"] .highlight span.linenos.special { + color: #000000; + background-color: #ffffc0; + padding-left: 5px; + padding-right: 5px; +} +#djDebug[data-theme="light"] .highlight .hll { + background-color: #ffffcc; +} +#djDebug[data-theme="light"] .highlight .c { + color: #3d7b7b; + font-style: italic; +} /* Comment */ +#djDebug[data-theme="light"] .highlight .err { + border: 1px solid #ff0000; +} /* Error */ +#djDebug[data-theme="light"] .highlight .k { + color: #008000; + font-weight: bold; +} /* Keyword */ +#djDebug[data-theme="light"] .highlight .o { + color: #666666; +} /* Operator */ +#djDebug[data-theme="light"] .highlight .ch { + color: #3d7b7b; + font-style: italic; +} /* Comment.Hashbang */ +#djDebug[data-theme="light"] .highlight .cm { + color: #3d7b7b; + font-style: italic; +} /* Comment.Multiline */ +#djDebug[data-theme="light"] .highlight .cp { + color: #9c6500; +} /* Comment.Preproc */ +#djDebug[data-theme="light"] .highlight .cpf { + color: #3d7b7b; + font-style: italic; +} /* Comment.PreprocFile */ +#djDebug[data-theme="light"] .highlight .c1 { + color: #3d7b7b; + font-style: italic; +} /* Comment.Single */ +#djDebug[data-theme="light"] .highlight .cs { + color: #3d7b7b; + font-style: italic; +} /* Comment.Special */ +#djDebug[data-theme="light"] .highlight .gd { + color: #a00000; +} /* Generic.Deleted */ +#djDebug[data-theme="light"] .highlight .ge { + font-style: italic; +} /* Generic.Emph */ +#djDebug[data-theme="light"] .highlight .ges { + font-weight: bold; + font-style: italic; +} /* Generic.EmphStrong */ +#djDebug[data-theme="light"] .highlight .gr { + color: #e40000; +} /* Generic.Error */ +#djDebug[data-theme="light"] .highlight .gh { + color: #000080; + font-weight: bold; +} /* Generic.Heading */ +#djDebug[data-theme="light"] .highlight .gi { + color: #008400; +} /* Generic.Inserted */ +#djDebug[data-theme="light"] .highlight .go { + color: #717171; +} /* Generic.Output */ +#djDebug[data-theme="light"] .highlight .gp { + color: #000080; + font-weight: bold; +} /* Generic.Prompt */ +#djDebug[data-theme="light"] .highlight .gs { + font-weight: bold; +} /* Generic.Strong */ +#djDebug[data-theme="light"] .highlight .gu { + color: #800080; + font-weight: bold; +} /* Generic.Subheading */ +#djDebug[data-theme="light"] .highlight .gt { + color: #0044dd; +} /* Generic.Traceback */ +#djDebug[data-theme="light"] .highlight .kc { + color: #008000; + font-weight: bold; +} /* Keyword.Constant */ +#djDebug[data-theme="light"] .highlight .kd { + color: #008000; + font-weight: bold; +} /* Keyword.Declaration */ +#djDebug[data-theme="light"] .highlight .kn { + color: #008000; + font-weight: bold; +} /* Keyword.Namespace */ +#djDebug[data-theme="light"] .highlight .kp { + color: #008000; +} /* Keyword.Pseudo */ +#djDebug[data-theme="light"] .highlight .kr { + color: #008000; + font-weight: bold; +} /* Keyword.Reserved */ +#djDebug[data-theme="light"] .highlight .kt { + color: #b00040; +} /* Keyword.Type */ +#djDebug[data-theme="light"] .highlight .m { + color: #666666; +} /* Literal.Number */ +#djDebug[data-theme="light"] .highlight .s { + color: #ba2121; +} /* Literal.String */ +#djDebug[data-theme="light"] .highlight .na { + color: #687822; +} /* Name.Attribute */ +#djDebug[data-theme="light"] .highlight .nb { + color: #008000; +} /* Name.Builtin */ +#djDebug[data-theme="light"] .highlight .nc { + color: #0000ff; + font-weight: bold; +} /* Name.Class */ +#djDebug[data-theme="light"] .highlight .no { + color: #880000; +} /* Name.Constant */ +#djDebug[data-theme="light"] .highlight .nd { + color: #aa22ff; +} /* Name.Decorator */ +#djDebug[data-theme="light"] .highlight .ni { + color: #717171; + font-weight: bold; +} /* Name.Entity */ +#djDebug[data-theme="light"] .highlight .ne { + color: #cb3f38; + font-weight: bold; +} /* Name.Exception */ +#djDebug[data-theme="light"] .highlight .nf { + color: #0000ff; +} /* Name.Function */ +#djDebug[data-theme="light"] .highlight .nl { + color: #767600; +} /* Name.Label */ +#djDebug[data-theme="light"] .highlight .nn { + color: #0000ff; + font-weight: bold; +} /* Name.Namespace */ +#djDebug[data-theme="light"] .highlight .nt { + color: #008000; + font-weight: bold; +} /* Name.Tag */ +#djDebug[data-theme="light"] .highlight .nv { + color: #19177c; +} /* Name.Variable */ +#djDebug[data-theme="light"] .highlight .ow { + color: #aa22ff; + font-weight: bold; +} /* Operator.Word */ +#djDebug[data-theme="light"] .highlight .w { + color: #bbbbbb; + white-space: pre-wrap; +} /* Text.Whitespace */ +#djDebug[data-theme="light"] .highlight .mb { + color: #666666; +} /* Literal.Number.Bin */ +#djDebug[data-theme="light"] .highlight .mf { + color: #666666; +} /* Literal.Number.Float */ +#djDebug[data-theme="light"] .highlight .mh { + color: #666666; +} /* Literal.Number.Hex */ +#djDebug[data-theme="light"] .highlight .mi { + color: #666666; +} /* Literal.Number.Integer */ +#djDebug[data-theme="light"] .highlight .mo { + color: #666666; +} /* Literal.Number.Oct */ +#djDebug[data-theme="light"] .highlight .sa { + color: #ba2121; +} /* Literal.String.Affix */ +#djDebug[data-theme="light"] .highlight .sb { + color: #ba2121; +} /* Literal.String.Backtick */ +#djDebug[data-theme="light"] .highlight .sc { + color: #ba2121; +} /* Literal.String.Char */ +#djDebug[data-theme="light"] .highlight .dl { + color: #ba2121; +} /* Literal.String.Delimiter */ +#djDebug[data-theme="light"] .highlight .sd { + color: #ba2121; + font-style: italic; +} /* Literal.String.Doc */ +#djDebug[data-theme="light"] .highlight .s2 { + color: #ba2121; +} /* Literal.String.Double */ +#djDebug[data-theme="light"] .highlight .se { + color: #aa5d1f; + font-weight: bold; +} /* Literal.String.Escape */ +#djDebug[data-theme="light"] .highlight .sh { + color: #ba2121; +} /* Literal.String.Heredoc */ +#djDebug[data-theme="light"] .highlight .si { + color: #a45a77; + font-weight: bold; +} /* Literal.String.Interpol */ +#djDebug[data-theme="light"] .highlight .sx { + color: #008000; +} /* Literal.String.Other */ +#djDebug[data-theme="light"] .highlight .sr { + color: #a45a77; +} /* Literal.String.Regex */ +#djDebug[data-theme="light"] .highlight .s1 { + color: #ba2121; +} /* Literal.String.Single */ +#djDebug[data-theme="light"] .highlight .ss { + color: #19177c; +} /* Literal.String.Symbol */ +#djDebug[data-theme="light"] .highlight .bp { + color: #008000; +} /* Name.Builtin.Pseudo */ +#djDebug[data-theme="light"] .highlight .fm { + color: #0000ff; +} /* Name.Function.Magic */ +#djDebug[data-theme="light"] .highlight .vc { + color: #19177c; +} /* Name.Variable.Class */ +#djDebug[data-theme="light"] .highlight .vg { + color: #19177c; +} /* Name.Variable.Global */ +#djDebug[data-theme="light"] .highlight .vi { + color: #19177c; +} /* Name.Variable.Instance */ +#djDebug[data-theme="light"] .highlight .vm { + color: #19177c; +} /* Name.Variable.Magic */ +#djDebug[data-theme="light"] .highlight .il { + color: #666666; +} /* Literal.Number.Integer.Long */ + +#djDebug[data-theme="dark"] .highlight .hll { + background-color: #f1fa8c; +} +#djDebug[data-theme="dark"] .highlight { + background: #282a36; + color: #f8f8f2; +} +#djDebug[data-theme="dark"] .highlight .c { + color: #6272a4; +} /* Comment */ +#djDebug[data-theme="dark"] .highlight .err { + color: #f8f8f2; +} /* Error */ +#djDebug[data-theme="dark"] .highlight .g { + color: #f8f8f2; +} /* Generic */ +#djDebug[data-theme="dark"] .highlight .k { + color: #ff79c6; +} /* Keyword */ +#djDebug[data-theme="dark"] .highlight .l { + color: #f8f8f2; +} /* Literal */ +#djDebug[data-theme="dark"] .highlight .n { + color: #f8f8f2; +} /* Name */ +#djDebug[data-theme="dark"] .highlight .o { + color: #ff79c6; +} /* Operator */ +#djDebug[data-theme="dark"] .highlight .x { + color: #f8f8f2; +} /* Other */ +#djDebug[data-theme="dark"] .highlight .p { + color: #f8f8f2; +} /* Punctuation */ +#djDebug[data-theme="dark"] .highlight .ch { + color: #6272a4; +} /* Comment.Hashbang */ +#djDebug[data-theme="dark"] .highlight .cm { + color: #6272a4; +} /* Comment.Multiline */ +#djDebug[data-theme="dark"] .highlight .cp { + color: #ff79c6; +} /* Comment.Preproc */ +#djDebug[data-theme="dark"] .highlight .cpf { + color: #6272a4; +} /* Comment.PreprocFile */ +#djDebug[data-theme="dark"] .highlight .c1 { + color: #6272a4; +} /* Comment.Single */ +#djDebug[data-theme="dark"] .highlight .cs { + color: #6272a4; +} /* Comment.Special */ +#djDebug[data-theme="dark"] .highlight .gd { + color: #8b080b; +} /* Generic.Deleted */ +#djDebug[data-theme="dark"] .highlight .ge { + color: #f8f8f2; + text-decoration: underline; +} /* Generic.Emph */ +#djDebug[data-theme="dark"] .highlight .gr { + color: #f8f8f2; +} /* Generic.Error */ +#djDebug[data-theme="dark"] .highlight .gh { + color: #f8f8f2; + font-weight: bold; +} /* Generic.Heading */ +#djDebug[data-theme="dark"] .highlight .gi { + color: #f8f8f2; + font-weight: bold; +} /* Generic.Inserted */ +#djDebug[data-theme="dark"] .highlight .go { + color: #44475a; +} /* Generic.Output */ +#djDebug[data-theme="dark"] .highlight .gp { + color: #f8f8f2; +} /* Generic.Prompt */ +#djDebug[data-theme="dark"] .highlight .gs { + color: #f8f8f2; +} /* Generic.Strong */ +#djDebug[data-theme="dark"] .highlight .gu { + color: #f8f8f2; + font-weight: bold; +} /* Generic.Subheading */ +#djDebug[data-theme="dark"] .highlight .gt { + color: #f8f8f2; +} /* Generic.Traceback */ +#djDebug[data-theme="dark"] .highlight .kc { + color: #ff79c6; +} /* Keyword.Constant */ +#djDebug[data-theme="dark"] .highlight .kd { + color: #8be9fd; + font-style: italic; +} /* Keyword.Declaration */ +#djDebug[data-theme="dark"] .highlight .kn { + color: #ff79c6; +} /* Keyword.Namespace */ +#djDebug[data-theme="dark"] .highlight .kp { + color: #ff79c6; +} /* Keyword.Pseudo */ +#djDebug[data-theme="dark"] .highlight .kr { + color: #ff79c6; +} /* Keyword.Reserved */ +#djDebug[data-theme="dark"] .highlight .kt { + color: #8be9fd; +} /* Keyword.Type */ +#djDebug[data-theme="dark"] .highlight .ld { + color: #f8f8f2; +} /* Literal.Date */ +#djDebug[data-theme="dark"] .highlight .m { + color: #bd93f9; +} /* Literal.Number */ +#djDebug[data-theme="dark"] .highlight .s { + color: #f1fa8c; +} /* Literal.String */ +#djDebug[data-theme="dark"] .highlight .na { + color: #50fa7b; +} /* Name.Attribute */ +#djDebug[data-theme="dark"] .highlight .nb { + color: #8be9fd; + font-style: italic; +} /* Name.Builtin */ +#djDebug[data-theme="dark"] .highlight .nc { + color: #50fa7b; +} /* Name.Class */ +#djDebug[data-theme="dark"] .highlight .no { + color: #f8f8f2; +} /* Name.Constant */ +#djDebug[data-theme="dark"] .highlight .nd { + color: #f8f8f2; +} /* Name.Decorator */ +#djDebug[data-theme="dark"] .highlight .ni { + color: #f8f8f2; +} /* Name.Entity */ +#djDebug[data-theme="dark"] .highlight .ne { + color: #f8f8f2; +} /* Name.Exception */ +#djDebug[data-theme="dark"] .highlight .nf { + color: #50fa7b; +} /* Name.Function */ +#djDebug[data-theme="dark"] .highlight .nl { + color: #8be9fd; + font-style: italic; +} /* Name.Label */ +#djDebug[data-theme="dark"] .highlight .nn { + color: #f8f8f2; +} /* Name.Namespace */ +#djDebug[data-theme="dark"] .highlight .nx { + color: #f8f8f2; +} /* Name.Other */ +#djDebug[data-theme="dark"] .highlight .py { + color: #f8f8f2; +} /* Name.Property */ +#djDebug[data-theme="dark"] .highlight .nt { + color: #ff79c6; +} /* Name.Tag */ +#djDebug[data-theme="dark"] .highlight .nv { + color: #8be9fd; + font-style: italic; +} /* Name.Variable */ +#djDebug[data-theme="dark"] .highlight .ow { + color: #ff79c6; +} /* Operator.Word */ +#djDebug[data-theme="dark"] .highlight .w { + color: #f8f8f2; +} /* Text.Whitespace */ +#djDebug[data-theme="dark"] .highlight .mb { + color: #bd93f9; +} /* Literal.Number.Bin */ +#djDebug[data-theme="dark"] .highlight .mf { + color: #bd93f9; +} /* Literal.Number.Float */ +#djDebug[data-theme="dark"] .highlight .mh { + color: #bd93f9; +} /* Literal.Number.Hex */ +#djDebug[data-theme="dark"] .highlight .mi { + color: #bd93f9; +} /* Literal.Number.Integer */ +#djDebug[data-theme="dark"] .highlight .mo { + color: #bd93f9; +} /* Literal.Number.Oct */ +#djDebug[data-theme="dark"] .highlight .sa { + color: #f1fa8c; +} /* Literal.String.Affix */ +#djDebug[data-theme="dark"] .highlight .sb { + color: #f1fa8c; +} /* Literal.String.Backtick */ +#djDebug[data-theme="dark"] .highlight .sc { + color: #f1fa8c; +} /* Literal.String.Char */ +#djDebug[data-theme="dark"] .highlight .dl { + color: #f1fa8c; +} /* Literal.String.Delimiter */ +#djDebug[data-theme="dark"] .highlight .sd { + color: #f1fa8c; +} /* Literal.String.Doc */ +#djDebug[data-theme="dark"] .highlight .s2 { + color: #f1fa8c; +} /* Literal.String.Double */ +#djDebug[data-theme="dark"] .highlight .se { + color: #f1fa8c; +} /* Literal.String.Escape */ +#djDebug[data-theme="dark"] .highlight .sh { + color: #f1fa8c; +} /* Literal.String.Heredoc */ +#djDebug[data-theme="dark"] .highlight .si { + color: #f1fa8c; +} /* Literal.String.Interpol */ +#djDebug[data-theme="dark"] .highlight .sx { + color: #f1fa8c; +} /* Literal.String.Other */ +#djDebug[data-theme="dark"] .highlight .sr { + color: #f1fa8c; +} /* Literal.String.Regex */ +#djDebug[data-theme="dark"] .highlight .s1 { + color: #f1fa8c; +} /* Literal.String.Single */ +#djDebug[data-theme="dark"] .highlight .ss { + color: #f1fa8c; +} /* Literal.String.Symbol */ +#djDebug[data-theme="dark"] .highlight .bp { + color: #f8f8f2; + font-style: italic; +} /* Name.Builtin.Pseudo */ +#djDebug[data-theme="dark"] .highlight .fm { + color: #50fa7b; +} /* Name.Function.Magic */ +#djDebug[data-theme="dark"] .highlight .vc { + color: #8be9fd; + font-style: italic; +} /* Name.Variable.Class */ +#djDebug[data-theme="dark"] .highlight .vg { + color: #8be9fd; + font-style: italic; +} /* Name.Variable.Global */ +#djDebug[data-theme="dark"] .highlight .vi { + color: #8be9fd; + font-style: italic; +} /* Name.Variable.Instance */ +#djDebug[data-theme="dark"] .highlight .vm { + color: #8be9fd; + font-style: italic; +} /* Name.Variable.Magic */ +#djDebug[data-theme="dark"] .highlight .il { + color: #bd93f9; +} /* Literal.Number.Integer.Long */ + +#djDebug svg.djDebugLineChart { + width: 100%; + height: 1.5em; +} + +#djDebug svg.djDebugLineChartWarning rect { + fill: #900; +} + +#djDebug svg.djDebugLineChartInTransaction rect { + fill: #d3ff82; +} +#djDebug svg.djDebugLineChart line { + stroke: #94b24d; +} + +#djDebug .djDebugRowWarning .djdt-time { + color: red; +} +#djDebug .djdt-panelContent table .djdt-toggle { + width: 14px; + padding-top: 3px; +} +#djDebug .djdt-panelContent table .djdt-actions { + min-width: 70px; + white-space: nowrap; +} +#djDebug .djdt-color:after { + content: "\00a0"; +} +#djDebug .djToggleSwitch { + box-sizing: content-box; + padding: 0; + border: 1px solid #999; + border-radius: 0; + width: 12px; + color: #777; + background: linear-gradient(to bottom, #fff, #dcdcdc); +} +#djDebug .djNoToggleSwitch { + height: 14px; + width: 14px; + display: inline-block; +} + +#djDebug .djSQLDetailsDiv { + margin-top: 0.8em; +} + +#djDebug .djdt-stack span { + color: var(--djdt-stack-span-color); + font-weight: bold; +} +#djDebug .djdt-stack span.djdt-path, +#djDebug .djdt-stack pre.djdt-locals, +#djDebug .djdt-stack pre.djdt-locals span { + color: var(--djdt-path-and-locals); + font-weight: normal; +} +#djDebug .djdt-stack span.djdt-code { + font-weight: normal; +} +#djDebug .djdt-stack pre.djdt-locals { + margin: 0 27px 27px 27px; +} +#djDebug .djdt-raw { + background-color: #fff; + border: 1px solid var(--djdt-raw-border-color); + margin-top: 0.8em; + padding: 5px; + white-space: pre-wrap; +} + +#djDebug .djdt-width-20 { + width: 20%; +} +#djDebug .djdt-width-30 { + width: 30%; +} +#djDebug .djdt-width-60 { + width: 60%; +} +#djDebug .djdt-max-height-100 { + max-height: 100%; +} +#djDebug .djdt-highlighted { + background-color: var(--djdt--highlighted-background-color); +} +#djDebug tr.djdt-highlighted.djdt-profile-row { + background-color: #ffc; +} +#djDebug tr.djdt-highlighted.djdt-profile-row:nth-child(2n + 1) { + background-color: #dd9; +} +@keyframes djdt-flash-new { + from { + background-color: green; + } + to { + background-color: inherit; + } +} +#djDebug .flash-new { + animation: djdt-flash-new 1s; +} + +.djdt-hidden { + display: none; +} + +#djDebug #djDebugToolbar a#djToggleThemeButton { + display: flex; + align-items: center; + cursor: pointer; +} +#djToggleThemeButton > svg { + margin-left: auto; +} +#djDebug[data-user-theme="light"] #djToggleThemeButton svg.theme-light, +#djDebug[data-user-theme="dark"] #djToggleThemeButton svg.theme-dark, +#djDebug[data-user-theme="auto"] #djToggleThemeButton svg.theme-auto { + display: block; + height: 1rem; + width: 1rem; +} diff --git a/staticfiles/debug_toolbar/js/history.js b/staticfiles/debug_toolbar/js/history.js new file mode 100644 index 00000000..d1015666 --- /dev/null +++ b/staticfiles/debug_toolbar/js/history.js @@ -0,0 +1,105 @@ +import { $$, ajaxForm, replaceToolbarState } from "./utils.js"; + +const djDebug = document.getElementById("djDebug"); + +function difference(setA, setB) { + const _difference = new Set(setA); + for (const elem of setB) { + _difference.delete(elem); + } + return _difference; +} + +/** + * Create an array of dataset properties from a NodeList. + */ +function pluckData(nodes, key) { + return [...nodes].map((obj) => obj.dataset[key]); +} + +function refreshHistory() { + const formTarget = djDebug.querySelector(".refreshHistory"); + const container = document.getElementById("djdtHistoryRequests"); + const oldIds = new Set( + pluckData(container.querySelectorAll("tr[data-store-id]"), "storeId") + ); + + ajaxForm(formTarget) + .then((data) => { + // Remove existing rows first then re-populate with new data + for (const node of container.querySelectorAll( + "tr[data-store-id]" + )) { + node.remove(); + } + for (const request of data.requests) { + container.innerHTML = request.content + container.innerHTML; + } + }) + .then(() => { + const allIds = new Set( + pluckData( + container.querySelectorAll("tr[data-store-id]"), + "storeId" + ) + ); + const newIds = difference(allIds, oldIds); + const lastRequestId = newIds.values().next().value; + return { + allIds, + newIds, + lastRequestId, + }; + }) + .then((refreshInfo) => { + for (const newId of refreshInfo.newIds) { + const row = container.querySelector( + `tr[data-store-id="${newId}"]` + ); + row.classList.add("flash-new"); + } + setTimeout(() => { + for (const row of container.querySelectorAll( + "tr[data-store-id]" + )) { + row.classList.remove("flash-new"); + } + }, 2000); + }); +} + +function switchHistory(newStoreId) { + const formTarget = djDebug.querySelector( + `.switchHistory[data-store-id='${newStoreId}']` + ); + const tbody = formTarget.closest("tbody"); + + const highlighted = tbody.querySelector(".djdt-highlighted"); + if (highlighted) { + highlighted.classList.remove("djdt-highlighted"); + } + formTarget.closest("tr").classList.add("djdt-highlighted"); + + ajaxForm(formTarget).then((data) => { + if (Object.keys(data).length === 0) { + const container = document.getElementById("djdtHistoryRequests"); + container.querySelector( + `button[data-store-id="${newStoreId}"]` + ).innerHTML = "Switch [EXPIRED]"; + } + replaceToolbarState(newStoreId, data); + }); +} + +$$.on(djDebug, "click", ".switchHistory", function (event) { + event.preventDefault(); + switchHistory(this.dataset.storeId); +}); + +$$.on(djDebug, "click", ".refreshHistory", (event) => { + event.preventDefault(); + refreshHistory(); +}); +// We don't refresh the whole toolbar each fetch or ajax request, +// so we need to refresh the history when we open the panel +$$.onPanelRender(djDebug, "HistoryPanel", refreshHistory); diff --git a/staticfiles/debug_toolbar/js/redirect.js b/staticfiles/debug_toolbar/js/redirect.js new file mode 100644 index 00000000..6976de4b --- /dev/null +++ b/staticfiles/debug_toolbar/js/redirect.js @@ -0,0 +1 @@ +document.getElementById("redirect_to").focus(); diff --git a/staticfiles/debug_toolbar/js/timer.js b/staticfiles/debug_toolbar/js/timer.js new file mode 100644 index 00000000..a01dbb2d --- /dev/null +++ b/staticfiles/debug_toolbar/js/timer.js @@ -0,0 +1,82 @@ +import { $$ } from "./utils.js"; + +function insertBrowserTiming() { + const timingOffset = performance.timing.navigationStart; + const timingEnd = performance.timing.loadEventEnd; + const totalTime = timingEnd - timingOffset; + function getLeft(stat) { + if (totalTime !== 0) { + return ( + ((performance.timing[stat] - timingOffset) / totalTime) * 100.0 + ); + } + return 0; + } + function getCSSWidth(stat, endStat) { + let width = 0; + if (totalTime !== 0) { + width = + ((performance.timing[endStat] - performance.timing[stat]) / + totalTime) * + 100.0; + } + const denominator = 100.0 - getLeft(stat); + if (denominator !== 0) { + // Calculate relative percent (same as sql panel logic) + width = (100.0 * width) / denominator; + } else { + width = 0; + } + return width < 1 ? "2px" : `${width}%`; + } + function addRow(tbody, stat, endStat) { + const row = document.createElement("tr"); + const elapsed = performance.timing[stat] - timingOffset; + if (endStat) { + const duration = + performance.timing[endStat] - performance.timing[stat]; + // Render a start through end bar + row.innerHTML = ` +
+ {% endif %}
+ {{ _("Name") }}: {{ user_.name }}
{{ _("Arabic Name") }}: {{ user_.arabic_name }}
{{ _("Phone Number") }}: {{ user_.phone_number }}