From bada43ba64febf651052f570b230283c8e74ed7e Mon Sep 17 00:00:00 2001 From: gitea Date: Fri, 7 Mar 2025 00:23:02 +0000 Subject: [PATCH] change --- .dockerignore | 22 + Dockerfile | 39 + api/__pycache__/__init__.cpython-311.pyc | Bin 174 -> 129 bytes api/__pycache__/admin.cpython-311.pyc | Bin 393 -> 348 bytes api/__pycache__/apps.cpython-311.pyc | Bin 539 -> 494 bytes api/__pycache__/models.cpython-311.pyc | Bin 961 -> 916 bytes api/__pycache__/serializers.cpython-311.pyc | Bin 6654 -> 6609 bytes api/__pycache__/services.cpython-311.pyc | Bin 2673 -> 2628 bytes api/__pycache__/urls.cpython-311.pyc | Bin 1945 -> 1900 bytes api/__pycache__/views.cpython-311.pyc | Bin 9086 -> 9041 bytes .../__pycache__/0001_initial.cpython-311.pyc | Bin 1068 -> 1023 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 185 -> 140 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 184 -> 139 bytes .../__pycache__/settings.cpython-311.pyc | Bin 8901 -> 8928 bytes .../__pycache__/urls.cpython-311.pyc | Bin 2313 -> 2268 bytes .../__pycache__/wsgi.cpython-311.pyc | Bin 718 -> 673 bytes docker-compose.yml | 31 + entrypoint.sh | 5 + haikalbot/migrations/0001_initial.py | 2 +- haikalbot/migrations/0002_initial.py | 2 +- .../__pycache__/__init__.cpython-311.pyc | Bin 180 -> 135 bytes inventory/__pycache__/admin.cpython-311.pyc | Bin 9238 -> 9193 bytes inventory/__pycache__/apps.cpython-311.pyc | Bin 747 -> 702 bytes inventory/__pycache__/filters.cpython-311.pyc | Bin 1079 -> 792 bytes inventory/__pycache__/forms.cpython-311.pyc | Bin 42241 -> 42196 bytes .../__pycache__/middleware.cpython-311.pyc | Bin 3866 -> 3821 bytes inventory/__pycache__/mixins.cpython-311.pyc | Bin 2479 -> 2434 bytes inventory/__pycache__/models.cpython-311.pyc | Bin 98031 -> 98982 bytes .../__pycache__/services.cpython-311.pyc | Bin 4098 -> 4390 bytes inventory/__pycache__/tables.cpython-311.pyc | Bin 5394 -> 5349 bytes inventory/__pycache__/urls.cpython-311.pyc | Bin 30543 -> 30610 bytes inventory/__pycache__/utils.cpython-311.pyc | Bin 40745 -> 40700 bytes inventory/__pycache__/views.cpython-311.pyc | Bin 228818 -> 236485 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 191 -> 146 bytes inventory/migrations/0001_initial.py | 209 +- .../0002_alter_carregistration_car.py | 19 - .../migrations/0002_alter_lead_customer.py | 21 - ...lead_first_name_lead_last_name_and_more.py | 46 - .../0004_remove_lead_city_lead_address.py | 23 - inventory/migrations/0005_schedule.py | 33 - .../migrations/0006_alter_schedule_purpose.py | 18 - .../0007_schedule_scheduled_type.py | 18 - inventory/migrations/0008_schedule_status.py | 18 - .../0009_alter_opportunity_customer.py | 21 - ..._make_remove_lead_id_car_model_and_more.py | 27 - ...emove_lead_year_alter_schedule_customer.py | 25 - .../migrations/0012_merge_20250206_1151.py | 14 - .../migrations/0012_merge_20250206_1308.py | 14 - ...13_alter_carregistration_text2_and_more.py | 23 - ..._id_car_make_lead_id_car_model_and_more.py | 33 - .../migrations/0015_merge_20250209_1116.py | 14 - .../migrations/0016_schedule_duration.py | 19 - inventory/migrations/0017_car_hash.py | 18 - inventory/migrations/0018_customer_user.py | 22 - inventory/migrations/0019_opportunity_lead.py | 19 - .../0020_alter_opportunity_closing_date.py | 18 - .../migrations/0021_alter_opportunity_lead.py | 19 - .../migrations/0022_opportunity_estimate.py | 21 - inventory/migrations/0023_email.py | 36 - .../0024_remove_email_body_email_message.py | 22 - inventory/migrations/0025_email_status.py | 18 - inventory/migrations/0026_carhistory.py | 29 - .../migrations/0027_carhistory_dealer.py | 20 - .../0028_carhistory_additional_info.py | 18 - ...rhistory_cost_remove_carhistory_mileage.py | 21 - ...ctivity_activity_type_delete_carhistory.py | 21 - ...er_alter_activity_content_type_and_more.py | 33 - .../migrations/0032_alter_carcolors_car.py | 19 - ..._staff_user_staff_staff_member_and_more.py | 32 - ...plan_remove_subscription_users_and_more.py | 38 - inventory/migrations/0038_customgroup.py | 25 - .../0039_alter_customgroup_dealer.py | 19 - inventory/migrations/0040_usersettings.py | 33 - ...0041_alter_usersettings_additional_info.py | 18 - .../0042_alter_usersettings_user.py | 21 - .../0043_alter_usersettings_user.py | 21 - ...0044_dealersettings_delete_usersettings.py | 33 - ...ttings_invoice_payable_account_and_more.py | 39 - ...ttings_invoice_prepaid_account_and_more.py | 25 - ...ings_invoice_recivable_account_and_more.py | 25 - ...rsettings_bill_payable_account_and_more.py | 39 - ...r_leadstatushistory_new_status_and_more.py | 33 - .../0049_carreservation_reserved_for.py | 22 - ...0050_remove_carreservation_reserved_for.py | 17 - .../migrations/0051_merge_20250226_1654.py | 14 - inventory/migrations/0052_lead_lead_type.py | 18 - .../migrations/0053_lead_crn_lead_vrn.py | 23 - .../migrations/0054_alter_staff_staff_type.py | 18 - inventory/migrations/0054_dealersmake.py | 26 - ...alter_staff_staff_type_0054_dealersmake.py | 14 - .../custom_filters.cpython-311.pyc | Bin 15512 -> 15467 bytes inventory/views.py | 9 +- requirements.txt | 20 +- scripts/run.py | 6 +- staticfiles/admin/css/autocomplete.css | 4 + staticfiles/admin/css/base.css | 90 +- staticfiles/admin/css/changelists.css | 19 +- staticfiles/admin/css/dark_mode.css | 23 +- staticfiles/admin/css/forms.css | 88 +- staticfiles/admin/css/login.css | 2 +- staticfiles/admin/css/nav_sidebar.css | 6 + staticfiles/admin/css/responsive.css | 56 +- staticfiles/admin/css/responsive_rtl.css | 37 +- staticfiles/admin/css/rtl.css | 35 +- .../admin/css/unusable_password_field.css | 19 + staticfiles/admin/css/widgets.css | 65 +- staticfiles/admin/img/README.txt | 2 +- staticfiles/admin/img/calendar-icons.svg | 69 +- staticfiles/admin/img/icon-addlink.svg | 2 +- staticfiles/admin/img/icon-changelink.svg | 2 +- staticfiles/admin/img/icon-hidelink.svg | 3 + staticfiles/admin/js/SelectFilter2.js | 5 +- staticfiles/admin/js/actions.js | 5 +- .../admin/js/admin/RelatedObjectLookups.js | 6 +- staticfiles/admin/js/calendar.js | 20 +- staticfiles/admin/js/core.js | 14 + staticfiles/admin/js/popup_response.js | 1 - staticfiles/admin/js/theme.js | 83 +- .../admin/js/unusable_password_field.js | 29 + staticfiles/admin/js/vendor/jquery/jquery.js | 1883 +- .../admin/js/vendor/jquery/jquery.min.js | 4 +- .../admin/js/vendor/xregexp/LICENSE.txt | 2 +- .../admin/js/vendor/xregexp/xregexp.js | 9160 ++-- .../admin/js/vendor/xregexp/xregexp.min.js | 177 +- staticfiles/assets/fonts/SaudiRiyalFont.ttf | Bin 0 -> 1864 bytes staticfiles/css/custom.css | 9 + staticfiles/css/line.css | 321 + staticfiles/css/theme-rtl.css | 2 + staticfiles/css/theme.css | 3 + staticfiles/debug_toolbar/css/toolbar.css | 147 +- staticfiles/fonts/line/unicons-14.ttf | Bin 0 -> 23124 bytes staticfiles/fonts/line/unicons-14.woff | Bin 0 -> 11252 bytes staticfiles/fonts/line/unicons-14.woff2 | Bin 0 -> 9248 bytes staticfiles/icons/195534_display-ui.svg | 57 + staticfiles/icons/195535_display-ui.svg | 53 + staticfiles/icons/195536_display-layout.svg | 57 + staticfiles/icons/195537_display-copy.svg | 51 + staticfiles/icons/195538_display.svg | 90 + staticfiles/icons/195539_display.svg | 88 + staticfiles/icons/195540_display.svg | 53 + staticfiles/icons/195541_display.svg | 53 + staticfiles/icons/195542_display-ui.svg | 53 + staticfiles/icons/195543_display.svg | 58 + staticfiles/icons/195544_display-copy.svg | 59 + staticfiles/icons/195545_display.svg | 55 + staticfiles/icons/195546_display-layout.svg | 50 + staticfiles/icons/195547_display-copy.svg | 50 + staticfiles/icons/195548_display-copy.svg | 55 + staticfiles/icons/195549_display-layout.svg | 55 + staticfiles/icons/195550_display-ui.svg | 59 + staticfiles/icons/195551_display.svg | 55 + staticfiles/icons/195552_display-layout.svg | 52 + staticfiles/icons/abacus.svg | 74 + staticfiles/icons/add.svg | 60 + staticfiles/icons/add_1.svg | 63 + .../icons/addthis-brands-and-logotypes.svg | 56 + staticfiles/icons/adjust-spanner.svg | 54 + staticfiles/icons/adobe-files-and-folders.svg | 65 + staticfiles/icons/agenda-miscellaneous.svg | 66 + staticfiles/icons/agenda-phone-book.svg | 54 + staticfiles/icons/alarm-bell copy.svg | 81 + staticfiles/icons/alarm-bell.svg | 61 + staticfiles/icons/alarm-silence.svg | 64 + staticfiles/icons/american-express.svg | 62 + staticfiles/icons/anchor.svg | 56 + staticfiles/icons/app-shop.svg | 52 + staticfiles/icons/apple.svg | 68 + staticfiles/icons/arrows-swap.svg | 59 + staticfiles/icons/attach-seo-and-web.svg | 43 + staticfiles/icons/avi.svg | 68 + staticfiles/icons/backward.svg | 55 + staticfiles/icons/backward_1.svg | 53 + staticfiles/icons/backward_2.svg | 50 + staticfiles/icons/backward_3.svg | 49 + staticfiles/icons/badge-discount.svg | 101 + staticfiles/icons/badge-new.svg | 104 + staticfiles/icons/balance-law.svg | 73 + staticfiles/icons/balance-law_1.svg | 72 + staticfiles/icons/balloons-celebration.svg | 65 + staticfiles/icons/bar-chart-bar-graph.svg | 51 + staticfiles/icons/bar-chart-seo-and-web.svg | 51 + staticfiles/icons/bar-chart-stats.svg | 70 + staticfiles/icons/barcode-product.svg | 63 + staticfiles/icons/battery-battery-level.svg | 52 + staticfiles/icons/battery.svg | 52 + staticfiles/icons/battery_1.svg | 56 + staticfiles/icons/battery_2.svg | 47 + staticfiles/icons/battery_3.svg | 46 + staticfiles/icons/battery_4.svg | 50 + staticfiles/icons/battery_5.svg | 51 + staticfiles/icons/beach-ocean.svg | 85 + .../icons/bebo-brands-and-logotypes.svg | 72 + staticfiles/icons/behance.svg | 101 + staticfiles/icons/bench.svg | 47 + staticfiles/icons/bible.svg | 59 + staticfiles/icons/big-ben-uk.svg | 64 + staticfiles/icons/billboard.svg | 67 + staticfiles/icons/bing.svg | 68 + staticfiles/icons/binoculars-see.svg | 92 + staticfiles/icons/blinder.svg | 65 + staticfiles/icons/block-not-allowed.svg | 49 + staticfiles/icons/blogger.svg | 63 + staticfiles/icons/blood-donation-donation.svg | 52 + staticfiles/icons/blood-donation.svg | 78 + staticfiles/icons/blueprint.svg | 64 + staticfiles/icons/bluetooth.svg | 51 + staticfiles/icons/bold-letter-b.svg | 55 + staticfiles/icons/bonfire-flame.svg | 63 + staticfiles/icons/book.svg | 60 + staticfiles/icons/bookmark.svg | 49 + staticfiles/icons/box.svg | 57 + staticfiles/icons/box_1.svg | 54 + staticfiles/icons/bridge.svg | 61 + staticfiles/icons/briefcase.svg | 58 + staticfiles/icons/brightness-sun.svg | 66 + staticfiles/icons/brightness.svg | 49 + staticfiles/icons/brightness_1.svg | 70 + staticfiles/icons/brightness_2.svg | 66 + staticfiles/icons/brightness_3.svg | 67 + staticfiles/icons/browser-lock.svg | 56 + staticfiles/icons/browser-website.svg | 62 + staticfiles/icons/browser-website_1.svg | 66 + .../icons/building-architecture-and-city.svg | 57 + .../building-architecture-and-city_1.svg | 53 + staticfiles/icons/building-city.svg | 57 + staticfiles/icons/building-skyscraper.svg | 61 + staticfiles/icons/building-town.svg | 54 + staticfiles/icons/building-town_1.svg | 62 + staticfiles/icons/bus-stop.svg | 59 + staticfiles/icons/cabinet.svg | 58 + staticfiles/icons/cafe.svg | 63 + staticfiles/icons/cage.svg | 67 + staticfiles/icons/calculator.svg | 62 + staticfiles/icons/calculator_1.svg | 58 + staticfiles/icons/calculator_2.svg | 61 + staticfiles/icons/calendar-date.svg | 57 + staticfiles/icons/calendar.svg | 95 + staticfiles/icons/calendar_1.svg | 65 + staticfiles/icons/calendars-calendar.svg | 59 + staticfiles/icons/camcorder.svg | 73 + staticfiles/icons/cancel-close.svg | 55 + staticfiles/icons/cancel-multiply.svg | 52 + staticfiles/icons/cancel.svg | 50 + staticfiles/icons/canoe.svg | 84 + staticfiles/icons/caravan-camping.svg | 54 + staticfiles/icons/cart-logistics-delivery.svg | 58 + .../icons/cathedral-of-saint-basil-russia.svg | 79 + staticfiles/icons/cctv-camera.svg | 58 + staticfiles/icons/cd.svg | 63 + staticfiles/icons/center-alignment-text.svg | 56 + staticfiles/icons/charity-stand.svg | 68 + staticfiles/icons/chat-communication.svg | 53 + staticfiles/icons/chat-conversation.svg | 59 + staticfiles/icons/chat.svg | 59 + staticfiles/icons/chat_1.svg | 68 + staticfiles/icons/chat_2.svg | 49 + staticfiles/icons/chat_3.svg | 54 + staticfiles/icons/check-money.svg | 57 + staticfiles/icons/check-success.svg | 52 + staticfiles/icons/checked-success.svg | 52 + staticfiles/icons/checked-tick.svg | 48 + staticfiles/icons/chevron-angle.svg | 46 + staticfiles/icons/chevron-angle_1.svg | 46 + staticfiles/icons/chevron-angle_2.svg | 56 + staticfiles/icons/chevron-angle_3.svg | 49 + staticfiles/icons/chevron-arrow.svg | 55 + staticfiles/icons/chevron-arrowhead.svg | 53 + staticfiles/icons/chevron-arrowhead_1.svg | 49 + staticfiles/icons/chevron-arrowhead_2.svg | 46 + staticfiles/icons/chevron-arrowhead_3.svg | 47 + staticfiles/icons/chevron-arrowhead_4.svg | 46 + staticfiles/icons/chevron-down.svg | 50 + staticfiles/icons/chevron-download.svg | 46 + staticfiles/icons/chevron-military.svg | 47 + staticfiles/icons/chevron-next.svg | 46 + staticfiles/icons/chevron-next_1.svg | 53 + staticfiles/icons/chevron-next_2.svg | 49 + staticfiles/icons/chevron-next_3.svg | 45 + staticfiles/icons/chevron.svg | 46 + staticfiles/icons/chevron_1.svg | 46 + staticfiles/icons/chevron_2.svg | 48 + staticfiles/icons/chinese-temple-china.svg | 63 + .../christ-the-redeemer-rio-de-janeiro.svg | 55 + staticfiles/icons/church.svg | 49 + staticfiles/icons/city-hall-monument.svg | 50 + staticfiles/icons/city-town.svg | 71 + staticfiles/icons/clip-paper-clip.svg | 52 + staticfiles/icons/clipboard-list.svg | 51 + staticfiles/icons/clock-time.svg | 66 + staticfiles/icons/clock-watch.svg | 64 + staticfiles/icons/clock-watch_1.svg | 58 + staticfiles/icons/close-up.svg | 70 + staticfiles/icons/close-up_1.svg | 71 + staticfiles/icons/close.svg | 54 + staticfiles/icons/closed.svg | 71 + staticfiles/icons/cloud-cloud-computing.svg | 64 + staticfiles/icons/cloud-computing-cloud.svg | 58 + staticfiles/icons/cloud-computing-play.svg | 63 + staticfiles/icons/cloud-computing-warning.svg | 52 + staticfiles/icons/cloud-sky.svg | 79 + staticfiles/icons/cloud-weather.svg | 56 + staticfiles/icons/cloudy-cloud.svg | 87 + staticfiles/icons/cloudy-cloud_1.svg | 88 + staticfiles/icons/cloudy-cloud_2.svg | 111 + staticfiles/icons/cloudy-night-cloud.svg | 70 + staticfiles/icons/coding-code.svg | 65 + staticfiles/icons/coins-stack.svg | 63 + staticfiles/icons/columns-ui.svg | 49 + staticfiles/icons/compact-disc-cd.svg | 67 + staticfiles/icons/compass.svg | 56 + staticfiles/icons/compress.svg | 61 + staticfiles/icons/compress_1.svg | 53 + staticfiles/icons/computer-electronics.svg | 60 + staticfiles/icons/computer-mouse-clicker.svg | 57 + staticfiles/icons/computer-tv.svg | 47 + staticfiles/icons/conference-lectern.svg | 75 + staticfiles/icons/contact.svg | 55 + staticfiles/icons/contrast-control.svg | 51 + staticfiles/icons/contrast.svg | 54 + staticfiles/icons/controller-adjust.svg | 59 + staticfiles/icons/conversation-chat.svg | 75 + staticfiles/icons/conversation-chat_1.svg | 103 + staticfiles/icons/conversation-chat_2.svg | 51 + staticfiles/icons/conversation-chat_3.svg | 51 + staticfiles/icons/copy.svg | 52 + staticfiles/icons/couple.svg | 68 + staticfiles/icons/cpu.svg | 55 + staticfiles/icons/credit-card-lock.svg | 61 + .../icons/credit-card-payment-method copy.svg | 64 + .../icons/credit-card-payment-method.svg | 64 + .../icons/credit-card-payment-method_1.svg | 65 + staticfiles/icons/credit-card.svg | 61 + staticfiles/icons/credit-card_1.svg | 59 + staticfiles/icons/crop.svg | 47 + staticfiles/icons/crotchet-semibreve.svg | 48 + staticfiles/icons/css.svg | 73 + staticfiles/icons/cursor-ui.svg | 54 + staticfiles/icons/cursor.svg | 44 + staticfiles/icons/cursor_1.svg | 50 + staticfiles/icons/cursor_2.svg | 62 + .../icons/customer-service-24-hours.svg | 89 + staticfiles/icons/cut-scissors.svg | 67 + staticfiles/icons/date-calendar.svg | 59 + staticfiles/icons/day-month.svg | 53 + staticfiles/icons/day-week.svg | 61 + staticfiles/icons/day-week_1.svg | 60 + staticfiles/icons/deck-chair.svg | 61 + staticfiles/icons/delete-bin.svg | 80 + staticfiles/icons/delete.svg | 61 + staticfiles/icons/delete_1.svg | 51 + staticfiles/icons/delete_2.svg | 50 + staticfiles/icons/delete_3.svg | 63 + staticfiles/icons/delete_4.svg | 55 + staticfiles/icons/delete_5.svg | 50 + staticfiles/icons/delete_6.svg | 57 + .../icons/delicious-brands-and-logotypes.svg | 53 + .../icons/demisemiquaver-semibreve.svg | 54 + staticfiles/icons/desert-cactus.svg | 60 + staticfiles/icons/desk-lamp.svg | 61 + staticfiles/icons/devaluation-money.svg | 62 + staticfiles/icons/deviantart.svg | 82 + staticfiles/icons/diagonal-arrow-arrows.svg | 45 + staticfiles/icons/diagonal-arrow-arrows_1.svg | 50 + staticfiles/icons/diagonal-arrow-arrows_2.svg | 51 + staticfiles/icons/diagonal-arrow-ui.svg | 51 + staticfiles/icons/diagonal-arrow-ui_1.svg | 45 + staticfiles/icons/diagonal-arrow-ui_2.svg | 45 + staticfiles/icons/diagonal-arrow-ui_3.svg | 45 + staticfiles/icons/diagonal-arrow-ui_4.svg | 45 + staticfiles/icons/diagonal-arrow-ui_5.svg | 46 + staticfiles/icons/diagonal-arrow-ui_6.svg | 46 + staticfiles/icons/diagonal-arrow.svg | 46 + staticfiles/icons/diagonal-arrow_1.svg | 51 + staticfiles/icons/diagonal-ui.svg | 51 + staticfiles/icons/diagonal-ui_1.svg | 51 + staticfiles/icons/diagonal-ui_2.svg | 51 + staticfiles/icons/diagonal-ui_3.svg | 51 + .../icons/digg-brands-and-logotypes.svg | 93 + staticfiles/icons/diners-club.svg | 66 + staticfiles/icons/direction-placeholders.svg | 51 + staticfiles/icons/direction-route.svg | 70 + staticfiles/icons/directional-direction.svg | 50 + staticfiles/icons/discman.svg | 78 + staticfiles/icons/discount.svg | 60 + staticfiles/icons/diskette-save.svg | 57 + staticfiles/icons/dislike.svg | 71 + staticfiles/icons/distance.svg | 81 + staticfiles/icons/document.svg | 66 + staticfiles/icons/document_1.svg | 58 + staticfiles/icons/dollar-money.svg | 70 + staticfiles/icons/donate-donation.svg | 76 + staticfiles/icons/donate-donation_1.svg | 91 + staticfiles/icons/donate-money.svg | 69 + staticfiles/icons/donation-bank.svg | 67 + staticfiles/icons/donation-heart.svg | 86 + staticfiles/icons/donation-money.svg | 57 + staticfiles/icons/donation-stand.svg | 76 + staticfiles/icons/donation.svg | 76 + staticfiles/icons/donation_1.svg | 59 + staticfiles/icons/donation_2.svg | 66 + staticfiles/icons/dove-bird.svg | 60 + staticfiles/icons/down-arrow-arrows.svg | 43 + staticfiles/icons/down-arrow-download.svg | 46 + staticfiles/icons/down-arrow-download_1.svg | 44 + staticfiles/icons/down-arrow-ui.svg | 46 + staticfiles/icons/down-arrow-ui_1.svg | 50 + staticfiles/icons/download-down-arrow.svg | 49 + staticfiles/icons/download-file-download.svg | 53 + staticfiles/icons/download.svg | 48 + staticfiles/icons/download_1.svg | 50 + staticfiles/icons/download_2.svg | 49 + staticfiles/icons/download_3.svg | 52 + staticfiles/icons/download_4.svg | 66 + staticfiles/icons/download_5.svg | 52 + staticfiles/icons/drag.svg | 57 + .../icons/dribbble-brands-and-logotypes.svg | 122 + staticfiles/icons/dropbox.svg | 74 + staticfiles/icons/dropper-dosage.svg | 50 + staticfiles/icons/dss-files-and-folders.svg | 71 + staticfiles/icons/earth-globe-earth.svg | 87 + staticfiles/icons/earth-globe-planet.svg | 116 + staticfiles/icons/ebay.svg | 115 + staticfiles/icons/eclipse-moon.svg | 58 + .../icons/ecology-ecology-and-environment.svg | 89 + staticfiles/icons/edit-cutter.svg | 49 + staticfiles/icons/edit-pencil.svg | 59 + staticfiles/icons/eiffel-tower-landmark.svg | 55 + .../icons/eject-music-and-multimedia.svg | 53 + staticfiles/icons/eject-video-player.svg | 48 + staticfiles/icons/eject.svg | 55 + staticfiles/icons/electric-tower.svg | 59 + staticfiles/icons/email-mail.svg | 46 + staticfiles/icons/email-mail_1.svg | 48 + staticfiles/icons/email-mails.svg | 46 + staticfiles/icons/email.svg | 51 + staticfiles/icons/email_1.svg | 45 + staticfiles/icons/emails-mail.svg | 49 + staticfiles/icons/employee-skills.svg | 54 + staticfiles/icons/employees-meeting.svg | 58 + staticfiles/icons/envelope-mail.svg | 56 + staticfiles/icons/eraser.svg | 59 + staticfiles/icons/eraser_1.svg | 57 + staticfiles/icons/ereader-ebook.svg | 57 + staticfiles/icons/euro.svg | 71 + staticfiles/icons/evernote.svg | 94 + staticfiles/icons/excel.svg | 78 + staticfiles/icons/exchange-change.svg | 64 + staticfiles/icons/exchange-change_1.svg | 53 + staticfiles/icons/exchange.svg | 95 + staticfiles/icons/expand-fullscreen.svg | 51 + staticfiles/icons/expand.svg | 50 + staticfiles/icons/expand_1.svg | 59 + staticfiles/icons/expand_2.svg | 78 + staticfiles/icons/expand_3.svg | 53 + staticfiles/icons/export.svg | 58 + staticfiles/icons/eye.svg | 57 + staticfiles/icons/facebook.svg | 56 + staticfiles/icons/factory.svg | 61 + staticfiles/icons/fast-backward-backward.svg | 59 + .../icons/fast-backward-backward_1.svg | 55 + staticfiles/icons/fast-forward-double.svg | 55 + staticfiles/icons/fast-forward-play.svg | 51 + staticfiles/icons/fast-forward-ui.svg | 46 + staticfiles/icons/fast-forward.svg | 59 + staticfiles/icons/favorites-rate.svg | 49 + staticfiles/icons/ferris-wheel.svg | 86 + staticfiles/icons/file-accept.svg | 64 + staticfiles/icons/file-add.svg | 64 + staticfiles/icons/file-audio.svg | 70 + staticfiles/icons/file-cancel.svg | 66 + staticfiles/icons/file-coding.svg | 64 + staticfiles/icons/file-document.svg | 65 + staticfiles/icons/file-files-and-folders.svg | 67 + .../icons/file-files-and-folders_1.svg | 65 + .../icons/file-files-and-folders_2.svg | 65 + staticfiles/icons/file-remove.svg | 60 + staticfiles/icons/file-video-file.svg | 61 + staticfiles/icons/files-archive.svg | 58 + staticfiles/icons/files-document.svg | 54 + staticfiles/icons/files-files-and-folders.svg | 49 + staticfiles/icons/film-reel.svg | 54 + .../icons/film-strip-negative-film.svg | 53 + staticfiles/icons/film-strip.svg | 58 + staticfiles/icons/finance-book-economy.svg | 50 + staticfiles/icons/fire-hydrant.svg | 54 + staticfiles/icons/fla-files-and-folders.svg | 68 + .../icons/flashlight-tools-and-utensils.svg | 50 + staticfiles/icons/flickr.svg | 58 + staticfiles/icons/flip-flops-sandals.svg | 90 + staticfiles/icons/folder-data-storage.svg | 54 + .../icons/folder-files-and-folders.svg | 57 + .../icons/folder-files-and-folders_1.svg | 50 + .../icons/folder-files-and-folders_2.svg | 66 + staticfiles/icons/folder.svg | 61 + staticfiles/icons/folder_1.svg | 52 + staticfiles/icons/folder_2.svg | 54 + staticfiles/icons/folder_3.svg | 53 + staticfiles/icons/folder_4.svg | 57 + staticfiles/icons/font.svg | 68 + .../icons/forrst-brands-and-logotypes.svg | 57 + staticfiles/icons/forward-keyboard.svg | 53 + staticfiles/icons/forward-redo.svg | 50 + staticfiles/icons/forward.svg | 55 + staticfiles/icons/fountain.svg | 50 + .../icons/foursquare-brands-and-logotypes.svg | 59 + staticfiles/icons/foursquare-microsoft.svg | 63 + staticfiles/icons/full-moon-moon.svg | 115 + staticfiles/icons/fullscreen.svg | 52 + staticfiles/icons/furniture-locker.svg | 47 + staticfiles/icons/garbage-bin.svg | 68 + staticfiles/icons/geolocalization.svg | 142 + staticfiles/icons/gif.svg | 68 + staticfiles/icons/gift-card.svg | 79 + staticfiles/icons/gift.svg | 62 + staticfiles/icons/gift_1.svg | 79 + staticfiles/icons/global-loupe.svg | 91 + staticfiles/icons/golden-gate-bridge.svg | 62 + staticfiles/icons/google-plus.svg | 73 + staticfiles/icons/grand-canyon.svg | 48 + .../great-buddha-of-thailand-thailand.svg | 83 + .../grooveshark-brands-and-logotypes.svg | 82 + .../icons/group-multiple-users copy.svg | 126 + staticfiles/icons/group-multiple-users.svg | 81 + staticfiles/icons/group-talk.svg | 55 + staticfiles/icons/group-user.svg | 84 + staticfiles/icons/growth.svg | 52 + staticfiles/icons/growth_1.svg | 67 + staticfiles/icons/hail.svg | 65 + staticfiles/icons/hamburger-burger.svg | 59 + staticfiles/icons/hand-cooperation.svg | 60 + staticfiles/icons/handshake-deal.svg | 60 + staticfiles/icons/handshake.svg | 75 + staticfiles/icons/hanger.svg | 70 + staticfiles/icons/headphone-headphones.svg | 65 + staticfiles/icons/headphones.svg | 69 + staticfiles/icons/headset.svg | 60 + staticfiles/icons/heart-hospital.svg | 75 + staticfiles/icons/heart-like.svg | 68 + staticfiles/icons/heart-like_1.svg | 60 + staticfiles/icons/heart-like_2.svg | 87 + .../icons/heart-shapes-and-symbols.svg | 55 + staticfiles/icons/heart.svg | 60 + staticfiles/icons/heart_1.svg | 54 + staticfiles/icons/hearts-heart.svg | 55 + staticfiles/icons/helm.svg | 67 + .../icons/hemidemisemiquarver-semibreve.svg | 58 + staticfiles/icons/hide-blind.svg | 52 + staticfiles/icons/high-heels-fashion.svg | 65 + staticfiles/icons/hold-take.svg | 68 + staticfiles/icons/home-house.svg | 57 + staticfiles/icons/hospital-medical.svg | 59 + staticfiles/icons/hospital.svg | 56 + staticfiles/icons/hospital_1.svg | 63 + staticfiles/icons/hot-dog-stand.svg | 63 + staticfiles/icons/hourglass.svg | 80 + staticfiles/icons/hourglass_1.svg | 63 + staticfiles/icons/hourglass_2.svg | 63 + staticfiles/icons/house-rural.svg | 55 + staticfiles/icons/house.svg | 70 + staticfiles/icons/house_1.svg | 60 + staticfiles/icons/house_2.svg | 49 + staticfiles/icons/html-code.svg | 71 + staticfiles/icons/html5.svg | 70 + staticfiles/icons/human-resources-search.svg | 67 + staticfiles/icons/id-card-identity.svg | 56 + staticfiles/icons/id-card.svg | 66 + staticfiles/icons/image.svg | 54 + staticfiles/icons/image_1.svg | 64 + staticfiles/icons/import.svg | 58 + staticfiles/icons/inbox-download.svg | 52 + staticfiles/icons/inbox-mail.svg | 60 + staticfiles/icons/inbox.svg | 56 + staticfiles/icons/indd-files-and-folders.svg | 70 + staticfiles/icons/indent.svg | 60 + staticfiles/icons/instagram.svg | 87 + staticfiles/icons/insurance.svg | 65 + staticfiles/icons/invoice-bill.svg | 71 + staticfiles/icons/island.svg | 78 + staticfiles/icons/island_1.svg | 71 + staticfiles/icons/iso.svg | 69 + staticfiles/icons/italic.svg | 51 + staticfiles/icons/jar-jar-file.svg | 71 + staticfiles/icons/joystick-gamepad.svg | 62 + staticfiles/icons/justify-align-justify.svg | 56 + staticfiles/icons/justify-text.svg | 54 + staticfiles/icons/key-access.svg | 61 + staticfiles/icons/keyboard.svg | 58 + staticfiles/icons/kickstarter.svg | 60 + staticfiles/icons/landscape-moon.svg | 55 + staticfiles/icons/laptop.svg | 47 + .../icons/lastfm-brands-and-logotypes.svg | 77 + staticfiles/icons/layer-ruler.svg | 64 + .../icons/leaning-tower-of-pisa-europe.svg | 68 + .../icons/left-alignment-alignment.svg | 57 + staticfiles/icons/left-alignment-text.svg | 56 + staticfiles/icons/left-alignment-text_1.svg | 54 + staticfiles/icons/left-arrow-back.svg | 47 + staticfiles/icons/left-arrow-back_1.svg | 44 + staticfiles/icons/left-arrow-back_2.svg | 49 + staticfiles/icons/left-arrow.svg | 51 + staticfiles/icons/levels-adjust.svg | 64 + staticfiles/icons/levels-ui.svg | 51 + staticfiles/icons/levels-ui_1.svg | 47 + staticfiles/icons/levels-ui_2.svg | 47 + staticfiles/icons/levels-ui_3.svg | 51 + staticfiles/icons/levels-ui_4.svg | 51 + staticfiles/icons/lifesaver-help.svg | 85 + staticfiles/icons/lifesaver-help_1.svg | 110 + staticfiles/icons/light-bulb-idea.svg | 53 + staticfiles/icons/lighter.svg | 75 + staticfiles/icons/lightning.svg | 48 + staticfiles/icons/like.svg | 71 + staticfiles/icons/link.svg | 66 + staticfiles/icons/link_1.svg | 61 + staticfiles/icons/linkedin.svg | 67 + staticfiles/icons/list-menu.svg | 69 + staticfiles/icons/list-menu_1.svg | 56 + staticfiles/icons/list-tasks-dark.svg | 26 + staticfiles/icons/list-tasks.svg | 67 + staticfiles/icons/livejournal.svg | 72 + staticfiles/icons/loading.svg | 91 + staticfiles/icons/loading_1.svg | 102 + staticfiles/icons/loading_2.svg | 95 + staticfiles/icons/loading_3.svg | 95 + staticfiles/icons/loading_4.svg | 85 + staticfiles/icons/locations-gps.svg | 59 + staticfiles/icons/lock-correct.svg | 61 + staticfiles/icons/lock-correct_1.svg | 54 + staticfiles/icons/lock-security.svg | 70 + staticfiles/icons/lock-tools-and-utensils.svg | 58 + .../icons/lock-tools-and-utensils_1.svg | 57 + staticfiles/icons/lock-wrong.svg | 64 + staticfiles/icons/lock-wrong_1.svg | 56 + staticfiles/icons/lock.svg | 54 + staticfiles/icons/lock_1.svg | 54 + staticfiles/icons/lock_2.svg | 61 + staticfiles/icons/login.svg | 54 + staticfiles/icons/login_1.svg | 51 + staticfiles/icons/logout.svg | 51 + staticfiles/icons/logout_1.svg | 54 + staticfiles/icons/loss.svg | 78 + staticfiles/icons/loss_1.svg | 47 + staticfiles/icons/loss_2.svg | 50 + staticfiles/icons/magic-wand.svg | 60 + staticfiles/icons/mail.svg | 53 + staticfiles/icons/mail_1.svg | 55 + staticfiles/icons/map-maps-and-flags.svg | 55 + staticfiles/icons/map-roll.svg | 63 + staticfiles/icons/map-street-map.svg | 59 + staticfiles/icons/map-street-map_1.svg | 59 + staticfiles/icons/map.svg | 53 + staticfiles/icons/mastercard.svg | 60 + staticfiles/icons/maximize-expand.svg | 61 + staticfiles/icons/medal-award.svg | 52 + staticfiles/icons/medal-quality.svg | 59 + staticfiles/icons/meeting-interview.svg | 74 + staticfiles/icons/megaphone.svg | 68 + staticfiles/icons/megaphone_1.svg | 52 + staticfiles/icons/megaphone_2.svg | 66 + staticfiles/icons/menu-grid.svg | 55 + staticfiles/icons/menu.svg | 50 + staticfiles/icons/menu_1.svg | 54 + staticfiles/icons/menu_2.svg | 77 + staticfiles/icons/menu_3.svg | 204 + staticfiles/icons/menu_4.svg | 56 + staticfiles/icons/message-email.svg | 55 + staticfiles/icons/message-mail.svg | 55 + staticfiles/icons/microphone.svg | 65 + staticfiles/icons/microphone_1.svg | 63 + staticfiles/icons/minim.svg | 66 + staticfiles/icons/minimize-ui.svg | 78 + staticfiles/icons/minus.svg | 45 + staticfiles/icons/minus_1.svg | 48 + staticfiles/icons/moais-chile.svg | 71 + .../icons/mobile-phone-touch-screen.svg | 63 + .../icons/mobile-phone-touch-screen_1.svg | 65 + .../icons/mobile-phone-touch-screen_2.svg | 57 + .../icons/mobile-phone-touch-screen_3.svg | 67 + .../icons/mobile-phone-touch-screen_4.svg | 53 + staticfiles/icons/modem.svg | 72 + staticfiles/icons/money-bag.svg | 63 + staticfiles/icons/money-cash.svg | 70 + staticfiles/icons/money-cash_1.svg | 72 + staticfiles/icons/money-cash_2.svg | 67 + staticfiles/icons/money-pay.svg | 76 + staticfiles/icons/money-pay_1.svg | 71 + staticfiles/icons/money.svg | 60 + staticfiles/icons/money_1.svg | 68 + staticfiles/icons/monument-america.svg | 55 + staticfiles/icons/moon-phases-moon.svg | 57 + staticfiles/icons/moon-phases-moon_1.svg | 69 + staticfiles/icons/moon-phases-moon_2.svg | 89 + staticfiles/icons/moon-phases-moon_3.svg | 66 + staticfiles/icons/moon-phases.svg | 116 + staticfiles/icons/moon-phases_1.svg | 73 + staticfiles/icons/more.svg | 56 + staticfiles/icons/more_1.svg | 58 + staticfiles/icons/mountains-altitude.svg | 43 + staticfiles/icons/mountains-altitude_1.svg | 62 + staticfiles/icons/mountains-mountain.svg | 54 + staticfiles/icons/mountains-sky.svg | 54 + staticfiles/icons/mouse.svg | 52 + staticfiles/icons/mov.svg | 71 + staticfiles/icons/move.svg | 49 + staticfiles/icons/move_1.svg | 53 + staticfiles/icons/mp3.svg | 73 + staticfiles/icons/music-music-player.svg | 56 + staticfiles/icons/music.svg | 61 + staticfiles/icons/music_1.svg | 77 + staticfiles/icons/myspace-microsoft.svg | 84 + staticfiles/icons/navigation-gps.svg | 74 + staticfiles/icons/next.svg | 50 + staticfiles/icons/next_1.svg | 44 + staticfiles/icons/next_2.svg | 58 + staticfiles/icons/next_3.svg | 50 + staticfiles/icons/next_4.svg | 46 + staticfiles/icons/nfc.svg | 50 + staticfiles/icons/notepad-note.svg | 63 + staticfiles/icons/notes-post-it.svg | 104 + staticfiles/icons/notification.svg | 56 + staticfiles/icons/office-chair-chair.svg | 57 + staticfiles/icons/open-book-book.svg | 55 + staticfiles/icons/open-book-book_1.svg | 61 + staticfiles/icons/open-book.svg | 56 + staticfiles/icons/open-shop.svg | 75 + staticfiles/icons/open.svg | 62 + staticfiles/icons/opera.svg | 81 + staticfiles/icons/outbox-inbox.svg | 53 + staticfiles/icons/outbox.svg | 47 + staticfiles/icons/outdent-ui.svg | 60 + staticfiles/icons/package-delivery.svg | 65 + staticfiles/icons/package.svg | 57 + staticfiles/icons/padlock-lock.svg | 54 + staticfiles/icons/paid.svg | 65 + .../icons/paint-brush-art-and-design.svg | 59 + staticfiles/icons/paint-brush-artist.svg | 69 + staticfiles/icons/paint-bucket.svg | 60 + staticfiles/icons/pamela-hat.svg | 52 + staticfiles/icons/pantone.svg | 55 + staticfiles/icons/paper-plane-origami.svg | 45 + .../icons/paperclip-tools-and-utensils.svg | 53 + staticfiles/icons/paragraph.svg | 60 + staticfiles/icons/parthenon-athens.svg | 50 + staticfiles/icons/password.svg | 60 + staticfiles/icons/password_1.svg | 101 + staticfiles/icons/paste-sheet.svg | 51 + staticfiles/icons/pause.svg | 56 + staticfiles/icons/pause_1.svg | 52 + staticfiles/icons/pause_2.svg | 52 + staticfiles/icons/paypal.svg | 61 + staticfiles/icons/pdf.svg | 69 + staticfiles/icons/pen-writing.svg | 52 + staticfiles/icons/pen.svg | 55 + staticfiles/icons/pencil-compose.svg | 61 + staticfiles/icons/pencil-edit.svg | 57 + staticfiles/icons/percentage-discount.svg | 81 + staticfiles/icons/pet-house-kennel.svg | 70 + .../phone-booth-architecture-and-city.svg | 51 + staticfiles/icons/photo-camera.svg | 61 + staticfiles/icons/php.svg | 69 + staticfiles/icons/piano.svg | 56 + staticfiles/icons/picasa.svg | 69 + staticfiles/icons/picture-image.svg | 60 + staticfiles/icons/picture-image_1.svg | 51 + staticfiles/icons/picture-photo.svg | 69 + staticfiles/icons/pie-chart-financial.svg | 283 + staticfiles/icons/pie-chart-financial_1.svg | 52 + staticfiles/icons/pie-chart-presentation.svg | 58 + staticfiles/icons/pie-chart.svg | 173 + staticfiles/icons/pie-chart_1.svg | 51 + staticfiles/icons/pills-pill.svg | 71 + staticfiles/icons/pinterest.svg | 71 + staticfiles/icons/placeholder-aim.svg | 52 + staticfiles/icons/placeholder-gps copy.svg | 65 + staticfiles/icons/placeholder-gps.svg | 88 + staticfiles/icons/placeholder-gps_1.svg | 62 + staticfiles/icons/placeholder-gps_2.svg | 54 + staticfiles/icons/placeholder-house.svg | 53 + staticfiles/icons/placeholder-map-pointer.svg | 61 + .../icons/placeholder-maps-and-location.svg | 80 + staticfiles/icons/placeholder-pin.svg | 60 + staticfiles/icons/planet-earth-global.svg | 123 + staticfiles/icons/play-movie.svg | 49 + staticfiles/icons/play.svg | 54 + staticfiles/icons/play_1.svg | 44 + staticfiles/icons/plus-add.svg | 52 + staticfiles/icons/plus.svg | 68 + staticfiles/icons/png.svg | 71 + staticfiles/icons/pointer-cursor.svg | 65 + staticfiles/icons/pointer-cursor_1.svg | 51 + .../icons/pointer-hands-and-gestures.svg | 55 + .../icons/pointer-hands-and-gestures_1.svg | 58 + staticfiles/icons/pointer-pin.svg | 56 + staticfiles/icons/pointer-point.svg | 61 + staticfiles/icons/pointer.svg | 62 + .../pointing-left-hands-and-gestures.svg | 61 + staticfiles/icons/pointing-right-finger.svg | 61 + staticfiles/icons/polaroids-polaroid.svg | 72 + staticfiles/icons/police-police-station.svg | 80 + staticfiles/icons/position-gps.svg | 109 + staticfiles/icons/position-gps_1.svg | 49 + staticfiles/icons/position-map-pointer.svg | 47 + staticfiles/icons/position-maps-and-flags.svg | 45 + staticfiles/icons/position-stick-man.svg | 76 + staticfiles/icons/postcard.svg | 65 + staticfiles/icons/pot-saucepan.svg | 75 + staticfiles/icons/pound-sterling.svg | 75 + .../icons/power-button-start-button.svg | 55 + staticfiles/icons/power-on-power.svg | 58 + staticfiles/icons/power-on-ui.svg | 56 + staticfiles/icons/powerpoint-ppt.svg | 69 + staticfiles/icons/preview.svg | 56 + staticfiles/icons/previous-back.svg | 49 + staticfiles/icons/previous-return.svg | 45 + staticfiles/icons/previous-return_1.svg | 50 + staticfiles/icons/previous-ui.svg | 44 + staticfiles/icons/price-tag-discount.svg | 57 + staticfiles/icons/price-tag-tag.svg | 47 + staticfiles/icons/print.svg | 62 + staticfiles/icons/printer-print.svg | 50 + staticfiles/icons/printer.svg | 52 + staticfiles/icons/profits-analytics.svg | 78 + staticfiles/icons/profits-bar-chart.svg | 47 + staticfiles/icons/profits-bar-chart_1.svg | 47 + staticfiles/icons/profits-dollar.svg | 63 + staticfiles/icons/profits-statistics copy.svg | 61 + staticfiles/icons/profits-statistics.svg | 49 + staticfiles/icons/projector-electronics.svg | 67 + staticfiles/icons/propeller.svg | 86 + staticfiles/icons/propeller_1.svg | 60 + staticfiles/icons/psd.svg | 70 + staticfiles/icons/push-pin-attach.svg | 46 + staticfiles/icons/push-pin.svg | 49 + staticfiles/icons/pyramid.svg | 51 + staticfiles/icons/pyramids-desert.svg | 52 + staticfiles/icons/radio.svg | 66 + staticfiles/icons/rain-umbrella.svg | 62 + staticfiles/icons/rain-weather.svg | 69 + staticfiles/icons/rain.svg | 71 + staticfiles/icons/rainbow.svg | 73 + staticfiles/icons/raindrop-teardrop.svg | 94 + staticfiles/icons/rainy-morning-rain.svg | 92 + staticfiles/icons/rainy-rain.svg | 75 + staticfiles/icons/rec-circle.svg | 44 + staticfiles/icons/rec-dot.svg | 53 + staticfiles/icons/rec.svg | 48 + staticfiles/icons/redo.svg | 45 + staticfiles/icons/redo_1.svg | 48 + staticfiles/icons/redo_2.svg | 48 + staticfiles/icons/reflector-vest-rescue.svg | 61 + staticfiles/icons/reforestation.svg | 88 + staticfiles/icons/refresh-loading.svg | 99 + staticfiles/icons/refresh-loading_1.svg | 95 + staticfiles/icons/refresh.svg | 67 + staticfiles/icons/remove-miscellaneous.svg | 59 + staticfiles/icons/remove-ui.svg | 61 + staticfiles/icons/repeat.svg | 61 + staticfiles/icons/reply.svg | 55 + staticfiles/icons/reply_1.svg | 54 + staticfiles/icons/reply_2.svg | 61 + staticfiles/icons/reply_3.svg | 65 + staticfiles/icons/resize-double-arrows.svg | 47 + staticfiles/icons/resize-vertical-arrow.svg | 47 + staticfiles/icons/resize.svg | 52 + staticfiles/icons/resize_1.svg | 52 + staticfiles/icons/retirement.svg | 53 + staticfiles/icons/right-alignment-text.svg | 57 + staticfiles/icons/right-alignment-text_1.svg | 56 + staticfiles/icons/right-arrow-forward.svg | 47 + staticfiles/icons/right-arrow-next.svg | 49 + staticfiles/icons/right-arrow-next_1.svg | 44 + staticfiles/icons/right-arrow-ui.svg | 112 + staticfiles/icons/road.svg | 73 + staticfiles/icons/route-start.svg | 63 + staticfiles/icons/rss.svg | 65 + staticfiles/icons/safebox-bank.svg | 65 + staticfiles/icons/sailing-yacht.svg | 67 + staticfiles/icons/sale.svg | 62 + staticfiles/icons/satellite-dish-radar.svg | 84 + staticfiles/icons/satellite-dish-radar_1.svg | 50 + staticfiles/icons/save-save-file.svg | 48 + staticfiles/icons/save-save-file_1.svg | 61 + staticfiles/icons/scale-image.svg | 60 + staticfiles/icons/school-college.svg | 63 + staticfiles/icons/scroll.svg | 61 + staticfiles/icons/scroll_1.svg | 58 + staticfiles/icons/scroll_2.svg | 61 + staticfiles/icons/search-magnifying-glass.svg | 57 + staticfiles/icons/search-zoom.svg | 56 + staticfiles/icons/search.svg | 60 + staticfiles/icons/search_1.svg | 56 + staticfiles/icons/search_2.svg | 56 + staticfiles/icons/semibreve.svg | 50 + staticfiles/icons/semiquaver.svg | 54 + staticfiles/icons/server.svg | 56 + staticfiles/icons/settings-cogwheel.svg | 65 + staticfiles/icons/settings-gear.svg | 76 + staticfiles/icons/settings-gear_1.svg | 93 + staticfiles/icons/settings-gear_2.svg | 69 + staticfiles/icons/share.svg | 65 + staticfiles/icons/shield-security-system.svg | 57 + staticfiles/icons/shield.svg | 66 + staticfiles/icons/shield_1.svg | 63 + staticfiles/icons/shield_2.svg | 59 + staticfiles/icons/shirt.svg | 63 + staticfiles/icons/shirt_1.svg | 57 + .../icons/shop-architecture-and-city.svg | 72 + staticfiles/icons/shop-chinese.svg | 69 + staticfiles/icons/shop.svg | 58 + staticfiles/icons/shopping-bag.svg | 54 + staticfiles/icons/shopping-basket-remove.svg | 73 + staticfiles/icons/shopping-basket.svg | 75 + staticfiles/icons/shopping-basket_1.svg | 54 + staticfiles/icons/shopping-cart-add.svg | 82 + staticfiles/icons/shopping-cart-cart.svg | 55 + staticfiles/icons/shopping-cart-cart_1.svg | 54 + staticfiles/icons/shopping-cart-cart_2.svg | 47 + staticfiles/icons/shopping-cart-cart_3.svg | 80 + staticfiles/icons/shopping-cart-cart_4.svg | 54 + staticfiles/icons/shopping-cart-cart_5.svg | 57 + staticfiles/icons/shopping-cart.svg | 53 + staticfiles/icons/shopping-cart_1.svg | 85 + staticfiles/icons/show.svg | 49 + staticfiles/icons/shuffle-random.svg | 65 + staticfiles/icons/signboard.svg | 51 + staticfiles/icons/signpost.svg | 55 + staticfiles/icons/skills.svg | 79 + staticfiles/icons/skype.svg | 79 + staticfiles/icons/skyscrapper-edifice.svg | 64 + staticfiles/icons/skyscrapper-edifice_1.svg | 49 + staticfiles/icons/smartphone-cellphone.svg | 63 + staticfiles/icons/smartphone-touch-screen.svg | 67 + .../icons/smartphone-touch-screen_1.svg | 63 + .../icons/smartphone-touch-screen_2.svg | 58 + .../icons/smartphone-touch-screen_3.svg | 69 + .../icons/smartphone-touch-screen_4.svg | 51 + staticfiles/icons/snowflake.svg | 143 + staticfiles/icons/snowing-snowy.svg | 93 + staticfiles/icons/solidarity-ribbon.svg | 64 + staticfiles/icons/solidarity-ribbon_1.svg | 90 + staticfiles/icons/sort-swap.svg | 55 + staticfiles/icons/sort-switch.svg | 55 + staticfiles/icons/sort-switch_1.svg | 59 + staticfiles/icons/sound-speaker.svg | 64 + staticfiles/icons/sound-speaker_1.svg | 63 + staticfiles/icons/soundcloud.svg | 62 + staticfiles/icons/speakers-speaker.svg | 52 + staticfiles/icons/speech-bubble-chat.svg | 58 + staticfiles/icons/spray-aerosol.svg | 64 + staticfiles/icons/sprout.svg | 74 + staticfiles/icons/star.svg | 58 + staticfiles/icons/star_1.svg | 68 + staticfiles/icons/star_2.svg | 61 + staticfiles/icons/star_3.svg | 56 + staticfiles/icons/startup-rocket.svg | 54 + staticfiles/icons/statue-of-liberty.svg | 65 + staticfiles/icons/sticker.svg | 92 + .../icons/stop-music-and-multimedia.svg | 42 + staticfiles/icons/stop-video-player.svg | 48 + staticfiles/icons/stop.svg | 53 + staticfiles/icons/store-search.svg | 64 + staticfiles/icons/store.svg | 58 + staticfiles/icons/storm-rain.svg | 69 + staticfiles/icons/street-light.svg | 67 + staticfiles/icons/street-light_1.svg | 67 + staticfiles/icons/street-map-gps.svg | 80 + staticfiles/icons/street-map.svg | 69 + staticfiles/icons/street-map_1.svg | 93 + staticfiles/icons/strikethrough.svg | 50 + .../stumbleupon-brands-and-logotypes.svg | 68 + .../icons/subscript-text-formatting.svg | 58 + staticfiles/icons/suitcase-portfolio.svg | 69 + staticfiles/icons/sun-cream.svg | 61 + staticfiles/icons/sun-umbrella.svg | 68 + staticfiles/icons/sun-warm.svg | 70 + staticfiles/icons/sunglasses.svg | 78 + staticfiles/icons/sunrise-evening.svg | 68 + staticfiles/icons/sunset-sea.svg | 66 + staticfiles/icons/superscript.svg | 65 + staticfiles/icons/swimsuit.svg | 64 + staticfiles/icons/swiss-army-knife.svg | 62 + staticfiles/icons/switch-button.svg | 57 + staticfiles/icons/switch.svg | 54 + staticfiles/icons/switch_1.svg | 48 + .../icons/sydney-opera-house-australia.svg | 71 + staticfiles/icons/symbol-maps-and-flags.svg | 53 + staticfiles/icons/table-excel.svg | 44 + staticfiles/icons/table-excel_1.svg | 46 + staticfiles/icons/tablet.svg | 47 + staticfiles/icons/tag-price.svg | 55 + staticfiles/icons/taj-mahal.svg | 65 + staticfiles/icons/tap-finger.svg | 65 + staticfiles/icons/tap-hands-and-gestures.svg | 77 + .../icons/tap-hands-and-gestures_1.svg | 76 + .../icons/tap-hands-and-gestures_2.svg | 75 + staticfiles/icons/tap.svg | 75 + staticfiles/icons/target-aim.svg | 79 + staticfiles/icons/target-aim_1.svg | 54 + staticfiles/icons/target-shooting.svg | 53 + staticfiles/icons/target.svg | 54 + staticfiles/icons/target_1.svg | 64 + staticfiles/icons/target_2.svg | 56 + .../icons/technorati-brands-and-logotypes.svg | 64 + staticfiles/icons/teddy-bear-animal.svg | 100 + staticfiles/icons/telegram.svg | 62 + staticfiles/icons/telephone-call.svg | 75 + staticfiles/icons/telephone-phone.svg | 79 + .../icons/telephone-telephone-call.svg | 67 + staticfiles/icons/telephone.svg | 65 + staticfiles/icons/television-tv.svg | 72 + staticfiles/icons/temperature.svg | 61 + staticfiles/icons/temperature_1.svg | 59 + staticfiles/icons/tent.svg | 59 + .../icons/teotihuacan-architectonic.svg | 53 + staticfiles/icons/test.svg | 63 + staticfiles/icons/text-height-edit-tools.svg | 59 + staticfiles/icons/text-width-edit-tools.svg | 59 + staticfiles/icons/text.svg | 53 + staticfiles/icons/thermometer-temperature.svg | 53 + .../icons/thermometer-temperature_1.svg | 54 + .../icons/thermometer-temperature_2.svg | 54 + staticfiles/icons/ticket.svg | 65 + staticfiles/icons/tie.svg | 59 + staticfiles/icons/time-hourglass.svg | 59 + staticfiles/icons/time-left-wait.svg | 69 + staticfiles/icons/time-left.svg | 84 + staticfiles/icons/time-management-watch.svg | 69 + staticfiles/icons/time-time-and-date.svg | 52 + staticfiles/icons/timer-stopwatch.svg | 62 + staticfiles/icons/tools-pen.svg | 69 + staticfiles/icons/tornado.svg | 104 + staticfiles/icons/traffic-light.svg | 56 + staticfiles/icons/traffic-sign-danger.svg | 70 + staticfiles/icons/trees-forest.svg | 59 + staticfiles/icons/trolley-items.svg | 68 + staticfiles/icons/trophy.svg | 52 + staticfiles/icons/truck.svg | 68 + staticfiles/icons/truck_1.svg | 90 + staticfiles/icons/truck_2.svg | 73 + staticfiles/icons/tumblr.svg | 69 + staticfiles/icons/turn-left-ui.svg | 45 + staticfiles/icons/turn-left-ui_1.svg | 45 + staticfiles/icons/turn-left-ui_2.svg | 51 + staticfiles/icons/turn-left.svg | 50 + staticfiles/icons/turn-right-arrows.svg | 45 + staticfiles/icons/turn-right-ui.svg | 50 + staticfiles/icons/turn-right-ui_1.svg | 50 + staticfiles/icons/turn-right-ui_2.svg | 45 + staticfiles/icons/twitter.svg | 80 + staticfiles/icons/typewriter.svg | 76 + staticfiles/icons/umbrella.svg | 72 + staticfiles/icons/underline-edit-tools.svg | 53 + staticfiles/icons/undo.svg | 48 + staticfiles/icons/undo_1.svg | 49 + staticfiles/icons/undo_2.svg | 45 + staticfiles/icons/unlink.svg | 81 + staticfiles/icons/unlock-lock.svg | 54 + staticfiles/icons/up-arrow-control.svg | 43 + staticfiles/icons/up-arrow-ui.svg | 46 + staticfiles/icons/up-arrow.svg | 46 + staticfiles/icons/up-arrow_1.svg | 46 + staticfiles/icons/up-arrow_2.svg | 112 + staticfiles/icons/up-arrow_3.svg | 44 + staticfiles/icons/upload-up-arrow.svg | 49 + staticfiles/icons/upload.svg | 51 + staticfiles/icons/upload_1.svg | 67 + staticfiles/icons/upload_2.svg | 50 + staticfiles/icons/upload_3.svg | 49 + staticfiles/icons/upload_4.svg | 49 + staticfiles/icons/usb-cable.svg | 53 + staticfiles/icons/usb.svg | 66 + staticfiles/icons/usb_1.svg | 52 + staticfiles/icons/user-add.svg | 82 + staticfiles/icons/user-add_1.svg | 69 + staticfiles/icons/user-block.svg | 71 + staticfiles/icons/user-delete.svg | 79 + staticfiles/icons/user-delete_1.svg | 81 + staticfiles/icons/user-follower.svg | 82 + staticfiles/icons/user-followers.svg | 82 + staticfiles/icons/user-remove.svg | 68 + staticfiles/icons/user-seo-and-web.svg | 71 + staticfiles/icons/user-seo-and-web_1.svg | 84 + staticfiles/icons/user-seo-and-web_2.svg | 80 + staticfiles/icons/user-seo-and-web_3.svg | 78 + staticfiles/icons/user-seo-and-web_4.svg | 71 + staticfiles/icons/user-seo-and-web_5.svg | 68 + staticfiles/icons/user-seo-and-web_6.svg | 70 + staticfiles/icons/user.svg | 60 + staticfiles/icons/user_1.svg | 60 + staticfiles/icons/user_2.svg | 62 + staticfiles/icons/users-user.svg | 45 + staticfiles/icons/vatican.svg | 47 + staticfiles/icons/viber.svg | 102 + staticfiles/icons/video-camera-cinema.svg | 59 + staticfiles/icons/video-camera-film.svg | 57 + staticfiles/icons/video-camera.svg | 71 + staticfiles/icons/video-player-movie.svg | 62 + staticfiles/icons/video.svg | 58 + .../icons/vimeo-brands-and-logotypes.svg | 70 + staticfiles/icons/visa.svg | 59 + staticfiles/icons/visualization-grid.svg | 69 + staticfiles/icons/visualization-grid_1.svg | 67 + staticfiles/icons/vk-vk.svg | 78 + staticfiles/icons/volume-down.svg | 55 + staticfiles/icons/volume-max.svg | 58 + .../icons/volume-music-and-multimedia.svg | 53 + staticfiles/icons/volume-mute.svg | 59 + staticfiles/icons/volume-up.svg | 57 + staticfiles/icons/wait-hourglass.svg | 51 + staticfiles/icons/wallet.svg | 79 + staticfiles/icons/watch.svg | 65 + staticfiles/icons/water-raindrop.svg | 72 + staticfiles/icons/water.svg | 56 + staticfiles/icons/water_1.svg | 98 + staticfiles/icons/waterfall-river.svg | 116 + staticfiles/icons/webcam.svg | 57 + staticfiles/icons/wheelchair.svg | 58 + staticfiles/icons/wifi.svg | 61 + staticfiles/icons/wifi_1.svg | 57 + staticfiles/icons/wikipedia.svg | 74 + staticfiles/icons/wind-rose.svg | 67 + staticfiles/icons/wind.svg | 59 + staticfiles/icons/windmill-mill.svg | 77 + staticfiles/icons/wma-files-and-folders.svg | 71 + staticfiles/icons/word.svg | 70 + staticfiles/icons/wordpress.svg | 68 + staticfiles/icons/workflow.svg | 62 + staticfiles/icons/workflow_1.svg | 55 + staticfiles/icons/worldwide-global.svg | 65 + staticfiles/icons/worldwide-gps.svg | 92 + staticfiles/icons/writing-edit.svg | 55 + staticfiles/icons/writing-note.svg | 61 + .../icons/writing-tools-and-utensils.svg | 70 + staticfiles/icons/xing.svg | 60 + staticfiles/icons/yahoo.svg | 86 + staticfiles/icons/yandex.svg | 60 + staticfiles/icons/yen.svg | 65 + staticfiles/icons/youtube.svg | 55 + .../icons/zerply-brands-and-logotypes.svg | 97 + staticfiles/icons/zoom-in.svg | 60 + staticfiles/icons/zoom-out.svg | 56 + .../images/car_make/Chevrolet_ZUJVQuH.png | Bin 0 -> 52812 bytes staticfiles/images/car_make/Citroen.png | Bin 0 -> 48694 bytes staticfiles/images/car_make/Daewoo.png | Bin 0 -> 46546 bytes staticfiles/images/car_make/Daihatsu.png | Bin 0 -> 18043 bytes staticfiles/images/car_make/Datsun.png | Bin 0 -> 80369 bytes staticfiles/images/car_make/Dongfeng.png | Bin 0 -> 111691 bytes staticfiles/images/car_make/EXEED.png | Bin 0 -> 10771 bytes staticfiles/images/car_make/Ferrari.png | Bin 0 -> 27113 bytes staticfiles/images/car_make/Fiat.png | Bin 0 -> 4036 bytes staticfiles/images/car_make/Forthing.png | Bin 0 -> 145457 bytes staticfiles/images/car_make/Foton.png | Bin 0 -> 22946 bytes staticfiles/images/car_make/GAC.png | Bin 0 -> 38088 bytes staticfiles/images/car_make/GMC.png | Bin 0 -> 16174 bytes staticfiles/images/car_make/GWM.png | Bin 0 -> 57040 bytes staticfiles/images/car_make/Geely.png | Bin 0 -> 11768 bytes staticfiles/images/car_make/Genesis.png | Bin 0 -> 10433 bytes staticfiles/images/car_make/Honda.png | Bin 0 -> 9719 bytes staticfiles/images/car_make/Hongqi.png | Bin 0 -> 65657 bytes staticfiles/images/car_make/Hummer.png | Bin 0 -> 3780 bytes staticfiles/images/car_make/Hyundai.png | Bin 0 -> 6301 bytes staticfiles/images/car_make/Infiniti.png | Bin 0 -> 9413 bytes staticfiles/images/car_make/Isuzu.png | Bin 0 -> 5528 bytes staticfiles/images/car_make/JAC.png | Bin 0 -> 29637 bytes staticfiles/images/car_make/JMC.png | Bin 0 -> 56102 bytes staticfiles/images/car_make/Jaguar.png | Bin 0 -> 24047 bytes staticfiles/images/car_make/Jetour.png | Bin 0 -> 12841 bytes staticfiles/images/car_make/Lamborghini.png | Bin 0 -> 90904 bytes staticfiles/images/car_make/Land-Rover.png | Bin 0 -> 75416 bytes staticfiles/images/car_make/Lexus.png | Bin 0 -> 10647 bytes staticfiles/images/car_make/Lucid.png | Bin 0 -> 3386 bytes staticfiles/images/car_make/LynkCo.png | Bin 0 -> 10750 bytes staticfiles/images/car_make/MG.png | Bin 0 -> 79968 bytes staticfiles/images/car_make/Maxus.png | Bin 0 -> 79308 bytes staticfiles/images/car_make/Maybach.png | Bin 0 -> 39300 bytes staticfiles/images/car_make/Mazda.png | Bin 0 -> 22597 bytes staticfiles/images/car_make/McLaren.png | Bin 0 -> 5777 bytes staticfiles/images/car_make/Mercedes-Benz.png | Bin 0 -> 80535 bytes staticfiles/images/car_make/Mercury.png | Bin 0 -> 54138 bytes staticfiles/images/car_make/Mitsubishi.png | Bin 0 -> 24488 bytes staticfiles/images/car_make/Opel.png | Bin 0 -> 27349 bytes staticfiles/images/car_make/Pontiac.png | Bin 0 -> 30799 bytes staticfiles/images/car_make/Porsche.png | Bin 0 -> 152816 bytes .../images/car_make/Rayton-Fissore.png | Bin 0 -> 23565 bytes staticfiles/images/car_make/Renault.png | Bin 0 -> 48302 bytes staticfiles/images/car_make/Rolls-Royce.png | Bin 0 -> 33603 bytes staticfiles/images/car_make/Rover.png | Bin 0 -> 32181 bytes staticfiles/images/car_make/Saab.png | Bin 0 -> 94493 bytes staticfiles/images/car_make/Seat.png | Bin 0 -> 10848 bytes staticfiles/images/car_make/Seres.png | Bin 0 -> 16346 bytes staticfiles/images/car_make/Skoda.png | Bin 0 -> 16948 bytes staticfiles/images/car_make/Smart.png | Bin 0 -> 9881 bytes staticfiles/images/car_make/Spectre.png | Bin 0 -> 105233 bytes staticfiles/images/car_make/Ssangyong.png | Bin 0 -> 14757 bytes staticfiles/images/car_make/Stelato.png | Bin 0 -> 9604 bytes staticfiles/images/car_make/Subaru.png | Bin 0 -> 77497 bytes staticfiles/images/car_make/Suzuki.png | Bin 0 -> 21836 bytes staticfiles/images/car_make/TATA.png | Bin 0 -> 9590 bytes staticfiles/images/car_make/Tank.png | Bin 0 -> 15441 bytes staticfiles/images/car_make/Tesla.png | Bin 0 -> 4738 bytes staticfiles/images/car_make/Volkswagen.png | Bin 0 -> 39019 bytes staticfiles/images/car_make/Volvo.png | Bin 0 -> 31973 bytes staticfiles/images/car_make/Voyah.png | Bin 0 -> 41427 bytes staticfiles/images/car_make/Zotye.png | Bin 0 -> 65082 bytes staticfiles/images/car_make/haval.png | Bin 0 -> 26644 bytes staticfiles/images/car_make/mini.png | Bin 0 -> 9273 bytes staticfiles/images/car_make/zx.png | Bin 0 -> 62499 bytes ...lamjdouie-Hyundai-logo_I8WTQve_NvbZyE9.png | Bin 0 -> 6262 bytes staticfiles/images/images/tenhal_hero.png | Bin 0 -> 2335764 bytes staticfiles/images/images/web-design.jpg | Bin 0 -> 462390 bytes staticfiles/images/sold.png | Bin 0 -> 669134 bytes staticfiles/js/echarts.js | 45 + staticfiles/js/ecommerce-dashboard.js | 1 - staticfiles/js/jquery.min.js | 2 + staticfiles/js/travel-agency-dashboard.js | 4 +- staticfiles/schema_graph/main.js | 439 + .../vendors/dhtmlx-gantt/dhtmlxgantt.css | 2 +- .../vendors/dhtmlx-gantt/dhtmlxgantt.js | 74 +- staticfiles/vendors/echarts/echarts.min.js | 45514 +--------------- .../vendors/feather-icons/feather.min.js | 1752 +- staticfiles/vendors/htmx.min.js | 1 + .../vendors/tesseract/tesseract.min.js | 3 + staticfiles/vendors/turf.min.js | 88 + staticfiles/vendors/zxing/index.min.js | 1 + templates/header.html | 10 +- 1225 files changed, 71034 insertions(+), 54077 deletions(-) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 entrypoint.sh delete mode 100644 inventory/migrations/0002_alter_carregistration_car.py delete mode 100644 inventory/migrations/0002_alter_lead_customer.py delete mode 100644 inventory/migrations/0003_lead_email_lead_first_name_lead_last_name_and_more.py delete mode 100644 inventory/migrations/0004_remove_lead_city_lead_address.py delete mode 100644 inventory/migrations/0005_schedule.py delete mode 100644 inventory/migrations/0006_alter_schedule_purpose.py delete mode 100644 inventory/migrations/0007_schedule_scheduled_type.py delete mode 100644 inventory/migrations/0008_schedule_status.py delete mode 100644 inventory/migrations/0009_alter_opportunity_customer.py delete mode 100644 inventory/migrations/0010_remove_lead_id_car_make_remove_lead_id_car_model_and_more.py delete mode 100644 inventory/migrations/0011_remove_lead_year_alter_schedule_customer.py delete mode 100644 inventory/migrations/0012_merge_20250206_1151.py delete mode 100644 inventory/migrations/0012_merge_20250206_1308.py delete mode 100644 inventory/migrations/0013_alter_carregistration_text2_and_more.py delete mode 100644 inventory/migrations/0014_remove_lead_car_lead_id_car_make_lead_id_car_model_and_more.py delete mode 100644 inventory/migrations/0015_merge_20250209_1116.py delete mode 100644 inventory/migrations/0016_schedule_duration.py delete mode 100644 inventory/migrations/0017_car_hash.py delete mode 100644 inventory/migrations/0018_customer_user.py delete mode 100644 inventory/migrations/0019_opportunity_lead.py delete mode 100644 inventory/migrations/0020_alter_opportunity_closing_date.py delete mode 100644 inventory/migrations/0021_alter_opportunity_lead.py delete mode 100644 inventory/migrations/0022_opportunity_estimate.py delete mode 100644 inventory/migrations/0023_email.py delete mode 100644 inventory/migrations/0024_remove_email_body_email_message.py delete mode 100644 inventory/migrations/0025_email_status.py delete mode 100644 inventory/migrations/0026_carhistory.py delete mode 100644 inventory/migrations/0027_carhistory_dealer.py delete mode 100644 inventory/migrations/0028_carhistory_additional_info.py delete mode 100644 inventory/migrations/0029_remove_carhistory_cost_remove_carhistory_mileage.py delete mode 100644 inventory/migrations/0030_alter_activity_activity_type_delete_carhistory.py delete mode 100644 inventory/migrations/0031_activity_dealer_alter_activity_content_type_and_more.py delete mode 100644 inventory/migrations/0032_alter_carcolors_car.py delete mode 100644 inventory/migrations/0033_remove_staff_user_staff_staff_member_and_more.py delete mode 100644 inventory/migrations/0034_remove_subscription_plan_remove_subscription_users_and_more.py delete mode 100644 inventory/migrations/0038_customgroup.py delete mode 100644 inventory/migrations/0039_alter_customgroup_dealer.py delete mode 100644 inventory/migrations/0040_usersettings.py delete mode 100644 inventory/migrations/0041_alter_usersettings_additional_info.py delete mode 100644 inventory/migrations/0042_alter_usersettings_user.py delete mode 100644 inventory/migrations/0043_alter_usersettings_user.py delete mode 100644 inventory/migrations/0044_dealersettings_delete_usersettings.py delete mode 100644 inventory/migrations/0045_remove_dealersettings_invoice_payable_account_and_more.py delete mode 100644 inventory/migrations/0046_remove_dealersettings_invoice_prepaid_account_and_more.py delete mode 100644 inventory/migrations/0047_remove_dealersettings_invoice_recivable_account_and_more.py delete mode 100644 inventory/migrations/0048_remove_dealersettings_bill_payable_account_and_more.py delete mode 100644 inventory/migrations/0049_alter_lead_status_alter_leadstatushistory_new_status_and_more.py delete mode 100644 inventory/migrations/0049_carreservation_reserved_for.py delete mode 100644 inventory/migrations/0050_remove_carreservation_reserved_for.py delete mode 100644 inventory/migrations/0051_merge_20250226_1654.py delete mode 100644 inventory/migrations/0052_lead_lead_type.py delete mode 100644 inventory/migrations/0053_lead_crn_lead_vrn.py delete mode 100644 inventory/migrations/0054_alter_staff_staff_type.py delete mode 100644 inventory/migrations/0054_dealersmake.py delete mode 100644 inventory/migrations/0055_merge_0054_alter_staff_staff_type_0054_dealersmake.py create mode 100644 staticfiles/admin/css/unusable_password_field.css create mode 100644 staticfiles/admin/img/icon-hidelink.svg create mode 100644 staticfiles/admin/js/unusable_password_field.js create mode 100644 staticfiles/assets/fonts/SaudiRiyalFont.ttf create mode 100644 staticfiles/css/line.css create mode 100644 staticfiles/fonts/line/unicons-14.ttf create mode 100644 staticfiles/fonts/line/unicons-14.woff create mode 100644 staticfiles/fonts/line/unicons-14.woff2 create mode 100644 staticfiles/icons/195534_display-ui.svg create mode 100644 staticfiles/icons/195535_display-ui.svg create mode 100644 staticfiles/icons/195536_display-layout.svg create mode 100644 staticfiles/icons/195537_display-copy.svg create mode 100644 staticfiles/icons/195538_display.svg create mode 100644 staticfiles/icons/195539_display.svg create mode 100644 staticfiles/icons/195540_display.svg create mode 100644 staticfiles/icons/195541_display.svg create mode 100644 staticfiles/icons/195542_display-ui.svg create mode 100644 staticfiles/icons/195543_display.svg create mode 100644 staticfiles/icons/195544_display-copy.svg create mode 100644 staticfiles/icons/195545_display.svg create mode 100644 staticfiles/icons/195546_display-layout.svg create mode 100644 staticfiles/icons/195547_display-copy.svg create mode 100644 staticfiles/icons/195548_display-copy.svg create mode 100644 staticfiles/icons/195549_display-layout.svg create mode 100644 staticfiles/icons/195550_display-ui.svg create mode 100644 staticfiles/icons/195551_display.svg create mode 100644 staticfiles/icons/195552_display-layout.svg create mode 100644 staticfiles/icons/abacus.svg create mode 100644 staticfiles/icons/add.svg create mode 100644 staticfiles/icons/add_1.svg create mode 100644 staticfiles/icons/addthis-brands-and-logotypes.svg create mode 100644 staticfiles/icons/adjust-spanner.svg create mode 100644 staticfiles/icons/adobe-files-and-folders.svg create mode 100644 staticfiles/icons/agenda-miscellaneous.svg create mode 100644 staticfiles/icons/agenda-phone-book.svg create mode 100644 staticfiles/icons/alarm-bell copy.svg create mode 100644 staticfiles/icons/alarm-bell.svg create mode 100644 staticfiles/icons/alarm-silence.svg create mode 100644 staticfiles/icons/american-express.svg create mode 100644 staticfiles/icons/anchor.svg create mode 100644 staticfiles/icons/app-shop.svg create mode 100644 staticfiles/icons/apple.svg create mode 100644 staticfiles/icons/arrows-swap.svg create mode 100644 staticfiles/icons/attach-seo-and-web.svg create mode 100644 staticfiles/icons/avi.svg create mode 100644 staticfiles/icons/backward.svg create mode 100644 staticfiles/icons/backward_1.svg create mode 100644 staticfiles/icons/backward_2.svg create mode 100644 staticfiles/icons/backward_3.svg create mode 100644 staticfiles/icons/badge-discount.svg create mode 100644 staticfiles/icons/badge-new.svg create mode 100644 staticfiles/icons/balance-law.svg create mode 100644 staticfiles/icons/balance-law_1.svg create mode 100644 staticfiles/icons/balloons-celebration.svg create mode 100644 staticfiles/icons/bar-chart-bar-graph.svg create mode 100644 staticfiles/icons/bar-chart-seo-and-web.svg create mode 100644 staticfiles/icons/bar-chart-stats.svg create mode 100644 staticfiles/icons/barcode-product.svg create mode 100644 staticfiles/icons/battery-battery-level.svg create mode 100644 staticfiles/icons/battery.svg create mode 100644 staticfiles/icons/battery_1.svg create mode 100644 staticfiles/icons/battery_2.svg create mode 100644 staticfiles/icons/battery_3.svg create mode 100644 staticfiles/icons/battery_4.svg create mode 100644 staticfiles/icons/battery_5.svg create mode 100644 staticfiles/icons/beach-ocean.svg create mode 100644 staticfiles/icons/bebo-brands-and-logotypes.svg create mode 100644 staticfiles/icons/behance.svg create mode 100644 staticfiles/icons/bench.svg create mode 100644 staticfiles/icons/bible.svg create mode 100644 staticfiles/icons/big-ben-uk.svg create mode 100644 staticfiles/icons/billboard.svg create mode 100644 staticfiles/icons/bing.svg create mode 100644 staticfiles/icons/binoculars-see.svg create mode 100644 staticfiles/icons/blinder.svg create mode 100644 staticfiles/icons/block-not-allowed.svg create mode 100644 staticfiles/icons/blogger.svg create mode 100644 staticfiles/icons/blood-donation-donation.svg create mode 100644 staticfiles/icons/blood-donation.svg create mode 100644 staticfiles/icons/blueprint.svg create mode 100644 staticfiles/icons/bluetooth.svg create mode 100644 staticfiles/icons/bold-letter-b.svg create mode 100644 staticfiles/icons/bonfire-flame.svg create mode 100644 staticfiles/icons/book.svg create mode 100644 staticfiles/icons/bookmark.svg create mode 100644 staticfiles/icons/box.svg create mode 100644 staticfiles/icons/box_1.svg create mode 100644 staticfiles/icons/bridge.svg create mode 100644 staticfiles/icons/briefcase.svg create mode 100644 staticfiles/icons/brightness-sun.svg create mode 100644 staticfiles/icons/brightness.svg create mode 100644 staticfiles/icons/brightness_1.svg create mode 100644 staticfiles/icons/brightness_2.svg create mode 100644 staticfiles/icons/brightness_3.svg create mode 100644 staticfiles/icons/browser-lock.svg create mode 100644 staticfiles/icons/browser-website.svg create mode 100644 staticfiles/icons/browser-website_1.svg create mode 100644 staticfiles/icons/building-architecture-and-city.svg create mode 100644 staticfiles/icons/building-architecture-and-city_1.svg create mode 100644 staticfiles/icons/building-city.svg create mode 100644 staticfiles/icons/building-skyscraper.svg create mode 100644 staticfiles/icons/building-town.svg create mode 100644 staticfiles/icons/building-town_1.svg create mode 100644 staticfiles/icons/bus-stop.svg create mode 100644 staticfiles/icons/cabinet.svg create mode 100644 staticfiles/icons/cafe.svg create mode 100644 staticfiles/icons/cage.svg create mode 100644 staticfiles/icons/calculator.svg create mode 100644 staticfiles/icons/calculator_1.svg create mode 100644 staticfiles/icons/calculator_2.svg create mode 100644 staticfiles/icons/calendar-date.svg create mode 100644 staticfiles/icons/calendar.svg create mode 100644 staticfiles/icons/calendar_1.svg create mode 100644 staticfiles/icons/calendars-calendar.svg create mode 100644 staticfiles/icons/camcorder.svg create mode 100644 staticfiles/icons/cancel-close.svg create mode 100644 staticfiles/icons/cancel-multiply.svg create mode 100644 staticfiles/icons/cancel.svg create mode 100644 staticfiles/icons/canoe.svg create mode 100644 staticfiles/icons/caravan-camping.svg create mode 100644 staticfiles/icons/cart-logistics-delivery.svg create mode 100644 staticfiles/icons/cathedral-of-saint-basil-russia.svg create mode 100644 staticfiles/icons/cctv-camera.svg create mode 100644 staticfiles/icons/cd.svg create mode 100644 staticfiles/icons/center-alignment-text.svg create mode 100644 staticfiles/icons/charity-stand.svg create mode 100644 staticfiles/icons/chat-communication.svg create mode 100644 staticfiles/icons/chat-conversation.svg create mode 100644 staticfiles/icons/chat.svg create mode 100644 staticfiles/icons/chat_1.svg create mode 100644 staticfiles/icons/chat_2.svg create mode 100644 staticfiles/icons/chat_3.svg create mode 100644 staticfiles/icons/check-money.svg create mode 100644 staticfiles/icons/check-success.svg create mode 100644 staticfiles/icons/checked-success.svg create mode 100644 staticfiles/icons/checked-tick.svg create mode 100644 staticfiles/icons/chevron-angle.svg create mode 100644 staticfiles/icons/chevron-angle_1.svg create mode 100644 staticfiles/icons/chevron-angle_2.svg create mode 100644 staticfiles/icons/chevron-angle_3.svg create mode 100644 staticfiles/icons/chevron-arrow.svg create mode 100644 staticfiles/icons/chevron-arrowhead.svg create mode 100644 staticfiles/icons/chevron-arrowhead_1.svg create mode 100644 staticfiles/icons/chevron-arrowhead_2.svg create mode 100644 staticfiles/icons/chevron-arrowhead_3.svg create mode 100644 staticfiles/icons/chevron-arrowhead_4.svg create mode 100644 staticfiles/icons/chevron-down.svg create mode 100644 staticfiles/icons/chevron-download.svg create mode 100644 staticfiles/icons/chevron-military.svg create mode 100644 staticfiles/icons/chevron-next.svg create mode 100644 staticfiles/icons/chevron-next_1.svg create mode 100644 staticfiles/icons/chevron-next_2.svg create mode 100644 staticfiles/icons/chevron-next_3.svg create mode 100644 staticfiles/icons/chevron.svg create mode 100644 staticfiles/icons/chevron_1.svg create mode 100644 staticfiles/icons/chevron_2.svg create mode 100644 staticfiles/icons/chinese-temple-china.svg create mode 100644 staticfiles/icons/christ-the-redeemer-rio-de-janeiro.svg create mode 100644 staticfiles/icons/church.svg create mode 100644 staticfiles/icons/city-hall-monument.svg create mode 100644 staticfiles/icons/city-town.svg create mode 100644 staticfiles/icons/clip-paper-clip.svg create mode 100644 staticfiles/icons/clipboard-list.svg create mode 100644 staticfiles/icons/clock-time.svg create mode 100644 staticfiles/icons/clock-watch.svg create mode 100644 staticfiles/icons/clock-watch_1.svg create mode 100644 staticfiles/icons/close-up.svg create mode 100644 staticfiles/icons/close-up_1.svg create mode 100644 staticfiles/icons/close.svg create mode 100644 staticfiles/icons/closed.svg create mode 100644 staticfiles/icons/cloud-cloud-computing.svg create mode 100644 staticfiles/icons/cloud-computing-cloud.svg create mode 100644 staticfiles/icons/cloud-computing-play.svg create mode 100644 staticfiles/icons/cloud-computing-warning.svg create mode 100644 staticfiles/icons/cloud-sky.svg create mode 100644 staticfiles/icons/cloud-weather.svg create mode 100644 staticfiles/icons/cloudy-cloud.svg create mode 100644 staticfiles/icons/cloudy-cloud_1.svg create mode 100644 staticfiles/icons/cloudy-cloud_2.svg create mode 100644 staticfiles/icons/cloudy-night-cloud.svg create mode 100644 staticfiles/icons/coding-code.svg create mode 100644 staticfiles/icons/coins-stack.svg create mode 100644 staticfiles/icons/columns-ui.svg create mode 100644 staticfiles/icons/compact-disc-cd.svg create mode 100644 staticfiles/icons/compass.svg create mode 100644 staticfiles/icons/compress.svg create mode 100644 staticfiles/icons/compress_1.svg create mode 100644 staticfiles/icons/computer-electronics.svg create mode 100644 staticfiles/icons/computer-mouse-clicker.svg create mode 100644 staticfiles/icons/computer-tv.svg create mode 100644 staticfiles/icons/conference-lectern.svg create mode 100644 staticfiles/icons/contact.svg create mode 100644 staticfiles/icons/contrast-control.svg create mode 100644 staticfiles/icons/contrast.svg create mode 100644 staticfiles/icons/controller-adjust.svg create mode 100644 staticfiles/icons/conversation-chat.svg create mode 100644 staticfiles/icons/conversation-chat_1.svg create mode 100644 staticfiles/icons/conversation-chat_2.svg create mode 100644 staticfiles/icons/conversation-chat_3.svg create mode 100644 staticfiles/icons/copy.svg create mode 100644 staticfiles/icons/couple.svg create mode 100644 staticfiles/icons/cpu.svg create mode 100644 staticfiles/icons/credit-card-lock.svg create mode 100644 staticfiles/icons/credit-card-payment-method copy.svg create mode 100644 staticfiles/icons/credit-card-payment-method.svg create mode 100644 staticfiles/icons/credit-card-payment-method_1.svg create mode 100644 staticfiles/icons/credit-card.svg create mode 100644 staticfiles/icons/credit-card_1.svg create mode 100644 staticfiles/icons/crop.svg create mode 100644 staticfiles/icons/crotchet-semibreve.svg create mode 100644 staticfiles/icons/css.svg create mode 100644 staticfiles/icons/cursor-ui.svg create mode 100644 staticfiles/icons/cursor.svg create mode 100644 staticfiles/icons/cursor_1.svg create mode 100644 staticfiles/icons/cursor_2.svg create mode 100644 staticfiles/icons/customer-service-24-hours.svg create mode 100644 staticfiles/icons/cut-scissors.svg create mode 100644 staticfiles/icons/date-calendar.svg create mode 100644 staticfiles/icons/day-month.svg create mode 100644 staticfiles/icons/day-week.svg create mode 100644 staticfiles/icons/day-week_1.svg create mode 100644 staticfiles/icons/deck-chair.svg create mode 100644 staticfiles/icons/delete-bin.svg create mode 100644 staticfiles/icons/delete.svg create mode 100644 staticfiles/icons/delete_1.svg create mode 100644 staticfiles/icons/delete_2.svg create mode 100644 staticfiles/icons/delete_3.svg create mode 100644 staticfiles/icons/delete_4.svg create mode 100644 staticfiles/icons/delete_5.svg create mode 100644 staticfiles/icons/delete_6.svg create mode 100644 staticfiles/icons/delicious-brands-and-logotypes.svg create mode 100644 staticfiles/icons/demisemiquaver-semibreve.svg create mode 100644 staticfiles/icons/desert-cactus.svg create mode 100644 staticfiles/icons/desk-lamp.svg create mode 100644 staticfiles/icons/devaluation-money.svg create mode 100644 staticfiles/icons/deviantart.svg create mode 100644 staticfiles/icons/diagonal-arrow-arrows.svg create mode 100644 staticfiles/icons/diagonal-arrow-arrows_1.svg create mode 100644 staticfiles/icons/diagonal-arrow-arrows_2.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_1.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_2.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_3.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_4.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_5.svg create mode 100644 staticfiles/icons/diagonal-arrow-ui_6.svg create mode 100644 staticfiles/icons/diagonal-arrow.svg create mode 100644 staticfiles/icons/diagonal-arrow_1.svg create mode 100644 staticfiles/icons/diagonal-ui.svg create mode 100644 staticfiles/icons/diagonal-ui_1.svg create mode 100644 staticfiles/icons/diagonal-ui_2.svg create mode 100644 staticfiles/icons/diagonal-ui_3.svg create mode 100644 staticfiles/icons/digg-brands-and-logotypes.svg create mode 100644 staticfiles/icons/diners-club.svg create mode 100644 staticfiles/icons/direction-placeholders.svg create mode 100644 staticfiles/icons/direction-route.svg create mode 100644 staticfiles/icons/directional-direction.svg create mode 100644 staticfiles/icons/discman.svg create mode 100644 staticfiles/icons/discount.svg create mode 100644 staticfiles/icons/diskette-save.svg create mode 100644 staticfiles/icons/dislike.svg create mode 100644 staticfiles/icons/distance.svg create mode 100644 staticfiles/icons/document.svg create mode 100644 staticfiles/icons/document_1.svg create mode 100644 staticfiles/icons/dollar-money.svg create mode 100644 staticfiles/icons/donate-donation.svg create mode 100644 staticfiles/icons/donate-donation_1.svg create mode 100644 staticfiles/icons/donate-money.svg create mode 100644 staticfiles/icons/donation-bank.svg create mode 100644 staticfiles/icons/donation-heart.svg create mode 100644 staticfiles/icons/donation-money.svg create mode 100644 staticfiles/icons/donation-stand.svg create mode 100644 staticfiles/icons/donation.svg create mode 100644 staticfiles/icons/donation_1.svg create mode 100644 staticfiles/icons/donation_2.svg create mode 100644 staticfiles/icons/dove-bird.svg create mode 100644 staticfiles/icons/down-arrow-arrows.svg create mode 100644 staticfiles/icons/down-arrow-download.svg create mode 100644 staticfiles/icons/down-arrow-download_1.svg create mode 100644 staticfiles/icons/down-arrow-ui.svg create mode 100644 staticfiles/icons/down-arrow-ui_1.svg create mode 100644 staticfiles/icons/download-down-arrow.svg create mode 100644 staticfiles/icons/download-file-download.svg create mode 100644 staticfiles/icons/download.svg create mode 100644 staticfiles/icons/download_1.svg create mode 100644 staticfiles/icons/download_2.svg create mode 100644 staticfiles/icons/download_3.svg create mode 100644 staticfiles/icons/download_4.svg create mode 100644 staticfiles/icons/download_5.svg create mode 100644 staticfiles/icons/drag.svg create mode 100644 staticfiles/icons/dribbble-brands-and-logotypes.svg create mode 100644 staticfiles/icons/dropbox.svg create mode 100644 staticfiles/icons/dropper-dosage.svg create mode 100644 staticfiles/icons/dss-files-and-folders.svg create mode 100644 staticfiles/icons/earth-globe-earth.svg create mode 100644 staticfiles/icons/earth-globe-planet.svg create mode 100644 staticfiles/icons/ebay.svg create mode 100644 staticfiles/icons/eclipse-moon.svg create mode 100644 staticfiles/icons/ecology-ecology-and-environment.svg create mode 100644 staticfiles/icons/edit-cutter.svg create mode 100644 staticfiles/icons/edit-pencil.svg create mode 100644 staticfiles/icons/eiffel-tower-landmark.svg create mode 100644 staticfiles/icons/eject-music-and-multimedia.svg create mode 100644 staticfiles/icons/eject-video-player.svg create mode 100644 staticfiles/icons/eject.svg create mode 100644 staticfiles/icons/electric-tower.svg create mode 100644 staticfiles/icons/email-mail.svg create mode 100644 staticfiles/icons/email-mail_1.svg create mode 100644 staticfiles/icons/email-mails.svg create mode 100644 staticfiles/icons/email.svg create mode 100644 staticfiles/icons/email_1.svg create mode 100644 staticfiles/icons/emails-mail.svg create mode 100644 staticfiles/icons/employee-skills.svg create mode 100644 staticfiles/icons/employees-meeting.svg create mode 100644 staticfiles/icons/envelope-mail.svg create mode 100644 staticfiles/icons/eraser.svg create mode 100644 staticfiles/icons/eraser_1.svg create mode 100644 staticfiles/icons/ereader-ebook.svg create mode 100644 staticfiles/icons/euro.svg create mode 100644 staticfiles/icons/evernote.svg create mode 100644 staticfiles/icons/excel.svg create mode 100644 staticfiles/icons/exchange-change.svg create mode 100644 staticfiles/icons/exchange-change_1.svg create mode 100644 staticfiles/icons/exchange.svg create mode 100644 staticfiles/icons/expand-fullscreen.svg create mode 100644 staticfiles/icons/expand.svg create mode 100644 staticfiles/icons/expand_1.svg create mode 100644 staticfiles/icons/expand_2.svg create mode 100644 staticfiles/icons/expand_3.svg create mode 100644 staticfiles/icons/export.svg create mode 100644 staticfiles/icons/eye.svg create mode 100644 staticfiles/icons/facebook.svg create mode 100644 staticfiles/icons/factory.svg create mode 100644 staticfiles/icons/fast-backward-backward.svg create mode 100644 staticfiles/icons/fast-backward-backward_1.svg create mode 100644 staticfiles/icons/fast-forward-double.svg create mode 100644 staticfiles/icons/fast-forward-play.svg create mode 100644 staticfiles/icons/fast-forward-ui.svg create mode 100644 staticfiles/icons/fast-forward.svg create mode 100644 staticfiles/icons/favorites-rate.svg create mode 100644 staticfiles/icons/ferris-wheel.svg create mode 100644 staticfiles/icons/file-accept.svg create mode 100644 staticfiles/icons/file-add.svg create mode 100644 staticfiles/icons/file-audio.svg create mode 100644 staticfiles/icons/file-cancel.svg create mode 100644 staticfiles/icons/file-coding.svg create mode 100644 staticfiles/icons/file-document.svg create mode 100644 staticfiles/icons/file-files-and-folders.svg create mode 100644 staticfiles/icons/file-files-and-folders_1.svg create mode 100644 staticfiles/icons/file-files-and-folders_2.svg create mode 100644 staticfiles/icons/file-remove.svg create mode 100644 staticfiles/icons/file-video-file.svg create mode 100644 staticfiles/icons/files-archive.svg create mode 100644 staticfiles/icons/files-document.svg create mode 100644 staticfiles/icons/files-files-and-folders.svg create mode 100644 staticfiles/icons/film-reel.svg create mode 100644 staticfiles/icons/film-strip-negative-film.svg create mode 100644 staticfiles/icons/film-strip.svg create mode 100644 staticfiles/icons/finance-book-economy.svg create mode 100644 staticfiles/icons/fire-hydrant.svg create mode 100644 staticfiles/icons/fla-files-and-folders.svg create mode 100644 staticfiles/icons/flashlight-tools-and-utensils.svg create mode 100644 staticfiles/icons/flickr.svg create mode 100644 staticfiles/icons/flip-flops-sandals.svg create mode 100644 staticfiles/icons/folder-data-storage.svg create mode 100644 staticfiles/icons/folder-files-and-folders.svg create mode 100644 staticfiles/icons/folder-files-and-folders_1.svg create mode 100644 staticfiles/icons/folder-files-and-folders_2.svg create mode 100644 staticfiles/icons/folder.svg create mode 100644 staticfiles/icons/folder_1.svg create mode 100644 staticfiles/icons/folder_2.svg create mode 100644 staticfiles/icons/folder_3.svg create mode 100644 staticfiles/icons/folder_4.svg create mode 100644 staticfiles/icons/font.svg create mode 100644 staticfiles/icons/forrst-brands-and-logotypes.svg create mode 100644 staticfiles/icons/forward-keyboard.svg create mode 100644 staticfiles/icons/forward-redo.svg create mode 100644 staticfiles/icons/forward.svg create mode 100644 staticfiles/icons/fountain.svg create mode 100644 staticfiles/icons/foursquare-brands-and-logotypes.svg create mode 100644 staticfiles/icons/foursquare-microsoft.svg create mode 100644 staticfiles/icons/full-moon-moon.svg create mode 100644 staticfiles/icons/fullscreen.svg create mode 100644 staticfiles/icons/furniture-locker.svg create mode 100644 staticfiles/icons/garbage-bin.svg create mode 100644 staticfiles/icons/geolocalization.svg create mode 100644 staticfiles/icons/gif.svg create mode 100644 staticfiles/icons/gift-card.svg create mode 100644 staticfiles/icons/gift.svg create mode 100644 staticfiles/icons/gift_1.svg create mode 100644 staticfiles/icons/global-loupe.svg create mode 100644 staticfiles/icons/golden-gate-bridge.svg create mode 100644 staticfiles/icons/google-plus.svg create mode 100644 staticfiles/icons/grand-canyon.svg create mode 100644 staticfiles/icons/great-buddha-of-thailand-thailand.svg create mode 100644 staticfiles/icons/grooveshark-brands-and-logotypes.svg create mode 100644 staticfiles/icons/group-multiple-users copy.svg create mode 100644 staticfiles/icons/group-multiple-users.svg create mode 100644 staticfiles/icons/group-talk.svg create mode 100644 staticfiles/icons/group-user.svg create mode 100644 staticfiles/icons/growth.svg create mode 100644 staticfiles/icons/growth_1.svg create mode 100644 staticfiles/icons/hail.svg create mode 100644 staticfiles/icons/hamburger-burger.svg create mode 100644 staticfiles/icons/hand-cooperation.svg create mode 100644 staticfiles/icons/handshake-deal.svg create mode 100644 staticfiles/icons/handshake.svg create mode 100644 staticfiles/icons/hanger.svg create mode 100644 staticfiles/icons/headphone-headphones.svg create mode 100644 staticfiles/icons/headphones.svg create mode 100644 staticfiles/icons/headset.svg create mode 100644 staticfiles/icons/heart-hospital.svg create mode 100644 staticfiles/icons/heart-like.svg create mode 100644 staticfiles/icons/heart-like_1.svg create mode 100644 staticfiles/icons/heart-like_2.svg create mode 100644 staticfiles/icons/heart-shapes-and-symbols.svg create mode 100644 staticfiles/icons/heart.svg create mode 100644 staticfiles/icons/heart_1.svg create mode 100644 staticfiles/icons/hearts-heart.svg create mode 100644 staticfiles/icons/helm.svg create mode 100644 staticfiles/icons/hemidemisemiquarver-semibreve.svg create mode 100644 staticfiles/icons/hide-blind.svg create mode 100644 staticfiles/icons/high-heels-fashion.svg create mode 100644 staticfiles/icons/hold-take.svg create mode 100644 staticfiles/icons/home-house.svg create mode 100644 staticfiles/icons/hospital-medical.svg create mode 100644 staticfiles/icons/hospital.svg create mode 100644 staticfiles/icons/hospital_1.svg create mode 100644 staticfiles/icons/hot-dog-stand.svg create mode 100644 staticfiles/icons/hourglass.svg create mode 100644 staticfiles/icons/hourglass_1.svg create mode 100644 staticfiles/icons/hourglass_2.svg create mode 100644 staticfiles/icons/house-rural.svg create mode 100644 staticfiles/icons/house.svg create mode 100644 staticfiles/icons/house_1.svg create mode 100644 staticfiles/icons/house_2.svg create mode 100644 staticfiles/icons/html-code.svg create mode 100644 staticfiles/icons/html5.svg create mode 100644 staticfiles/icons/human-resources-search.svg create mode 100644 staticfiles/icons/id-card-identity.svg create mode 100644 staticfiles/icons/id-card.svg create mode 100644 staticfiles/icons/image.svg create mode 100644 staticfiles/icons/image_1.svg create mode 100644 staticfiles/icons/import.svg create mode 100644 staticfiles/icons/inbox-download.svg create mode 100644 staticfiles/icons/inbox-mail.svg create mode 100644 staticfiles/icons/inbox.svg create mode 100644 staticfiles/icons/indd-files-and-folders.svg create mode 100644 staticfiles/icons/indent.svg create mode 100644 staticfiles/icons/instagram.svg create mode 100644 staticfiles/icons/insurance.svg create mode 100644 staticfiles/icons/invoice-bill.svg create mode 100644 staticfiles/icons/island.svg create mode 100644 staticfiles/icons/island_1.svg create mode 100644 staticfiles/icons/iso.svg create mode 100644 staticfiles/icons/italic.svg create mode 100644 staticfiles/icons/jar-jar-file.svg create mode 100644 staticfiles/icons/joystick-gamepad.svg create mode 100644 staticfiles/icons/justify-align-justify.svg create mode 100644 staticfiles/icons/justify-text.svg create mode 100644 staticfiles/icons/key-access.svg create mode 100644 staticfiles/icons/keyboard.svg create mode 100644 staticfiles/icons/kickstarter.svg create mode 100644 staticfiles/icons/landscape-moon.svg create mode 100644 staticfiles/icons/laptop.svg create mode 100644 staticfiles/icons/lastfm-brands-and-logotypes.svg create mode 100644 staticfiles/icons/layer-ruler.svg create mode 100644 staticfiles/icons/leaning-tower-of-pisa-europe.svg create mode 100644 staticfiles/icons/left-alignment-alignment.svg create mode 100644 staticfiles/icons/left-alignment-text.svg create mode 100644 staticfiles/icons/left-alignment-text_1.svg create mode 100644 staticfiles/icons/left-arrow-back.svg create mode 100644 staticfiles/icons/left-arrow-back_1.svg create mode 100644 staticfiles/icons/left-arrow-back_2.svg create mode 100644 staticfiles/icons/left-arrow.svg create mode 100644 staticfiles/icons/levels-adjust.svg create mode 100644 staticfiles/icons/levels-ui.svg create mode 100644 staticfiles/icons/levels-ui_1.svg create mode 100644 staticfiles/icons/levels-ui_2.svg create mode 100644 staticfiles/icons/levels-ui_3.svg create mode 100644 staticfiles/icons/levels-ui_4.svg create mode 100644 staticfiles/icons/lifesaver-help.svg create mode 100644 staticfiles/icons/lifesaver-help_1.svg create mode 100644 staticfiles/icons/light-bulb-idea.svg create mode 100644 staticfiles/icons/lighter.svg create mode 100644 staticfiles/icons/lightning.svg create mode 100644 staticfiles/icons/like.svg create mode 100644 staticfiles/icons/link.svg create mode 100644 staticfiles/icons/link_1.svg create mode 100644 staticfiles/icons/linkedin.svg create mode 100644 staticfiles/icons/list-menu.svg create mode 100644 staticfiles/icons/list-menu_1.svg create mode 100644 staticfiles/icons/list-tasks-dark.svg create mode 100644 staticfiles/icons/list-tasks.svg create mode 100644 staticfiles/icons/livejournal.svg create mode 100644 staticfiles/icons/loading.svg create mode 100644 staticfiles/icons/loading_1.svg create mode 100644 staticfiles/icons/loading_2.svg create mode 100644 staticfiles/icons/loading_3.svg create mode 100644 staticfiles/icons/loading_4.svg create mode 100644 staticfiles/icons/locations-gps.svg create mode 100644 staticfiles/icons/lock-correct.svg create mode 100644 staticfiles/icons/lock-correct_1.svg create mode 100644 staticfiles/icons/lock-security.svg create mode 100644 staticfiles/icons/lock-tools-and-utensils.svg create mode 100644 staticfiles/icons/lock-tools-and-utensils_1.svg create mode 100644 staticfiles/icons/lock-wrong.svg create mode 100644 staticfiles/icons/lock-wrong_1.svg create mode 100644 staticfiles/icons/lock.svg create mode 100644 staticfiles/icons/lock_1.svg create mode 100644 staticfiles/icons/lock_2.svg create mode 100644 staticfiles/icons/login.svg create mode 100644 staticfiles/icons/login_1.svg create mode 100644 staticfiles/icons/logout.svg create mode 100644 staticfiles/icons/logout_1.svg create mode 100644 staticfiles/icons/loss.svg create mode 100644 staticfiles/icons/loss_1.svg create mode 100644 staticfiles/icons/loss_2.svg create mode 100644 staticfiles/icons/magic-wand.svg create mode 100644 staticfiles/icons/mail.svg create mode 100644 staticfiles/icons/mail_1.svg create mode 100644 staticfiles/icons/map-maps-and-flags.svg create mode 100644 staticfiles/icons/map-roll.svg create mode 100644 staticfiles/icons/map-street-map.svg create mode 100644 staticfiles/icons/map-street-map_1.svg create mode 100644 staticfiles/icons/map.svg create mode 100644 staticfiles/icons/mastercard.svg create mode 100644 staticfiles/icons/maximize-expand.svg create mode 100644 staticfiles/icons/medal-award.svg create mode 100644 staticfiles/icons/medal-quality.svg create mode 100644 staticfiles/icons/meeting-interview.svg create mode 100644 staticfiles/icons/megaphone.svg create mode 100644 staticfiles/icons/megaphone_1.svg create mode 100644 staticfiles/icons/megaphone_2.svg create mode 100644 staticfiles/icons/menu-grid.svg create mode 100644 staticfiles/icons/menu.svg create mode 100644 staticfiles/icons/menu_1.svg create mode 100644 staticfiles/icons/menu_2.svg create mode 100644 staticfiles/icons/menu_3.svg create mode 100644 staticfiles/icons/menu_4.svg create mode 100644 staticfiles/icons/message-email.svg create mode 100644 staticfiles/icons/message-mail.svg create mode 100644 staticfiles/icons/microphone.svg create mode 100644 staticfiles/icons/microphone_1.svg create mode 100644 staticfiles/icons/minim.svg create mode 100644 staticfiles/icons/minimize-ui.svg create mode 100644 staticfiles/icons/minus.svg create mode 100644 staticfiles/icons/minus_1.svg create mode 100644 staticfiles/icons/moais-chile.svg create mode 100644 staticfiles/icons/mobile-phone-touch-screen.svg create mode 100644 staticfiles/icons/mobile-phone-touch-screen_1.svg create mode 100644 staticfiles/icons/mobile-phone-touch-screen_2.svg create mode 100644 staticfiles/icons/mobile-phone-touch-screen_3.svg create mode 100644 staticfiles/icons/mobile-phone-touch-screen_4.svg create mode 100644 staticfiles/icons/modem.svg create mode 100644 staticfiles/icons/money-bag.svg create mode 100644 staticfiles/icons/money-cash.svg create mode 100644 staticfiles/icons/money-cash_1.svg create mode 100644 staticfiles/icons/money-cash_2.svg create mode 100644 staticfiles/icons/money-pay.svg create mode 100644 staticfiles/icons/money-pay_1.svg create mode 100644 staticfiles/icons/money.svg create mode 100644 staticfiles/icons/money_1.svg create mode 100644 staticfiles/icons/monument-america.svg create mode 100644 staticfiles/icons/moon-phases-moon.svg create mode 100644 staticfiles/icons/moon-phases-moon_1.svg create mode 100644 staticfiles/icons/moon-phases-moon_2.svg create mode 100644 staticfiles/icons/moon-phases-moon_3.svg create mode 100644 staticfiles/icons/moon-phases.svg create mode 100644 staticfiles/icons/moon-phases_1.svg create mode 100644 staticfiles/icons/more.svg create mode 100644 staticfiles/icons/more_1.svg create mode 100644 staticfiles/icons/mountains-altitude.svg create mode 100644 staticfiles/icons/mountains-altitude_1.svg create mode 100644 staticfiles/icons/mountains-mountain.svg create mode 100644 staticfiles/icons/mountains-sky.svg create mode 100644 staticfiles/icons/mouse.svg create mode 100644 staticfiles/icons/mov.svg create mode 100644 staticfiles/icons/move.svg create mode 100644 staticfiles/icons/move_1.svg create mode 100644 staticfiles/icons/mp3.svg create mode 100644 staticfiles/icons/music-music-player.svg create mode 100644 staticfiles/icons/music.svg create mode 100644 staticfiles/icons/music_1.svg create mode 100644 staticfiles/icons/myspace-microsoft.svg create mode 100644 staticfiles/icons/navigation-gps.svg create mode 100644 staticfiles/icons/next.svg create mode 100644 staticfiles/icons/next_1.svg create mode 100644 staticfiles/icons/next_2.svg create mode 100644 staticfiles/icons/next_3.svg create mode 100644 staticfiles/icons/next_4.svg create mode 100644 staticfiles/icons/nfc.svg create mode 100644 staticfiles/icons/notepad-note.svg create mode 100644 staticfiles/icons/notes-post-it.svg create mode 100644 staticfiles/icons/notification.svg create mode 100644 staticfiles/icons/office-chair-chair.svg create mode 100644 staticfiles/icons/open-book-book.svg create mode 100644 staticfiles/icons/open-book-book_1.svg create mode 100644 staticfiles/icons/open-book.svg create mode 100644 staticfiles/icons/open-shop.svg create mode 100644 staticfiles/icons/open.svg create mode 100644 staticfiles/icons/opera.svg create mode 100644 staticfiles/icons/outbox-inbox.svg create mode 100644 staticfiles/icons/outbox.svg create mode 100644 staticfiles/icons/outdent-ui.svg create mode 100644 staticfiles/icons/package-delivery.svg create mode 100644 staticfiles/icons/package.svg create mode 100644 staticfiles/icons/padlock-lock.svg create mode 100644 staticfiles/icons/paid.svg create mode 100644 staticfiles/icons/paint-brush-art-and-design.svg create mode 100644 staticfiles/icons/paint-brush-artist.svg create mode 100644 staticfiles/icons/paint-bucket.svg create mode 100644 staticfiles/icons/pamela-hat.svg create mode 100644 staticfiles/icons/pantone.svg create mode 100644 staticfiles/icons/paper-plane-origami.svg create mode 100644 staticfiles/icons/paperclip-tools-and-utensils.svg create mode 100644 staticfiles/icons/paragraph.svg create mode 100644 staticfiles/icons/parthenon-athens.svg create mode 100644 staticfiles/icons/password.svg create mode 100644 staticfiles/icons/password_1.svg create mode 100644 staticfiles/icons/paste-sheet.svg create mode 100644 staticfiles/icons/pause.svg create mode 100644 staticfiles/icons/pause_1.svg create mode 100644 staticfiles/icons/pause_2.svg create mode 100644 staticfiles/icons/paypal.svg create mode 100644 staticfiles/icons/pdf.svg create mode 100644 staticfiles/icons/pen-writing.svg create mode 100644 staticfiles/icons/pen.svg create mode 100644 staticfiles/icons/pencil-compose.svg create mode 100644 staticfiles/icons/pencil-edit.svg create mode 100644 staticfiles/icons/percentage-discount.svg create mode 100644 staticfiles/icons/pet-house-kennel.svg create mode 100644 staticfiles/icons/phone-booth-architecture-and-city.svg create mode 100644 staticfiles/icons/photo-camera.svg create mode 100644 staticfiles/icons/php.svg create mode 100644 staticfiles/icons/piano.svg create mode 100644 staticfiles/icons/picasa.svg create mode 100644 staticfiles/icons/picture-image.svg create mode 100644 staticfiles/icons/picture-image_1.svg create mode 100644 staticfiles/icons/picture-photo.svg create mode 100644 staticfiles/icons/pie-chart-financial.svg create mode 100644 staticfiles/icons/pie-chart-financial_1.svg create mode 100644 staticfiles/icons/pie-chart-presentation.svg create mode 100644 staticfiles/icons/pie-chart.svg create mode 100644 staticfiles/icons/pie-chart_1.svg create mode 100644 staticfiles/icons/pills-pill.svg create mode 100644 staticfiles/icons/pinterest.svg create mode 100644 staticfiles/icons/placeholder-aim.svg create mode 100644 staticfiles/icons/placeholder-gps copy.svg create mode 100644 staticfiles/icons/placeholder-gps.svg create mode 100644 staticfiles/icons/placeholder-gps_1.svg create mode 100644 staticfiles/icons/placeholder-gps_2.svg create mode 100644 staticfiles/icons/placeholder-house.svg create mode 100644 staticfiles/icons/placeholder-map-pointer.svg create mode 100644 staticfiles/icons/placeholder-maps-and-location.svg create mode 100644 staticfiles/icons/placeholder-pin.svg create mode 100644 staticfiles/icons/planet-earth-global.svg create mode 100644 staticfiles/icons/play-movie.svg create mode 100644 staticfiles/icons/play.svg create mode 100644 staticfiles/icons/play_1.svg create mode 100644 staticfiles/icons/plus-add.svg create mode 100644 staticfiles/icons/plus.svg create mode 100644 staticfiles/icons/png.svg create mode 100644 staticfiles/icons/pointer-cursor.svg create mode 100644 staticfiles/icons/pointer-cursor_1.svg create mode 100644 staticfiles/icons/pointer-hands-and-gestures.svg create mode 100644 staticfiles/icons/pointer-hands-and-gestures_1.svg create mode 100644 staticfiles/icons/pointer-pin.svg create mode 100644 staticfiles/icons/pointer-point.svg create mode 100644 staticfiles/icons/pointer.svg create mode 100644 staticfiles/icons/pointing-left-hands-and-gestures.svg create mode 100644 staticfiles/icons/pointing-right-finger.svg create mode 100644 staticfiles/icons/polaroids-polaroid.svg create mode 100644 staticfiles/icons/police-police-station.svg create mode 100644 staticfiles/icons/position-gps.svg create mode 100644 staticfiles/icons/position-gps_1.svg create mode 100644 staticfiles/icons/position-map-pointer.svg create mode 100644 staticfiles/icons/position-maps-and-flags.svg create mode 100644 staticfiles/icons/position-stick-man.svg create mode 100644 staticfiles/icons/postcard.svg create mode 100644 staticfiles/icons/pot-saucepan.svg create mode 100644 staticfiles/icons/pound-sterling.svg create mode 100644 staticfiles/icons/power-button-start-button.svg create mode 100644 staticfiles/icons/power-on-power.svg create mode 100644 staticfiles/icons/power-on-ui.svg create mode 100644 staticfiles/icons/powerpoint-ppt.svg create mode 100644 staticfiles/icons/preview.svg create mode 100644 staticfiles/icons/previous-back.svg create mode 100644 staticfiles/icons/previous-return.svg create mode 100644 staticfiles/icons/previous-return_1.svg create mode 100644 staticfiles/icons/previous-ui.svg create mode 100644 staticfiles/icons/price-tag-discount.svg create mode 100644 staticfiles/icons/price-tag-tag.svg create mode 100644 staticfiles/icons/print.svg create mode 100644 staticfiles/icons/printer-print.svg create mode 100644 staticfiles/icons/printer.svg create mode 100644 staticfiles/icons/profits-analytics.svg create mode 100644 staticfiles/icons/profits-bar-chart.svg create mode 100644 staticfiles/icons/profits-bar-chart_1.svg create mode 100644 staticfiles/icons/profits-dollar.svg create mode 100644 staticfiles/icons/profits-statistics copy.svg create mode 100644 staticfiles/icons/profits-statistics.svg create mode 100644 staticfiles/icons/projector-electronics.svg create mode 100644 staticfiles/icons/propeller.svg create mode 100644 staticfiles/icons/propeller_1.svg create mode 100644 staticfiles/icons/psd.svg create mode 100644 staticfiles/icons/push-pin-attach.svg create mode 100644 staticfiles/icons/push-pin.svg create mode 100644 staticfiles/icons/pyramid.svg create mode 100644 staticfiles/icons/pyramids-desert.svg create mode 100644 staticfiles/icons/radio.svg create mode 100644 staticfiles/icons/rain-umbrella.svg create mode 100644 staticfiles/icons/rain-weather.svg create mode 100644 staticfiles/icons/rain.svg create mode 100644 staticfiles/icons/rainbow.svg create mode 100644 staticfiles/icons/raindrop-teardrop.svg create mode 100644 staticfiles/icons/rainy-morning-rain.svg create mode 100644 staticfiles/icons/rainy-rain.svg create mode 100644 staticfiles/icons/rec-circle.svg create mode 100644 staticfiles/icons/rec-dot.svg create mode 100644 staticfiles/icons/rec.svg create mode 100644 staticfiles/icons/redo.svg create mode 100644 staticfiles/icons/redo_1.svg create mode 100644 staticfiles/icons/redo_2.svg create mode 100644 staticfiles/icons/reflector-vest-rescue.svg create mode 100644 staticfiles/icons/reforestation.svg create mode 100644 staticfiles/icons/refresh-loading.svg create mode 100644 staticfiles/icons/refresh-loading_1.svg create mode 100644 staticfiles/icons/refresh.svg create mode 100644 staticfiles/icons/remove-miscellaneous.svg create mode 100644 staticfiles/icons/remove-ui.svg create mode 100644 staticfiles/icons/repeat.svg create mode 100644 staticfiles/icons/reply.svg create mode 100644 staticfiles/icons/reply_1.svg create mode 100644 staticfiles/icons/reply_2.svg create mode 100644 staticfiles/icons/reply_3.svg create mode 100644 staticfiles/icons/resize-double-arrows.svg create mode 100644 staticfiles/icons/resize-vertical-arrow.svg create mode 100644 staticfiles/icons/resize.svg create mode 100644 staticfiles/icons/resize_1.svg create mode 100644 staticfiles/icons/retirement.svg create mode 100644 staticfiles/icons/right-alignment-text.svg create mode 100644 staticfiles/icons/right-alignment-text_1.svg create mode 100644 staticfiles/icons/right-arrow-forward.svg create mode 100644 staticfiles/icons/right-arrow-next.svg create mode 100644 staticfiles/icons/right-arrow-next_1.svg create mode 100644 staticfiles/icons/right-arrow-ui.svg create mode 100644 staticfiles/icons/road.svg create mode 100644 staticfiles/icons/route-start.svg create mode 100644 staticfiles/icons/rss.svg create mode 100644 staticfiles/icons/safebox-bank.svg create mode 100644 staticfiles/icons/sailing-yacht.svg create mode 100644 staticfiles/icons/sale.svg create mode 100644 staticfiles/icons/satellite-dish-radar.svg create mode 100644 staticfiles/icons/satellite-dish-radar_1.svg create mode 100644 staticfiles/icons/save-save-file.svg create mode 100644 staticfiles/icons/save-save-file_1.svg create mode 100644 staticfiles/icons/scale-image.svg create mode 100644 staticfiles/icons/school-college.svg create mode 100644 staticfiles/icons/scroll.svg create mode 100644 staticfiles/icons/scroll_1.svg create mode 100644 staticfiles/icons/scroll_2.svg create mode 100644 staticfiles/icons/search-magnifying-glass.svg create mode 100644 staticfiles/icons/search-zoom.svg create mode 100644 staticfiles/icons/search.svg create mode 100644 staticfiles/icons/search_1.svg create mode 100644 staticfiles/icons/search_2.svg create mode 100644 staticfiles/icons/semibreve.svg create mode 100644 staticfiles/icons/semiquaver.svg create mode 100644 staticfiles/icons/server.svg create mode 100644 staticfiles/icons/settings-cogwheel.svg create mode 100644 staticfiles/icons/settings-gear.svg create mode 100644 staticfiles/icons/settings-gear_1.svg create mode 100644 staticfiles/icons/settings-gear_2.svg create mode 100644 staticfiles/icons/share.svg create mode 100644 staticfiles/icons/shield-security-system.svg create mode 100644 staticfiles/icons/shield.svg create mode 100644 staticfiles/icons/shield_1.svg create mode 100644 staticfiles/icons/shield_2.svg create mode 100644 staticfiles/icons/shirt.svg create mode 100644 staticfiles/icons/shirt_1.svg create mode 100644 staticfiles/icons/shop-architecture-and-city.svg create mode 100644 staticfiles/icons/shop-chinese.svg create mode 100644 staticfiles/icons/shop.svg create mode 100644 staticfiles/icons/shopping-bag.svg create mode 100644 staticfiles/icons/shopping-basket-remove.svg create mode 100644 staticfiles/icons/shopping-basket.svg create mode 100644 staticfiles/icons/shopping-basket_1.svg create mode 100644 staticfiles/icons/shopping-cart-add.svg create mode 100644 staticfiles/icons/shopping-cart-cart.svg create mode 100644 staticfiles/icons/shopping-cart-cart_1.svg create mode 100644 staticfiles/icons/shopping-cart-cart_2.svg create mode 100644 staticfiles/icons/shopping-cart-cart_3.svg create mode 100644 staticfiles/icons/shopping-cart-cart_4.svg create mode 100644 staticfiles/icons/shopping-cart-cart_5.svg create mode 100644 staticfiles/icons/shopping-cart.svg create mode 100644 staticfiles/icons/shopping-cart_1.svg create mode 100644 staticfiles/icons/show.svg create mode 100644 staticfiles/icons/shuffle-random.svg create mode 100644 staticfiles/icons/signboard.svg create mode 100644 staticfiles/icons/signpost.svg create mode 100644 staticfiles/icons/skills.svg create mode 100644 staticfiles/icons/skype.svg create mode 100644 staticfiles/icons/skyscrapper-edifice.svg create mode 100644 staticfiles/icons/skyscrapper-edifice_1.svg create mode 100644 staticfiles/icons/smartphone-cellphone.svg create mode 100644 staticfiles/icons/smartphone-touch-screen.svg create mode 100644 staticfiles/icons/smartphone-touch-screen_1.svg create mode 100644 staticfiles/icons/smartphone-touch-screen_2.svg create mode 100644 staticfiles/icons/smartphone-touch-screen_3.svg create mode 100644 staticfiles/icons/smartphone-touch-screen_4.svg create mode 100644 staticfiles/icons/snowflake.svg create mode 100644 staticfiles/icons/snowing-snowy.svg create mode 100644 staticfiles/icons/solidarity-ribbon.svg create mode 100644 staticfiles/icons/solidarity-ribbon_1.svg create mode 100644 staticfiles/icons/sort-swap.svg create mode 100644 staticfiles/icons/sort-switch.svg create mode 100644 staticfiles/icons/sort-switch_1.svg create mode 100644 staticfiles/icons/sound-speaker.svg create mode 100644 staticfiles/icons/sound-speaker_1.svg create mode 100644 staticfiles/icons/soundcloud.svg create mode 100644 staticfiles/icons/speakers-speaker.svg create mode 100644 staticfiles/icons/speech-bubble-chat.svg create mode 100644 staticfiles/icons/spray-aerosol.svg create mode 100644 staticfiles/icons/sprout.svg create mode 100644 staticfiles/icons/star.svg create mode 100644 staticfiles/icons/star_1.svg create mode 100644 staticfiles/icons/star_2.svg create mode 100644 staticfiles/icons/star_3.svg create mode 100644 staticfiles/icons/startup-rocket.svg create mode 100644 staticfiles/icons/statue-of-liberty.svg create mode 100644 staticfiles/icons/sticker.svg create mode 100644 staticfiles/icons/stop-music-and-multimedia.svg create mode 100644 staticfiles/icons/stop-video-player.svg create mode 100644 staticfiles/icons/stop.svg create mode 100644 staticfiles/icons/store-search.svg create mode 100644 staticfiles/icons/store.svg create mode 100644 staticfiles/icons/storm-rain.svg create mode 100644 staticfiles/icons/street-light.svg create mode 100644 staticfiles/icons/street-light_1.svg create mode 100644 staticfiles/icons/street-map-gps.svg create mode 100644 staticfiles/icons/street-map.svg create mode 100644 staticfiles/icons/street-map_1.svg create mode 100644 staticfiles/icons/strikethrough.svg create mode 100644 staticfiles/icons/stumbleupon-brands-and-logotypes.svg create mode 100644 staticfiles/icons/subscript-text-formatting.svg create mode 100644 staticfiles/icons/suitcase-portfolio.svg create mode 100644 staticfiles/icons/sun-cream.svg create mode 100644 staticfiles/icons/sun-umbrella.svg create mode 100644 staticfiles/icons/sun-warm.svg create mode 100644 staticfiles/icons/sunglasses.svg create mode 100644 staticfiles/icons/sunrise-evening.svg create mode 100644 staticfiles/icons/sunset-sea.svg create mode 100644 staticfiles/icons/superscript.svg create mode 100644 staticfiles/icons/swimsuit.svg create mode 100644 staticfiles/icons/swiss-army-knife.svg create mode 100644 staticfiles/icons/switch-button.svg create mode 100644 staticfiles/icons/switch.svg create mode 100644 staticfiles/icons/switch_1.svg create mode 100644 staticfiles/icons/sydney-opera-house-australia.svg create mode 100644 staticfiles/icons/symbol-maps-and-flags.svg create mode 100644 staticfiles/icons/table-excel.svg create mode 100644 staticfiles/icons/table-excel_1.svg create mode 100644 staticfiles/icons/tablet.svg create mode 100644 staticfiles/icons/tag-price.svg create mode 100644 staticfiles/icons/taj-mahal.svg create mode 100644 staticfiles/icons/tap-finger.svg create mode 100644 staticfiles/icons/tap-hands-and-gestures.svg create mode 100644 staticfiles/icons/tap-hands-and-gestures_1.svg create mode 100644 staticfiles/icons/tap-hands-and-gestures_2.svg create mode 100644 staticfiles/icons/tap.svg create mode 100644 staticfiles/icons/target-aim.svg create mode 100644 staticfiles/icons/target-aim_1.svg create mode 100644 staticfiles/icons/target-shooting.svg create mode 100644 staticfiles/icons/target.svg create mode 100644 staticfiles/icons/target_1.svg create mode 100644 staticfiles/icons/target_2.svg create mode 100644 staticfiles/icons/technorati-brands-and-logotypes.svg create mode 100644 staticfiles/icons/teddy-bear-animal.svg create mode 100644 staticfiles/icons/telegram.svg create mode 100644 staticfiles/icons/telephone-call.svg create mode 100644 staticfiles/icons/telephone-phone.svg create mode 100644 staticfiles/icons/telephone-telephone-call.svg create mode 100644 staticfiles/icons/telephone.svg create mode 100644 staticfiles/icons/television-tv.svg create mode 100644 staticfiles/icons/temperature.svg create mode 100644 staticfiles/icons/temperature_1.svg create mode 100644 staticfiles/icons/tent.svg create mode 100644 staticfiles/icons/teotihuacan-architectonic.svg create mode 100644 staticfiles/icons/test.svg create mode 100644 staticfiles/icons/text-height-edit-tools.svg create mode 100644 staticfiles/icons/text-width-edit-tools.svg create mode 100644 staticfiles/icons/text.svg create mode 100644 staticfiles/icons/thermometer-temperature.svg create mode 100644 staticfiles/icons/thermometer-temperature_1.svg create mode 100644 staticfiles/icons/thermometer-temperature_2.svg create mode 100644 staticfiles/icons/ticket.svg create mode 100644 staticfiles/icons/tie.svg create mode 100644 staticfiles/icons/time-hourglass.svg create mode 100644 staticfiles/icons/time-left-wait.svg create mode 100644 staticfiles/icons/time-left.svg create mode 100644 staticfiles/icons/time-management-watch.svg create mode 100644 staticfiles/icons/time-time-and-date.svg create mode 100644 staticfiles/icons/timer-stopwatch.svg create mode 100644 staticfiles/icons/tools-pen.svg create mode 100644 staticfiles/icons/tornado.svg create mode 100644 staticfiles/icons/traffic-light.svg create mode 100644 staticfiles/icons/traffic-sign-danger.svg create mode 100644 staticfiles/icons/trees-forest.svg create mode 100644 staticfiles/icons/trolley-items.svg create mode 100644 staticfiles/icons/trophy.svg create mode 100644 staticfiles/icons/truck.svg create mode 100644 staticfiles/icons/truck_1.svg create mode 100644 staticfiles/icons/truck_2.svg create mode 100644 staticfiles/icons/tumblr.svg create mode 100644 staticfiles/icons/turn-left-ui.svg create mode 100644 staticfiles/icons/turn-left-ui_1.svg create mode 100644 staticfiles/icons/turn-left-ui_2.svg create mode 100644 staticfiles/icons/turn-left.svg create mode 100644 staticfiles/icons/turn-right-arrows.svg create mode 100644 staticfiles/icons/turn-right-ui.svg create mode 100644 staticfiles/icons/turn-right-ui_1.svg create mode 100644 staticfiles/icons/turn-right-ui_2.svg create mode 100644 staticfiles/icons/twitter.svg create mode 100644 staticfiles/icons/typewriter.svg create mode 100644 staticfiles/icons/umbrella.svg create mode 100644 staticfiles/icons/underline-edit-tools.svg create mode 100644 staticfiles/icons/undo.svg create mode 100644 staticfiles/icons/undo_1.svg create mode 100644 staticfiles/icons/undo_2.svg create mode 100644 staticfiles/icons/unlink.svg create mode 100644 staticfiles/icons/unlock-lock.svg create mode 100644 staticfiles/icons/up-arrow-control.svg create mode 100644 staticfiles/icons/up-arrow-ui.svg create mode 100644 staticfiles/icons/up-arrow.svg create mode 100644 staticfiles/icons/up-arrow_1.svg create mode 100644 staticfiles/icons/up-arrow_2.svg create mode 100644 staticfiles/icons/up-arrow_3.svg create mode 100644 staticfiles/icons/upload-up-arrow.svg create mode 100644 staticfiles/icons/upload.svg create mode 100644 staticfiles/icons/upload_1.svg create mode 100644 staticfiles/icons/upload_2.svg create mode 100644 staticfiles/icons/upload_3.svg create mode 100644 staticfiles/icons/upload_4.svg create mode 100644 staticfiles/icons/usb-cable.svg create mode 100644 staticfiles/icons/usb.svg create mode 100644 staticfiles/icons/usb_1.svg create mode 100644 staticfiles/icons/user-add.svg create mode 100644 staticfiles/icons/user-add_1.svg create mode 100644 staticfiles/icons/user-block.svg create mode 100644 staticfiles/icons/user-delete.svg create mode 100644 staticfiles/icons/user-delete_1.svg create mode 100644 staticfiles/icons/user-follower.svg create mode 100644 staticfiles/icons/user-followers.svg create mode 100644 staticfiles/icons/user-remove.svg create mode 100644 staticfiles/icons/user-seo-and-web.svg create mode 100644 staticfiles/icons/user-seo-and-web_1.svg create mode 100644 staticfiles/icons/user-seo-and-web_2.svg create mode 100644 staticfiles/icons/user-seo-and-web_3.svg create mode 100644 staticfiles/icons/user-seo-and-web_4.svg create mode 100644 staticfiles/icons/user-seo-and-web_5.svg create mode 100644 staticfiles/icons/user-seo-and-web_6.svg create mode 100644 staticfiles/icons/user.svg create mode 100644 staticfiles/icons/user_1.svg create mode 100644 staticfiles/icons/user_2.svg create mode 100644 staticfiles/icons/users-user.svg create mode 100644 staticfiles/icons/vatican.svg create mode 100644 staticfiles/icons/viber.svg create mode 100644 staticfiles/icons/video-camera-cinema.svg create mode 100644 staticfiles/icons/video-camera-film.svg create mode 100644 staticfiles/icons/video-camera.svg create mode 100644 staticfiles/icons/video-player-movie.svg create mode 100644 staticfiles/icons/video.svg create mode 100644 staticfiles/icons/vimeo-brands-and-logotypes.svg create mode 100644 staticfiles/icons/visa.svg create mode 100644 staticfiles/icons/visualization-grid.svg create mode 100644 staticfiles/icons/visualization-grid_1.svg create mode 100644 staticfiles/icons/vk-vk.svg create mode 100644 staticfiles/icons/volume-down.svg create mode 100644 staticfiles/icons/volume-max.svg create mode 100644 staticfiles/icons/volume-music-and-multimedia.svg create mode 100644 staticfiles/icons/volume-mute.svg create mode 100644 staticfiles/icons/volume-up.svg create mode 100644 staticfiles/icons/wait-hourglass.svg create mode 100644 staticfiles/icons/wallet.svg create mode 100644 staticfiles/icons/watch.svg create mode 100644 staticfiles/icons/water-raindrop.svg create mode 100644 staticfiles/icons/water.svg create mode 100644 staticfiles/icons/water_1.svg create mode 100644 staticfiles/icons/waterfall-river.svg create mode 100644 staticfiles/icons/webcam.svg create mode 100644 staticfiles/icons/wheelchair.svg create mode 100644 staticfiles/icons/wifi.svg create mode 100644 staticfiles/icons/wifi_1.svg create mode 100644 staticfiles/icons/wikipedia.svg create mode 100644 staticfiles/icons/wind-rose.svg create mode 100644 staticfiles/icons/wind.svg create mode 100644 staticfiles/icons/windmill-mill.svg create mode 100644 staticfiles/icons/wma-files-and-folders.svg create mode 100644 staticfiles/icons/word.svg create mode 100644 staticfiles/icons/wordpress.svg create mode 100644 staticfiles/icons/workflow.svg create mode 100644 staticfiles/icons/workflow_1.svg create mode 100644 staticfiles/icons/worldwide-global.svg create mode 100644 staticfiles/icons/worldwide-gps.svg create mode 100644 staticfiles/icons/writing-edit.svg create mode 100644 staticfiles/icons/writing-note.svg create mode 100644 staticfiles/icons/writing-tools-and-utensils.svg create mode 100644 staticfiles/icons/xing.svg create mode 100644 staticfiles/icons/yahoo.svg create mode 100644 staticfiles/icons/yandex.svg create mode 100644 staticfiles/icons/yen.svg create mode 100644 staticfiles/icons/youtube.svg create mode 100644 staticfiles/icons/zerply-brands-and-logotypes.svg create mode 100644 staticfiles/icons/zoom-in.svg create mode 100644 staticfiles/icons/zoom-out.svg create mode 100644 staticfiles/images/car_make/Chevrolet_ZUJVQuH.png create mode 100644 staticfiles/images/car_make/Citroen.png create mode 100644 staticfiles/images/car_make/Daewoo.png create mode 100644 staticfiles/images/car_make/Daihatsu.png create mode 100644 staticfiles/images/car_make/Datsun.png create mode 100644 staticfiles/images/car_make/Dongfeng.png create mode 100644 staticfiles/images/car_make/EXEED.png create mode 100644 staticfiles/images/car_make/Ferrari.png create mode 100644 staticfiles/images/car_make/Fiat.png create mode 100644 staticfiles/images/car_make/Forthing.png create mode 100644 staticfiles/images/car_make/Foton.png create mode 100644 staticfiles/images/car_make/GAC.png create mode 100644 staticfiles/images/car_make/GMC.png create mode 100644 staticfiles/images/car_make/GWM.png create mode 100644 staticfiles/images/car_make/Geely.png create mode 100644 staticfiles/images/car_make/Genesis.png create mode 100644 staticfiles/images/car_make/Honda.png create mode 100644 staticfiles/images/car_make/Hongqi.png create mode 100644 staticfiles/images/car_make/Hummer.png create mode 100644 staticfiles/images/car_make/Hyundai.png create mode 100644 staticfiles/images/car_make/Infiniti.png create mode 100644 staticfiles/images/car_make/Isuzu.png create mode 100644 staticfiles/images/car_make/JAC.png create mode 100644 staticfiles/images/car_make/JMC.png create mode 100644 staticfiles/images/car_make/Jaguar.png create mode 100644 staticfiles/images/car_make/Jetour.png create mode 100644 staticfiles/images/car_make/Lamborghini.png create mode 100644 staticfiles/images/car_make/Land-Rover.png create mode 100644 staticfiles/images/car_make/Lexus.png create mode 100644 staticfiles/images/car_make/Lucid.png create mode 100644 staticfiles/images/car_make/LynkCo.png create mode 100644 staticfiles/images/car_make/MG.png create mode 100644 staticfiles/images/car_make/Maxus.png create mode 100644 staticfiles/images/car_make/Maybach.png create mode 100644 staticfiles/images/car_make/Mazda.png create mode 100644 staticfiles/images/car_make/McLaren.png create mode 100644 staticfiles/images/car_make/Mercedes-Benz.png create mode 100644 staticfiles/images/car_make/Mercury.png create mode 100644 staticfiles/images/car_make/Mitsubishi.png create mode 100644 staticfiles/images/car_make/Opel.png create mode 100644 staticfiles/images/car_make/Pontiac.png create mode 100644 staticfiles/images/car_make/Porsche.png create mode 100644 staticfiles/images/car_make/Rayton-Fissore.png create mode 100644 staticfiles/images/car_make/Renault.png create mode 100644 staticfiles/images/car_make/Rolls-Royce.png create mode 100644 staticfiles/images/car_make/Rover.png create mode 100644 staticfiles/images/car_make/Saab.png create mode 100644 staticfiles/images/car_make/Seat.png create mode 100644 staticfiles/images/car_make/Seres.png create mode 100644 staticfiles/images/car_make/Skoda.png create mode 100644 staticfiles/images/car_make/Smart.png create mode 100644 staticfiles/images/car_make/Spectre.png create mode 100644 staticfiles/images/car_make/Ssangyong.png create mode 100644 staticfiles/images/car_make/Stelato.png create mode 100644 staticfiles/images/car_make/Subaru.png create mode 100644 staticfiles/images/car_make/Suzuki.png create mode 100644 staticfiles/images/car_make/TATA.png create mode 100644 staticfiles/images/car_make/Tank.png create mode 100644 staticfiles/images/car_make/Tesla.png create mode 100644 staticfiles/images/car_make/Volkswagen.png create mode 100644 staticfiles/images/car_make/Volvo.png create mode 100644 staticfiles/images/car_make/Voyah.png create mode 100644 staticfiles/images/car_make/Zotye.png create mode 100644 staticfiles/images/car_make/haval.png create mode 100644 staticfiles/images/car_make/mini.png create mode 100644 staticfiles/images/car_make/zx.png create mode 100644 staticfiles/images/images/Alamjdouie-Hyundai-logo_I8WTQve_NvbZyE9.png create mode 100644 staticfiles/images/images/tenhal_hero.png create mode 100644 staticfiles/images/images/web-design.jpg create mode 100644 staticfiles/images/sold.png create mode 100644 staticfiles/js/echarts.js create mode 100644 staticfiles/js/jquery.min.js create mode 100644 staticfiles/schema_graph/main.js create mode 100644 staticfiles/vendors/htmx.min.js create mode 100644 staticfiles/vendors/tesseract/tesseract.min.js create mode 100644 staticfiles/vendors/turf.min.js create mode 100644 staticfiles/vendors/zxing/index.min.js diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..f804ad10 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,22 @@ +__pycache__/ +*.pyc +*.log +*.sqlite3 +*.db +migrations/ +media/ +static/ +node_modules/ +venv/ +env/ +.git/ +.gitignore +.DS_Store +docker-compose.yml +README.md +car*.json +.vscode +.idea +*/migrations/* +*/migrations/ +inventory/migrations/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..eacc006c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +# Use an official Python image as a base +FROM python:3.11.11-slim-bullseye + +# Set the working directory to /app +WORKDIR /app + +# Create a new user and group +RUN groupadd -r appgroup +RUN useradd -r -g appgroup -G appgroup -m -d /app -s /bin/false appuser + +# Copy the requirements file +COPY requirements.txt . + +# Install the dependencies +RUN pip install -r requirements.txt +RUN apt-get update && apt-get install -y libgl1 +RUN apt-get update && apt-get install -y libglib2.0-dev +RUN apt-get update && apt-get install -y libzbar0 + +# Copy the application code +COPY . . + +# Expose the port +EXPOSE 8000 + +# Copy the entrypoint script +COPY entrypoint.sh /app/entrypoint.sh + +# Make the script executable +RUN chmod +x /app/entrypoint.sh + +# Change ownership of the app directory to the new user +RUN chown -R appuser:appgroup /app + +RUN find /app -path "*/migrations/*.py" -not -name "__init__.py" -delete +RUN find /app -path "*/migrations/*.pyc" -delete + +# Set the entrypoint to execute the script as the new user +ENTRYPOINT ["sh", "-c", "python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py collectstatic --no-input && python3 manage.py runserver 0.0.0.0:8000"] \ No newline at end of file diff --git a/api/__pycache__/__init__.cpython-311.pyc b/api/__pycache__/__init__.cpython-311.pyc index c463de3e9bbf5dd884e37bdc124a0063bef18d86..3224f17d5392143e24fc2dae963c8b448c34d0e1 100644 GIT binary patch delta 29 jcmZ3-*vQDUoR^o20SKZxLenSmn6QfICl(Y;EV2OrVS@)i delta 74 zcmZooR^o20SI#E?n#@-V`Ai}A6lGRRIHzySX7>vmzYzYn3Jg=P??;OSd<%3 cl%JKFTvDu`oLCf}nOByYSCU^;InmVy0B+J5`Tzg` diff --git a/api/__pycache__/admin.cpython-311.pyc b/api/__pycache__/admin.cpython-311.pyc index 4612b35a32c675f54808a40f03cd3c4280b1a7ea..e8144647890602a6d0661630973c2947cf836f9e 100644 GIT binary patch delta 30 kcmeBVzQe?`oR^o20SKZxLenSm++Y>dPb?^yEXG(20CboK_y7O^ delta 74 zcmcb^)XB`VoR^o20SIIk?@61;bHm6^KeRZts8~NYv8X&TFEOV)F(*?$pfWilu_!m7 cC_gJTxujS>Ik6}{Gp{T)uOz>ya^lNk0FlNUWB>pF diff --git a/api/__pycache__/apps.cpython-311.pyc b/api/__pycache__/apps.cpython-311.pyc index 77b80ab1d47dae06ea343a0089e8070cdeb646d6..98145dab70b3e7b6c9a3fdde9f1484e9dfedaaac 100644 GIT binary patch delta 31 lcmbQu@{XBjIWI340}w=Ygr;xg;bLSJ&`&HVnC!uL831>02m$~A delta 76 zcmaFIJe!4QIWI340}$lS-IKPFhl|n3RzI{jwWwG>H?gQZF)uNvJTWIzKcF%>Be5tq epeR2pHMyi%KRK}|J~OW@HLoPUsB*G2<7EJ+ZW_D* diff --git a/api/__pycache__/models.cpython-311.pyc b/api/__pycache__/models.cpython-311.pyc index ec635e62c26a7afd694ccbf5423a6e7340a61dcc..6d74ca0b5e913f4c828f66f14b21a8c6d09376f4 100644 GIT binary patch delta 31 lcmX@eK82loIWI340}$-JnzfO89wV!eequqv=G%Ik6}{Gp{T)uOz>ya`QUIXN&-@Q5!}8 diff --git a/api/__pycache__/serializers.cpython-311.pyc b/api/__pycache__/serializers.cpython-311.pyc index b4949161bf400d632e88e69fb02eaf0421e0b48d..4d72b394b8c1019139c08235946fe3c51797263f 100644 GIT binary patch delta 31 lcmexoe9@SDIWI340}vQ)TDy_^H5042equqvW)0?RVgQ;L37Y@_ delta 76 zcmca;{Lh$sIWI340}ur5U9*wuc^*Tet{@f`60 diff --git a/api/__pycache__/services.cpython-311.pyc b/api/__pycache__/services.cpython-311.pyc index 3d0cde4fc40c31cf0bd7d38239865857a1e2d86a..fb40e554ded0fbd069d9737f74c7660adee3ecfa 100644 GIT binary patch delta 32 mcmew;azun@IWI340}w=Ygr;xgiDqII(N8QW*gTWz20H+cYY8I& delta 77 zcmX>i@==6mIWI340}vd)crtAxPc)N}qkd>{YEiL%Zeme+VqRiSd16kcen4e%Mq*KJ fKv8~HYH~@jesW?_d}dx*YFe*3V5WDo@Ny%qdUI$W0IWI340}$|3&fmyg#l)(tpIA_^c{@`nBLIM42xkBQ delta 76 zcmey*zJ`N)IWI340}x~+&ECje#bgwqA6lGRRIHzySX7>vmzYzYn3Jg=P??;OSd<%3 el%JKFTvDu`oLCf}nOByYSCU^;xw(s}lo0^AVH(r` diff --git a/api/migrations/__pycache__/__init__.cpython-311.pyc b/api/migrations/__pycache__/__init__.cpython-311.pyc index 6be173e1d6137ff936d7aefb399e2911809906f3..e249a1354dbe60b9bdfb35dab2d9de6c63b0782d 100644 GIT binary patch delta 29 jcmdnV*u%)PoR^o20SKZxLenSmn6S$0Cl(Y;EOG|`WKIWc delta 74 zcmeBS+{wtZoR^o20SI#E?n#@-V`Ai^A6lGRRIHzySX7>vmzYzYn3Jg=P??;OSd<%3 cl%JKFTvDu`oLCf}nOByYSCU^;InmV}0C#E{CIA2c diff --git a/car_inventory/__pycache__/__init__.cpython-311.pyc b/car_inventory/__pycache__/__init__.cpython-311.pyc index cbc58d29ae0029c63b344d70f68890704c0a1a19..f2d679b7f8e14849010c3517fcaaae4975e6e989 100644 GIT binary patch delta 29 jcmdnN*v-hZoR^o20SKZxLenSmn6S#}Cl(Y;EOG+?WDN&s delta 74 zcmeBX+`-7RoR^o20SIi@_@qtbF){Mi4=qkDD%Q_UEGkdTOUx-x%*oUbs7%gCEXoZi c%FjwoE-BVePArPg%qvUHE6FdaoapKX0957~kpKVy diff --git a/car_inventory/__pycache__/settings.cpython-311.pyc b/car_inventory/__pycache__/settings.cpython-311.pyc index 02a390cce16b6890efb63bf192554556464c4ed0..76352677a1ad7c945cba34b4c4ffd720d5774c4f 100644 GIT binary patch delta 1282 zcmaJ=-A|Ke6n~zVw=IRXyoCa#K*dd=e7C58f>WSSbRZLykE4i{Un#{Fh>%H0miEG{ z?FROe%!?)?W^prK_CFX|vh1pCWD<5mmh5g9y))Tvc3Q_`P3C!XzMk{-ob#Obhr#1P z+qYJ0kzn}x^iN@H+8J0@2mMowU=I4qKFB#v!u6825%~AARvKQkU zAbVJ#_?e_qSf~tEa?D?g`5+;;#qOxZ)BH>7? zVM$deCl@ME2`8$ON<>mMT&QNd3pF`fo1^ZC46FL2bjMLoXV5@r%>ojhXnm}K8l-@U zJj>P(MX2$Ncw}I`kvubES$!-v3TDJ(iKazKP3+ao*uvIUG*cT|s2xq@MJxIEyaR1? z4()UvUiiWaT|ft4`W)l=q(YszKwXG;Qa8HjBD-HgH}&8m^)kPVOY{+X=nD7UyICv* z_jdJv$Mp7;F6U2)`raR>lPXQ)6wTxc&EyplL~OYOqPw_5v$#w5FpGPb!+iuX%zN`7 zX`(sI(|yKZE`v4xPKpOmX`T^$)et}n2w?$XEFyv>JWLuX%z+A`@5C)4MiDI267Shc z^kFPY(O8UPQiNimD7U}-FJFN=AsSbM9sK(g`ImyJQ)*JS9Xb5h`)&lr=K4lP#-;}S zbHig3wZ0dX06U7+e=Y6!KkJL6B-0i{DRsBWnS@$bG%>Kk{zpFxI z3Z#@7rAVq7ktI(3&)QabsJq-fR4B~WgyC4L+ERARX_q(c8`{?b2U_5jHu|$R`s4h* zHh!RuC#)G`L#dJxCnRCZj7w2$Ntg~Tj)Xa*+HGt-A&H_)eQMYJtF#|FYMyTFI~vku zp0v;oZJPc?owvp!>}5NquPk3$o=)#>>}%cw&6_UiNLY?5J^F8Tug#7v-`4Hz?wxM^ fm($-VPQU)y2c4yR#=?OTu~%Xms4CcVN~Zq+oscY| delta 1252 zcma)4OH5lw6rFiIY>YpcpK(Y*Bn4w2_y++Tl7duPt*&b@Ou z{^PjgYrDN#@Nka(6npJ`>ToN6Ry_57mWv5g?Mtd*Yhmj|HPymOb?n>NuZNu);Ls|Q zjU{zyeCax}$62$X=D8xow~V6^lQ6@{=hW`YghX9IjY(=kJ-N|+3zIJlE|n# z;!(wt*pcwYC3$&Q7o(e3d(cJa&`rJYk`F!P=Xe0;D2QGP!3Td#p*{pS>mVakP^ce$ zbRPXQfb%qnoSB9&Kw%8h1-8Q&qKgRACBFEDU8@j$xewl{OvA^^M3>)5b@A*8*$6Jt zmE%(V3&oRLmo$pYbQL2s##bC?OfV)fq6n=DSDs65660vBD;O=uubzx^Ij&)hrdWF& z<1~#4n!zO9VBEwtn#B~&;X2*IG~LDw&Ep0w;3nl3QH@T_Vh*y^Z$CXMY(n(6DH)ul&Z9_|P4O0Kw zG}L*~l`h8BujF!9)$f+nW;BwDZ*FbxT7scLUx2^hu00qI`GNyOzMwDI7x>#691QtF zyb$p9?^>BlKT|ks=JJaR|^jvl`sYSQ9{Lx5uEs^<9%WQ9E zAM4+@bhN(Y6H3kB`b8DOsE|?`O0`rCQ6iWAS4*!v)IF`k(#wr$P_=#f=!M#3R45I~&%$Y# zL`|)}-xg?dh)VO`#9&3x{DHuOSmf2p?fE~k>W8CAmFrN3%>E#3O7Gv6q#QT^H3 Vfw}`v)u>+__|2o?ii07^{11F=GKK&E diff --git a/car_inventory/__pycache__/urls.cpython-311.pyc b/car_inventory/__pycache__/urls.cpython-311.pyc index 710e63f326a9e13926054bc66def2546181a90c3..77e3f7adc37b6bf9cd2f7daf701300d3d23cbbe1 100644 GIT binary patch delta 31 lcmeAax+BQFoR^o20SJmzc5mc1XJeJpPb?_dT*5Y$2>^L#2mAm4 delta 76 zcmca3*eS%loR^o20SMF+w{PS&XESow4=qkDD%Q_UEGkdTOUx-x%*oUbs7%gCEXoZi e%FjwoE-BVePArPg%qvUHE6Fda-0aRal?ecl9vT(^ diff --git a/car_inventory/__pycache__/wsgi.cpython-311.pyc b/car_inventory/__pycache__/wsgi.cpython-311.pyc index ada8fdac7499788666a213418996bd2ba047d6e9..86d4e317fe4af24f5ba83ec5491df5341c751ecb 100644 GIT binary patch delta 31 lcmX@dx{#G;IWI340}w=Ygr;xgVP#^K(oZZXnC#5d4FGiw2c-Z2 delta 76 zcmZ3;dXAN6IWI340}$A*@k!gr!^&jjt{+;QT2!o`n^;tyn3tGSo|u!VA5fW`kyw-) eP?VpQnp{$>pPX0}pP5&dnpcuvR5@9UsT%-(Ga1eR diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..78c65691 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3' + +services: + db: + image: postgres + restart: always + environment: + - POSTGRES_DB=haikal_db + - POSTGRES_USER=haikal_user + - POSTGRES_PASSWORD=haikal_pass + healthcheck: + test: ["CMD", "pg_isready", "-U", "haikal_user", "-d", "haikal_db"] + interval: 1m30s + timeout: 30s + retries: 5 + start_period: 30s + web: + build: . + command: python manage.py runserver 0.0.0.0:8000 + environment: + - DATABASE_HOST=db + - DATABASE_PORT=5432 + - POSTGRES_DB=haikal_db + - POSTGRES_USER=haikal_user + - POSTGRES_PASSWORD=haikal_pass + volumes: + - .:/app + ports: + - "8000:8000" + depends_on: + - db \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 00000000..b3783692 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +python manage.py migrate +python manage.py collectstatic --no-input +python manage.py runserver 0.0.0.0:8000 \ No newline at end of file diff --git a/haikalbot/migrations/0001_initial.py b/haikalbot/migrations/0001_initial.py index 2f118a31..40c4a0ce 100644 --- a/haikalbot/migrations/0001_initial.py +++ b/haikalbot/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.5 on 2025-01-30 11:28 +# Generated by Django 5.1.6 on 2025-03-06 01:43 from django.db import migrations, models diff --git a/haikalbot/migrations/0002_initial.py b/haikalbot/migrations/0002_initial.py index 0b0861b7..2ef50ed1 100644 --- a/haikalbot/migrations/0002_initial.py +++ b/haikalbot/migrations/0002_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 5.1.5 on 2025-01-30 11:28 +# Generated by Django 5.1.6 on 2025-03-06 01:43 import django.db.models.deletion from django.db import migrations, models diff --git a/inventory/__pycache__/__init__.cpython-311.pyc b/inventory/__pycache__/__init__.cpython-311.pyc index 767a888d743577a8f42d40b07fd089824129a2b0..27c305b717a09202bd457d18e2045aa51edb04f2 100644 GIT binary patch delta 28 icmdnO*v`nkoR^o20SIC`LML*YvP$VE78Fb@asmKahX(Qh delta 73 zcmZo?+``DcoR^o20SI{C%$~??YUHjTTAW%`te=}$RGyfZm{XpZlc^t2nVgYWlp9c# bpOupH~;^F`VdmIJ; diff --git a/inventory/__pycache__/apps.cpython-311.pyc b/inventory/__pycache__/apps.cpython-311.pyc index 811af7867ba4bbfd4b261f64a610c6a7085583e7..4fe06dca9b68ed9469b02a21190964764d12ee24 100644 GIT binary patch delta 31 lcmaFOx{sB6IWI340}!m^S+$W{kC9bOKe3=-b2eiGBLIJ52m}BC delta 76 zcmdnT`kIw{IWI340}yOqxMCx>9;1=7erR!OQL%n*Vo`ZwUSdvpVos)hKxJ}9Vo`2D eQGQlxa!Ij%a$-?@W?orpUP*pY&*$I$4qKKk~ z^l3mTa%Nb-82L&R|4x+9?2?xkN5KBPT7gikO?>Ykx_#=Zr=3nbjMDR1Y18VIm+&tN zV|E1Oj%X54MT#gCqOcJIW%%+DaK%AcxUIL6XFZc@yP#X%nC&m_imy0c~t_%dfaqDRDzew*ht4d(s$OJAq;C3Y@}sNDcvRUgu=<;MSYekH*=$ zt>CnEIAXT}TE4LBXjBnu<+j~KmYv!{hPoMG+mmB}{{g0qdH$3v!xQd3zvIY-QPcO_ zM|BxS-B=o}y4p6f+LOEy8-=SV)qTj{tF6;Kp~WQUtH*g)zt~-nrkH5}Fy)le3HdZ$ dTobZ0F4t6W3MDMVkHf!vpP$h2{Ej!P;|21NwtxTt literal 1079 zcmZuwJ#P~+7`E@LY3LWJfT{`<#vrv}=4(MJ0z_4*fW$2)_w2M+-A8I)2w|ZELkEU# z{Rc(RO6>fKj3=*5-4Z2JC*Jq2p^e)2>_^XQ`(8hfefMK}x=bK`|M}JUKneMa$tdh| zGI$N-kZ{6jNFwUe$Z!oxxWUcPj4amzPPi4?k>fg)80014_BX;EL61yAj-eOfPVk8h zQY)QeS~K+IY7nMEZirNuUu-j3q^F>R)Tl0Pw3^K@5E8iENMxk^qD+C#c{11pa!3Sm zDJQOB5Me^Mc1G$!H8%o!Vje-=W2~LWi8Y?P&V}wH16D#WVx(Hnj06=rwe5#YsV`O3 zw(KWyDwFX3p>hsjNZ3W9|&0iY+}iO=b)xY-*Piez9A9+^sz6nRM=1p8yOIdZsz= z^a;QaVed_^Y}gNab8FwH-{kvoc;Ra`%@pkVWK?yQ*rsuT({ delta 78 zcmca|lBw|&6ZdjnUM>b8SkHTGBX<d178-PI+QZrhY(WazZsfYf$SR|sSWvK8jERL80CQ&t0RR91 delta 75 zcmaDWJ4=phIWI340}yO*-pF-}(a2Ljv^ce>SU)$hs5~(*F{eB+CsRM5GC3o$C^w)e dKPxr4q*y;Wu_!(>uPimMB)_O~^Gik+UI4Lg8o2-f diff --git a/inventory/__pycache__/mixins.cpython-311.pyc b/inventory/__pycache__/mixins.cpython-311.pyc index 83a38ab9939637dc06e44ab7c335bba0891dd379..44beb318e9edcdef010174e0b8354742d7ecb24b 100644 GIT binary patch delta 31 lcmZ24+$7AsoR^o20SNl+S8wDNV_}uhPb?_d9Ly5K3IKE#2Xp`c delta 76 zcmZn?UN6kOoR^o20SI^*R&C@KV=;2o4=qkDD%Q_UEGkdTOUx-x%*oUbs7%gCEXoZi e%FjwoE-BVePArPg%qvUHE6Fda+^ohD!wLXa@fhC# diff --git a/inventory/__pycache__/models.cpython-311.pyc b/inventory/__pycache__/models.cpython-311.pyc index 6de4990727f5c6892b0257b4222563d1422eda66..38538031efc9b6e60998b1ac995f9dfd10a5799e 100644 GIT binary patch delta 25378 zcmbV!3t*Jh(e|F*T*;k;TnI^)kN^uwxP|*Q2>}8mToRCb*kqRwNV4(l21rx_sE9X2 zkNR4FiePJ%YSkKTTC1X>pVnFph)UmzqHS%p_80nj`?T7Bo_Y6{O@jVk0+V;=TxZUl znK^Uj-A}&_|Jk(>@%P8Y4KmSBb?ZwFc`>)fr;B%P9rZ?WbMCraVRD!pNlhb~^Va3@ z^WdiZ=8@}0@^f<2sOHh@M)Pw@ldXBox-n{u$QnD=Y+7h?q+Mfjq&o-w%wjS3OL1jao5!(vYg|IaBh=_>JB+M`$CSe@c$|77g;l`s@!UV?U5Y9@tiHw`XxZ#A$ z<$6|2MnW;;Mi4H~kDJW6e8P?N(*^HY^xG8?z9L7y0+%!LKF5{*XZU*-U zdgn22CgEl=4s$7C+-$N11BchiPX1NcOu!L)^AlypEVJ1r% zS53GYf4xe^ts>lN!WkT`V%%kfTjOuLjB#rTw~p(zMr1{=r%xOFtyXZ2jfC6e$E{>s zE#Wr%an+2o6RysOQ#p|l(e;FJ_%I2pxR#S}Tl~1yjB6m=R>B#QeHr5#3Ac@LpmPo5 zwiB+&k6X*QX2P`?Z6mXyUG%Bd-_v@oaXI0n4>x3k!+niu-9|3)P)VDwM0G|*MDHNX zP9G+rmTT=IT)Q8)nQlUFFBsF>W{EIvEEl>KV6(aC`mr9E{sXxU2m* zC*!Um+_iq(7RK!-+;xn5HaaW%0DZdNUt=rRxPfpt`f#GL>$_-+5E058GdWQoQr_Ze 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 a$G+gu$lIw2;Xex$&exvUEvAG)QvV+jPaEd| delta 24550 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 Yc+=EdsU6Bb53g~d)^Vkn%U5^*2jGA)d;kCd diff --git a/inventory/__pycache__/services.cpython-311.pyc b/inventory/__pycache__/services.cpython-311.pyc index a667752377670039c4263810da97d824199be2f4..b0f20d072318429dede2f3882d0e9e561bbb0b57 100644 GIT binary patch delta 714 zcmX|7&ubG=5Z>8eCTTWl+U8aB1Cv^`TT*+eXt4+_Ie1ZQQxFA-OS;t9{Nn9as!b1i zF$WQKyopc{6zf5xmtH-2sE4!^8deMa69OWL2XS6XGce!I`)2lg-nHv6sZ3zt4>W#k8+6q;Nn_F@c?(#5+(dEH{#mm(NyOeiqm-iFN2Lwb#TjPvA zo?5n+Y(6OHlLAf=I2wWQnBp<2JpZEY<~u?>Mdvt9s;?k{-_r90zRbIAA z#Yc8tY=xhr(P8|gU5+QHDgeQ8C{&32wSu6}%C3gz^~_bp3oO_L@|%B9tayrDDszK| zOxaTep>x|=F1e0OT-Vvr57g#kM2}E9v-noOkUoeEujh6m=3c~X`ppJwONuto3P&5p zVYt8H^2Fv3{Te_FP2V_N!CSsGy=c`poe-;Vgt_DAbCV7on823rAtW~E{En=5RyK&+ zJ-12ZY%tw(Q;batNZ?%X<>`))ek9b@8Wnv3(B>LG2E_4QXh;`Z;xXI~HNz*M Pw=H#{4>!W|s%ZZQIn%TL delta 648 zcmX|7J#Q015WT%G`)prqg~T>aM9x79IzDt&3JV%41Slp7(9oQg^Cq0RJ4dsNgOMU6 zDhe9dk|GiXC`c5@{{cEgeSgA{5Dh}W?2%-o8O`jxef##kUwz@ZA6&PhVZ8hEWoP}f z%ShG0N#&2BCiltk`CZM|`-dd2Wi(}B7_+A|621vl#N?&X!y$_V&+Y9v5e#x`I|eR% zJvU>)(%c+SLAj1l&--;FxX&5zAf>QJGn(wtBn~zw(IX1!CX5QAAfgb)*_dTw1d|}n z{;b4Qb0y)?3n%H*LRDpysj>q^SKF3za8u z0ii4Mm3?)oja@{roW!Y_Tk>qVEANyl(k-ps9%$$)>7z}R0gF&}IF7U2U`dKchU#r# z{7E8?tvgotAB$_af)AX>ehT(=bt7Uit=07-7S-RhP)=&90{WB2t+L1g2ML>PrIxTyB3 oT$5{aKk>=s`bW}|U+b&3as--kR{vhtN#jU6EoJ$wanDrif8V5~+5i9m diff --git a/inventory/__pycache__/tables.cpython-311.pyc b/inventory/__pycache__/tables.cpython-311.pyc index 066c1013ee73cd11c0932daee4bbd1462d8c6e22..85caef9341a6b0046eb89a1c4c880304fd098d2f 100644 GIT binary patch delta 31 lcmbQF^;DC4IWI340}xpEZr#Wo%+4yIpIA_^c>;SAF93yV2$}!@ delta 76 zcmaE=IZ2CqIWI340}xdAY}v>i%x>hWA6lGRRIHzySX7>vmzYzYn3Jg=P??;OSd<%3 el%JKFTvDu`oLCf}nOByYSCU^;xjC7=i5CFK9vcJz diff --git a/inventory/__pycache__/urls.cpython-311.pyc b/inventory/__pycache__/urls.cpython-311.pyc index e51a455cfd4b29f12457ebb7962992e9aa879021..2af2899cbd0c54fcb938209b14902fb2e4a83660 100644 GIT binary patch delta 8235 zcmajj33wFc0mku}Y_bUnfg})a0wf_z2;_i-BZT`V*#OyaEoaCqVZ-hwZW17hEQ%<2 zK^PT8(0G9eiZ-=}w)U<)#cFFMt<~POhghj?rH8(=>^D0+-@K3egxT4d-~ZdWGFkTG z`|8olYWkV<^i%~8PwOj9Z+E2+)%FxB$}vS#G&P_ERj(RM@FoNuUPmy|o2VMg69P#= zr`H*scLb7yDc%&!Cu&K7KEYIPYIJ#0APw_2PdV*SlymrZ?a`%1c^~lpVwuS!sf4G2X9%wKB`O^%(^UP4>JOD=stl_dW-N|v zVJ6rB!OSgmWm&z24*(x1^MQnCgJ;Wp5aENt2T6SX5W9g z7s}j*$P~h-f{ztkn?}@hr~*?}5;X(LWvVKxiWrMy$8sjvIFrq?GK-oGh5O&Nhc<_( zxlrRxHIJzIzDR0wk;xViwh)8G)gq!6LrpNpT0+!PsEMXp79p$}tk`5VM7g0#OjS$N zawy9sEqwG@-{f!_xA_&MU3q;g{wgqD2VN@Pz`V#@9x{48c$v&s5xyFHlEfox2ww|6 zS#WI~QC_HWQ>`az15|}j-TlOz@vLujB;yc9Hj;D`(kUX)HWRf4YO1Lkh}sG@O(@&V za5a)tLpnX4#?GYMNBB1IO2M@zqP9cL5GsDY{e(AzS4rHxgYW?OOu@AvQ6Z>VLdCbC zh45Be?!JNWF!*dSy4FTiJJcMZ;@i+c_)hS-5_j(+d^h+!!L?4JZiJdIRD2t5B76_{ z0-4`T_+IdZGH3U%ec+2^ehV4>R`A6#-%t2$;7eqFfbiSFm&*JO!ViKklldXS?*y-w z`CWwH4PGPh$UTJL3+@(NJ51COs9IBX5p@)5xv6xkvVH`*4{U{C=7kiw-|CIku|L}n zfUgu>J4V!Ts5(n=dorl^Wl>K>mhNRCT-55{B zCx{D#KL@@^=Fb!UIq=OAkMt1!dGIZQYcCM>1*is7eUYdyL2VVv{+N83q%R_EjHj_< z5_yU6uYhZUYhNYmWhkGizDCs7p|+Xo8&+k#2YeH(NwD~Z|1GOGR>$rE-v-|<^Y0M; zU2wn5Um^T^;LS4sKH)zA-y!oK68JQhcKN9sPs7`aN_pHkL`}b$C8wHE+&|j?HSRMQQ z`z!cO5|8|i@b|&@2(Dcw>I0~oP4#!8K7`t9sw-Ay-JySgMgOyJP;-aeA6dPzDz-!a z1m9=8HXho)i266wE!T`?P}j$VUj@Ha;_m+t{$KF@f@}XH>iVh2BJ7@Q)JU(5Q-x<#b8|Pb19B0`qeVW7 zW1_&;jHR*w^0-C1s2m6RppeD~Jl*5Sj9#6Ev>A`)M7%LR*+q*YT1-IkkWDd>7R4w| z+7u> g1gc3J)#nQ9Nr?tfIwg6c^;e?)z@< zbGYZN^*S(J=S{@a>s2vb?@hpTgGU*+QB{=pjIjz6dsDYJgtUM!TwXfaGGA($FE{5a zN=pmX-o)01_U(91t8dsE=s8{ZLc)lG#*Vi3mY^@(R#Mf`;nym~>&v>g9j(7vldIH+uSf(m2S`0BlPU~Nmg zf1AItq21pSs`0nAulDTPv1)V=zJx=N?< zc`>|Szg(BC9?+9KMe0Gl%+swN)?fD=SC8pC>fKJ`UK~Ev^K$*kge_;4D|n?`9aPfL z+FIfd?evA(Tf&_s#?BSDc3w@X3btq+0pF}}8O{iPl(v1N6y*bls;X}(OJ4h|pPnmg Zx*Te0&w=$HW~rBYc8A_bNi4xIp8^Vd{!{<} delta 8242 zcmZ|V2Urwm0><$fmZpdxc12NCRs;bREQl35EF#6Sl9-iQadFutv!KD0iHT{NB2E%Z zETn0S8gs|>T+eyQwdC${CC9Z~t|Ykk=5=kfR2qg(Cwsqp0`lp=fDD4S^bBt8}7PtuPYnK2zdH5_5W_s`03*-a0b@0fzz!J ze!TU&_0VP#RRooN%{WK(7873rKf&#NvxuJ!KT&vX4pF60IYPy^%_t*&F8n0nwRuF% zhnj4w1w@rY<=SeYQyJFN1G}>VY>LemIhjK(hMH=tB}6TSnr5qIL@f^*Nv(M{t0Zg% z28*keM6H7I+GDLIY7NwMTdg$+TL*@V`?ZHwMN~D^3|sk#s)2Hx*24GyG*79?{a5|< zB(D8){I}zJd5g_?d2RY$SdYe39_lW}>!072C>B)K;hx zp?U_1IqRo+Qcbb;qtQg#>(I^;g?2qr+n{FK>IR|$P;-QmuZMR#X`9iO##?bbeH!sW z_%h+O9YnQ2%@xXV)OQjef}iL1zE| zR19jNP>!|eAifj6!tH&#iQfaiNO6lK2C}AB11+_Qw6hKLEc* zcc5}QHN5}gd@t5GYNc{7}e*)g` z_QofP?}gtgy!I)gJ`L4mtIrViS*YuTBKzfYr2RbF>*KB1FUA*$e*u1*@Y)xN`V!O) zw)!$rUx5nP>Z?xWydZoHY`b8Nx4_q(fwg?#g76}Iv&4Uc_{;E`#DA0cm*9gE|1$C4 zg5M$W-zNS$@GTPmUE;q7zftV_#eQxy1nm*#J>i=OL*-^MEw{lER^G@ z{)G6S!naBM>%{*IJ|gjb#Qz*V>h`{05dTZ~cHy;O5%p`R8-;Rgax}QPUYOB55V>c7T+Y_ht9xSKCnq2!QU*r_BW#b4t0xA@ln11 zApW25x4OOWD)Ik~?~ti=lnw&D%RvWInFe{ckdB=(gcj*2?vWHjX_0~A zUP+Nji(x44lN4FB7>?qAq!>YqkthyIicz!}jpBZHQ9p(jV^KUH3Y-Sxs2mUZppfz7 zP@heU2`C;C1;(C8We(&aA>(7`Pol+S6y5H^$fd;;6o*BDwV6ugG)U7S^QiPfJ}jhl z*JqmQFw=UgPNz*inn&VI|J|Nd%%DX9ibo|yAuVR2I3g*EXi<#fsH7;N#Vi!ZB*ko6 z%t3KnQk2r748>!TVlFM_p*SHa=F?&Uij$I}oE8g7Q9+AEC{9UUV=*n3pg1ilmeOJw ziXKU^oEDWR9+wm=Xt5H-6Ov*TEmos=Qc|p;#aa|kNs4u}s6z3yq^PEa55*ZtQA3OM zD9%cXT3T#C@r}`WlTWo^=1I>)M{2fN=gU=d%ue6bQJm>V<@;sx4zBR%gn}_OX~98 zr1i%=YP;D}SEF{CSLzn3d(DFS@@(sFOt)^f`ZCr=c1J_aK|9}P?yE0Q_nQ~%d(?ww zO~X;uG~a6QC0o}${a9~#Qb`nick<%xNTIpv8tnfd{h$r*`7 hxdBD_S*gh-#rnyKMe&(=WvO{3`9+nRC$nbG1OR3h9oGN= diff --git a/inventory/__pycache__/views.cpython-311.pyc b/inventory/__pycache__/views.cpython-311.pyc index b00dc5c3a4285edda198f735d44366ce92301947..b7129e6d97d29dd1bc573cffc8282e85a177cd77 100644 GIT binary patch delta 64894 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 Lnyhl;4CsFVp1pTb delta 58063 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 diff --git a/inventory/management/__pycache__/__init__.cpython-311.pyc b/inventory/management/__pycache__/__init__.cpython-311.pyc index 98179969c42524f34b586086c9ef1dd43e2aa573..f8712ed747ceb1755750244b22db7a76fe86bc0c 100644 GIT binary patch delta 29 jcmdnbIEj&GIWI340}#Y?gr-mAF=18JPb?^ySmX-;W%LJz delta 74 zcmbQlxSx?{IWI340}!NU&QF`jV`3DfA6lGRRIHzySX7>vmzYzYn3Jg=P??;OSd<%3 cl%JKFTvDu`oLCf}nOByYSCU^;InmV@0B2JfIk6}{Gp{T)uOz>yan+u^XQN diff --git a/inventory/views.py b/inventory/views.py index c4a9452e..23f4af1c 100644 --- a/inventory/views.py +++ b/inventory/views.py @@ -210,6 +210,11 @@ def dealer_signup(request, *args, **kwargs): user = User.objects.create(username=email, email=email) user.set_password(password) user.save() + group = Group.objects.create(name=f'{user.pk}-Admin') + user.groups.add(group) + for perm in Permission.objects.filter(content_type__app_label__in=["inventory","django_ledger"]): + group.permissions.add(perm) + StaffMember.objects.create(user=user) models.Dealer.objects.create( user=user, @@ -1300,7 +1305,7 @@ class CustomerDetailView(LoginRequiredMixin,PermissionRequiredMixin, DetailView) return context @login_required -def add_note_to_customer(request, customer_id): +def add_note_to_customer(request, customer_id): customer = get_object_or_404(CustomerModel, uuid=customer_id) if request.method == "POST": form = forms.NoteForm(request.POST) @@ -2721,7 +2726,7 @@ class UserActivityLogListView(LoginRequiredMixin,ListView): queryset = super().get_queryset() if "user" in self.request.GET: queryset = queryset.filter(user__email=self.request.GET["user"]) - return queryset + return queryset[:100] # will update later with better pagination # CRM RELATED VIEWS diff --git a/requirements.txt b/requirements.txt index e2801725..420449fb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -23,7 +23,7 @@ certifi==2025.1.31 cffi==1.17.1 chardet==5.2.0 charset-normalizer==3.4.1 -click==8.1.8 +click colorama==0.4.6 commonmark==0.9.1 contourpy==1.3.1 @@ -55,7 +55,7 @@ django-extensions==3.2.3 django-filter==25.1 django-formtools==2.5.1 django-import-export==4.3.5 -django-ledger==0.7.4.1 +django-ledger django-model-utils==5.0.0 django-money==3.5.3 django-next-url-mixin==0.4.0 @@ -89,7 +89,6 @@ et_xmlfile==2.0.0 Faker==36.1.1 filelock==3.17.0 fire==0.7.0 -Flask==3.1.0 fonttools==4.56.0 fpdf2==2.8.2 frozenlist==1.5.0 @@ -151,22 +150,16 @@ packaging==24.2 pandas==2.2.3 pango==0.0.1 pdfkit==1.0.0 -phonenumbers==8.13.55 -pillow==11.1.0 platformdirs==4.3.6 prometheus_client==0.21.1 propcache==0.2.1 protobuf==5.29.3 -psycopg==3.2.4 psycopg-binary==3.2.4 -psycopg-c==3.2.4 py-moneyed==3.0 PyAutoGUI==0.9.54 pyclipper==1.3.0.post6 pycodestyle==2.12.1 pycparser==2.22 -pydantic==2.10.6 -pydantic_core==2.29.0 pydotplus==2.0.2 pydyf==0.11.0 PyGetWindow==0.0.9 @@ -174,10 +167,6 @@ Pygments==2.19.1 PyJWT==2.10.1 pylint==3.3.4 PyMsgBox==1.0.9 -PyMySQL==1.1.1 -pyobjc-core==11.0 -pyobjc-framework-Cocoa==11.0 -pyobjc-framework-Quartz==11.0 pyparsing==3.2.1 pypdf==5.3.0 PyPDF2==3.0.1 @@ -198,8 +187,6 @@ pytweening==1.2.0 pytz==2025.1 pyvin==0.0.2 pywa==2.7.0 -pywhat==5.1.0 -pywhatkit==5.4 PyYAML==6.0.2 pyzbar==0.1.9 qrcode==8.0 @@ -229,7 +216,6 @@ sqlparse==0.5.3 stanza==1.10.1 stringzilla==3.11.3 suds==1.2.0 -swapper==1.4.0 sympy==1.13.1 tablib==3.8.0 termcolor==2.5.0 @@ -263,3 +249,5 @@ wsproto==1.2.0 xmlsec==1.3.14 yarl==1.18.3 zopfli==0.2.3.post1 +python-dotenv +psycopg2-binary \ No newline at end of file diff --git a/scripts/run.py b/scripts/run.py index 30c3b438..ca76ad5d 100644 --- a/scripts/run.py +++ b/scripts/run.py @@ -1,3 +1,5 @@ +import os +from dotenv import load_dotenv from django.contrib.auth.models import Permission from django.contrib.auth.models import Group from django_ledger.models.invoice import InvoiceModel @@ -17,6 +19,7 @@ import hashlib User = get_user_model() +load_dotenv(".env") def run(): # print(Service.objects.first().pk) # print(Appointment.objects.first().client) @@ -145,7 +148,8 @@ def run(): # print(Permission.objects.filter(codename__in=['view_car','view_carlocation','view_customcard','view_carcolors','view_cartransfer','view_estimatemodel','view_invoicemodel','view_saleorder'])) # print(Permission.objects.filter(codename__in=['view_estimatemodel','view_invoicemodel','view_saleorder'])) # CustomGroup.objects.filter(name='Accountant').last().set_default_permissions() - CustomGroup.objects.filter(name='Inventory').last().set_default_permissions() + # CustomGroup.objects.filter(name='Inventory').last().set_default_permissions() # EntityManagementModel.objects.create(entity=,user=) # print(Permission.objects.filter(codename__icontains='customermodel').first().codename) + print(os.getenv("DJANGO_ALLOWED_HOSTS")) diff --git a/staticfiles/admin/css/autocomplete.css b/staticfiles/admin/css/autocomplete.css index 69c94e73..7478c2c4 100644 --- a/staticfiles/admin/css/autocomplete.css +++ b/staticfiles/admin/css/autocomplete.css @@ -273,3 +273,7 @@ select.admin-autocomplete { display: block; padding: 6px; } + +.errors .select2-selection { + border: 1px solid var(--error-fg); +} diff --git a/staticfiles/admin/css/base.css b/staticfiles/admin/css/base.css index 93db7d06..ac283260 100644 --- a/staticfiles/admin/css/base.css +++ b/staticfiles/admin/css/base.css @@ -13,6 +13,7 @@ html[data-theme="light"], --body-fg: #333; --body-bg: #fff; --body-quiet-color: #666; + --body-medium-color: #444; --body-loud-color: #000; --header-color: #ffc; @@ -22,11 +23,11 @@ html[data-theme="light"], --breadcrumbs-fg: #c4dce8; --breadcrumbs-link-fg: var(--body-bg); - --breadcrumbs-bg: var(--primary); + --breadcrumbs-bg: #264b5d; --link-fg: #417893; --link-hover-color: #036; - --link-selected-fg: #5b80b2; + --link-selected-fg: var(--secondary); --hairline-color: #e8e8e8; --border-color: #ccc; @@ -42,10 +43,10 @@ html[data-theme="light"], --selected-row: #ffc; --button-fg: #fff; - --button-bg: var(--primary); - --button-hover-bg: #609ab6; - --default-button-bg: var(--secondary); - --default-button-hover-bg: #205067; + --button-bg: var(--secondary); + --button-hover-bg: #205067; + --default-button-bg: #205067; + --default-button-hover-bg: var(--secondary); --close-button-bg: #747474; --close-button-hover-bg: #333; --delete-button-bg: #ba2121; @@ -56,8 +57,6 @@ html[data-theme="light"], --object-tools-hover-bg: var(--close-button-hover-bg); --font-family-primary: - -apple-system, - BlinkMacSystemFont, "Segoe UI", system-ui, Roboto, @@ -86,6 +85,8 @@ html[data-theme="light"], "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + + color-scheme: light; } html, body { @@ -149,7 +150,6 @@ h1 { margin: 0 0 20px; font-weight: 300; font-size: 1.25rem; - color: var(--body-quiet-color); } h2 { @@ -165,7 +165,7 @@ h2.subhead { h3 { font-size: 0.875rem; margin: .8em 0 .3em 0; - color: var(--body-quiet-color); + color: var(--body-medium-color); font-weight: bold; } @@ -173,6 +173,7 @@ h4 { font-size: 0.75rem; margin: 1em 0 .8em 0; padding-bottom: 3px; + color: var(--body-medium-color); } h5 { @@ -219,6 +220,10 @@ fieldset { border-top: 1px solid var(--hairline-color); } +details summary { + cursor: pointer; +} + blockquote { font-size: 0.6875rem; color: #777; @@ -315,7 +320,7 @@ td, th { } th { - font-weight: 600; + font-weight: 500; text-align: left; } @@ -336,7 +341,7 @@ tfoot td { } thead th.required { - color: var(--body-loud-color); + font-weight: bold; } tr.alt { @@ -484,8 +489,13 @@ textarea { vertical-align: top; } -input[type=text], input[type=password], input[type=email], input[type=url], -input[type=number], input[type=tel], textarea, select, .vTextField { +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]), input[type=text], input[type=password], input[type=email], +input[type=url], input[type=number], input[type=tel], textarea, select, +.vTextField { border: 1px solid var(--border-color); border-radius: 4px; padding: 5px 6px; @@ -494,9 +504,13 @@ input[type=number], input[type=tel], textarea, select, .vTextField { background-color: var(--body-bg); } -input[type=text]:focus, input[type=password]:focus, input[type=email]:focus, -input[type=url]:focus, input[type=number]:focus, input[type=tel]:focus, -textarea:focus, select:focus, .vTextField:focus { +/* +Minifiers remove the default (text) "type" attribute from "input" HTML tags. +Add input:not([type]) to make the CSS stylesheet work the same. +*/ +input:not([type]):focus, input[type=text]:focus, input[type=password]:focus, +input[type=email]:focus, input[type=url]:focus, input[type=number]:focus, +input[type=tel]:focus, textarea:focus, select:focus, .vTextField:focus { border-color: var(--body-quiet-color); } @@ -586,7 +600,7 @@ input[type=button][disabled].default { font-weight: 400; font-size: 0.8125rem; text-align: left; - background: var(--primary); + background: var(--header-bg); color: var(--header-link-color); } @@ -722,6 +736,11 @@ div.breadcrumbs a:focus, div.breadcrumbs a:hover { background: url(../img/icon-viewlink.svg) 0 1px no-repeat; } +.hidelink { + padding-left: 16px; + background: url(../img/icon-hidelink.svg) 0 1px no-repeat; +} + .addlink { padding-left: 16px; background: url(../img/icon-addlink.svg) 0 1px no-repeat; @@ -831,10 +850,6 @@ a.deletelink:focus, a.deletelink:hover { height: 100%; } -#container > div { - flex-shrink: 0; -} - #container > .main { display: flex; flex: 1 0 auto; @@ -879,9 +894,10 @@ a.deletelink:focus, a.deletelink:hover { margin-right: -300px; } -#footer { - clear: both; - padding: 10px; +@media (forced-colors: active) { + #content-related { + border: 1px solid; + } } /* COLUMN TYPES */ @@ -919,7 +935,6 @@ a.deletelink:focus, a.deletelink:hover { padding: 10px 40px; background: var(--header-bg); color: var(--header-color); - overflow: hidden; } #header a:link, #header a:visited, #logout-form button { @@ -930,11 +945,17 @@ a.deletelink:focus, a.deletelink:hover { text-decoration: underline; } +@media (forced-colors: active) { + #header { + border-bottom: 1px solid; + } +} + #branding { display: flex; } -#branding h1 { +#site-name { padding: 0; margin: 0; margin-inline-end: 20px; @@ -943,7 +964,7 @@ a.deletelink:focus, a.deletelink:hover { color: var(--header-branding-color); } -#branding h1 a:link, #branding h1 a:visited { +#site-name a:link, #site-name a:visited { color: var(--accent); } @@ -1143,3 +1164,16 @@ a.deletelink:focus, a.deletelink:hover { .base-svgs { display: none; } + +.visually-hidden { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0,0,0,0); + white-space: nowrap; + border: 0; + color: var(--body-fg); + background-color: var(--body-bg); +} diff --git a/staticfiles/admin/css/changelists.css b/staticfiles/admin/css/changelists.css index a7545131..005b7768 100644 --- a/staticfiles/admin/css/changelists.css +++ b/staticfiles/admin/css/changelists.css @@ -139,6 +139,12 @@ margin: 0 0 0 30px; } +@media (forced-colors: active) { + #changelist-filter { + border: 1px solid; + } +} + #changelist-filter h2 { font-size: 0.875rem; text-transform: uppercase; @@ -215,9 +221,9 @@ color: var(--link-hover-color); } -#changelist-filter #changelist-filter-clear a { +#changelist-filter #changelist-filter-extra-actions { font-size: 0.8125rem; - padding-bottom: 10px; + margin-bottom: 10px; border-bottom: 1px solid var(--hairline-color); } @@ -265,6 +271,15 @@ background-color: var(--selected-row); } +@media (forced-colors: active) { + #changelist tbody tr.selected { + background-color: SelectedItem; + } + #changelist tbody tr:has(.action-select:checked) { + background-color: SelectedItem; + } +} + #changelist .actions { padding: 10px; background: var(--body-bg); diff --git a/staticfiles/admin/css/dark_mode.css b/staticfiles/admin/css/dark_mode.css index 6d08233a..7e12a815 100644 --- a/staticfiles/admin/css/dark_mode.css +++ b/staticfiles/admin/css/dark_mode.css @@ -5,7 +5,8 @@ --body-fg: #eeeeee; --body-bg: #121212; - --body-quiet-color: #e0e0e0; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; --body-loud-color: #ffffff; --breadcrumbs-link-fg: #e0e0e0; @@ -29,6 +30,8 @@ --close-button-bg: #333333; --close-button-hover-bg: #666666; + + color-scheme: dark; } } @@ -39,7 +42,8 @@ html[data-theme="dark"] { --body-fg: #eeeeee; --body-bg: #121212; - --body-quiet-color: #e0e0e0; + --body-quiet-color: #d0d0d0; + --body-medium-color: #e0e0e0; --body-loud-color: #ffffff; --breadcrumbs-link-fg: #e0e0e0; @@ -63,6 +67,8 @@ html[data-theme="dark"] { --close-button-bg: #333333; --close-button-hover-bg: #666666; + + color-scheme: dark; } /* THEME SWITCH */ @@ -122,16 +128,3 @@ html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark { html[data-theme="light"] .theme-toggle svg.theme-icon-when-light { display: block; } - -.visually-hidden { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - overflow: hidden; - clip: rect(0,0,0,0); - white-space: nowrap; - border: 0; - color: var(--body-fg); - background-color: var(--body-bg); -} diff --git a/staticfiles/admin/css/forms.css b/staticfiles/admin/css/forms.css index 9a8dad08..4f49b613 100644 --- a/staticfiles/admin/css/forms.css +++ b/staticfiles/admin/css/forms.css @@ -44,7 +44,6 @@ label { .required label, label.required { font-weight: bold; - color: var(--body-fg); } /* RADIO BUTTONS */ @@ -76,6 +75,20 @@ form ul.inline li { padding-right: 7px; } +/* FIELDSETS */ + +fieldset .fieldset-heading, +fieldset .inline-heading, +:not(.inline-related) .collapse summary { + border: 1px solid var(--header-bg); + margin: 0; + padding: 8px; + font-weight: 400; + font-size: 0.8125rem; + background: var(--header-bg); + color: var(--header-link-color); +} + /* ALIGNED FIELDSETS */ .aligned label { @@ -84,14 +97,12 @@ form ul.inline li { min-width: 160px; width: 160px; word-wrap: break-word; - line-height: 1; } .aligned label:not(.vCheckboxLabel):after { content: ''; display: inline-block; vertical-align: middle; - height: 1.625rem; } .aligned label + p, .aligned .checkbox-row + div.help, .aligned label + div.readonly { @@ -158,6 +169,10 @@ form .aligned select + div.help { padding-left: 10px; } +form .aligned select option:checked { + background-color: var(--selected-row); +} + form .aligned ul li { list-style: none; } @@ -168,11 +183,7 @@ form .aligned table p { } .aligned .vCheckboxLabel { - float: none; - width: auto; - display: inline-block; - vertical-align: -3px; - padding: 0 0 5px 5px; + padding: 1px 0 0 5px; } .aligned .vCheckboxLabel + p.help, @@ -194,14 +205,8 @@ fieldset .fieldBox { width: 200px; } -form .wide p, -form .wide ul.errorlist, -form .wide input + p.help, -form .wide input + div.help { - margin-left: 200px; -} - form .wide p.help, +form .wide ul.errorlist, form .wide div.help { padding-left: 50px; } @@ -215,35 +220,16 @@ form div.help ul { width: 450px; } -/* COLLAPSED FIELDSETS */ +/* COLLAPSIBLE FIELDSETS */ -fieldset.collapsed * { - display: none; -} - -fieldset.collapsed h2, fieldset.collapsed { - display: block; -} - -fieldset.collapsed { - border: 1px solid var(--hairline-color); - border-radius: 4px; - overflow: hidden; -} - -fieldset.collapsed h2 { - background: var(--darkened-bg); - color: var(--body-quiet-color); -} - -fieldset .collapse-toggle { - color: var(--header-link-color); -} - -fieldset.collapsed .collapse-toggle { +.collapse summary .fieldset-heading, +.collapse summary .inline-heading { background: transparent; + border: none; + color: currentColor; display: inline; - color: var(--link-fg); + margin: 0; + padding: 0; } /* MONOSPACE TEXTAREAS */ @@ -395,14 +381,16 @@ body.popup .submit-row { position: relative; } -.inline-related h3 { +.inline-related h4, +.inline-related:not(.tabular) .collapse summary { margin: 0; - color: var(--body-quiet-color); + color: var(--body-medium-color); padding: 5px; font-size: 0.8125rem; background: var(--darkened-bg); - border-top: 1px solid var(--hairline-color); - border-bottom: 1px solid var(--hairline-color); + border: 1px solid var(--hairline-color); + border-left-color: var(--darkened-bg); + border-right-color: var(--darkened-bg); } .inline-related h3 span.delete { @@ -421,16 +409,6 @@ body.popup .submit-row { width: 100%; } -.inline-related fieldset.module h3 { - margin: 0; - padding: 2px 5px 3px 5px; - font-size: 0.6875rem; - text-align: left; - font-weight: bold; - background: #bcd; - color: var(--body-bg); -} - .inline-group .tabular fieldset.module { border: none; } diff --git a/staticfiles/admin/css/login.css b/staticfiles/admin/css/login.css index 389772f5..805a34b5 100644 --- a/staticfiles/admin/css/login.css +++ b/staticfiles/admin/css/login.css @@ -21,7 +21,7 @@ } .login #content { - padding: 20px 20px 0; + padding: 20px; } .login #container { diff --git a/staticfiles/admin/css/nav_sidebar.css b/staticfiles/admin/css/nav_sidebar.css index f76e6ce4..7eb0de97 100644 --- a/staticfiles/admin/css/nav_sidebar.css +++ b/staticfiles/admin/css/nav_sidebar.css @@ -102,6 +102,12 @@ background: var(--selected-row); } +@media (forced-colors: active) { + #nav-sidebar .current-model { + background-color: SelectedItem; + } +} + .main > #nav-sidebar + .content { max-width: calc(100% - 23px); } diff --git a/staticfiles/admin/css/responsive.css b/staticfiles/admin/css/responsive.css index 1d0a188f..932e824c 100644 --- a/staticfiles/admin/css/responsive.css +++ b/staticfiles/admin/css/responsive.css @@ -43,7 +43,7 @@ input[type="submit"], button { justify-content: flex-start; } - #branding h1 { + #site-name { margin: 0 0 8px; line-height: 1.2; } @@ -171,9 +171,14 @@ input[type="submit"], button { /* Forms */ label { - font-size: 0.875rem; + font-size: 1rem; } + /* + Minifiers remove the default (text) "type" attribute from "input" HTML + tags. Add input:not([type]) to make the CSS stylesheet work the same. + */ + .form-row input:not([type]), .form-row input[type=text], .form-row input[type=password], .form-row input[type=email], @@ -187,7 +192,7 @@ input[type="submit"], button { margin: 0; padding: 6px 8px; min-height: 2.25rem; - font-size: 0.875rem; + font-size: 1rem; } .form-row select { @@ -237,22 +242,6 @@ input[type="submit"], button { padding: 7px; } - /* Related widget */ - - .related-widget-wrapper { - float: none; - } - - .related-widget-wrapper-link + .selector { - max-width: calc(100% - 30px); - margin-right: 15px; - } - - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 10px; - } - /* Selector */ .selector { @@ -270,7 +259,7 @@ input[type="submit"], button { } .selector .selector-filter input { - width: auto; + width: 100%; min-height: 0; flex: 1 1; } @@ -292,7 +281,6 @@ input[type="submit"], button { width: 26px; height: 52px; padding: 2px 0; - margin: auto 15px; border-radius: 20px; transform: translateY(-10px); } @@ -336,7 +324,6 @@ input[type="submit"], button { width: 52px; height: 26px; padding: 0 2px; - margin: 15px auto; transform: none; } @@ -432,7 +419,7 @@ input[type="submit"], button { padding: 15px 20px; } - .login #branding h1 { + .login #site-name { margin: 0; } @@ -464,14 +451,10 @@ input[type="submit"], button { @media (max-width: 767px) { /* Layout */ - #header, #content, #footer { + #header, #content { padding: 15px; } - #footer:empty { - padding: 0; - } - div.breadcrumbs { padding: 10px 15px; } @@ -582,10 +565,6 @@ input[type="submit"], button { padding-top: 15px; } - fieldset.collapsed .form-row { - display: none; - } - .aligned label { width: 100%; min-width: auto; @@ -684,23 +663,14 @@ input[type="submit"], button { align-self: center; } - select + .related-widget-wrapper-link, - .related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 15px; - } - /* Selector */ .selector { flex-direction: column; - } - - .selector > * { - float: none; + gap: 10px 0; } .selector-available, .selector-chosen { - margin-bottom: 0; flex: 1 1 auto; } @@ -710,11 +680,9 @@ input[type="submit"], button { .selector ul.selector-chooser { display: block; - float: none; width: 52px; height: 26px; padding: 0 2px; - margin: 15px auto 20px; transform: none; } diff --git a/staticfiles/admin/css/responsive_rtl.css b/staticfiles/admin/css/responsive_rtl.css index 31dc8ff7..33b57848 100644 --- a/staticfiles/admin/css/responsive_rtl.css +++ b/staticfiles/admin/css/responsive_rtl.css @@ -35,11 +35,6 @@ background-position: calc(100% - 8px) 9px; } - [dir="rtl"] .related-widget-wrapper-link + .selector { - margin-right: 0; - margin-left: 15px; - } - [dir="rtl"] .selector .selector-filter label { margin-right: 0; margin-left: 8px; @@ -58,6 +53,22 @@ padding-left: 0; padding-right: 16px; } + + [dir="rtl"] .selector-add { + background-position: 0 -80px; + } + + [dir="rtl"] .selector-remove { + background-position: 0 -120px; + } + + [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -100px; + } + + [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -140px; + } } /* MOBILE */ @@ -81,4 +92,20 @@ [dir="rtl"] .aligned .vCheckboxLabel { padding: 1px 5px 0 0; } + + [dir="rtl"] .selector-remove { + background-position: 0 0; + } + + [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover { + background-position: 0 -20px; + } + + [dir="rtl"] .selector-add { + background-position: 0 -40px; + } + + [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover { + background-position: 0 -60px; + } } diff --git a/staticfiles/admin/css/rtl.css b/staticfiles/admin/css/rtl.css index c349a939..b8f60e0a 100644 --- a/staticfiles/admin/css/rtl.css +++ b/staticfiles/admin/css/rtl.css @@ -13,7 +13,7 @@ th { margin-right: 1.5em; } -.viewlink, .addlink, .changelink { +.viewlink, .addlink, .changelink, .hidelink { padding-left: 0; padding-right: 16px; background-position: 100% 1px; @@ -151,6 +151,7 @@ form ul.inline li { form .aligned p.help, form .aligned div.help { + margin-left: 0; margin-right: 160px; padding-right: 10px; } @@ -164,19 +165,13 @@ form .aligned p.time div.help.timezonewarning { padding-right: 0; } -form .wide p.help, form .wide div.help { +form .wide p.help, +form .wide ul.errorlist, +form .wide div.help { padding-left: 0; padding-right: 50px; } -form .wide p, -form .wide ul.errorlist, -form .wide input + p.help, -form .wide input + div.help { - margin-right: 200px; - margin-left: 0px; -} - .submit-row { text-align: right; } @@ -202,12 +197,7 @@ fieldset .fieldBox { top: 0; left: auto; right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -45px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; } .calendarnav-next { @@ -217,11 +207,6 @@ fieldset .fieldBox { background: url(../img/calendar-icons.svg) 0 0 no-repeat; } -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -15px; -} - .calendar caption, .calendarbox h2 { text-align: center; } @@ -296,3 +281,11 @@ form .form-row p.datetime { margin-left: inherit; margin-right: 2px; } + +.inline-group .tabular td.original p { + right: 0; +} + +.selector .selector-chooser { + margin: 0; +} diff --git a/staticfiles/admin/css/unusable_password_field.css b/staticfiles/admin/css/unusable_password_field.css new file mode 100644 index 00000000..d46eb038 --- /dev/null +++ b/staticfiles/admin/css/unusable_password_field.css @@ -0,0 +1,19 @@ +/* Hide warnings fields if usable password is selected */ +form:has(#id_usable_password input[value="true"]:checked) .messagelist { + display: none; +} + +/* Hide password fields if unusable password is selected */ +form:has(#id_usable_password input[value="false"]:checked) .field-password1, +form:has(#id_usable_password input[value="false"]:checked) .field-password2 { + display: none; +} + +/* Select appropriate submit button */ +form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password { + display: none; +} + +form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password { + display: none; +} diff --git a/staticfiles/admin/css/widgets.css b/staticfiles/admin/css/widgets.css index 1104e8b1..cc64811a 100644 --- a/staticfiles/admin/css/widgets.css +++ b/staticfiles/admin/css/widgets.css @@ -1,23 +1,23 @@ /* SELECTOR (FILTER INTERFACE) */ .selector { - width: 800px; - float: left; display: flex; + flex-grow: 1; + gap: 0 10px; } .selector select { - width: 380px; height: 17.2em; flex: 1 0 auto; + overflow: scroll; + width: 100%; } .selector-available, .selector-chosen { - width: 380px; text-align: center; - margin-bottom: 5px; display: flex; flex-direction: column; + flex: 1 1; } .selector-available h2, .selector-chosen h2 { @@ -41,7 +41,7 @@ } .selector-chosen h2 { - background: var(--primary); + background: var(--secondary); color: var(--header-link-color); } @@ -58,6 +58,7 @@ font-size: 0.625rem; margin: 0; text-align: left; + display: flex; } .selector .selector-filter label, @@ -72,9 +73,12 @@ min-width: auto; } +.selector-filter input { + flex-grow: 1; +} + .selector .selector-available input, .selector .selector-chosen input { - width: 320px; margin-left: 8px; } @@ -83,7 +87,7 @@ width: 22px; background-color: var(--selected-bg); border-radius: 10px; - margin: 0 5px; + margin: 0; padding: 0; transform: translateY(-17px); } @@ -147,7 +151,7 @@ a.selector-chooseall, a.selector-clearall { display: inline-block; height: 16px; text-align: left; - margin: 1px auto 3px; + margin: 0 auto; overflow: hidden; font-weight: bold; line-height: 16px; @@ -447,7 +451,7 @@ span.clearable-file-input label { } .calendar td.selected a { - background: var(--primary); + background: var(--secondary); color: var(--button-fg); } @@ -515,36 +519,26 @@ span.clearable-file-input label { background: url(../img/calendar-icons.svg) 0 0 no-repeat; } -.calendarbox .calendarnav-previous:focus, -.calendarbox .calendarnav-previous:hover { - background-position: 0 -15px; -} - .calendarnav-next { right: 10px; - background: url(../img/calendar-icons.svg) 0 -30px no-repeat; -} - -.calendarbox .calendarnav-next:focus, -.calendarbox .calendarnav-next:hover { - background-position: 0 -45px; + background: url(../img/calendar-icons.svg) 0 -15px no-repeat; } .calendar-cancel { margin: 0; padding: 4px 0; font-size: 0.75rem; - background: #eee; + background: var(--close-button-bg); border-top: 1px solid var(--border-color); - color: var(--body-fg); + color: var(--button-fg); } .calendar-cancel:focus, .calendar-cancel:hover { - background: #ddd; + background: var(--close-button-hover-bg); } .calendar-cancel a { - color: black; + color: var(--button-fg); display: block; } @@ -575,26 +569,21 @@ ul.timelist, .timelist li { /* RELATED WIDGET WRAPPER */ .related-widget-wrapper { - float: left; /* display properly in form rows with multiple fields */ - overflow: hidden; /* clear floated contents */ + display: flex; + gap: 0 10px; + flex-grow: 1; + flex-wrap: wrap; + margin-bottom: 5px; } .related-widget-wrapper-link { - opacity: 0.3; + opacity: .6; + filter: grayscale(1); } .related-widget-wrapper-link:link { - opacity: .8; -} - -.related-widget-wrapper-link:link:focus, -.related-widget-wrapper-link:link:hover { opacity: 1; -} - -select + .related-widget-wrapper-link, -.related-widget-wrapper-link + .related-widget-wrapper-link { - margin-left: 7px; + filter: grayscale(0); } /* GIS MAPS */ diff --git a/staticfiles/admin/img/README.txt b/staticfiles/admin/img/README.txt index 4eb2e492..bf81f35b 100644 --- a/staticfiles/admin/img/README.txt +++ b/staticfiles/admin/img/README.txt @@ -1,4 +1,4 @@ -All icons are taken from Font Awesome (http://fontawesome.io/) project. +All icons are taken from Font Awesome (https://fontawesome.com/) project. The Font Awesome font is licensed under the SIL OFL 1.1: - https://scripts.sil.org/OFL diff --git a/staticfiles/admin/img/calendar-icons.svg b/staticfiles/admin/img/calendar-icons.svg index dbf21c39..04c02741 100644 --- a/staticfiles/admin/img/calendar-icons.svg +++ b/staticfiles/admin/img/calendar-icons.svg @@ -1,14 +1,63 @@ - - - - + + + + + + - - + + - - - - + + diff --git a/staticfiles/admin/img/icon-addlink.svg b/staticfiles/admin/img/icon-addlink.svg index e004fb16..8d5c6a3a 100644 --- a/staticfiles/admin/img/icon-addlink.svg +++ b/staticfiles/admin/img/icon-addlink.svg @@ -1,3 +1,3 @@ - + diff --git a/staticfiles/admin/img/icon-changelink.svg b/staticfiles/admin/img/icon-changelink.svg index bbb137aa..592b093b 100644 --- a/staticfiles/admin/img/icon-changelink.svg +++ b/staticfiles/admin/img/icon-changelink.svg @@ -1,3 +1,3 @@ - + diff --git a/staticfiles/admin/img/icon-hidelink.svg b/staticfiles/admin/img/icon-hidelink.svg new file mode 100644 index 00000000..2a8b404b --- /dev/null +++ b/staticfiles/admin/img/icon-hidelink.svg @@ -0,0 +1,3 @@ + + + diff --git a/staticfiles/admin/js/SelectFilter2.js b/staticfiles/admin/js/SelectFilter2.js index 9a4e0a3a..69574124 100644 --- a/staticfiles/admin/js/SelectFilter2.js +++ b/staticfiles/admin/js/SelectFilter2.js @@ -1,4 +1,4 @@ -/*global SelectBox, gettext, interpolate, quickElement, SelectFilter*/ +/*global SelectBox, gettext, ngettext, interpolate, quickElement, SelectFilter*/ /* SelectFilter2 - Turns a multiple-select box into a filter interface. @@ -30,6 +30,9 @@ Requires core.js and SelectBox.js. //
or
const selector_div = quickElement('div', from_box.parentNode); + // Make sure the selector div is at the beginning so that the + // add link would be displayed to the right of the widget. + from_box.parentNode.prepend(selector_div); selector_div.className = is_stacked ? 'selector stacked' : 'selector'; //
diff --git a/staticfiles/admin/js/actions.js b/staticfiles/admin/js/actions.js index 20a5c143..04b25e96 100644 --- a/staticfiles/admin/js/actions.js +++ b/staticfiles/admin/js/actions.js @@ -1,4 +1,4 @@ -/*global gettext, interpolate, ngettext*/ +/*global gettext, interpolate, ngettext, Actions*/ 'use strict'; { function show(selector) { @@ -179,6 +179,9 @@ } }); } + // Sync counter when navigating to the page, such as through the back + // button. + window.addEventListener('pageshow', (event) => updateCounter(actionCheckboxes, options)); }; // Call function fn when the DOM is loaded and ready. If it is already diff --git a/staticfiles/admin/js/admin/RelatedObjectLookups.js b/staticfiles/admin/js/admin/RelatedObjectLookups.js index afb6b66c..bc3accea 100644 --- a/staticfiles/admin/js/admin/RelatedObjectLookups.js +++ b/staticfiles/admin/js/admin/RelatedObjectLookups.js @@ -79,9 +79,11 @@ siblings.each(function() { const elm = $(this); elm.attr('href', elm.attr('data-href-template').replace('__fk__', value)); + elm.removeAttr('aria-disabled'); }); } else { siblings.removeAttr('href'); + siblings.attr('aria-disabled', true); } } @@ -94,8 +96,8 @@ // Extract the model from the popup url '...//add/' or // '...///change/' depending the action (add or change). const modelName = path.split('/')[path.split('/').length - (objId ? 4 : 3)]; - // Exclude autocomplete selects. - const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] select:not(.admin-autocomplete)`); + // Select elements with a specific model reference and context of "available-source". + const selectsRelated = document.querySelectorAll(`[data-model-ref="${modelName}"] [data-context="available-source"]`); selectsRelated.forEach(function(select) { if (currentSelect === select) { diff --git a/staticfiles/admin/js/calendar.js b/staticfiles/admin/js/calendar.js index a62d10a7..776310f7 100644 --- a/staticfiles/admin/js/calendar.js +++ b/staticfiles/admin/js/calendar.js @@ -36,6 +36,24 @@ depends on core.js for utility functions like removeChildren or quickElement pgettext('abbrev. month December', 'Dec') ], daysOfWeek: [ + gettext('Sunday'), + gettext('Monday'), + gettext('Tuesday'), + gettext('Wednesday'), + gettext('Thursday'), + gettext('Friday'), + gettext('Saturday') + ], + daysOfWeekAbbrev: [ + pgettext('abbrev. day Sunday', 'Sun'), + pgettext('abbrev. day Monday', 'Mon'), + pgettext('abbrev. day Tuesday', 'Tue'), + pgettext('abbrev. day Wednesday', 'Wed'), + pgettext('abbrev. day Thursday', 'Thur'), + pgettext('abbrev. day Friday', 'Fri'), + pgettext('abbrev. day Saturday', 'Sat') + ], + daysOfWeekInitial: [ pgettext('one letter Sunday', 'S'), pgettext('one letter Monday', 'M'), pgettext('one letter Tuesday', 'T'), @@ -98,7 +116,7 @@ depends on core.js for utility functions like removeChildren or quickElement // Draw days-of-week header let tableRow = quickElement('tr', tableBody); for (let i = 0; i < 7; i++) { - quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); + quickElement('th', tableRow, CalendarNamespace.daysOfWeekInitial[(i + CalendarNamespace.firstDayOfWeek) % 7]); } const startingPos = new Date(year, month - 1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); diff --git a/staticfiles/admin/js/core.js b/staticfiles/admin/js/core.js index 0344a13f..10504d4a 100644 --- a/staticfiles/admin/js/core.js +++ b/staticfiles/admin/js/core.js @@ -85,6 +85,18 @@ function findPosY(obj) { return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); }; + Date.prototype.getAbbrevDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeekAbbrev[this.getDay()]; + }; + + Date.prototype.getFullDayName = function() { + return typeof window.CalendarNamespace === "undefined" + ? '0' + this.getDay() + : window.CalendarNamespace.daysOfWeek[this.getDay()]; + }; + Date.prototype.getAbbrevMonthName = function() { return typeof window.CalendarNamespace === "undefined" ? this.getTwoDigitMonth() @@ -99,6 +111,8 @@ function findPosY(obj) { Date.prototype.strftime = function(format) { const fields = { + a: this.getAbbrevDayName(), + A: this.getFullDayName(), b: this.getAbbrevMonthName(), B: this.getFullMonthName(), c: this.toString(), diff --git a/staticfiles/admin/js/popup_response.js b/staticfiles/admin/js/popup_response.js index 2b1d3dd3..fecf0f47 100644 --- a/staticfiles/admin/js/popup_response.js +++ b/staticfiles/admin/js/popup_response.js @@ -1,4 +1,3 @@ -/*global opener */ 'use strict'; { const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse); diff --git a/staticfiles/admin/js/theme.js b/staticfiles/admin/js/theme.js index 794cd15f..e79d375c 100644 --- a/staticfiles/admin/js/theme.js +++ b/staticfiles/admin/js/theme.js @@ -1,56 +1,51 @@ 'use strict'; { - window.addEventListener('load', function(e) { - - function setTheme(mode) { - if (mode !== "light" && mode !== "dark" && mode !== "auto") { - console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); - mode = "auto"; - } - document.documentElement.dataset.theme = mode; - localStorage.setItem("theme", mode); + function setTheme(mode) { + if (mode !== "light" && mode !== "dark" && mode !== "auto") { + console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`); + mode = "auto"; } + document.documentElement.dataset.theme = mode; + localStorage.setItem("theme", mode); + } - function cycleTheme() { - const currentTheme = localStorage.getItem("theme") || "auto"; - const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; + function cycleTheme() { + const currentTheme = localStorage.getItem("theme") || "auto"; + const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches; - if (prefersDark) { - // Auto (dark) -> Light -> Dark - if (currentTheme === "auto") { - setTheme("light"); - } else if (currentTheme === "light") { - setTheme("dark"); - } else { - setTheme("auto"); - } + if (prefersDark) { + // Auto (dark) -> Light -> Dark + if (currentTheme === "auto") { + setTheme("light"); + } else if (currentTheme === "light") { + setTheme("dark"); } else { - // Auto (light) -> Dark -> Light - if (currentTheme === "auto") { - setTheme("dark"); - } else if (currentTheme === "dark") { - setTheme("light"); - } else { - setTheme("auto"); - } + setTheme("auto"); + } + } else { + // Auto (light) -> Dark -> Light + if (currentTheme === "auto") { + setTheme("dark"); + } else if (currentTheme === "dark") { + setTheme("light"); + } else { + setTheme("auto"); } } + } - function initTheme() { - // set theme defined in localStorage if there is one, or fallback to auto mode - const currentTheme = localStorage.getItem("theme"); - currentTheme ? setTheme(currentTheme) : setTheme("auto"); - } + function initTheme() { + // set theme defined in localStorage if there is one, or fallback to auto mode + const currentTheme = localStorage.getItem("theme"); + currentTheme ? setTheme(currentTheme) : setTheme("auto"); + } - function setupTheme() { - // Attach event handlers for toggling themes - const buttons = document.getElementsByClassName("theme-toggle"); - Array.from(buttons).forEach((btn) => { - btn.addEventListener("click", cycleTheme); - }); - initTheme(); - } - - setupTheme(); + window.addEventListener('load', function(_) { + const buttons = document.getElementsByClassName("theme-toggle"); + Array.from(buttons).forEach((btn) => { + btn.addEventListener("click", cycleTheme); + }); }); + + initTheme(); } diff --git a/staticfiles/admin/js/unusable_password_field.js b/staticfiles/admin/js/unusable_password_field.js new file mode 100644 index 00000000..ec26238c --- /dev/null +++ b/staticfiles/admin/js/unusable_password_field.js @@ -0,0 +1,29 @@ +"use strict"; +// Fallback JS for browsers which do not support :has selector used in +// admin/css/unusable_password_fields.css +// Remove file once all supported browsers support :has selector +try { + // If browser does not support :has selector this will raise an error + document.querySelector("form:has(input)"); +} catch (error) { + console.log("Defaulting to javascript for usable password form management: " + error); + // JS replacement for unsupported :has selector + document.querySelectorAll('input[name="usable_password"]').forEach(option => { + option.addEventListener('change', function() { + const usablePassword = (this.value === "true" ? this.checked : !this.checked); + const submit1 = document.querySelector('input[type="submit"].set-password'); + const submit2 = document.querySelector('input[type="submit"].unset-password'); + const messages = document.querySelector('#id_unusable_warning'); + document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword; + document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword; + if (messages) { + messages.hidden = usablePassword; + } + if (submit1 && submit2) { + submit1.hidden = !usablePassword; + submit2.hidden = usablePassword; + } + }); + option.dispatchEvent(new Event('change')); + }); +} diff --git a/staticfiles/admin/js/vendor/jquery/jquery.js b/staticfiles/admin/js/vendor/jquery/jquery.js index 7f35c11b..1a86433c 100644 --- a/staticfiles/admin/js/vendor/jquery/jquery.js +++ b/staticfiles/admin/js/vendor/jquery/jquery.js @@ -1,15 +1,12 @@ /*! - * jQuery JavaScript Library v3.6.4 + * jQuery JavaScript Library v3.7.1 * https://jquery.com/ * - * Includes Sizzle.js - * https://sizzlejs.com/ - * * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * - * Date: 2023-03-08T15:28Z + * Date: 2023-08-28T13:37Z */ ( function( global, factory ) { @@ -150,8 +147,9 @@ function toType( obj ) { -var - version = "3.6.4", +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -397,6 +395,38 @@ jQuery.extend( { return obj; }, + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -419,6 +449,15 @@ jQuery.extend( { return arr == null ? -1 : indexOf.call( arr, elem, i ); }, + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + // Support: Android <=4.0 only, PhantomJS 1 only // push.apply(_, arraylike) throws on ancient WebKit merge: function( first, second ) { @@ -520,43 +559,98 @@ function isArrayLike( obj ) { return type === "array" || length === 0 || typeof length === "number" && length > 0 && ( length - 1 ) in obj; } -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.10 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2023-02-14 - */ -( function( window ) { + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + var i, - support, Expr, - getText, - isXML, - tokenize, - compile, - select, outermostContext, sortInput, hasDuplicate, + push = pushNative, // Local document vars - setDocument, document, - docElem, + documentElement, documentIsHTML, rbuggyQSA, - rbuggyMatches, matches, - contains, // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, + expando = jQuery.expando, dirruns = 0, done = 0, classCache = createCache(), @@ -570,47 +664,22 @@ var i, return 0; }, - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", // Regular expressions - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + "*\\]", @@ -629,101 +698,88 @@ var i, // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), ridentifier = new RegExp( "^" + identifier + "$" ), matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + + needsContext: new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, - rhtml = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, - rnative = /^[^{]+\{\s*\[native \w/, - // Easily-parseable/retrievable ID or TAG or CLASS selectors rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), funescape = function( escape, nonHex ) { var high = "0x" + escape.slice( 1 ) - 0x10000; - return nonHex ? + if ( nonHex ) { // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + return nonHex; } - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, - // Used for iframes - // See setDocument() + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ // Removing the function wrapper causes a "Permission Denied" - // error in IE + // error in IE/Edge. unloadHandler = function() { setDocument(); }, inDisabledFieldset = addCombinator( function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + return elem.disabled === true && nodeName( elem, "fieldset" ); }, { dir: "parentNode", next: "legend" } ); +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + // Optimize for push.apply( _, NodeList ) try { push.apply( @@ -731,32 +787,22 @@ try { preferredDoc.childNodes ); - // Support: Android<4.0 + // Support: Android <=4.0 // Detect silently failing push.apply // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { + push = { + apply: function( target, els ) { pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); } }; } -function Sizzle( selector, context, results, seed ) { +function find( selector, context, results, seed ) { var m, i, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, @@ -790,11 +836,10 @@ function Sizzle( selector, context, results, seed ) { if ( nodeType === 9 ) { if ( ( elem = context.getElementById( m ) ) ) { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } else { @@ -804,14 +849,13 @@ function Sizzle( selector, context, results, seed ) { // Element context } else { - // Support: IE, Opera, Webkit - // TODO: identify versions + // Support: IE 9 only // getElementById can match elements by name instead of ID if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && + find.contains( context, elem ) && elem.id === m ) { - results.push( elem ); + push.call( results, elem ); return results; } } @@ -822,22 +866,15 @@ function Sizzle( selector, context, results, seed ) { return results; // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } } // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { newSelector = selector; newContext = context; @@ -858,11 +895,15 @@ function Sizzle( selector, context, results, seed ) { // We can use :scope instead of the ID hack if the browser // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { // Capture the context ID, setting it first if necessary if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); + nid = jQuery.escapeSelector( nid ); } else { context.setAttribute( "id", ( nid = expando ) ); } @@ -895,7 +936,7 @@ function Sizzle( selector, context, results, seed ) { } // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); } /** @@ -909,7 +950,8 @@ function createCache() { function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) if ( keys.push( key + " " ) > Expr.cacheLength ) { // Only keep the most recent entries @@ -921,7 +963,7 @@ function createCache() { } /** - * Mark a function for special use by Sizzle + * Mark a function for special use by jQuery selector module * @param {Function} fn The function to mark */ function markFunction( fn ) { @@ -952,56 +994,13 @@ function assert( fn ) { } } -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - /** * Returns a function to use in pseudos for input types * @param {String} type */ function createInputPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; + return nodeName( elem, "input" ) && elem.type === type; }; } @@ -1011,8 +1010,8 @@ function createInputPseudo( type ) { */ function createButtonPseudo( type ) { return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; }; } @@ -1048,14 +1047,13 @@ function createDisabledPseudo( disabled ) { } } - // Support: IE 6 - 11 + // Support: IE 6 - 11+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors return elem.isDisabled === disabled || // Where there is no isDisabled, check manually - /* jshint -W018 */ elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1095,7 +1093,7 @@ function createPositionalPseudo( fn ) { } /** - * Checks a node for validity as a Sizzle context + * Checks a node for validity as a jQuery selector context * @param {Element|Object=} context * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ @@ -1103,31 +1101,13 @@ function testContext( context ) { return context && typeof context.getElementsByTagName !== "undefined" && context; } -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem && elem.namespaceURI, - docElem = elem && ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - /** * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document + * @param {Element|Object} [node] An element or document object to use to set the document * @returns {Object} Returns the current document */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, +function setDocument( node ) { + var subWindow, doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected @@ -1141,41 +1121,58 @@ setDocument = Sizzle.setDocument = function( node ) { // Update global variables document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); } - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; } ); - // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ - // Make sure the the `:has()` argument is parsed unforgivingly. + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. // We include `*` in the test to detect buggy implementations that are // _selectively_ forgiving (specifically when the list includes at least // one valid selector). @@ -1192,54 +1189,22 @@ setDocument = Sizzle.setDocument = function( node ) { } } ); - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - // ID filter and find if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { return elem.getAttribute( "id" ) === attrId; }; }; - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { - Expr.filter[ "ID" ] = function( id ) { + Expr.filter.ID = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && @@ -1250,7 +1215,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { + Expr.find.ID = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); @@ -1280,40 +1245,18 @@ setDocument = Sizzle.setDocument = function( node ) { } // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { + Expr.find.CLASS = function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } @@ -1324,139 +1267,75 @@ setDocument = Sizzle.setDocument = function( node ) { // QSA and matchesSelector support - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { + var input; - var input; + documentElement.appendChild( el ).innerHTML = + "" + + ""; - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); if ( !support.cssHas ) { @@ -1470,49 +1349,12 @@ setDocument = Sizzle.setDocument = function( node ) { } rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - - // Support: IE <9 only - // IE doesn't have `contains` on `document` so we need to check for - // `documentElement` presence. - // We need to fall back to `a` when `documentElement` is missing - // as `ownerDocument` of elements within `