From ed018d660d8e534dae5471e08ba10cafa9a03206 Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Tue, 23 Apr 2019 13:07:03 +0600 Subject: [PATCH 01/27] Initial commit --- .gitignore | 141 +++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 6 +++ lessons/README | 1 + 3 files changed, 148 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 lessons/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ad0e46d --- /dev/null +++ b/.gitignore @@ -0,0 +1,141 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# IDEs +.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc7db6f --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# Web Python 20XX-XX + + +### Занятия + +- [Урок название](lessons/lesson.folder/) diff --git a/lessons/README b/lessons/README new file mode 100644 index 0000000..7880f95 --- /dev/null +++ b/lessons/README @@ -0,0 +1 @@ +Файлы уроков From fc1ccbd907063fc965477c4529c7fbc5f746a938 Mon Sep 17 00:00:00 2001 From: Suren Khorenyan Date: Tue, 31 Oct 2023 21:43:31 +0300 Subject: [PATCH 02/27] Add lesson 1: requests, BeautifulSoup --- README.md | 4 +- lessons/lesson.01/main.ipynb | 7091 ++++++++++++++++++++++++++++ lessons/lesson.01/requirements.txt | 87 + 3 files changed, 7180 insertions(+), 2 deletions(-) create mode 100644 lessons/lesson.01/main.ipynb create mode 100644 lessons/lesson.01/requirements.txt diff --git a/README.md b/README.md index fc7db6f..f7e8801 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Web Python 20XX-XX +# Web Python 2023-10 ### Занятия -- [Урок название](lessons/lesson.folder/) +- [Урок 1. Введение в HTTP. Работа с библиотеками requests и BeautifulSoup](lessons/lesson.01/) diff --git a/lessons/lesson.01/main.ipynb b/lessons/lesson.01/main.ipynb new file mode 100644 index 0000000..44cd23e --- /dev/null +++ b/lessons/lesson.01/main.ipynb @@ -0,0 +1,7091 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "a8a98a8c-8b5d-48a7-9e16-614a0e03f922", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hello world!\n" + ] + } + ], + "source": [ + "print(\"Hello world!\")" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "6c31ab2d-af81-4b3c-9785-36c9a6dffda0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "3" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "1 + 2" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b6d44b8f-bb71-4e08-bce8-71ff1ae2861a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: requests in ./venv/lib/python3.11/site-packages (2.31.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in ./venv/lib/python3.11/site-packages (from requests) (3.3.1)\n", + "Requirement already satisfied: idna<4,>=2.5 in ./venv/lib/python3.11/site-packages (from requests) (3.4)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in ./venv/lib/python3.11/site-packages (from requests) (2.0.7)\n", + "Requirement already satisfied: certifi>=2017.4.17 in ./venv/lib/python3.11/site-packages (from requests) (2023.7.22)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.3.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install requests" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "d8e2a34d-fd80-4a94-a2fd-93dac6b656f9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on package requests:\n", + "\n", + "NAME\n", + " requests\n", + "\n", + "DESCRIPTION\n", + " Requests HTTP Library\n", + " ~~~~~~~~~~~~~~~~~~~~~\n", + " \n", + " Requests is an HTTP library, written in Python, for human beings.\n", + " Basic GET usage:\n", + " \n", + " >>> import requests\n", + " >>> r = requests.get('https://www.python.org')\n", + " >>> r.status_code\n", + " 200\n", + " >>> b'Python is a programming language' in r.content\n", + " True\n", + " \n", + " ... or POST:\n", + " \n", + " >>> payload = dict(key1='value1', key2='value2')\n", + " >>> r = requests.post('https://httpbin.org/post', data=payload)\n", + " >>> print(r.text)\n", + " {\n", + " ...\n", + " \"form\": {\n", + " \"key1\": \"value1\",\n", + " \"key2\": \"value2\"\n", + " },\n", + " ...\n", + " }\n", + " \n", + " The other HTTP methods are supported - see `requests.api`. Full documentation\n", + " is at .\n", + " \n", + " :copyright: (c) 2017 by Kenneth Reitz.\n", + " :license: Apache 2.0, see LICENSE for more details.\n", + "\n", + "PACKAGE CONTENTS\n", + " __version__\n", + " _internal_utils\n", + " adapters\n", + " api\n", + " auth\n", + " certs\n", + " compat\n", + " cookies\n", + " exceptions\n", + " help\n", + " hooks\n", + " models\n", + " packages\n", + " sessions\n", + " status_codes\n", + " structures\n", + " utils\n", + "\n", + "FUNCTIONS\n", + " check_compatibility(urllib3_version, chardet_version, charset_normalizer_version)\n", + "\n", + "DATA\n", + " __author_email__ = 'me@kennethreitz.org'\n", + " __build__ = 143616\n", + " __cake__ = '✨ 🍰 ✨'\n", + " __copyright__ = 'Copyright Kenneth Reitz'\n", + " __description__ = 'Python HTTP for Humans.'\n", + " __license__ = 'Apache 2.0'\n", + " __title__ = 'requests'\n", + " __url__ = 'https://requests.readthedocs.io'\n", + " chardet_version = None\n", + " charset_normalizer_version = '3.3.1'\n", + " codes = \n", + "\n", + "VERSION\n", + " 2.31.0\n", + "\n", + "AUTHOR\n", + " Kenneth Reitz\n", + "\n", + "FILE\n", + " /Users/suren/MyFiles/OTUS/lessons/WebPython.2023-10/01.requests-and-bs/venv/lib/python3.11/site-packages/requests/__init__.py\n", + "\n", + "\n" + ] + } + ], + "source": [ + "import requests\n", + "\n", + "help(requests)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "a2ea14fb-9a0d-4689-b16a-e064b7a3b90e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://httpbin.org/get\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b63d2463-f3f7-4fac-a0f9-e4ab2d2012e1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.status_code" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "d6a4b2f3-9538-4028-b7d0-fedf492ed8d0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\\n \"args\": {}, \\n \"headers\": {\\n \"Accept\": \"*/*\", \\n \"Accept-Encoding\": \"gzip, deflate\", \\n \"Host\": \"httpbin.org\", \\n \"User-Agent\": \"python-requests/2.31.0\", \\n \"X-Amzn-Trace-Id\": \"Root=1-65413e2c-1c49701c43cac4af7397e869\"\\n }, \\n \"origin\": \"79.172.111.35\", \\n \"url\": \"https://httpbin.org/get\"\\n}\\n'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "c08cf3aa-19ed-4764-87de-77c63c2862cc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-65413e2c-1c49701c43cac4af7397e869'},\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/get'}" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "eb6fbbf7-bfd5-4242-919b-411a159588ad", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "params = {\n", + " \"fizz\": \"buzz\",\n", + " \"foo\": [\"bar\", \"spam\", \"eggs\"]\n", + "}\n", + "response = requests.get(\"https://httpbin.org/get\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "2d6ca131-193c-4e0d-84ed-297d990205e8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://httpbin.org/get'" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.url" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "99e9f451-5e41-4ff1-be83-de19b846726d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'_content': b'{\\n \"args\": {}, \\n \"headers\": {\\n \"Accept\": \"*/*\", \\n \"Accept-Encoding\": \"gzip, deflate\", \\n \"Host\": \"httpbin.org\", \\n \"User-Agent\": \"python-requests/2.31.0\", \\n \"X-Amzn-Trace-Id\": \"Root=1-65413e75-6034f3be58d93bf663d81fce\"\\n }, \\n \"origin\": \"79.172.111.35\", \\n \"url\": \"https://httpbin.org/get\"\\n}\\n',\n", + " '_content_consumed': True,\n", + " '_next': None,\n", + " 'status_code': 200,\n", + " 'headers': {'Date': 'Tue, 31 Oct 2023 17:50:45 GMT', 'Content-Type': 'application/json', 'Content-Length': '307', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'},\n", + " 'raw': ,\n", + " 'url': 'https://httpbin.org/get',\n", + " 'encoding': 'utf-8',\n", + " 'history': [],\n", + " 'reason': 'OK',\n", + " 'cookies': ,\n", + " 'elapsed': datetime.timedelta(microseconds=837518),\n", + " 'request': ,\n", + " 'connection': }" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vars(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b09c3fdf-2ce9-41c8-ba0a-81ef25492dac", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\\n \"args\": {}, \\n \"headers\": {\\n \"Accept\": \"*/*\", \\n \"Accept-Encoding\": \"gzip, deflate\", \\n \"Host\": \"httpbin.org\", \\n \"User-Agent\": \"python-requests/2.31.0\", \\n \"X-Amzn-Trace-Id\": \"Root=1-65413e75-6034f3be58d93bf663d81fce\"\\n }, \\n \"origin\": \"79.172.111.35\", \\n \"url\": \"https://httpbin.org/get\"\\n}\\n'" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "a0c6794e-9c91-48df-b1c8-c337797247ca", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-65413e75-6034f3be58d93bf663d81fce'},\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/get'}" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "fe2a89f6-bacb-42b5-acd8-a5af4526f22c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "params = {\n", + " \"fizz\": \"buzz\",\n", + " \"foo\": [\"bar\", \"spam\", \"eggs\"]\n", + "}\n", + "response = requests.get(\"https://httpbin.org/get\", params=params)\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "f43beef5-afd2-4296-b44b-351610d065d6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://httpbin.org/get?fizz=buzz&foo=bar&foo=spam&foo=eggs'" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.url" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "773b7fe8-2732-4ed9-b62a-aedf3664eefc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {'fizz': 'buzz', 'foo': ['bar', 'spam', 'eggs']},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-65413eb1-47e404e40cafef7f7b24a65d'},\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/get?fizz=buzz&foo=bar&foo=spam&foo=eggs'}" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "f96e426b-b3e1-48e6-b973-1530e9f0282e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.post(\"https://httpbin.org/get\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "39e0213f-1298-4c14-8036-281cf75d792d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n405 Method Not Allowed\\n

Method Not Allowed

\\n

The method is not allowed for the requested URL.

\\n'" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "326a766a-0f04-496e-ba61-9280ff8a3228", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.post(\"https://httpbin.org/post\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "1edab43e-2581-4799-b3f7-29a7f8902248", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\\n \"args\": {}, \\n \"data\": \"\", \\n \"files\": {}, \\n \"form\": {}, \\n \"headers\": {\\n \"Accept\": \"*/*\", \\n \"Accept-Encoding\": \"gzip, deflate\", \\n \"Content-Length\": \"0\", \\n \"Host\": \"httpbin.org\", \\n \"User-Agent\": \"python-requests/2.31.0\", \\n \"X-Amzn-Trace-Id\": \"Root=1-65413ef4-713a3c9c6431f4e141385631\"\\n }, \\n \"json\": null, \\n \"origin\": \"79.172.111.35\", \\n \"url\": \"https://httpbin.org/post\"\\n}\\n'" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "id": "93cfbc98-1dae-4651-ad63-0ee069e49170", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {},\n", + " 'data': '',\n", + " 'files': {},\n", + " 'form': {},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Content-Length': '0',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-65413ef4-713a3c9c6431f4e141385631'},\n", + " 'json': None,\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/post'}" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "505a6f03-4df6-4fe8-8c79-7ac5d73e49d4", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "params = {\n", + " \"fizz\": \"buzz\",\n", + " \"foo\": [\"bar\", \"spam\", \"eggs\"]\n", + "}\n", + "json_data = {\n", + " \"bool value\": True,\n", + " \"null value\": None,\n", + " \"ids\": [1, 2, 3],\n", + " \"squares\": {\n", + " \"2\": 4,\n", + " 4: 16,\n", + " }\n", + "}\n", + "response = requests.post(\n", + " \"https://httpbin.org/post\",\n", + " params=params,\n", + " json=json_data,\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "232d55c9-fa08-43e4-a0ec-43100d900981", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Date': 'Tue, 31 Oct 2023 17:54:42 GMT', 'Content-Type': 'application/json', 'Content-Length': '814', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.headers" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "a0e30f21-36ce-4d84-8837-f9df514f5266", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.request" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "bf8de01c-b227-4550-a293-af24ca636724", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://httpbin.org/post?fizz=buzz&foo=bar&foo=spam&foo=eggs'" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.request.url" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "67d98286-d9b3-44fd-9269-aa6d95c2f85a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '88', 'Content-Type': 'application/json'}" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.request.headers" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "56701f4e-bee1-435b-9224-d326d56616e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {'fizz': 'buzz', 'foo': ['bar', 'spam', 'eggs']},\n", + " 'data': '{\"bool value\": true, \"null value\": null, \"ids\": [1, 2, 3], \"squares\": {\"2\": 4, \"4\": 16}}',\n", + " 'files': {},\n", + " 'form': {},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Content-Length': '88',\n", + " 'Content-Type': 'application/json',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-65413f62-7e1a1b70773d75ca35c79fb1'},\n", + " 'json': {'bool value': True,\n", + " 'ids': [1, 2, 3],\n", + " 'null value': None,\n", + " 'squares': {'2': 4, '4': 16}},\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/post?fizz=buzz&foo=bar&foo=spam&foo=eggs'}" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "3553cd0b-b740-4e07-877b-f168d418d80f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'https://httpbin.org/post?fizz=buzz&foo=bar&foo=spam&foo=eggs'" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.url" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "7858a16b-0589-4273-ae37-0cb8282276f4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'method': 'POST',\n", + " 'url': 'https://httpbin.org/post?fizz=buzz&foo=bar&foo=spam&foo=eggs',\n", + " 'headers': {'User-Agent': 'python-requests/2.31.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Content-Length': '88', 'Content-Type': 'application/json'},\n", + " '_cookies': ,\n", + " 'body': b'{\"bool value\": true, \"null value\": null, \"ids\": [1, 2, 3], \"squares\": {\"2\": 4, \"4\": 16}}',\n", + " 'hooks': {'response': []},\n", + " '_body_position': None}" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "vars(response.request)" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "d04f31d6-9a24-4cee-9331-1f600fd795a1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "88" + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(b'{\"bool value\": true, \"null value\": null, \"ids\": [1, 2, 3], \"squares\": {\"2\": 4, \"4\": 16}}')" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "f2ed6c3c-ef42-47e4-90bd-5802a34b7710", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "json_data = {\n", + " \"ids\": [3, 2, 1],\n", + " \"squares\": {\n", + " \"2\": 4,\n", + " 4: 16,\n", + " 8: 64,\n", + " }\n", + "}\n", + "response = requests.put(\n", + " \"https://httpbin.org/put\",\n", + " json=json_data,\n", + ")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "5ebeb388-170c-4f1a-b522-eeea23c6478e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "200" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.status_code" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "bee803b5-6860-428a-a4c5-37aedd596798", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'args': {},\n", + " 'data': '{\"ids\": [3, 2, 1], \"squares\": {\"2\": 4, \"4\": 16, \"8\": 64}}',\n", + " 'files': {},\n", + " 'form': {},\n", + " 'headers': {'Accept': '*/*',\n", + " 'Accept-Encoding': 'gzip, deflate',\n", + " 'Content-Length': '57',\n", + " 'Content-Type': 'application/json',\n", + " 'Host': 'httpbin.org',\n", + " 'User-Agent': 'python-requests/2.31.0',\n", + " 'X-Amzn-Trace-Id': 'Root=1-654140b6-1791a10f2085f8e5055dff55'},\n", + " 'json': {'ids': [3, 2, 1], 'squares': {'2': 4, '4': 16, '8': 64}},\n", + " 'origin': '79.172.111.35',\n", + " 'url': 'https://httpbin.org/put'}" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "0697eb04-8b2c-4472-bb25-3117cc91a204", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://httpbin.org/basic-auth/user/password\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "7c695f13-9c8e-4a07-8b12-d47cfa191823", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Date': 'Tue, 31 Oct 2023 18:02:13 GMT', 'Content-Length': '0', 'Connection': 'keep-alive', 'Server': 'gunicorn/19.9.0', 'WWW-Authenticate': 'Basic realm=\"Fake Realm\"', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Credentials': 'true'}" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.headers" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "049a9b91-7406-4710-a7be-6e7b8cc26175", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "''" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "d75fa149-0bc4-47b7-baff-7c008e8d6ebe", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://httpbin.org/basic-auth/user/password\", auth=(\"user\", \"password\"))\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "d8c1af1d-e14a-4e71-b5e6-3f373c6e753c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\\n \"authenticated\": true, \\n \"user\": \"user\"\\n}\\n'" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.text" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5efc8e81-591d-4130-a21b-2edebd4f1f51", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'authenticated': True, 'user': 'user'}" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "dcd6d2d5-af6c-40cb-bde4-6ea08d4d32f3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://httpbin.org/basic-auth/otus/password\", auth=(\"user\", \"password\"))\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "cb51d5b7-7d79-46cf-bcc1-e1b30bc8d2be", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://httpbin.org/basic-auth/otus/password\", auth=(\"otus\", \"password\"))\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "94e9c14c-4ad7-4b6d-88d7-18a863ae147b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'authenticated': True, 'user': 'otus'}" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "17294493-fd60-4601-b446-f69cca0b189d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "json_placeholder_posts_url = \"https://jsonplaceholder.typicode.com/posts\"\n", + "response = requests.get(json_placeholder_posts_url)\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "3be3ff69-19e6-479c-9930-01d04489deaa", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'userId': 1,\n", + " 'id': 1,\n", + " 'title': 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',\n", + " 'body': 'quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto'},\n", + " {'userId': 1,\n", + " 'id': 2,\n", + " 'title': 'qui est esse',\n", + " 'body': 'est rerum tempore vitae\\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\\nqui aperiam non debitis possimus qui neque nisi nulla'},\n", + " {'userId': 1,\n", + " 'id': 3,\n", + " 'title': 'ea molestias quasi exercitationem repellat qui ipsa sit aut',\n", + " 'body': 'et iusto sed quo iure\\nvoluptatem occaecati omnis eligendi aut ad\\nvoluptatem doloribus vel accusantium quis pariatur\\nmolestiae porro eius odio et labore et velit aut'},\n", + " {'userId': 1,\n", + " 'id': 4,\n", + " 'title': 'eum et est occaecati',\n", + " 'body': 'ullam et saepe reiciendis voluptatem adipisci\\nsit amet autem assumenda provident rerum culpa\\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\\nquis sunt voluptatem rerum illo velit'},\n", + " {'userId': 1,\n", + " 'id': 5,\n", + " 'title': 'nesciunt quas odio',\n", + " 'body': 'repudiandae veniam quaerat sunt sed\\nalias aut fugiat sit autem sed est\\nvoluptatem omnis possimus esse voluptatibus quis\\nest aut tenetur dolor neque'},\n", + " {'userId': 1,\n", + " 'id': 6,\n", + " 'title': 'dolorem eum magni eos aperiam quia',\n", + " 'body': 'ut aspernatur corporis harum nihil quis provident sequi\\nmollitia nobis aliquid molestiae\\nperspiciatis et ea nemo ab reprehenderit accusantium quas\\nvoluptate dolores velit et doloremque molestiae'},\n", + " {'userId': 1,\n", + " 'id': 7,\n", + " 'title': 'magnam facilis autem',\n", + " 'body': 'dolore placeat quibusdam ea quo vitae\\nmagni quis enim qui quis quo nemo aut saepe\\nquidem repellat excepturi ut quia\\nsunt ut sequi eos ea sed quas'},\n", + " {'userId': 1,\n", + " 'id': 8,\n", + " 'title': 'dolorem dolore est ipsam',\n", + " 'body': 'dignissimos aperiam dolorem qui eum\\nfacilis quibusdam animi sint suscipit qui sint possimus cum\\nquaerat magni maiores excepturi\\nipsam ut commodi dolor voluptatum modi aut vitae'},\n", + " {'userId': 1,\n", + " 'id': 9,\n", + " 'title': 'nesciunt iure omnis dolorem tempora et accusantium',\n", + " 'body': 'consectetur animi nesciunt iure dolore\\nenim quia ad\\nveniam autem ut quam aut nobis\\net est aut quod aut provident voluptas autem voluptas'},\n", + " {'userId': 1,\n", + " 'id': 10,\n", + " 'title': 'optio molestias id quia eum',\n", + " 'body': 'quo et expedita modi cum officia vel magni\\ndoloribus qui repudiandae\\nvero nisi sit\\nquos veniam quod sed accusamus veritatis error'},\n", + " {'userId': 2,\n", + " 'id': 11,\n", + " 'title': 'et ea vero quia laudantium autem',\n", + " 'body': 'delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\\naccusamus in eum beatae sit\\nvel qui neque voluptates ut commodi qui incidunt\\nut animi commodi'},\n", + " {'userId': 2,\n", + " 'id': 12,\n", + " 'title': 'in quibusdam tempore odit est dolorem',\n", + " 'body': 'itaque id aut magnam\\npraesentium quia et ea odit et ea voluptas et\\nsapiente quia nihil amet occaecati quia id voluptatem\\nincidunt ea est distinctio odio'},\n", + " {'userId': 2,\n", + " 'id': 13,\n", + " 'title': 'dolorum ut in voluptas mollitia et saepe quo animi',\n", + " 'body': 'aut dicta possimus sint mollitia voluptas commodi quo doloremque\\niste corrupti reiciendis voluptatem eius rerum\\nsit cumque quod eligendi laborum minima\\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam'},\n", + " {'userId': 2,\n", + " 'id': 14,\n", + " 'title': 'voluptatem eligendi optio',\n", + " 'body': 'fuga et accusamus dolorum perferendis illo voluptas\\nnon doloremque neque facere\\nad qui dolorum molestiae beatae\\nsed aut voluptas totam sit illum'},\n", + " {'userId': 2,\n", + " 'id': 15,\n", + " 'title': 'eveniet quod temporibus',\n", + " 'body': 'reprehenderit quos placeat\\nvelit minima officia dolores impedit repudiandae molestiae nam\\nvoluptas recusandae quis delectus\\nofficiis harum fugiat vitae'},\n", + " {'userId': 2,\n", + " 'id': 16,\n", + " 'title': 'sint suscipit perspiciatis velit dolorum rerum ipsa laboriosam odio',\n", + " 'body': 'suscipit nam nisi quo aperiam aut\\nasperiores eos fugit maiores voluptatibus quia\\nvoluptatem quis ullam qui in alias quia est\\nconsequatur magni mollitia accusamus ea nisi voluptate dicta'},\n", + " {'userId': 2,\n", + " 'id': 17,\n", + " 'title': 'fugit voluptas sed molestias voluptatem provident',\n", + " 'body': 'eos voluptas et aut odit natus earum\\naspernatur fuga molestiae ullam\\ndeserunt ratione qui eos\\nqui nihil ratione nemo velit ut aut id quo'},\n", + " {'userId': 2,\n", + " 'id': 18,\n", + " 'title': 'voluptate et itaque vero tempora molestiae',\n", + " 'body': 'eveniet quo quis\\nlaborum totam consequatur non dolor\\nut et est repudiandae\\nest voluptatem vel debitis et magnam'},\n", + " {'userId': 2,\n", + " 'id': 19,\n", + " 'title': 'adipisci placeat illum aut reiciendis qui',\n", + " 'body': 'illum quis cupiditate provident sit magnam\\nea sed aut omnis\\nveniam maiores ullam consequatur atque\\nadipisci quo iste expedita sit quos voluptas'},\n", + " {'userId': 2,\n", + " 'id': 20,\n", + " 'title': 'doloribus ad provident suscipit at',\n", + " 'body': 'qui consequuntur ducimus possimus quisquam amet similique\\nsuscipit porro ipsam amet\\neos veritatis officiis exercitationem vel fugit aut necessitatibus totam\\nomnis rerum consequatur expedita quidem cumque explicabo'},\n", + " {'userId': 3,\n", + " 'id': 21,\n", + " 'title': 'asperiores ea ipsam voluptatibus modi minima quia sint',\n", + " 'body': 'repellat aliquid praesentium dolorem quo\\nsed totam minus non itaque\\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\\ntempora et tenetur expedita sunt'},\n", + " {'userId': 3,\n", + " 'id': 22,\n", + " 'title': 'dolor sint quo a velit explicabo quia nam',\n", + " 'body': 'eos qui et ipsum ipsam suscipit aut\\nsed omnis non odio\\nexpedita earum mollitia molestiae aut atque rem suscipit\\nnam impedit esse'},\n", + " {'userId': 3,\n", + " 'id': 23,\n", + " 'title': 'maxime id vitae nihil numquam',\n", + " 'body': 'veritatis unde neque eligendi\\nquae quod architecto quo neque vitae\\nest illo sit tempora doloremque fugit quod\\net et vel beatae sequi ullam sed tenetur perspiciatis'},\n", + " {'userId': 3,\n", + " 'id': 24,\n", + " 'title': 'autem hic labore sunt dolores incidunt',\n", + " 'body': 'enim et ex nulla\\nomnis voluptas quia qui\\nvoluptatem consequatur numquam aliquam sunt\\ntotam recusandae id dignissimos aut sed asperiores deserunt'},\n", + " {'userId': 3,\n", + " 'id': 25,\n", + " 'title': 'rem alias distinctio quo quis',\n", + " 'body': 'ullam consequatur ut\\nomnis quis sit vel consequuntur\\nipsa eligendi ipsum molestiae et omnis error nostrum\\nmolestiae illo tempore quia et distinctio'},\n", + " {'userId': 3,\n", + " 'id': 26,\n", + " 'title': 'est et quae odit qui non',\n", + " 'body': 'similique esse doloribus nihil accusamus\\nomnis dolorem fuga consequuntur reprehenderit fugit recusandae temporibus\\nperspiciatis cum ut laudantium\\nomnis aut molestiae vel vero'},\n", + " {'userId': 3,\n", + " 'id': 27,\n", + " 'title': 'quasi id et eos tenetur aut quo autem',\n", + " 'body': 'eum sed dolores ipsam sint possimus debitis occaecati\\ndebitis qui qui et\\nut placeat enim earum aut odit facilis\\nconsequatur suscipit necessitatibus rerum sed inventore temporibus consequatur'},\n", + " {'userId': 3,\n", + " 'id': 28,\n", + " 'title': 'delectus ullam et corporis nulla voluptas sequi',\n", + " 'body': 'non et quaerat ex quae ad maiores\\nmaiores recusandae totam aut blanditiis mollitia quas illo\\nut voluptatibus voluptatem\\nsimilique nostrum eum'},\n", + " {'userId': 3,\n", + " 'id': 29,\n", + " 'title': 'iusto eius quod necessitatibus culpa ea',\n", + " 'body': 'odit magnam ut saepe sed non qui\\ntempora atque nihil\\naccusamus illum doloribus illo dolor\\neligendi repudiandae odit magni similique sed cum maiores'},\n", + " {'userId': 3,\n", + " 'id': 30,\n", + " 'title': 'a quo magni similique perferendis',\n", + " 'body': 'alias dolor cumque\\nimpedit blanditiis non eveniet odio maxime\\nblanditiis amet eius quis tempora quia autem rem\\na provident perspiciatis quia'},\n", + " {'userId': 4,\n", + " 'id': 31,\n", + " 'title': 'ullam ut quidem id aut vel consequuntur',\n", + " 'body': 'debitis eius sed quibusdam non quis consectetur vitae\\nimpedit ut qui consequatur sed aut in\\nquidem sit nostrum et maiores adipisci atque\\nquaerat voluptatem adipisci repudiandae'},\n", + " {'userId': 4,\n", + " 'id': 32,\n", + " 'title': 'doloremque illum aliquid sunt',\n", + " 'body': 'deserunt eos nobis asperiores et hic\\nest debitis repellat molestiae optio\\nnihil ratione ut eos beatae quibusdam distinctio maiores\\nearum voluptates et aut adipisci ea maiores voluptas maxime'},\n", + " {'userId': 4,\n", + " 'id': 33,\n", + " 'title': 'qui explicabo molestiae dolorem',\n", + " 'body': 'rerum ut et numquam laborum odit est sit\\nid qui sint in\\nquasi tenetur tempore aperiam et quaerat qui in\\nrerum officiis sequi cumque quod'},\n", + " {'userId': 4,\n", + " 'id': 34,\n", + " 'title': 'magnam ut rerum iure',\n", + " 'body': 'ea velit perferendis earum ut voluptatem voluptate itaque iusto\\ntotam pariatur in\\nnemo voluptatem voluptatem autem magni tempora minima in\\nest distinctio qui assumenda accusamus dignissimos officia nesciunt nobis'},\n", + " {'userId': 4,\n", + " 'id': 35,\n", + " 'title': 'id nihil consequatur molestias animi provident',\n", + " 'body': 'nisi error delectus possimus ut eligendi vitae\\nplaceat eos harum cupiditate facilis reprehenderit voluptatem beatae\\nmodi ducimus quo illum voluptas eligendi\\net nobis quia fugit'},\n", + " {'userId': 4,\n", + " 'id': 36,\n", + " 'title': 'fuga nam accusamus voluptas reiciendis itaque',\n", + " 'body': 'ad mollitia et omnis minus architecto odit\\nvoluptas doloremque maxime aut non ipsa qui alias veniam\\nblanditiis culpa aut quia nihil cumque facere et occaecati\\nqui aspernatur quia eaque ut aperiam inventore'},\n", + " {'userId': 4,\n", + " 'id': 37,\n", + " 'title': 'provident vel ut sit ratione est',\n", + " 'body': 'debitis et eaque non officia sed nesciunt pariatur vel\\nvoluptatem iste vero et ea\\nnumquam aut expedita ipsum nulla in\\nvoluptates omnis consequatur aut enim officiis in quam qui'},\n", + " {'userId': 4,\n", + " 'id': 38,\n", + " 'title': 'explicabo et eos deleniti nostrum ab id repellendus',\n", + " 'body': 'animi esse sit aut sit nesciunt assumenda eum voluptas\\nquia voluptatibus provident quia necessitatibus ea\\nrerum repudiandae quia voluptatem delectus fugit aut id quia\\nratione optio eos iusto veniam iure'},\n", + " {'userId': 4,\n", + " 'id': 39,\n", + " 'title': 'eos dolorem iste accusantium est eaque quam',\n", + " 'body': 'corporis rerum ducimus vel eum accusantium\\nmaxime aspernatur a porro possimus iste omnis\\nest in deleniti asperiores fuga aut\\nvoluptas sapiente vel dolore minus voluptatem incidunt ex'},\n", + " {'userId': 4,\n", + " 'id': 40,\n", + " 'title': 'enim quo cumque',\n", + " 'body': 'ut voluptatum aliquid illo tenetur nemo sequi quo facilis\\nipsum rem optio mollitia quas\\nvoluptatem eum voluptas qui\\nunde omnis voluptatem iure quasi maxime voluptas nam'},\n", + " {'userId': 5,\n", + " 'id': 41,\n", + " 'title': 'non est facere',\n", + " 'body': 'molestias id nostrum\\nexcepturi molestiae dolore omnis repellendus quaerat saepe\\nconsectetur iste quaerat tenetur asperiores accusamus ex ut\\nnam quidem est ducimus sunt debitis saepe'},\n", + " {'userId': 5,\n", + " 'id': 42,\n", + " 'title': 'commodi ullam sint et excepturi error explicabo praesentium voluptas',\n", + " 'body': 'odio fugit voluptatum ducimus earum autem est incidunt voluptatem\\nodit reiciendis aliquam sunt sequi nulla dolorem\\nnon facere repellendus voluptates quia\\nratione harum vitae ut'},\n", + " {'userId': 5,\n", + " 'id': 43,\n", + " 'title': 'eligendi iste nostrum consequuntur adipisci praesentium sit beatae perferendis',\n", + " 'body': 'similique fugit est\\nillum et dolorum harum et voluptate eaque quidem\\nexercitationem quos nam commodi possimus cum odio nihil nulla\\ndolorum exercitationem magnam ex et a et distinctio debitis'},\n", + " {'userId': 5,\n", + " 'id': 44,\n", + " 'title': 'optio dolor molestias sit',\n", + " 'body': 'temporibus est consectetur dolore\\net libero debitis vel velit laboriosam quia\\nipsum quibusdam qui itaque fuga rem aut\\nea et iure quam sed maxime ut distinctio quae'},\n", + " {'userId': 5,\n", + " 'id': 45,\n", + " 'title': 'ut numquam possimus omnis eius suscipit laudantium iure',\n", + " 'body': 'est natus reiciendis nihil possimus aut provident\\nex et dolor\\nrepellat pariatur est\\nnobis rerum repellendus dolorem autem'},\n", + " {'userId': 5,\n", + " 'id': 46,\n", + " 'title': 'aut quo modi neque nostrum ducimus',\n", + " 'body': 'voluptatem quisquam iste\\nvoluptatibus natus officiis facilis dolorem\\nquis quas ipsam\\nvel et voluptatum in aliquid'},\n", + " {'userId': 5,\n", + " 'id': 47,\n", + " 'title': 'quibusdam cumque rem aut deserunt',\n", + " 'body': 'voluptatem assumenda ut qui ut cupiditate aut impedit veniam\\noccaecati nemo illum voluptatem laudantium\\nmolestiae beatae rerum ea iure soluta nostrum\\neligendi et voluptate'},\n", + " {'userId': 5,\n", + " 'id': 48,\n", + " 'title': 'ut voluptatem illum ea doloribus itaque eos',\n", + " 'body': 'voluptates quo voluptatem facilis iure occaecati\\nvel assumenda rerum officia et\\nillum perspiciatis ab deleniti\\nlaudantium repellat ad ut et autem reprehenderit'},\n", + " {'userId': 5,\n", + " 'id': 49,\n", + " 'title': 'laborum non sunt aut ut assumenda perspiciatis voluptas',\n", + " 'body': 'inventore ab sint\\nnatus fugit id nulla sequi architecto nihil quaerat\\neos tenetur in in eum veritatis non\\nquibusdam officiis aspernatur cumque aut commodi aut'},\n", + " {'userId': 5,\n", + " 'id': 50,\n", + " 'title': 'repellendus qui recusandae incidunt voluptates tenetur qui omnis exercitationem',\n", + " 'body': 'error suscipit maxime adipisci consequuntur recusandae\\nvoluptas eligendi et est et voluptates\\nquia distinctio ab amet quaerat molestiae et vitae\\nadipisci impedit sequi nesciunt quis consectetur'},\n", + " {'userId': 6,\n", + " 'id': 51,\n", + " 'title': 'soluta aliquam aperiam consequatur illo quis voluptas',\n", + " 'body': 'sunt dolores aut doloribus\\ndolore doloribus voluptates tempora et\\ndoloremque et quo\\ncum asperiores sit consectetur dolorem'},\n", + " {'userId': 6,\n", + " 'id': 52,\n", + " 'title': 'qui enim et consequuntur quia animi quis voluptate quibusdam',\n", + " 'body': 'iusto est quibusdam fuga quas quaerat molestias\\na enim ut sit accusamus enim\\ntemporibus iusto accusantium provident architecto\\nsoluta esse reprehenderit qui laborum'},\n", + " {'userId': 6,\n", + " 'id': 53,\n", + " 'title': 'ut quo aut ducimus alias',\n", + " 'body': 'minima harum praesentium eum rerum illo dolore\\nquasi exercitationem rerum nam\\nporro quis neque quo\\nconsequatur minus dolor quidem veritatis sunt non explicabo similique'},\n", + " {'userId': 6,\n", + " 'id': 54,\n", + " 'title': 'sit asperiores ipsam eveniet odio non quia',\n", + " 'body': 'totam corporis dignissimos\\nvitae dolorem ut occaecati accusamus\\nex velit deserunt\\net exercitationem vero incidunt corrupti mollitia'},\n", + " {'userId': 6,\n", + " 'id': 55,\n", + " 'title': 'sit vel voluptatem et non libero',\n", + " 'body': 'debitis excepturi ea perferendis harum libero optio\\neos accusamus cum fuga ut sapiente repudiandae\\net ut incidunt omnis molestiae\\nnihil ut eum odit'},\n", + " {'userId': 6,\n", + " 'id': 56,\n", + " 'title': 'qui et at rerum necessitatibus',\n", + " 'body': 'aut est omnis dolores\\nneque rerum quod ea rerum velit pariatur beatae excepturi\\net provident voluptas corrupti\\ncorporis harum reprehenderit dolores eligendi'},\n", + " {'userId': 6,\n", + " 'id': 57,\n", + " 'title': 'sed ab est est',\n", + " 'body': 'at pariatur consequuntur earum quidem\\nquo est laudantium soluta voluptatem\\nqui ullam et est\\net cum voluptas voluptatum repellat est'},\n", + " {'userId': 6,\n", + " 'id': 58,\n", + " 'title': 'voluptatum itaque dolores nisi et quasi',\n", + " 'body': 'veniam voluptatum quae adipisci id\\net id quia eos ad et dolorem\\naliquam quo nisi sunt eos impedit error\\nad similique veniam'},\n", + " {'userId': 6,\n", + " 'id': 59,\n", + " 'title': 'qui commodi dolor at maiores et quis id accusantium',\n", + " 'body': 'perspiciatis et quam ea autem temporibus non voluptatibus qui\\nbeatae a earum officia nesciunt dolores suscipit voluptas et\\nanimi doloribus cum rerum quas et magni\\net hic ut ut commodi expedita sunt'},\n", + " {'userId': 6,\n", + " 'id': 60,\n", + " 'title': 'consequatur placeat omnis quisquam quia reprehenderit fugit veritatis facere',\n", + " 'body': 'asperiores sunt ab assumenda cumque modi velit\\nqui esse omnis\\nvoluptate et fuga perferendis voluptas\\nillo ratione amet aut et omnis'},\n", + " {'userId': 7,\n", + " 'id': 61,\n", + " 'title': 'voluptatem doloribus consectetur est ut ducimus',\n", + " 'body': 'ab nemo optio odio\\ndelectus tenetur corporis similique nobis repellendus rerum omnis facilis\\nvero blanditiis debitis in nesciunt doloribus dicta dolores\\nmagnam minus velit'},\n", + " {'userId': 7,\n", + " 'id': 62,\n", + " 'title': 'beatae enim quia vel',\n", + " 'body': 'enim aspernatur illo distinctio quae praesentium\\nbeatae alias amet delectus qui voluptate distinctio\\nodit sint accusantium autem omnis\\nquo molestiae omnis ea eveniet optio'},\n", + " {'userId': 7,\n", + " 'id': 63,\n", + " 'title': 'voluptas blanditiis repellendus animi ducimus error sapiente et suscipit',\n", + " 'body': 'enim adipisci aspernatur nemo\\nnumquam omnis facere dolorem dolor ex quis temporibus incidunt\\nab delectus culpa quo reprehenderit blanditiis asperiores\\naccusantium ut quam in voluptatibus voluptas ipsam dicta'},\n", + " {'userId': 7,\n", + " 'id': 64,\n", + " 'title': 'et fugit quas eum in in aperiam quod',\n", + " 'body': 'id velit blanditiis\\neum ea voluptatem\\nmolestiae sint occaecati est eos perspiciatis\\nincidunt a error provident eaque aut aut qui'},\n", + " {'userId': 7,\n", + " 'id': 65,\n", + " 'title': 'consequatur id enim sunt et et',\n", + " 'body': 'voluptatibus ex esse\\nsint explicabo est aliquid cumque adipisci fuga repellat labore\\nmolestiae corrupti ex saepe at asperiores et perferendis\\nnatus id esse incidunt pariatur'},\n", + " {'userId': 7,\n", + " 'id': 66,\n", + " 'title': 'repudiandae ea animi iusto',\n", + " 'body': 'officia veritatis tenetur vero qui itaque\\nsint non ratione\\nsed et ut asperiores iusto eos molestiae nostrum\\nveritatis quibusdam et nemo iusto saepe'},\n", + " {'userId': 7,\n", + " 'id': 67,\n", + " 'title': 'aliquid eos sed fuga est maxime repellendus',\n", + " 'body': 'reprehenderit id nostrum\\nvoluptas doloremque pariatur sint et accusantium quia quod aspernatur\\net fugiat amet\\nnon sapiente et consequatur necessitatibus molestiae'},\n", + " {'userId': 7,\n", + " 'id': 68,\n", + " 'title': 'odio quis facere architecto reiciendis optio',\n", + " 'body': 'magnam molestiae perferendis quisquam\\nqui cum reiciendis\\nquaerat animi amet hic inventore\\nea quia deleniti quidem saepe porro velit'},\n", + " {'userId': 7,\n", + " 'id': 69,\n", + " 'title': 'fugiat quod pariatur odit minima',\n", + " 'body': 'officiis error culpa consequatur modi asperiores et\\ndolorum assumenda voluptas et vel qui aut vel rerum\\nvoluptatum quisquam perspiciatis quia rerum consequatur totam quas\\nsequi commodi repudiandae asperiores et saepe a'},\n", + " {'userId': 7,\n", + " 'id': 70,\n", + " 'title': 'voluptatem laborum magni',\n", + " 'body': 'sunt repellendus quae\\nest asperiores aut deleniti esse accusamus repellendus quia aut\\nquia dolorem unde\\neum tempora esse dolore'},\n", + " {'userId': 8,\n", + " 'id': 71,\n", + " 'title': 'et iusto veniam et illum aut fuga',\n", + " 'body': 'occaecati a doloribus\\niste saepe consectetur placeat eum voluptate dolorem et\\nqui quo quia voluptas\\nrerum ut id enim velit est perferendis'},\n", + " {'userId': 8,\n", + " 'id': 72,\n", + " 'title': 'sint hic doloribus consequatur eos non id',\n", + " 'body': 'quam occaecati qui deleniti consectetur\\nconsequatur aut facere quas exercitationem aliquam hic voluptas\\nneque id sunt ut aut accusamus\\nsunt consectetur expedita inventore velit'},\n", + " {'userId': 8,\n", + " 'id': 73,\n", + " 'title': 'consequuntur deleniti eos quia temporibus ab aliquid at',\n", + " 'body': 'voluptatem cumque tenetur consequatur expedita ipsum nemo quia explicabo\\naut eum minima consequatur\\ntempore cumque quae est et\\net in consequuntur voluptatem voluptates aut'},\n", + " {'userId': 8,\n", + " 'id': 74,\n", + " 'title': 'enim unde ratione doloribus quas enim ut sit sapiente',\n", + " 'body': 'odit qui et et necessitatibus sint veniam\\nmollitia amet doloremque molestiae commodi similique magnam et quam\\nblanditiis est itaque\\nquo et tenetur ratione occaecati molestiae tempora'},\n", + " {'userId': 8,\n", + " 'id': 75,\n", + " 'title': 'dignissimos eum dolor ut enim et delectus in',\n", + " 'body': 'commodi non non omnis et voluptas sit\\nautem aut nobis magnam et sapiente voluptatem\\net laborum repellat qui delectus facilis temporibus\\nrerum amet et nemo voluptate expedita adipisci error dolorem'},\n", + " {'userId': 8,\n", + " 'id': 76,\n", + " 'title': 'doloremque officiis ad et non perferendis',\n", + " 'body': 'ut animi facere\\ntotam iusto tempore\\nmolestiae eum aut et dolorem aperiam\\nquaerat recusandae totam odio'},\n", + " {'userId': 8,\n", + " 'id': 77,\n", + " 'title': 'necessitatibus quasi exercitationem odio',\n", + " 'body': 'modi ut in nulla repudiandae dolorum nostrum eos\\naut consequatur omnis\\nut incidunt est omnis iste et quam\\nvoluptates sapiente aliquam asperiores nobis amet corrupti repudiandae provident'},\n", + " {'userId': 8,\n", + " 'id': 78,\n", + " 'title': 'quam voluptatibus rerum veritatis',\n", + " 'body': 'nobis facilis odit tempore cupiditate quia\\nassumenda doloribus rerum qui ea\\nillum et qui totam\\naut veniam repellendus'},\n", + " {'userId': 8,\n", + " 'id': 79,\n", + " 'title': 'pariatur consequatur quia magnam autem omnis non amet',\n", + " 'body': 'libero accusantium et et facere incidunt sit dolorem\\nnon excepturi qui quia sed laudantium\\nquisquam molestiae ducimus est\\nofficiis esse molestiae iste et quos'},\n", + " {'userId': 8,\n", + " 'id': 80,\n", + " 'title': 'labore in ex et explicabo corporis aut quas',\n", + " 'body': 'ex quod dolorem ea eum iure qui provident amet\\nquia qui facere excepturi et repudiandae\\nasperiores molestias provident\\nminus incidunt vero fugit rerum sint sunt excepturi provident'},\n", + " {'userId': 9,\n", + " 'id': 81,\n", + " 'title': 'tempora rem veritatis voluptas quo dolores vero',\n", + " 'body': 'facere qui nesciunt est voluptatum voluptatem nisi\\nsequi eligendi necessitatibus ea at rerum itaque\\nharum non ratione velit laboriosam quis consequuntur\\nex officiis minima doloremque voluptas ut aut'},\n", + " {'userId': 9,\n", + " 'id': 82,\n", + " 'title': 'laudantium voluptate suscipit sunt enim enim',\n", + " 'body': 'ut libero sit aut totam inventore sunt\\nporro sint qui sunt molestiae\\nconsequatur cupiditate qui iste ducimus adipisci\\ndolor enim assumenda soluta laboriosam amet iste delectus hic'},\n", + " {'userId': 9,\n", + " 'id': 83,\n", + " 'title': 'odit et voluptates doloribus alias odio et',\n", + " 'body': 'est molestiae facilis quis tempora numquam nihil qui\\nvoluptate sapiente consequatur est qui\\nnecessitatibus autem aut ipsa aperiam modi dolore numquam\\nreprehenderit eius rem quibusdam'},\n", + " {'userId': 9,\n", + " 'id': 84,\n", + " 'title': 'optio ipsam molestias necessitatibus occaecati facilis veritatis dolores aut',\n", + " 'body': 'sint molestiae magni a et quos\\neaque et quasi\\nut rerum debitis similique veniam\\nrecusandae dignissimos dolor incidunt consequatur odio'},\n", + " {'userId': 9,\n", + " 'id': 85,\n", + " 'title': 'dolore veritatis porro provident adipisci blanditiis et sunt',\n", + " 'body': 'similique sed nisi voluptas iusto omnis\\nmollitia et quo\\nassumenda suscipit officia magnam sint sed tempora\\nenim provident pariatur praesentium atque animi amet ratione'},\n", + " {'userId': 9,\n", + " 'id': 86,\n", + " 'title': 'placeat quia et porro iste',\n", + " 'body': 'quasi excepturi consequatur iste autem temporibus sed molestiae beatae\\net quaerat et esse ut\\nvoluptatem occaecati et vel explicabo autem\\nasperiores pariatur deserunt optio'},\n", + " {'userId': 9,\n", + " 'id': 87,\n", + " 'title': 'nostrum quis quasi placeat',\n", + " 'body': 'eos et molestiae\\nnesciunt ut a\\ndolores perspiciatis repellendus repellat aliquid\\nmagnam sint rem ipsum est'},\n", + " {'userId': 9,\n", + " 'id': 88,\n", + " 'title': 'sapiente omnis fugit eos',\n", + " 'body': 'consequatur omnis est praesentium\\nducimus non iste\\nneque hic deserunt\\nvoluptatibus veniam cum et rerum sed'},\n", + " {'userId': 9,\n", + " 'id': 89,\n", + " 'title': 'sint soluta et vel magnam aut ut sed qui',\n", + " 'body': 'repellat aut aperiam totam temporibus autem et\\narchitecto magnam ut\\nconsequatur qui cupiditate rerum quia soluta dignissimos nihil iure\\ntempore quas est'},\n", + " {'userId': 9,\n", + " 'id': 90,\n", + " 'title': 'ad iusto omnis odit dolor voluptatibus',\n", + " 'body': 'minus omnis soluta quia\\nqui sed adipisci voluptates illum ipsam voluptatem\\neligendi officia ut in\\neos soluta similique molestias praesentium blanditiis'},\n", + " {'userId': 10,\n", + " 'id': 91,\n", + " 'title': 'aut amet sed',\n", + " 'body': 'libero voluptate eveniet aperiam sed\\nsunt placeat suscipit molestias\\nsimilique fugit nam natus\\nexpedita consequatur consequatur dolores quia eos et placeat'},\n", + " {'userId': 10,\n", + " 'id': 92,\n", + " 'title': 'ratione ex tenetur perferendis',\n", + " 'body': 'aut et excepturi dicta laudantium sint rerum nihil\\nlaudantium et at\\na neque minima officia et similique libero et\\ncommodi voluptate qui'},\n", + " {'userId': 10,\n", + " 'id': 93,\n", + " 'title': 'beatae soluta recusandae',\n", + " 'body': 'dolorem quibusdam ducimus consequuntur dicta aut quo laboriosam\\nvoluptatem quis enim recusandae ut sed sunt\\nnostrum est odit totam\\nsit error sed sunt eveniet provident qui nulla'},\n", + " {'userId': 10,\n", + " 'id': 94,\n", + " 'title': 'qui qui voluptates illo iste minima',\n", + " 'body': 'aspernatur expedita soluta quo ab ut similique\\nexpedita dolores amet\\nsed temporibus distinctio magnam saepe deleniti\\nomnis facilis nam ipsum natus sint similique omnis'},\n", + " {'userId': 10,\n", + " 'id': 95,\n", + " 'title': 'id minus libero illum nam ad officiis',\n", + " 'body': 'earum voluptatem facere provident blanditiis velit laboriosam\\npariatur accusamus odio saepe\\ncumque dolor qui a dicta ab doloribus consequatur omnis\\ncorporis cupiditate eaque assumenda ad nesciunt'},\n", + " {'userId': 10,\n", + " 'id': 96,\n", + " 'title': 'quaerat velit veniam amet cupiditate aut numquam ut sequi',\n", + " 'body': 'in non odio excepturi sint eum\\nlabore voluptates vitae quia qui et\\ninventore itaque rerum\\nveniam non exercitationem delectus aut'},\n", + " {'userId': 10,\n", + " 'id': 97,\n", + " 'title': 'quas fugiat ut perspiciatis vero provident',\n", + " 'body': 'eum non blanditiis soluta porro quibusdam voluptas\\nvel voluptatem qui placeat dolores qui velit aut\\nvel inventore aut cumque culpa explicabo aliquid at\\nperspiciatis est et voluptatem dignissimos dolor itaque sit nam'},\n", + " {'userId': 10,\n", + " 'id': 98,\n", + " 'title': 'laboriosam dolor voluptates',\n", + " 'body': 'doloremque ex facilis sit sint culpa\\nsoluta assumenda eligendi non ut eius\\nsequi ducimus vel quasi\\nveritatis est dolores'},\n", + " {'userId': 10,\n", + " 'id': 99,\n", + " 'title': 'temporibus sit alias delectus eligendi possimus magni',\n", + " 'body': 'quo deleniti praesentium dicta non quod\\naut est molestias\\nmolestias et officia quis nihil\\nitaque dolorem quia'},\n", + " {'userId': 10,\n", + " 'id': 100,\n", + " 'title': 'at nam consequatur ea labore ea harum',\n", + " 'body': 'cupiditate quo est a modi nesciunt soluta\\nipsa voluptas error itaque dicta in\\nautem qui minus magnam et distinctio eum\\naccusamus ratione error aut'}]" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "55860a61-56dd-41d2-b6f5-a540dff42820", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'userId': 1,\n", + " 'id': 1,\n", + " 'title': 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit',\n", + " 'body': 'quia et suscipit\\nsuscipit recusandae consequuntur expedita et cum\\nreprehenderit molestiae ut ut quas totam\\nnostrum rerum est autem sunt rem eveniet architecto'},\n", + " {'userId': 1,\n", + " 'id': 2,\n", + " 'title': 'qui est esse',\n", + " 'body': 'est rerum tempore vitae\\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\\nqui aperiam non debitis possimus qui neque nisi nulla'},\n", + " {'userId': 1,\n", + " 'id': 3,\n", + " 'title': 'ea molestias quasi exercitationem repellat qui ipsa sit aut',\n", + " 'body': 'et iusto sed quo iure\\nvoluptatem occaecati omnis eligendi aut ad\\nvoluptatem doloribus vel accusantium quis pariatur\\nmolestiae porro eius odio et labore et velit aut'},\n", + " {'userId': 1,\n", + " 'id': 4,\n", + " 'title': 'eum et est occaecati',\n", + " 'body': 'ullam et saepe reiciendis voluptatem adipisci\\nsit amet autem assumenda provident rerum culpa\\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\\nquis sunt voluptatem rerum illo velit'},\n", + " {'userId': 1,\n", + " 'id': 5,\n", + " 'title': 'nesciunt quas odio',\n", + " 'body': 'repudiandae veniam quaerat sunt sed\\nalias aut fugiat sit autem sed est\\nvoluptatem omnis possimus esse voluptatibus quis\\nest aut tenetur dolor neque'}]" + ] + }, + "execution_count": 47, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = {\n", + " \"_limit\": 5,\n", + "}\n", + "response = requests.get(json_placeholder_posts_url, params=params)\n", + "print(response)\n", + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "id": "b2a63f5c-d58f-4d04-a675-9c7a3baf249d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'userId': 2,\n", + " 'id': 11,\n", + " 'title': 'et ea vero quia laudantium autem',\n", + " 'body': 'delectus reiciendis molestiae occaecati non minima eveniet qui voluptatibus\\naccusamus in eum beatae sit\\nvel qui neque voluptates ut commodi qui incidunt\\nut animi commodi'},\n", + " {'userId': 2,\n", + " 'id': 12,\n", + " 'title': 'in quibusdam tempore odit est dolorem',\n", + " 'body': 'itaque id aut magnam\\npraesentium quia et ea odit et ea voluptas et\\nsapiente quia nihil amet occaecati quia id voluptatem\\nincidunt ea est distinctio odio'},\n", + " {'userId': 2,\n", + " 'id': 13,\n", + " 'title': 'dolorum ut in voluptas mollitia et saepe quo animi',\n", + " 'body': 'aut dicta possimus sint mollitia voluptas commodi quo doloremque\\niste corrupti reiciendis voluptatem eius rerum\\nsit cumque quod eligendi laborum minima\\nperferendis recusandae assumenda consectetur porro architecto ipsum ipsam'},\n", + " {'userId': 2,\n", + " 'id': 14,\n", + " 'title': 'voluptatem eligendi optio',\n", + " 'body': 'fuga et accusamus dolorum perferendis illo voluptas\\nnon doloremque neque facere\\nad qui dolorum molestiae beatae\\nsed aut voluptas totam sit illum'},\n", + " {'userId': 2,\n", + " 'id': 15,\n", + " 'title': 'eveniet quod temporibus',\n", + " 'body': 'reprehenderit quos placeat\\nvelit minima officia dolores impedit repudiandae molestiae nam\\nvoluptas recusandae quis delectus\\nofficiis harum fugiat vitae'}]" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = {\n", + " \"_limit\": 5,\n", + " \"_page\": 3,\n", + "}\n", + "response = requests.get(json_placeholder_posts_url, params=params)\n", + "print(response)\n", + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "69cbb43e-9915-4f5a-966b-20b826f98f2a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'userId': 3,\n", + " 'id': 21,\n", + " 'title': 'asperiores ea ipsam voluptatibus modi minima quia sint',\n", + " 'body': 'repellat aliquid praesentium dolorem quo\\nsed totam minus non itaque\\nnihil labore molestiae sunt dolor eveniet hic recusandae veniam\\ntempora et tenetur expedita sunt'},\n", + " {'userId': 3,\n", + " 'id': 22,\n", + " 'title': 'dolor sint quo a velit explicabo quia nam',\n", + " 'body': 'eos qui et ipsum ipsam suscipit aut\\nsed omnis non odio\\nexpedita earum mollitia molestiae aut atque rem suscipit\\nnam impedit esse'},\n", + " {'userId': 3,\n", + " 'id': 23,\n", + " 'title': 'maxime id vitae nihil numquam',\n", + " 'body': 'veritatis unde neque eligendi\\nquae quod architecto quo neque vitae\\nest illo sit tempora doloremque fugit quod\\net et vel beatae sequi ullam sed tenetur perspiciatis'},\n", + " {'userId': 3,\n", + " 'id': 24,\n", + " 'title': 'autem hic labore sunt dolores incidunt',\n", + " 'body': 'enim et ex nulla\\nomnis voluptas quia qui\\nvoluptatem consequatur numquam aliquam sunt\\ntotam recusandae id dignissimos aut sed asperiores deserunt'},\n", + " {'userId': 3,\n", + " 'id': 25,\n", + " 'title': 'rem alias distinctio quo quis',\n", + " 'body': 'ullam consequatur ut\\nomnis quis sit vel consequuntur\\nipsa eligendi ipsum molestiae et omnis error nostrum\\nmolestiae illo tempore quia et distinctio'},\n", + " {'userId': 3,\n", + " 'id': 26,\n", + " 'title': 'est et quae odit qui non',\n", + " 'body': 'similique esse doloribus nihil accusamus\\nomnis dolorem fuga consequuntur reprehenderit fugit recusandae temporibus\\nperspiciatis cum ut laudantium\\nomnis aut molestiae vel vero'},\n", + " {'userId': 3,\n", + " 'id': 27,\n", + " 'title': 'quasi id et eos tenetur aut quo autem',\n", + " 'body': 'eum sed dolores ipsam sint possimus debitis occaecati\\ndebitis qui qui et\\nut placeat enim earum aut odit facilis\\nconsequatur suscipit necessitatibus rerum sed inventore temporibus consequatur'},\n", + " {'userId': 3,\n", + " 'id': 28,\n", + " 'title': 'delectus ullam et corporis nulla voluptas sequi',\n", + " 'body': 'non et quaerat ex quae ad maiores\\nmaiores recusandae totam aut blanditiis mollitia quas illo\\nut voluptatibus voluptatem\\nsimilique nostrum eum'},\n", + " {'userId': 3,\n", + " 'id': 29,\n", + " 'title': 'iusto eius quod necessitatibus culpa ea',\n", + " 'body': 'odit magnam ut saepe sed non qui\\ntempora atque nihil\\naccusamus illum doloribus illo dolor\\neligendi repudiandae odit magni similique sed cum maiores'},\n", + " {'userId': 3,\n", + " 'id': 30,\n", + " 'title': 'a quo magni similique perferendis',\n", + " 'body': 'alias dolor cumque\\nimpedit blanditiis non eveniet odio maxime\\nblanditiis amet eius quis tempora quia autem rem\\na provident perspiciatis quia'}]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "params = {\n", + " \"_limit\": 10,\n", + " \"_page\": 3,\n", + "}\n", + "response = requests.get(json_placeholder_posts_url, params=params)\n", + "print(response)\n", + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "6b038f4d-4854-40e0-8d30-3c89e7b03ba6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "text/plain": [ + "{'userId': 3,\n", + " 'id': 30,\n", + " 'title': 'a quo magni similique perferendis',\n", + " 'body': 'alias dolor cumque\\nimpedit blanditiis non eveniet odio maxime\\nblanditiis amet eius quis tempora quia autem rem\\na provident perspiciatis quia'}" + ] + }, + "execution_count": 50, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response = requests.get(json_placeholder_posts_url + \"/30\", params=params)\n", + "print(response)\n", + "response.json()" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "5deb9520-0f1c-4061-97d6-1a203d1fd91f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: beautifulsoup4 in ./venv/lib/python3.11/site-packages (4.12.2)\n", + "Requirement already satisfied: soupsieve>1.2 in ./venv/lib/python3.11/site-packages (from beautifulsoup4) (2.5)\n", + "\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.2.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.3.1\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "!pip install beautifulsoup4" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "0ff1c2b1-794d-4111-9d71-df75cf4936fc", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Help on class BeautifulSoup in module bs4:\n", + "\n", + "class BeautifulSoup(bs4.element.Tag)\n", + " | BeautifulSoup(markup='', features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, element_classes=None, **kwargs)\n", + " | \n", + " | A data structure representing a parsed HTML or XML document.\n", + " | \n", + " | Most of the methods you'll call on a BeautifulSoup object are inherited from\n", + " | PageElement or Tag.\n", + " | \n", + " | Internally, this class defines the basic interface called by the\n", + " | tree builders when converting an HTML/XML document into a data\n", + " | structure. The interface abstracts away the differences between\n", + " | parsers. To write a new tree builder, you'll need to understand\n", + " | these methods as a whole.\n", + " | \n", + " | These methods will be called by the BeautifulSoup constructor:\n", + " | * reset()\n", + " | * feed(markup)\n", + " | \n", + " | The tree builder may call these methods from its feed() implementation:\n", + " | * handle_starttag(name, attrs) # See note about return value\n", + " | * handle_endtag(name)\n", + " | * handle_data(data) # Appends to the current data node\n", + " | * endData(containerClass) # Ends the current data node\n", + " | \n", + " | No matter how complicated the underlying parser is, you should be\n", + " | able to build a tree using 'start tag' events, 'end tag' events,\n", + " | 'data' events, and \"done with data\" events.\n", + " | \n", + " | If you encounter an empty-element tag (aka a self-closing tag,\n", + " | like HTML's
tag), call handle_starttag and then\n", + " | handle_endtag.\n", + " | \n", + " | Method resolution order:\n", + " | BeautifulSoup\n", + " | bs4.element.Tag\n", + " | bs4.element.PageElement\n", + " | builtins.object\n", + " | \n", + " | Methods defined here:\n", + " | \n", + " | __getstate__(self)\n", + " | Helper for pickle.\n", + " | \n", + " | __init__(self, markup='', features=None, builder=None, parse_only=None, from_encoding=None, exclude_encodings=None, element_classes=None, **kwargs)\n", + " | Constructor.\n", + " | \n", + " | :param markup: A string or a file-like object representing\n", + " | markup to be parsed.\n", + " | \n", + " | :param features: Desirable features of the parser to be\n", + " | used. This may be the name of a specific parser (\"lxml\",\n", + " | \"lxml-xml\", \"html.parser\", or \"html5lib\") or it may be the\n", + " | type of markup to be used (\"html\", \"html5\", \"xml\"). It's\n", + " | recommended that you name a specific parser, so that\n", + " | Beautiful Soup gives you the same results across platforms\n", + " | and virtual environments.\n", + " | \n", + " | :param builder: A TreeBuilder subclass to instantiate (or\n", + " | instance to use) instead of looking one up based on\n", + " | `features`. You only need to use this if you've implemented a\n", + " | custom TreeBuilder.\n", + " | \n", + " | :param parse_only: A SoupStrainer. Only parts of the document\n", + " | matching the SoupStrainer will be considered. This is useful\n", + " | when parsing part of a document that would otherwise be too\n", + " | large to fit into memory.\n", + " | \n", + " | :param from_encoding: A string indicating the encoding of the\n", + " | document to be parsed. Pass this in if Beautiful Soup is\n", + " | guessing wrongly about the document's encoding.\n", + " | \n", + " | :param exclude_encodings: A list of strings indicating\n", + " | encodings known to be wrong. Pass this in if you don't know\n", + " | the document's encoding but you know Beautiful Soup's guess is\n", + " | wrong.\n", + " | \n", + " | :param element_classes: A dictionary mapping BeautifulSoup\n", + " | classes like Tag and NavigableString, to other classes you'd\n", + " | like to be instantiated instead as the parse tree is\n", + " | built. This is useful for subclassing Tag or NavigableString\n", + " | to modify default behavior.\n", + " | \n", + " | :param kwargs: For backwards compatibility purposes, the\n", + " | constructor accepts certain keyword arguments used in\n", + " | Beautiful Soup 3. None of these arguments do anything in\n", + " | Beautiful Soup 4; they will result in a warning and then be\n", + " | ignored.\n", + " | \n", + " | Apart from this, any keyword arguments passed into the\n", + " | BeautifulSoup constructor are propagated to the TreeBuilder\n", + " | constructor. This makes it possible to configure a\n", + " | TreeBuilder by passing in arguments, not just by saying which\n", + " | one to use.\n", + " | \n", + " | __setstate__(self, state)\n", + " | \n", + " | decode(self, pretty_print=False, eventual_encoding='utf-8', formatter='minimal', iterator=None)\n", + " | Returns a string or Unicode representation of the parse tree\n", + " | as an HTML or XML document.\n", + " | \n", + " | :param pretty_print: If this is True, indentation will be used to\n", + " | make the document more readable.\n", + " | :param eventual_encoding: The encoding of the final document.\n", + " | If this is None, the document will be a Unicode string.\n", + " | \n", + " | endData(self, containerClass=None)\n", + " | Method called by the TreeBuilder when the end of a data segment\n", + " | occurs.\n", + " | \n", + " | handle_data(self, data)\n", + " | Called by the tree builder when a chunk of textual data is encountered.\n", + " | \n", + " | handle_endtag(self, name, nsprefix=None)\n", + " | Called by the tree builder when an ending tag is encountered.\n", + " | \n", + " | :param name: Name of the tag.\n", + " | :param nsprefix: Namespace prefix for the tag.\n", + " | \n", + " | handle_starttag(self, name, namespace, nsprefix, attrs, sourceline=None, sourcepos=None, namespaces=None)\n", + " | Called by the tree builder when a new tag is encountered.\n", + " | \n", + " | :param name: Name of the tag.\n", + " | :param nsprefix: Namespace prefix for the tag.\n", + " | :param attrs: A dictionary of attribute values.\n", + " | :param sourceline: The line number where this tag was found in its\n", + " | source document.\n", + " | :param sourcepos: The character position within `sourceline` where this\n", + " | tag was found.\n", + " | :param namespaces: A dictionary of all namespace prefix mappings \n", + " | currently in scope in the document.\n", + " | \n", + " | If this method returns None, the tag was rejected by an active\n", + " | SoupStrainer. You should proceed as if the tag had not occurred\n", + " | in the document. For instance, if this was a self-closing tag,\n", + " | don't call handle_endtag.\n", + " | \n", + " | insert_after(self, *args)\n", + " | This method is part of the PageElement API, but `BeautifulSoup` doesn't implement\n", + " | it because there is nothing before or after it in the parse tree.\n", + " | \n", + " | insert_before(self, *args)\n", + " | This method is part of the PageElement API, but `BeautifulSoup` doesn't implement\n", + " | it because there is nothing before or after it in the parse tree.\n", + " | \n", + " | new_string(self, s, subclass=None)\n", + " | Create a new NavigableString associated with this BeautifulSoup\n", + " | object.\n", + " | \n", + " | new_tag(self, name, namespace=None, nsprefix=None, attrs={}, sourceline=None, sourcepos=None, **kwattrs)\n", + " | Create a new Tag associated with this BeautifulSoup object.\n", + " | \n", + " | :param name: The name of the new Tag.\n", + " | :param namespace: The URI of the new Tag's XML namespace, if any.\n", + " | :param prefix: The prefix for the new Tag's XML namespace, if any.\n", + " | :param attrs: A dictionary of this Tag's attribute values; can\n", + " | be used instead of `kwattrs` for attributes like 'class'\n", + " | that are reserved words in Python.\n", + " | :param sourceline: The line number where this tag was\n", + " | (purportedly) found in its source document.\n", + " | :param sourcepos: The character position within `sourceline` where this\n", + " | tag was (purportedly) found.\n", + " | :param kwattrs: Keyword arguments for the new Tag's attribute values.\n", + " | \n", + " | object_was_parsed(self, o, parent=None, most_recent_element=None)\n", + " | Method called by the TreeBuilder to integrate an object into the parse tree.\n", + " | \n", + " | popTag(self)\n", + " | Internal method called by _popToTag when a tag is closed.\n", + " | \n", + " | pushTag(self, tag)\n", + " | Internal method called by handle_starttag when a tag is opened.\n", + " | \n", + " | reset(self)\n", + " | Reset this object to a state as though it had never parsed any\n", + " | markup.\n", + " | \n", + " | string_container(self, base_class=None)\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data and other attributes defined here:\n", + " | \n", + " | ASCII_SPACES = ' \\n\\t\\x0c\\r'\n", + " | \n", + " | DEFAULT_BUILDER_FEATURES = ['html', 'fast']\n", + " | \n", + " | NO_PARSER_SPECIFIED_WARNING = 'No parser was explicitly specified, so ...\n", + " | \n", + " | ROOT_TAG_NAME = '[document]'\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Methods inherited from bs4.element.Tag:\n", + " | \n", + " | __bool__(self)\n", + " | A tag is non-None even if it has no contents.\n", + " | \n", + " | __call__(self, *args, **kwargs)\n", + " | Calling a Tag like a function is the same as calling its\n", + " | find_all() method. Eg. tag('a') returns a list of all the A tags\n", + " | found within this tag.\n", + " | \n", + " | __contains__(self, x)\n", + " | \n", + " | __copy__(self)\n", + " | A copy of a Tag must always be a deep copy, because a Tag's\n", + " | children can only have one parent at a time.\n", + " | \n", + " | __deepcopy__(self, memo, recursive=True)\n", + " | A deepcopy of a Tag is a new Tag, unconnected to the parse tree.\n", + " | Its contents are a copy of the old Tag's contents.\n", + " | \n", + " | __delitem__(self, key)\n", + " | Deleting tag[key] deletes all 'key' attributes for the tag.\n", + " | \n", + " | __eq__(self, other)\n", + " | Returns true iff this Tag has the same name, the same attributes,\n", + " | and the same contents (recursively) as `other`.\n", + " | \n", + " | __getattr__(self, tag)\n", + " | Calling tag.subtag is the same as calling tag.find(name=\"subtag\")\n", + " | \n", + " | __getitem__(self, key)\n", + " | tag[key] returns the value of the 'key' attribute for the Tag,\n", + " | and throws an exception if it's not there.\n", + " | \n", + " | __hash__(self)\n", + " | Return hash(self).\n", + " | \n", + " | __iter__(self)\n", + " | Iterating over a Tag iterates over its contents.\n", + " | \n", + " | __len__(self)\n", + " | The length of a Tag is the length of its list of contents.\n", + " | \n", + " | __ne__(self, other)\n", + " | Returns true iff this Tag is not identical to `other`,\n", + " | as defined in __eq__.\n", + " | \n", + " | __repr__ = __unicode__(self)\n", + " | \n", + " | __setitem__(self, key, value)\n", + " | Setting tag[key] sets the value of the 'key' attribute for the\n", + " | tag.\n", + " | \n", + " | __str__ = __unicode__(self)\n", + " | \n", + " | __unicode__(self)\n", + " | Renders this PageElement as a Unicode string.\n", + " | \n", + " | childGenerator(self)\n", + " | Deprecated generator.\n", + " | \n", + " | clear(self, decompose=False)\n", + " | Wipe out all children of this PageElement by calling extract()\n", + " | on them.\n", + " | \n", + " | :param decompose: If this is True, decompose() (a more\n", + " | destructive method) will be called instead of extract().\n", + " | \n", + " | decode_contents(self, indent_level=None, eventual_encoding='utf-8', formatter='minimal')\n", + " | Renders the contents of this tag as a Unicode string.\n", + " | \n", + " | :param indent_level: Each line of the rendering will be\n", + " | indented this many levels. (The formatter decides what a\n", + " | 'level' means in terms of spaces or other characters\n", + " | output.) Used internally in recursive calls while\n", + " | pretty-printing.\n", + " | \n", + " | :param eventual_encoding: The tag is destined to be\n", + " | encoded into this encoding. decode_contents() is _not_\n", + " | responsible for performing that encoding. This information\n", + " | is passed in so that it can be substituted in if the\n", + " | document contains a tag that mentions the document's\n", + " | encoding.\n", + " | \n", + " | :param formatter: A Formatter object, or a string naming one of\n", + " | the standard Formatters.\n", + " | \n", + " | decompose(self)\n", + " | Recursively destroys this PageElement and its children.\n", + " | \n", + " | This element will be removed from the tree and wiped out; so\n", + " | will everything beneath it.\n", + " | \n", + " | The behavior of a decomposed PageElement is undefined and you\n", + " | should never use one for anything, but if you need to _check_\n", + " | whether an element has been decomposed, you can use the\n", + " | `decomposed` property.\n", + " | \n", + " | encode(self, encoding='utf-8', indent_level=None, formatter='minimal', errors='xmlcharrefreplace')\n", + " | Render a bytestring representation of this PageElement and its\n", + " | contents.\n", + " | \n", + " | :param encoding: The destination encoding.\n", + " | :param indent_level: Each line of the rendering will be\n", + " | indented this many levels. (The formatter decides what a\n", + " | 'level' means in terms of spaces or other characters\n", + " | output.) Used internally in recursive calls while\n", + " | pretty-printing.\n", + " | :param formatter: A Formatter object, or a string naming one of\n", + " | the standard formatters.\n", + " | :param errors: An error handling strategy such as\n", + " | 'xmlcharrefreplace'. This value is passed along into\n", + " | encode() and its value should be one of the constants\n", + " | defined by Python.\n", + " | :return: A bytestring.\n", + " | \n", + " | encode_contents(self, indent_level=None, encoding='utf-8', formatter='minimal')\n", + " | Renders the contents of this PageElement as a bytestring.\n", + " | \n", + " | :param indent_level: Each line of the rendering will be\n", + " | indented this many levels. (The formatter decides what a\n", + " | 'level' means in terms of spaces or other characters\n", + " | output.) Used internally in recursive calls while\n", + " | pretty-printing.\n", + " | \n", + " | :param eventual_encoding: The bytestring will be in this encoding.\n", + " | \n", + " | :param formatter: A Formatter object, or a string naming one of\n", + " | the standard Formatters.\n", + " | \n", + " | :return: A bytestring.\n", + " | \n", + " | find(self, name=None, attrs={}, recursive=True, string=None, **kwargs)\n", + " | Look in the children of this PageElement and find the first\n", + " | PageElement that matches the given criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param recursive: If this is True, find() will perform a\n", + " | recursive search of this PageElement's children. Otherwise,\n", + " | only the direct children will be considered.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | findAll = find_all(self, name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)\n", + " | \n", + " | findChild = find(self, name=None, attrs={}, recursive=True, string=None, **kwargs)\n", + " | \n", + " | findChildren = find_all(self, name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)\n", + " | \n", + " | find_all(self, name=None, attrs={}, recursive=True, string=None, limit=None, **kwargs)\n", + " | Look in the children of this PageElement and find all\n", + " | PageElements that match the given criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param recursive: If this is True, find_all() will perform a\n", + " | recursive search of this PageElement's children. Otherwise,\n", + " | only the direct children will be considered.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A ResultSet of PageElements.\n", + " | :rtype: bs4.element.ResultSet\n", + " | \n", + " | get(self, key, default=None)\n", + " | Returns the value of the 'key' attribute for the tag, or\n", + " | the value given for 'default' if it doesn't have that\n", + " | attribute.\n", + " | \n", + " | get_attribute_list(self, key, default=None)\n", + " | The same as get(), but always returns a list.\n", + " | \n", + " | :param key: The attribute to look for.\n", + " | :param default: Use this value if the attribute is not present\n", + " | on this PageElement.\n", + " | :return: A list of values, probably containing only a single\n", + " | value.\n", + " | \n", + " | has_attr(self, key)\n", + " | Does this PageElement have an attribute with the given name?\n", + " | \n", + " | has_key(self, key)\n", + " | Deprecated method. This was kind of misleading because has_key()\n", + " | (attributes) was different from __in__ (contents).\n", + " | \n", + " | has_key() is gone in Python 3, anyway.\n", + " | \n", + " | index(self, element)\n", + " | Find the index of a child by identity, not value.\n", + " | \n", + " | Avoids issues with tag.contents.index(element) getting the\n", + " | index of equal elements.\n", + " | \n", + " | :param element: Look for this PageElement in `self.contents`.\n", + " | \n", + " | prettify(self, encoding=None, formatter='minimal')\n", + " | Pretty-print this PageElement as a string.\n", + " | \n", + " | :param encoding: The eventual encoding of the string. If this is None,\n", + " | a Unicode string will be returned.\n", + " | :param formatter: A Formatter object, or a string naming one of\n", + " | the standard formatters.\n", + " | :return: A Unicode string (if encoding==None) or a bytestring\n", + " | (otherwise).\n", + " | \n", + " | recursiveChildGenerator(self)\n", + " | Deprecated generator.\n", + " | \n", + " | renderContents(self, encoding='utf-8', prettyPrint=False, indentLevel=0)\n", + " | Deprecated method for BS3 compatibility.\n", + " | \n", + " | select(self, selector, namespaces=None, limit=None, **kwargs)\n", + " | Perform a CSS selection operation on the current element.\n", + " | \n", + " | This uses the SoupSieve library.\n", + " | \n", + " | :param selector: A string containing a CSS selector.\n", + " | \n", + " | :param namespaces: A dictionary mapping namespace prefixes\n", + " | used in the CSS selector to namespace URIs. By default,\n", + " | Beautiful Soup will use the prefixes it encountered while\n", + " | parsing the document.\n", + " | \n", + " | :param limit: After finding this number of results, stop looking.\n", + " | \n", + " | :param kwargs: Keyword arguments to be passed into SoupSieve's\n", + " | soupsieve.select() method.\n", + " | \n", + " | :return: A ResultSet of Tags.\n", + " | :rtype: bs4.element.ResultSet\n", + " | \n", + " | select_one(self, selector, namespaces=None, **kwargs)\n", + " | Perform a CSS selection operation on the current element.\n", + " | \n", + " | :param selector: A CSS selector.\n", + " | \n", + " | :param namespaces: A dictionary mapping namespace prefixes\n", + " | used in the CSS selector to namespace URIs. By default,\n", + " | Beautiful Soup will use the prefixes it encountered while\n", + " | parsing the document.\n", + " | \n", + " | :param kwargs: Keyword arguments to be passed into Soup Sieve's\n", + " | soupsieve.select() method.\n", + " | \n", + " | :return: A Tag.\n", + " | :rtype: bs4.element.Tag\n", + " | \n", + " | smooth(self)\n", + " | Smooth out this element's children by consolidating consecutive\n", + " | strings.\n", + " | \n", + " | This makes pretty-printed output look more natural following a\n", + " | lot of operations that modified the tree.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Readonly properties inherited from bs4.element.Tag:\n", + " | \n", + " | children\n", + " | Iterate over all direct children of this PageElement.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | css\n", + " | Return an interface to the CSS selector API.\n", + " | \n", + " | descendants\n", + " | Iterate over all children of this PageElement in a\n", + " | breadth-first sequence.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | isSelfClosing\n", + " | Is this tag an empty-element tag? (aka a self-closing tag)\n", + " | \n", + " | A tag that has contents is never an empty-element tag.\n", + " | \n", + " | A tag that has no contents may or may not be an empty-element\n", + " | tag. It depends on the builder used to create the tag. If the\n", + " | builder has a designated list of empty-element tags, then only\n", + " | a tag whose name shows up in that list is considered an\n", + " | empty-element tag.\n", + " | \n", + " | If the builder has no designated list of empty-element tags,\n", + " | then any tag with no contents is an empty-element tag.\n", + " | \n", + " | is_empty_element\n", + " | Is this tag an empty-element tag? (aka a self-closing tag)\n", + " | \n", + " | A tag that has contents is never an empty-element tag.\n", + " | \n", + " | A tag that has no contents may or may not be an empty-element\n", + " | tag. It depends on the builder used to create the tag. If the\n", + " | builder has a designated list of empty-element tags, then only\n", + " | a tag whose name shows up in that list is considered an\n", + " | empty-element tag.\n", + " | \n", + " | If the builder has no designated list of empty-element tags,\n", + " | then any tag with no contents is an empty-element tag.\n", + " | \n", + " | self_and_descendants\n", + " | Iterate over this PageElement and its children in a\n", + " | breadth-first sequence.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | strings\n", + " | Yield all strings of certain classes, possibly stripping them.\n", + " | \n", + " | :param strip: If True, all strings will be stripped before being\n", + " | yielded.\n", + " | \n", + " | :param types: A tuple of NavigableString subclasses. Any strings of\n", + " | a subclass not found in this list will be ignored. By\n", + " | default, the subclasses considered are the ones found in\n", + " | self.interesting_string_types. If that's not specified,\n", + " | only NavigableString and CData objects will be\n", + " | considered. That means no comments, processing\n", + " | instructions, etc.\n", + " | \n", + " | :yield: A sequence of strings.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors inherited from bs4.element.Tag:\n", + " | \n", + " | parserClass\n", + " | \n", + " | string\n", + " | Convenience property to get the single string within this\n", + " | PageElement.\n", + " | \n", + " | TODO It might make sense to have NavigableString.string return\n", + " | itself.\n", + " | \n", + " | :return: If this element has a single string child, return\n", + " | value is that string. If this element has one child tag,\n", + " | return value is the 'string' attribute of the child tag,\n", + " | recursively. If this element is itself a string, has no\n", + " | children, or has more than one child, return value is None.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data and other attributes inherited from bs4.element.Tag:\n", + " | \n", + " | DEFAULT_INTERESTING_STRING_TYPES = (\n", + " | \n", + " | END_ELEMENT_EVENT = \n", + " | \n", + " | START_ELEMENT_EVENT = \n", + " | \n", + " | STRING_ELEMENT_EVENT = \n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Methods inherited from bs4.element.PageElement:\n", + " | \n", + " | append(self, tag)\n", + " | Appends the given PageElement to the contents of this one.\n", + " | \n", + " | :param tag: A PageElement.\n", + " | \n", + " | extend(self, tags)\n", + " | Appends the given PageElements to this one's contents.\n", + " | \n", + " | :param tags: A list of PageElements. If a single Tag is\n", + " | provided instead, this PageElement's contents will be extended\n", + " | with that Tag's contents.\n", + " | \n", + " | extract(self, _self_index=None)\n", + " | Destructively rips this element out of the tree.\n", + " | \n", + " | :param _self_index: The location of this element in its parent's\n", + " | .contents, if known. Passing this in allows for a performance\n", + " | optimization.\n", + " | \n", + " | :return: `self`, no longer part of the tree.\n", + " | \n", + " | fetchNextSiblings = find_next_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | fetchParents = find_parents(self, name=None, attrs={}, limit=None, **kwargs)\n", + " | \n", + " | fetchPrevious = find_all_previous(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | fetchPreviousSiblings = find_previous_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | findAllNext = find_all_next(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | findAllPrevious = find_all_previous(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | findNext = find_next(self, name=None, attrs={}, string=None, **kwargs)\n", + " | \n", + " | findNextSibling = find_next_sibling(self, name=None, attrs={}, string=None, **kwargs)\n", + " | \n", + " | findNextSiblings = find_next_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | findParent = find_parent(self, name=None, attrs={}, **kwargs)\n", + " | \n", + " | findParents = find_parents(self, name=None, attrs={}, limit=None, **kwargs)\n", + " | \n", + " | findPrevious = find_previous(self, name=None, attrs={}, string=None, **kwargs)\n", + " | \n", + " | findPreviousSibling = find_previous_sibling(self, name=None, attrs={}, string=None, **kwargs)\n", + " | \n", + " | findPreviousSiblings = find_previous_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | \n", + " | find_all_next(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | Find all PageElements that match the given criteria and appear\n", + " | later in the document than this PageElement.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A ResultSet containing PageElements.\n", + " | \n", + " | find_all_previous(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | Look backwards in the document from this PageElement and find all\n", + " | PageElements that match the given criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A ResultSet of PageElements.\n", + " | :rtype: bs4.element.ResultSet\n", + " | \n", + " | find_next(self, name=None, attrs={}, string=None, **kwargs)\n", + " | Find the first PageElement that matches the given criteria and\n", + " | appears later in the document than this PageElement.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_next_sibling(self, name=None, attrs={}, string=None, **kwargs)\n", + " | Find the closest sibling to this PageElement that matches the\n", + " | given criteria and appears later in the document.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the\n", + " | online documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_next_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | Find all siblings of this PageElement that match the given criteria\n", + " | and appear later in the document.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A ResultSet of PageElements.\n", + " | :rtype: bs4.element.ResultSet\n", + " | \n", + " | find_parent(self, name=None, attrs={}, **kwargs)\n", + " | Find the closest parent of this PageElement that matches the given\n", + " | criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | \n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_parents(self, name=None, attrs={}, limit=None, **kwargs)\n", + " | Find all parents of this PageElement that match the given criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | \n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_previous(self, name=None, attrs={}, string=None, **kwargs)\n", + " | Look backwards in the document from this PageElement and find the\n", + " | first PageElement that matches the given criteria.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_previous_sibling(self, name=None, attrs={}, string=None, **kwargs)\n", + " | Returns the closest sibling to this PageElement that matches the\n", + " | given criteria and appears earlier in the document.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | find_previous_siblings(self, name=None, attrs={}, string=None, limit=None, **kwargs)\n", + " | Returns all siblings to this PageElement that match the\n", + " | given criteria and appear earlier in the document.\n", + " | \n", + " | All find_* methods take a common set of arguments. See the online\n", + " | documentation for detailed explanations.\n", + " | \n", + " | :param name: A filter on tag name.\n", + " | :param attrs: A dictionary of filters on attribute values.\n", + " | :param string: A filter for a NavigableString with specific text.\n", + " | :param limit: Stop looking after finding this many results.\n", + " | :kwargs: A dictionary of filters on attribute values.\n", + " | :return: A ResultSet of PageElements.\n", + " | :rtype: bs4.element.ResultSet\n", + " | \n", + " | format_string(self, s, formatter)\n", + " | Format the given string using the given formatter.\n", + " | \n", + " | :param s: A string.\n", + " | :param formatter: A Formatter object, or a string naming one of the standard formatters.\n", + " | \n", + " | formatter_for_name(self, formatter)\n", + " | Look up or create a Formatter for the given identifier,\n", + " | if necessary.\n", + " | \n", + " | :param formatter: Can be a Formatter object (used as-is), a\n", + " | function (used as the entity substitution hook for an\n", + " | XMLFormatter or HTMLFormatter), or a string (used to look\n", + " | up an XMLFormatter or HTMLFormatter in the appropriate\n", + " | registry.\n", + " | \n", + " | getText = get_text(self, separator='', strip=False, types=)\n", + " | \n", + " | get_text(self, separator='', strip=False, types=)\n", + " | Get all child strings of this PageElement, concatenated using the\n", + " | given separator.\n", + " | \n", + " | :param separator: Strings will be concatenated using this separator.\n", + " | \n", + " | :param strip: If True, strings will be stripped before being\n", + " | concatenated.\n", + " | \n", + " | :param types: A tuple of NavigableString subclasses. Any\n", + " | strings of a subclass not found in this list will be\n", + " | ignored. Although there are exceptions, the default\n", + " | behavior in most cases is to consider only NavigableString\n", + " | and CData objects. That means no comments, processing\n", + " | instructions, etc.\n", + " | \n", + " | :return: A string.\n", + " | \n", + " | insert(self, position, new_child)\n", + " | Insert a new PageElement in the list of this PageElement's children.\n", + " | \n", + " | This works the same way as `list.insert`.\n", + " | \n", + " | :param position: The numeric position that should be occupied\n", + " | in `self.children` by the new PageElement.\n", + " | :param new_child: A PageElement.\n", + " | \n", + " | nextGenerator(self)\n", + " | # Old non-property versions of the generators, for backwards\n", + " | # compatibility with BS3.\n", + " | \n", + " | nextSiblingGenerator(self)\n", + " | \n", + " | parentGenerator(self)\n", + " | \n", + " | previousGenerator(self)\n", + " | \n", + " | previousSiblingGenerator(self)\n", + " | \n", + " | replaceWith = replace_with(self, *args)\n", + " | \n", + " | replaceWithChildren = unwrap(self)\n", + " | \n", + " | replace_with(self, *args)\n", + " | Replace this PageElement with one or more PageElements, keeping the\n", + " | rest of the tree the same.\n", + " | \n", + " | :param args: One or more PageElements.\n", + " | :return: `self`, no longer part of the tree.\n", + " | \n", + " | replace_with_children = unwrap(self)\n", + " | \n", + " | setup(self, parent=None, previous_element=None, next_element=None, previous_sibling=None, next_sibling=None)\n", + " | Sets up the initial relations between this element and\n", + " | other elements.\n", + " | \n", + " | :param parent: The parent of this element.\n", + " | \n", + " | :param previous_element: The element parsed immediately before\n", + " | this one.\n", + " | \n", + " | :param next_element: The element parsed immediately before\n", + " | this one.\n", + " | \n", + " | :param previous_sibling: The most recently encountered element\n", + " | on the same level of the parse tree as this one.\n", + " | \n", + " | :param previous_sibling: The next element to be encountered\n", + " | on the same level of the parse tree as this one.\n", + " | \n", + " | unwrap(self)\n", + " | Replace this PageElement with its contents.\n", + " | \n", + " | :return: `self`, no longer part of the tree.\n", + " | \n", + " | wrap(self, wrap_inside)\n", + " | Wrap this PageElement inside another one.\n", + " | \n", + " | :param wrap_inside: A PageElement.\n", + " | :return: `wrap_inside`, occupying the position in the tree that used\n", + " | to be occupied by `self`, and with `self` inside it.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Readonly properties inherited from bs4.element.PageElement:\n", + " | \n", + " | decomposed\n", + " | Check whether a PageElement has been decomposed.\n", + " | \n", + " | :rtype: bool\n", + " | \n", + " | next\n", + " | The PageElement, if any, that was parsed just after this one.\n", + " | \n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | next_elements\n", + " | All PageElements that were parsed after this one.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | next_siblings\n", + " | All PageElements that are siblings of this one but were parsed\n", + " | later.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | parents\n", + " | All PageElements that are parents of this PageElement.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | previous\n", + " | The PageElement, if any, that was parsed just before this one.\n", + " | \n", + " | :return: A PageElement.\n", + " | :rtype: bs4.element.Tag | bs4.element.NavigableString\n", + " | \n", + " | previous_elements\n", + " | All PageElements that were parsed before this one.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | previous_siblings\n", + " | All PageElements that are siblings of this one but were parsed\n", + " | earlier.\n", + " | \n", + " | :yield: A sequence of PageElements.\n", + " | \n", + " | stripped_strings\n", + " | Yield all strings in this PageElement, stripping them first.\n", + " | \n", + " | :yield: A sequence of stripped strings.\n", + " | \n", + " | text\n", + " | Get all child strings of this PageElement, concatenated using the\n", + " | given separator.\n", + " | \n", + " | :param separator: Strings will be concatenated using this separator.\n", + " | \n", + " | :param strip: If True, strings will be stripped before being\n", + " | concatenated.\n", + " | \n", + " | :param types: A tuple of NavigableString subclasses. Any\n", + " | strings of a subclass not found in this list will be\n", + " | ignored. Although there are exceptions, the default\n", + " | behavior in most cases is to consider only NavigableString\n", + " | and CData objects. That means no comments, processing\n", + " | instructions, etc.\n", + " | \n", + " | :return: A string.\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data descriptors inherited from bs4.element.PageElement:\n", + " | \n", + " | __dict__\n", + " | dictionary for instance variables (if defined)\n", + " | \n", + " | __weakref__\n", + " | list of weak references to the object (if defined)\n", + " | \n", + " | nextSibling\n", + " | \n", + " | previousSibling\n", + " | \n", + " | ----------------------------------------------------------------------\n", + " | Data and other attributes inherited from bs4.element.PageElement:\n", + " | \n", + " | default = \n", + " | \n", + " | known_xml = None\n", + "\n" + ] + } + ], + "source": [ + "from bs4 import BeautifulSoup as bs\n", + "\n", + "help(bs)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "29e6a563-30f6-48f2-91a1-43a0254ce988", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "response = requests.get(\"https://otus.ru/nest/post/703/\")\n", + "print(response)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "fe1cb1c2-a4d2-40f7-a819-2f727c8a4d9a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Date': 'Tue, 31 Oct 2023 18:12:37 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'Vary': 'Authorization, Cookie', 'Referrer-Policy': 'no-referrer-when-downgrade', 'Cross-Origin-Opener-Policy': 'same-origin', 'Set-Cookie': 'oid=97bfb23384d3766711f1492d5b466fd0; Domain=.otus.ru; expires=Fri, 30 Oct 2026 18:12:37 GMT; Max-Age=94608000; Path=/, auth_token=\"\"; Domain=.otus.ru; expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/, auth_token_expires=\"\"; Domain=.otus.ru; expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/, utm=utm_source%3Dtypein%26utm_medium%3Ddirect%26utm_campaign%3DNone; Domain=.otus.ru; expires=Fri, 30 Oct 2026 18:12:37 GMT; Max-Age=94608000; Path=/, sessionid=zi9wgb46egdyxjus7rtxzugrx7rzbt5u; expires=Mon, 29 Jan 2024 18:12:37 GMT; HttpOnly; Max-Age=7776000; Path=/; SameSite=Lax; Secure', 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains', 'Permissions-Policy': 'geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=*,payment=(self)', 'X-Content-Type-Options': 'nosniff', 'X-Otus-Ingress': 'ingress-nginx-controller-pbfrm', 'X-Otus-Request-Time': '0.453', 'CF-Cache-Status': 'DYNAMIC', 'Report-To': '{\"endpoints\":[{\"url\":\"https:\\\\/\\\\/a.nel.cloudflare.com\\\\/report\\\\/v3?s=U3k1bwI0kk762RJtiNF7Tp75jCkk3UIHsyamD1AzS17zeRjpfbx8frZUdsOiLpa1ulM8dvW9F1wfMCf3UyY2OQxxbVxnIGKas1WePLmHtG9A72P%2BsVd9qRI%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}', 'NEL': '{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}', 'Server': 'cloudflare', 'CF-RAY': '81edde007d727b4f-DME', 'Content-Encoding': 'gzip'}" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.headers" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "33e25119-2ef4-4cb9-b11a-593509093fe1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'text/html; charset=utf-8'" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response.headers.get('content-type')" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "da379217-b26f-4681-8938-5e415d7d5b7f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Парсинг страниц на Python. Parser на Python | OTUS\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "👻 Страшные скидки!
\n", + "Начните обучение выгодно с промокодом Hello15: скидка -15% на оплату любого курса до 31 октября 2023.\n", + "
\n", + "
\n", + "
\n", + "Выбрать курс\n", + "
\n", + "Выбрать курс\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\"Logo\"\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "+7 499 938-92-02\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
    \n", + "
  • \n", + "Обучение\n", + "
  • \n", + "
  • \n", + "Информация\n", + "
  • \n", + "
\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Блоги\n", + "\n", + "Посты\n", + "\n", + "\n", + "Лучшие\n", + "\n", + "Участники\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "Поиск\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "Поиск\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
Андрей Павленко
\n", + "
\n", + "
30.04.19 в 19:56
\n", + "
\n", + "

Парсинг страниц на Python. Parser на Python

\n", + "
\n", + "\n", + "
\n", + "Теги: python, html, парсер, парсинг, парсить, сайт\n", + "
\n", + "
\n", + "
\n", + "

\"Python_Deep_11.06_site-5020-b0d612.png\"

\n", + "

Рано или поздно любой Python-программист сталкивается с задачей скопировать какой-нибудь материал с сайта. Так как страниц на нём достаточно много, терять время на ручное копирование — не самый лучший выход.

\n", + "

\"Python_Pro_970x90-20219-1c8674.png\"

\n", + "

К тому же, языки программирования затем и нужны, чтобы избавлять нас от рутинной работы, автоматизируя решение различных задач. Если же говорить о работе с HTML, то в Python есть отличные библиотеки для этого. Они позволяет парсить как сайты, так и обычные HTML-документы.

\n", + "

Парсер — что это вообще такое?

\n", + "

Если вы ещё не сталкивались с этим понятием, то давайте поговорим о нём подробнее. Итак, парсером называют скрипт, который осуществляет синтаксический анализ данных с последующих их отбором и группировкой в БД либо электронную таблицу. Эта программа выполняет сопоставление линейной последовательности слов с учётом правил языка.

\n", + "

Алгоритм работы парсера:\n", + "1. Получение доступа к сети и API веб-ресурса, его скачивание.\n", + "2. Извлечение, исследование и обработка скачанных данных.\n", + "3. Экспорт полученной информации.

\n", + "

По сути, парсинг может проводиться с применением разных языков программирования, но проще всего показать его именно на Python, благодаря простому синтаксису.

\n", + "

Что касается назначения парсинга, то он используется в разных целях, например:\n", + "— сбор информации для своего сайта;\n", + "— индексация веб-страниц;\n", + "— получение данных, не являющихся интеллектуальной собственностью и т. д.

\n", + "

Но чтобы парсер полноценно выполнил поставленные задачи, нужно подготовить среду, о чём и поговорим.

\n", + "

Готовим к работе скрипт парсинга на Python

\n", + "

Подготовка включает в себя 2 этапа: сначала мы должны освежить свои знания в некоторых областях, а потом можно приступить и к подготовке библиотек.

\n", + "

Итак, для успешного парсинга вам потребуются:\n", + "1. Знание PHP, HTML, CSS, JavaScript. Они нужны для первичного анализа и понимания кода страницы, с которой и будем осуществлять парсинг. Не стоит думать, что всё так просто, ведь порой и опытный специалист не может разобраться в структуре сайта, написанного на HTML.\n", + "2. Знание и понимание, как применять библиотеки HTML-парсинга на Python, а также регулярные выражения. Это поможет разобраться с проблемами, связанными с невалидным кодом.\n", + "3. Основы объектно-ориентированного программирования (желательно).\n", + "4. Знания баз данных, например, MySQL. Это необходимо для обработки выходных данных.

\n", + "

\"Python_Pro_970x90-20219-1c8674.png\"

\n", + "

Вышеперечисленное — базис, владея которым HTML-парсинг не вызовет у вас затруднений. Также было бы неплохо уметь работать с иерархическими структурами, XML и JSON.

\n", + "

Переходим ко второй части — библиотекам. Вот основные:\n", + "— LXML. Пакет, имеющий поддержку XLST и XPath. Отличается богатым функционалом по обработке разных API;\n", + "— GRAB. Очень распространённый инструмент, работает с DOM, может выполнять автозаполнение форм, обрабатывать перенаправление с сайтов;\n", + "— Beautiful Soup. Прекрасно справляется со структурным разбором сайта, а также с обработкой невалидного кода HTML.

\n", + "

Устанавливаем библиотеку Beautiful Soup (Linux)

\n", + "

Прекрасным преимуществом этой библиотеки является наличие персонального алгоритма структурирования HTML-кода. А это уже позволяет сэкономить разработчику время, что не может не радовать. Итак, устанавливаем:

\n", + "
$ apt-get install python-bs4\n",
+      "$ apt-get install python-lxml\n",
+      "$ apt-get install python-html5lib\n",
+      "
\n", + "
\n", + "

Установив нужные модули, можем парсить сайт. В результате мы получим его структурированный код:

\n", + "
# -*- coding: utf-8 -*-\n",
+      "from bs4 import BeautifulSoup\n",
+      "from urllib2 import urlopen\n",
+      "html_doc = urlopen('http://otus.ru').read()\n",
+      "soup = BeautifulSoup(html_doc)\n",
+      "print soup\n",
+      "
\n", + "
\n", + "

Чтобы выполнить поиск по ссылкам:

\n", + "
for link in soup.find_all('a'):\n",
+      "    print link.get('href')\n",
+      "# Содержимое ссылок\n",
+      "for link in soup.find_all('a'):\n",
+      "    print link.contents[0]\n",
+      "
\n", + "
\n", + "

А вот так работает парсер DIV-блоков:

\n", + "
# Содержимое из <div class="content"> ... </div>\n",
+      "print soup.find('div', 'content')\n",
+      "# Блок: <div id="top_menu"> ... </div>\n",
+      "print soup.find('div', id='top_menu')\n",
+      "
\n", + "
\n", + "

Если хотим получить ссылки на изображения:

\n", + "
for img in soup.find_all('img'):\n",
+      "    print img.get('src')\n",
+      "
\n", + "
\n", + "

Как видим, ничего сложного нет. Но если хотите узнать больше, вы всегда можете записаться на курс «Разработчик Python» в OTUS!

\n", + "

\"Python_Pro_970x550-20219-0846c7.png\"

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Не пропустите новые полезные статьи!

\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "

\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Спасибо за подписку!

\n", + "

\n", + "Мы отправили вам письмо для подтверждения вашего email.\n", + "
\n", + "С уважением, OTUS!\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Автор
\n", + "
\n", + "\n", + "
\n", + "
Андрей Павленко
\n", + "
\n", + "
\n", + "Рейтинг:\n", + "
\n", + "+2687\n", + "
\n", + "
\n", + "
\n", + "1976 дней\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "1 комментарий\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Комментарий удален\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Для комментирования необходимо авторизоваться\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Популярное
\n", + "
Сегодня тут пусто
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Посещая наш сайт, вы принимаете политику использования cookie-файлов\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Подпишитесь на наши новости

\n", + "\n", + "

\n", + "По всем вопросам пишите на\n", + "[email protected]\n", + "

\n", + "

\n", + "\n", + "Сведения об образовательной организации\n", + "\n", + "

\n", + "

\n", + "\n", + "OTUS является аккредитованной IT-компанией\n", + "\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

\n", + "© 2015-2023 OTUS\n", + "

\n", + "\n", + "Пользовательское соглашение\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
Премия Рунета
2018
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Премия Рунета
2018
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Восстановление пароля

\n", + "
\n", + "\n", + "
\n", + "Введите электронную почту для восстановления пароля\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "Пользователь с таким email не найден\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "

\n", + "Ваш телефон уже привязан к
другой учетной записи\n", + "

\n", + "

\n", + "Ваш телефон уже\n", + "привязан к учетной записи .\n", + "Выберите учетную запись, с которой желаете продолжить работу.\n", + "Мы привяжем к ней телефон.\n", + "

\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Заполните номер телефона\n", + "
\n", + "
\n", + "Для отправки заявки в преподаватели заполните номер телефона\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(response.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "dee63e44-fa93-4788-93f0-30f5dc26e6b0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "Парсинг страниц на Python. Parser на Python | OTUS\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "👻 Страшные скидки!
\n", + "Начните обучение выгодно с промокодом Hello15: скидка -15% на оплату любого курса до 31 октября 2023.\n", + "
\n", + "
\n", + "
\n", + "Выбрать курс\n", + "
\n", + "Выбрать курс\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\"Logo\"\n", + "\n", + "\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "+7 499 938-92-02\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
    \n", + "
  • \n", + "Обучение\n", + "
  • \n", + "
  • \n", + "Информация\n", + "
  • \n", + "
\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Блоги\n", + "\n", + "Посты\n", + "\n", + "\n", + "Лучшие\n", + "\n", + "Участники\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "Поиск\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "Поиск\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
Андрей Павленко
\n", + "
\n", + "
30.04.19 в 19:56
\n", + "
\n", + "

Парсинг страниц на Python. Parser на Python

\n", + "
\n", + "\n", + "
\n", + "Теги: python, html, парсер, парсинг, парсить, сайт\n", + "
\n", + "
\n", + "
\n", + "

\"Python_Deep_11.06_site-5020-b0d612.png\"

\n", + "

Рано или поздно любой Python-программист сталкивается с задачей скопировать какой-нибудь материал с сайта. Так как страниц на нём достаточно много, терять время на ручное копирование — не самый лучший выход.

\n", + "

\"Python_Pro_970x90-20219-1c8674.png\"

\n", + "

К тому же, языки программирования затем и нужны, чтобы избавлять нас от рутинной работы, автоматизируя решение различных задач. Если же говорить о работе с HTML, то в Python есть отличные библиотеки для этого. Они позволяет парсить как сайты, так и обычные HTML-документы.

\n", + "

Парсер — что это вообще такое?

\n", + "

Если вы ещё не сталкивались с этим понятием, то давайте поговорим о нём подробнее. Итак, парсером называют скрипт, который осуществляет синтаксический анализ данных с последующих их отбором и группировкой в БД либо электронную таблицу. Эта программа выполняет сопоставление линейной последовательности слов с учётом правил языка.

\n", + "

Алгоритм работы парсера:\n", + "1. Получение доступа к сети и API веб-ресурса, его скачивание.\n", + "2. Извлечение, исследование и обработка скачанных данных.\n", + "3. Экспорт полученной информации.

\n", + "

По сути, парсинг может проводиться с применением разных языков программирования, но проще всего показать его именно на Python, благодаря простому синтаксису.

\n", + "

Что касается назначения парсинга, то он используется в разных целях, например:\n", + "— сбор информации для своего сайта;\n", + "— индексация веб-страниц;\n", + "— получение данных, не являющихся интеллектуальной собственностью и т. д.

\n", + "

Но чтобы парсер полноценно выполнил поставленные задачи, нужно подготовить среду, о чём и поговорим.

\n", + "

Готовим к работе скрипт парсинга на Python

\n", + "

Подготовка включает в себя 2 этапа: сначала мы должны освежить свои знания в некоторых областях, а потом можно приступить и к подготовке библиотек.

\n", + "

Итак, для успешного парсинга вам потребуются:\n", + "1. Знание PHP, HTML, CSS, JavaScript. Они нужны для первичного анализа и понимания кода страницы, с которой и будем осуществлять парсинг. Не стоит думать, что всё так просто, ведь порой и опытный специалист не может разобраться в структуре сайта, написанного на HTML.\n", + "2. Знание и понимание, как применять библиотеки HTML-парсинга на Python, а также регулярные выражения. Это поможет разобраться с проблемами, связанными с невалидным кодом.\n", + "3. Основы объектно-ориентированного программирования (желательно).\n", + "4. Знания баз данных, например, MySQL. Это необходимо для обработки выходных данных.

\n", + "

\"Python_Pro_970x90-20219-1c8674.png\"

\n", + "

Вышеперечисленное — базис, владея которым HTML-парсинг не вызовет у вас затруднений. Также было бы неплохо уметь работать с иерархическими структурами, XML и JSON.

\n", + "

Переходим ко второй части — библиотекам. Вот основные:\n", + "— LXML. Пакет, имеющий поддержку XLST и XPath. Отличается богатым функционалом по обработке разных API;\n", + "— GRAB. Очень распространённый инструмент, работает с DOM, может выполнять автозаполнение форм, обрабатывать перенаправление с сайтов;\n", + "— Beautiful Soup. Прекрасно справляется со структурным разбором сайта, а также с обработкой невалидного кода HTML.

\n", + "

Устанавливаем библиотеку Beautiful Soup (Linux)

\n", + "

Прекрасным преимуществом этой библиотеки является наличие персонального алгоритма структурирования HTML-кода. А это уже позволяет сэкономить разработчику время, что не может не радовать. Итак, устанавливаем:

\n", + "
$ apt-get install python-bs4\n",
+      "$ apt-get install python-lxml\n",
+      "$ apt-get install python-html5lib\n",
+      "
\n", + "
\n", + "

Установив нужные модули, можем парсить сайт. В результате мы получим его структурированный код:

\n", + "
# -*- coding: utf-8 -*-\n",
+      "from bs4 import BeautifulSoup\n",
+      "from urllib2 import urlopen\n",
+      "html_doc = urlopen('http://otus.ru').read()\n",
+      "soup = BeautifulSoup(html_doc)\n",
+      "print soup\n",
+      "
\n", + "
\n", + "

Чтобы выполнить поиск по ссылкам:

\n", + "
for link in soup.find_all('a'):\n",
+      "    print link.get('href')\n",
+      "# Содержимое ссылок\n",
+      "for link in soup.find_all('a'):\n",
+      "    print link.contents[0]\n",
+      "
\n", + "
\n", + "

А вот так работает парсер DIV-блоков:

\n", + "
# Содержимое из <div class=\"content\"> ... </div>\n",
+      "print soup.find('div', 'content')\n",
+      "# Блок: <div id=\"top_menu\"> ... </div>\n",
+      "print soup.find('div', id='top_menu')\n",
+      "
\n", + "
\n", + "

Если хотим получить ссылки на изображения:

\n", + "
for img in soup.find_all('img'):\n",
+      "    print img.get('src')\n",
+      "
\n", + "
\n", + "

Как видим, ничего сложного нет. Но если хотите узнать больше, вы всегда можете записаться на курс «Разработчик Python» в OTUS!

\n", + "

\"Python_Pro_970x550-20219-0846c7.png\"

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Не пропустите новые полезные статьи!

\n", + "
\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "

\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Спасибо за подписку!

\n", + "

\n", + "Мы отправили вам письмо для подтверждения вашего email.\n", + "
\n", + "С уважением, OTUS!\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Автор
\n", + "
\n", + "\n", + "
\n", + "
Андрей Павленко
\n", + "
\n", + "
\n", + "Рейтинг:\n", + "
\n", + "+2687\n", + "
\n", + "
\n", + "
\n", + "1976 дней\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "1 комментарий\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Комментарий удален\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Для комментирования необходимо авторизоваться\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Популярное
\n", + "
Сегодня тут пусто
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Посещая наш сайт, вы принимаете политику использования cookie-файлов\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Подпишитесь на наши новости

\n", + "\n", + "

\n", + "По всем вопросам пишите на\n", + "[email protected]\n", + "

\n", + "

\n", + "\n", + "Сведения об образовательной организации\n", + "\n", + "

\n", + "

\n", + "\n", + "OTUS является аккредитованной IT-компанией\n", + "\n", + "

\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

\n", + "© 2015-2023 OTUS\n", + "

\n", + "\n", + "Пользовательское соглашение\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
Премия Рунета
2018
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
Премия Рунета
2018
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "

Восстановление пароля

\n", + "
\n", + "\n", + "
\n", + "Введите электронную почту для восстановления пароля\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "Пользователь с таким email не найден\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "

\n", + "Ваш телефон уже привязан к
другой учетной записи\n", + "

\n", + "

\n", + "Ваш телефон уже\n", + "привязан к учетной записи .\n", + "Выберите учетную запись, с которой желаете продолжить работу.\n", + "Мы привяжем к ней телефон.\n", + "

\n", + "\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "Заполните номер телефона\n", + "
\n", + "
\n", + "Для отправки заявки в преподаватели заполните номер телефона\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "\n", + "
\n", + "
\n", + "
\n", + "
\n", + "
\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\"\"\n", + "\n", + "\n" + ] + } + ], + "source": [ + "soup = bs(response.text, \"html.parser\")\n", + "print(soup)" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "daefae3f-cc1e-478e-af74-d43a8b6068b6", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Парсинг страниц на Python. Parser на Python | OTUS" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "soup.title" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "a4da2264-2a5c-4ecc-b183-c305ea4cad0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "bs4.element.Tag" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(soup.title)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "ca1ef0a6-4691-4c81-b3d1-2a993d1b717f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Парсинг страниц на Python. Parser на Python | OTUS'" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "soup.title.text" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "id": "9f1f2b02-812d-4072-ac90-83d4de244a20", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "

Парсинг страниц на Python. Parser на Python

" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "soup.h1" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "ca2bb557-95d0-46af-8c4a-9034fccd2f64", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'Парсинг страниц на Python. Parser на Python'" + ] + }, + "execution_count": 62, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "soup.h1.text" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "id": "309f33c2-3ed7-476b-bee4-7956fad35d60", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['blog__h1']" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "soup.h1[\"class\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "0df5877c-5b57-4d7a-a652-2f5e5b18cd87", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "
\n", + "\n", + "
\n" + ] + } + ], + "source": [ + "div_tile = soup.find(\"div\", {\"class\": \"blog__tile blog__tile_slim\"})\n", + "print(div_tile)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "1e909212-8869-4b57-b37b-26627d6d72e0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['blog__tile', 'blog__tile_slim']" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "div_tile[\"class\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "id": "18d14bac-3122-4032-a6c1-eea47f48af35", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[

Парсер — что это вообще такое?

,

Готовим к работе скрипт парсинга на Python

,

Устанавливаем библиотеку Beautiful Soup (Linux)

]\n" + ] + } + ], + "source": [ + "headers_2 = soup.find_all(\"h2\")\n", + "print(headers_2)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "aa2cfd65-8bfd-480a-8b6b-238794526b6b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Парсер — что это вообще такое?\n", + "Готовим к работе скрипт парсинга на Python\n", + "Устанавливаем библиотеку Beautiful Soup (Linux)\n" + ] + } + ], + "source": [ + "for header2 in headers_2:\n", + " print(header2.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "id": "e773d4be-8cbc-4a8d-98b8-ffc195212f11", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[

Парсинг страниц на Python. Parser на Python

,

Парсер — что это вообще такое?

,

Готовим к работе скрипт парсинга на Python

,

Устанавливаем библиотеку Beautiful Soup (Linux)

]\n" + ] + } + ], + "source": [ + "h1s_and_h2s = soup.find_all([\"h1\", \"h2\"])\n", + "print(h1s_and_h2s)" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "id": "f3f90897-d3e2-4738-ac14-f7f37dbcdb8d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Парсинг страниц на Python. Parser на Python\n", + "Парсер — что это вообще такое?\n", + "Готовим к работе скрипт парсинга на Python\n", + "Устанавливаем библиотеку Beautiful Soup (Linux)\n" + ] + } + ], + "source": [ + "for header in h1s_and_h2s:\n", + " print(header.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "id": "21682b90-987c-4ae3-9eae-7576330a86de", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['parser_class',\n", + " 'name',\n", + " 'namespace',\n", + " '_namespaces',\n", + " 'prefix',\n", + " 'sourceline',\n", + " 'sourcepos',\n", + " 'known_xml',\n", + " 'attrs',\n", + " 'contents',\n", + " 'parent',\n", + " 'previous_element',\n", + " 'next_element',\n", + " 'next_sibling',\n", + " 'previous_sibling',\n", + " 'hidden',\n", + " 'can_be_empty_element',\n", + " 'cdata_list_attributes',\n", + " 'preserve_whitespace_tags',\n", + " 'interesting_string_types']" + ] + }, + "execution_count": 74, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(vars(header).keys())" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "id": "3790553b-38b0-4d02-9873-27c70ad42cd1", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'div'" + ] + }, + "execution_count": 75, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "div_tile.name" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "id": "b8ad5609-56be-40f8-a5b0-0d6891a87e0b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "h1 Парсинг страниц на Python. Parser на Python\n", + "h2 Парсер — что это вообще такое?\n", + "h2 Готовим к работе скрипт парсинга на Python\n", + "h2 Устанавливаем библиотеку Beautiful Soup (Linux)\n" + ] + } + ], + "source": [ + "for header in h1s_and_h2s:\n", + " print(header.name, header.text)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "id": "d673f941-f247-4aa4-a895-cdde45bec39d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "similar_posts_selector = \"body > div.body-wrapper > div > div.blog.js-blog > div.blog__content > div > div > div.container__col.container__col_8.container__col_md-12 > div.blog-tile-wrapper\"\n", + "similar_posts = soup.select_one(similar_posts_selector)\n", + "print(similar_posts)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "36e06aac-1c6f-4970-80a8-12063ce77925", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'div'" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "similar_posts.name" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "3c78246a-3628-405b-a409-db7ccd68c34b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "Get ready to run back: ещё одна проблема регулярных выражений\n", + ", \n", + "MergeSort + InsertionSort + хитрые эвристики = ?\n", + ", \n", + "Подводный камень в Default-настройках СУБД\n", + ", \n", + "Расстояние Вассерштейна: WGAN и 2 кучи земли\n", + ", \n", + "Adversarial Autoencoders: порождение дискретных объектов\n", + "]\n" + ] + } + ], + "source": [ + "similar_posts_links = similar_posts.find_all(\"a\", {\"class\": \"blog-tile__item-title\"})\n", + "print(similar_posts_links)" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "id": "aabc7bf9-0f05-4341-b101-02facab92f48", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Get ready to run back: ещё одна проблема регулярных выражений /nest/post/140/\n", + "* MergeSort + InsertionSort + хитрые эвристики = ? /nest/post/144/\n", + "* Подводный камень в Default-настройках СУБД /nest/post/149/\n", + "* Расстояние Вассерштейна: WGAN и 2 кучи земли /nest/post/182/\n", + "* Adversarial Autoencoders: порождение дискретных объектов /nest/post/183/\n" + ] + } + ], + "source": [ + "for link in similar_posts_links:\n", + " print(\"*\", link[\"title\"], link[\"href\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "837cb3dd-8cd5-4dc4-b85a-a6d247ff421a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "
Похожие посты
\n" + ] + } + ], + "source": [ + "similar_posts_div = soup.find(\"div\", string=\"Похожие посты\")\n", + "print(similar_posts_div)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "985fbe11-91ff-4bc1-b5e5-28c2ec6b08fc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
\n", + "
Похожие посты
\n", + "
" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "similar_posts_div.parent" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "id": "dec049f8-a6b0-412d-891e-c535454ebe09", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "similar_posts_div.parent.parent" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "id": "3b0a67cf-2820-432b-be16-6a6c931ccfcd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[\n", + "Get ready to run back: ещё одна проблема регулярных выражений\n", + ", \n", + "MergeSort + InsertionSort + хитрые эвристики = ?\n", + ", \n", + "Подводный камень в Default-настройках СУБД\n", + ", \n", + "Расстояние Вассерштейна: WGAN и 2 кучи земли\n", + ", \n", + "Adversarial Autoencoders: порождение дискретных объектов\n", + "]\n" + ] + } + ], + "source": [ + "similar_posts_links = similar_posts_div.parent.parent.find_all(\"a\", {\"class\": \"blog-tile__item-title\"})\n", + "print(similar_posts_links)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "503f7cd3-4675-4fac-bff0-ac857564cb9b", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "* Get ready to run back: ещё одна проблема регулярных выражений /nest/post/140/\n", + "* MergeSort + InsertionSort + хитрые эвристики = ? /nest/post/144/\n", + "* Подводный камень в Default-настройках СУБД /nest/post/149/\n", + "* Расстояние Вассерштейна: WGAN и 2 кучи земли /nest/post/182/\n", + "* Adversarial Autoencoders: порождение дискретных объектов /nest/post/183/\n" + ] + } + ], + "source": [ + "for link in similar_posts_links:\n", + " print(\"*\", link[\"title\"], link[\"href\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "903939ee-0992-4967-946b-d08e52455054", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "\n", + "Adversarial Autoencoders: порождение дискретных объектов\n", + "" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "link" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "30f96027-25be-424c-ba4d-15f699a36229", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'\\n Adversarial Autoencoders: порождение дискретных объектов\\n\\n'" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "link.prettify()" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "6fe1b7b4-8ef2-40b9-9a9c-f48b2d64e921", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Adversarial Autoencoders: порождение дискретных объектов\n", + "\n", + "\n" + ] + } + ], + "source": [ + "print(link.prettify())" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "e9ead044-21ff-4a3d-aec9-d240f613113a", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "\n" + ] + } + ], + "source": [ + "print(similar_posts_div.parent.parent.prettify())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c96f1b75-2df1-4098-bba6-e103613f5c43", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/lessons/lesson.01/requirements.txt b/lessons/lesson.01/requirements.txt new file mode 100644 index 0000000..a44e4a4 --- /dev/null +++ b/lessons/lesson.01/requirements.txt @@ -0,0 +1,87 @@ +anyio==4.0.0 +appnope==0.1.3 +argon2-cffi==23.1.0 +argon2-cffi-bindings==21.2.0 +arrow==1.3.0 +asttokens==2.4.1 +async-lru==2.0.4 +attrs==23.1.0 +Babel==2.13.1 +beautifulsoup4==4.12.2 +bleach==6.1.0 +certifi==2023.7.22 +cffi==1.16.0 +charset-normalizer==3.3.1 +comm==0.1.4 +debugpy==1.8.0 +decorator==5.1.1 +defusedxml==0.7.1 +executing==2.0.1 +fastjsonschema==2.18.1 +fqdn==1.5.1 +idna==3.4 +ipykernel==6.26.0 +ipython==8.17.2 +isoduration==20.11.0 +jedi==0.19.1 +Jinja2==3.1.2 +json5==0.9.14 +jsonpointer==2.4 +jsonschema==4.19.2 +jsonschema-specifications==2023.7.1 +jupyter-events==0.8.0 +jupyter-lsp==2.2.0 +jupyter_client==8.5.0 +jupyter_core==5.5.0 +jupyter_server==2.9.1 +jupyter_server_terminals==0.4.4 +jupyterlab==4.0.7 +jupyterlab-pygments==0.2.2 +jupyterlab_server==2.25.0 +MarkupSafe==2.1.3 +matplotlib-inline==0.1.6 +mistune==3.0.2 +nbclient==0.8.0 +nbconvert==7.10.0 +nbformat==5.9.2 +nest-asyncio==1.5.8 +notebook==7.0.6 +notebook_shim==0.2.3 +overrides==7.4.0 +packaging==23.2 +pandocfilters==1.5.0 +parso==0.8.3 +pexpect==4.8.0 +platformdirs==3.11.0 +prometheus-client==0.18.0 +prompt-toolkit==3.0.39 +psutil==5.9.6 +ptyprocess==0.7.0 +pure-eval==0.2.2 +pycparser==2.21 +Pygments==2.16.1 +python-dateutil==2.8.2 +python-json-logger==2.0.7 +PyYAML==6.0.1 +pyzmq==25.1.1 +referencing==0.30.2 +requests==2.31.0 +rfc3339-validator==0.1.4 +rfc3986-validator==0.1.1 +rpds-py==0.10.6 +Send2Trash==1.8.2 +six==1.16.0 +sniffio==1.3.0 +soupsieve==2.5 +stack-data==0.6.3 +terminado==0.17.1 +tinycss2==1.2.1 +tornado==6.3.3 +traitlets==5.13.0 +types-python-dateutil==2.8.19.14 +uri-template==1.3.0 +urllib3==2.0.7 +wcwidth==0.2.9 +webcolors==1.13 +webencodings==0.5.1 +websocket-client==1.6.4 From e3e273aaa5a852816d4cee5f0e258b20eb2fb0b9 Mon Sep 17 00:00:00 2001 From: Evgeny Revniakov Date: Wed, 8 Nov 2023 00:15:24 +0500 Subject: [PATCH 03/27] Add lesson 2: OOP basics --- README.md | 1 + lessons/lesson.02/step_1.py | 23 ++++++++++++++++ lessons/lesson.02/step_10.py | 47 +++++++++++++++++++++++++++++++++ lessons/lesson.02/step_2.py | 34 ++++++++++++++++++++++++ lessons/lesson.02/step_3.py | 35 +++++++++++++++++++++++++ lessons/lesson.02/step_4.py | 37 ++++++++++++++++++++++++++ lessons/lesson.02/step_5.py | 39 +++++++++++++++++++++++++++ lessons/lesson.02/step_6.py | 43 ++++++++++++++++++++++++++++++ lessons/lesson.02/step_7.py | 45 +++++++++++++++++++++++++++++++ lessons/lesson.02/step_8.py | 51 ++++++++++++++++++++++++++++++++++++ lessons/lesson.02/step_9.py | 46 ++++++++++++++++++++++++++++++++ 11 files changed, 401 insertions(+) create mode 100644 lessons/lesson.02/step_1.py create mode 100644 lessons/lesson.02/step_10.py create mode 100644 lessons/lesson.02/step_2.py create mode 100644 lessons/lesson.02/step_3.py create mode 100644 lessons/lesson.02/step_4.py create mode 100644 lessons/lesson.02/step_5.py create mode 100644 lessons/lesson.02/step_6.py create mode 100644 lessons/lesson.02/step_7.py create mode 100644 lessons/lesson.02/step_8.py create mode 100644 lessons/lesson.02/step_9.py diff --git a/README.md b/README.md index f7e8801..7304c82 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,4 @@ ### Занятия - [Урок 1. Введение в HTTP. Работа с библиотеками requests и BeautifulSoup](lessons/lesson.01/) +- [Урок 2. Основы ООП. Принципы ООП](lessons/lesson.02/) diff --git a/lessons/lesson.02/step_1.py b/lessons/lesson.02/step_1.py new file mode 100644 index 0000000..a311e2c --- /dev/null +++ b/lessons/lesson.02/step_1.py @@ -0,0 +1,23 @@ +def set_address(self, address): + print(user_1) + + +class User: + # def __new__(cls, *args, **kwargs) -> self: + # pass + + def __init__(self): + self.name = None + self.age = None + self.address = None + + def set_address(self, address): + pass + + +# descriptors +user_1 = User() +user_2 = User() + +print(vars(user_1)) +print(user_1.__dict__) diff --git a/lessons/lesson.02/step_10.py b/lessons/lesson.02/step_10.py new file mode 100644 index 0000000..819ad3f --- /dev/null +++ b/lessons/lesson.02/step_10.py @@ -0,0 +1,47 @@ +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + def _age_setter(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + +user_1 = AdminUser('Ivan', '26', 'Moscow') + +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) diff --git a/lessons/lesson.02/step_2.py b/lessons/lesson.02/step_2.py new file mode 100644 index 0000000..3d1fc90 --- /dev/null +++ b/lessons/lesson.02/step_2.py @@ -0,0 +1,34 @@ +class User: + def __init__(self): + self.name = None + self.__age = None # name mangling, private + self._address = None # protected + + def set_address(self, address): + pass + + def _set_age(self, value): + pass + + def get_address(self): + return self._address + + +user_1 = User() +user_2 = User() + +print(vars(user_1)) +# print(user_1.__dict__) +print(user_1.name) +print(user_1._address) +user_1._address = 'Moscow' + +print(vars(user_1)) + +# MongoMixin() + + +class MongoUser(MongoMixin, User): # C3 + pass + + diff --git a/lessons/lesson.02/step_3.py b/lessons/lesson.02/step_3.py new file mode 100644 index 0000000..053d481 --- /dev/null +++ b/lessons/lesson.02/step_3.py @@ -0,0 +1,35 @@ +class User: + def __init__(self): + self.name = None + self._age = None + self._address = None + + def get_address(self): + return self._address or 'undefined' + + def set_address(self, address): + self._address = address + + def get_age(self): + return self._age + + def set_age(self, value): + self._age = int(value) + + def year_older(self): + self._age += 1 + + + + +user_1 = User() +user_2 = User() + +user_1.name = 'Ivan' +# user_1._age = 25 +# user_1.set_age(25) +user_1.set_age('25') +user_1.year_older() +print(user_1.get_age()) +print(user_1.get_address()) +print(vars(user_1)) diff --git a/lessons/lesson.02/step_4.py b/lessons/lesson.02/step_4.py new file mode 100644 index 0000000..c416fc8 --- /dev/null +++ b/lessons/lesson.02/step_4.py @@ -0,0 +1,37 @@ +class User: + def __init__(self): + self.name = None + self._age = None + self._address = None + + @property + def address(self): + return self._address or 'undefined' + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @age.setter + def age(self, value): + self._age = int(value) + + def year_older(self): + self._age += 1 + + + + +user_1 = User() +user_2 = User() + +user_1.name = 'Ivan' +user_1.age = '25' +user_1.year_older() +print(user_1.age) +print(user_1.address) +print(vars(user_1)) diff --git a/lessons/lesson.02/step_5.py b/lessons/lesson.02/step_5.py new file mode 100644 index 0000000..6acc113 --- /dev/null +++ b/lessons/lesson.02/step_5.py @@ -0,0 +1,39 @@ +class User: + def __init__(self): + self.name = None + self._age = None + self._address = None + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @age.setter + def age(self, value): + self._age = int(value) + + def year_older(self): + self._age += 1 + + + +user_1 = User() +user_2 = User() + +user_1.name = 'Ivan' +user_1.age = '25' +user_1.year_older() +print(user_1.age) +print(user_1.address) +print(vars(user_1)) +print(vars(User)) diff --git a/lessons/lesson.02/step_6.py b/lessons/lesson.02/step_6.py new file mode 100644 index 0000000..857e388 --- /dev/null +++ b/lessons/lesson.02/step_6.py @@ -0,0 +1,43 @@ +class User: + MIN_AGE = 18 + + def __init__(self): + self.name = None + self._age = None + self._address = None + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + @age.setter + def age(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +user_1 = User() +user_2 = User() + +user_1.name = 'Ivan' +user_1.age = '18' +user_1.year_older() +print(user_1.age) +print(user_1.address) +print(vars(user_1)) +print(vars(User)) diff --git a/lessons/lesson.02/step_7.py b/lessons/lesson.02/step_7.py new file mode 100644 index 0000000..04cf3a9 --- /dev/null +++ b/lessons/lesson.02/step_7.py @@ -0,0 +1,45 @@ +class User: + MIN_AGE = 18 + + def __init__(self): + self.name = None + self._age = None + self._address = None + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + @age.setter + def age(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + # pass + MIN_AGE = 25 + + +user_1 = AdminUser() + +user_1.name = 'Ivan' +user_1.age = '25' +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) diff --git a/lessons/lesson.02/step_8.py b/lessons/lesson.02/step_8.py new file mode 100644 index 0000000..320df8e --- /dev/null +++ b/lessons/lesson.02/step_8.py @@ -0,0 +1,51 @@ +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + # @age.setter + # def age(self, value): + # if self._age is not None: + # return + # self._age_setter(value) + + def _age_setter(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + + +user_1 = AdminUser('Ivan', '26') + +# user_1.age = '25' # immutable +# user_1._age = '25' +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) diff --git a/lessons/lesson.02/step_9.py b/lessons/lesson.02/step_9.py new file mode 100644 index 0000000..5d6b048 --- /dev/null +++ b/lessons/lesson.02/step_9.py @@ -0,0 +1,46 @@ +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + def _age_setter(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + + # def __init__(self, *args, **kwargs): + # super().__init__(*args, **kwargs) + + +user_1 = AdminUser('Ivan', '26') + +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) From 187bfbb5041e4a111d0d28f7abeb2add6a1f2ffe Mon Sep 17 00:00:00 2001 From: Evgeny Revniakov Date: Fri, 10 Nov 2023 00:07:38 +0500 Subject: [PATCH 04/27] Add lesson 3: OOP advanced --- README.md | 1 + lessons/lesson.03/step_0.py | 47 ++++++++++++++++++ lessons/lesson.03/step_1.py | 64 ++++++++++++++++++++++++ lessons/lesson.03/step_2.py | 83 +++++++++++++++++++++++++++++++ lessons/lesson.03/step_3.py | 83 +++++++++++++++++++++++++++++++ lessons/lesson.03/step_4.py | 97 +++++++++++++++++++++++++++++++++++++ lessons/lesson.03/step_5.py | 80 ++++++++++++++++++++++++++++++ lessons/lesson.03/step_6.py | 44 +++++++++++++++++ lessons/lesson.03/step_7.py | 67 +++++++++++++++++++++++++ 9 files changed, 566 insertions(+) create mode 100644 lessons/lesson.03/step_0.py create mode 100644 lessons/lesson.03/step_1.py create mode 100644 lessons/lesson.03/step_2.py create mode 100644 lessons/lesson.03/step_3.py create mode 100644 lessons/lesson.03/step_4.py create mode 100644 lessons/lesson.03/step_5.py create mode 100644 lessons/lesson.03/step_6.py create mode 100644 lessons/lesson.03/step_7.py diff --git a/README.md b/README.md index 7304c82..0ae366d 100644 --- a/README.md +++ b/README.md @@ -5,3 +5,4 @@ - [Урок 1. Введение в HTTP. Работа с библиотеками requests и BeautifulSoup](lessons/lesson.01/) - [Урок 2. Основы ООП. Принципы ООП](lessons/lesson.02/) +- [Урок 3. ООП. Магические методы, утиная типизация, статические методы, методы класса](lessons/lesson.03/) diff --git a/lessons/lesson.03/step_0.py b/lessons/lesson.03/step_0.py new file mode 100644 index 0000000..819ad3f --- /dev/null +++ b/lessons/lesson.03/step_0.py @@ -0,0 +1,47 @@ +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + def _age_setter(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + +user_1 = AdminUser('Ivan', '26', 'Moscow') + +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) diff --git a/lessons/lesson.03/step_1.py b/lessons/lesson.03/step_1.py new file mode 100644 index 0000000..c56b865 --- /dev/null +++ b/lessons/lesson.03/step_1.py @@ -0,0 +1,64 @@ +# import step_0 +# +# print(step_0.User.MIN_AGE) +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + # print(self.MIN_AGE) + return self._age + + def _age_setter(self, value): + self._age = int(value) + if self._age < self.MIN_AGE: + raise ValueError + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + MAX_AGE = 75 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + # def _age_setter(self, value): + # self._age = int(value) + # if ( + # self._age <= self.MIN_AGE + # or self._age > self.MAX_AGE + # ): + # raise ValueError + def _age_setter(self, value): + super()._age_setter(value) + + if self._age > self.MAX_AGE: + raise ValueError + + +user_1 = AdminUser('Ivan', '26', 'Moscow') + +user_1.year_older() +print(vars(user_1)) +print(isinstance(user_1, AdminUser)) diff --git a/lessons/lesson.03/step_2.py b/lessons/lesson.03/step_2.py new file mode 100644 index 0000000..ea18761 --- /dev/null +++ b/lessons/lesson.03/step_2.py @@ -0,0 +1,83 @@ +def name_to_upper(name): + return name.upper() + + +def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + +class WrongIntValue(Exception): + pass + + +class WrongAgeValue(Exception): + pass + + +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = None + self._address = address + + self._age_setter(age) + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @staticmethod + def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + def _age_setter(self, value): + self._age = self._parse_int(value) + if self._age < self.MIN_AGE: + raise WrongAgeValue + + def year_older(self): + self._age += 1 + + # def name_to_upper(self, name): + # # no self + # return name.upper() + + +class AdminUser(User): + MIN_AGE = 25 + MAX_AGE = 75 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + def _age_setter(self, value): + super()._age_setter(value) + + if self._age > self.MAX_AGE: + raise ValueError + + +user_1 = AdminUser('Ivan', '26', 'Moscow') + +user_1.year_older() +# print(user_1.name_to_upper('john')) +print(name_to_upper('john')) diff --git a/lessons/lesson.03/step_3.py b/lessons/lesson.03/step_3.py new file mode 100644 index 0000000..63074dc --- /dev/null +++ b/lessons/lesson.03/step_3.py @@ -0,0 +1,83 @@ +MIN_AGE = 18 + + +def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + +def _age_validator(value): + _age = _parse_int(value) + if _age < MIN_AGE: + raise WrongAgeValue + return _age + + +class WrongIntValue(Exception): + pass + + +class WrongAgeValue(Exception): + pass + + +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = _age_validator(age) + self._address = address + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @staticmethod + def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + # def _age_validator(self, value): + # _age = self._parse_int(value) + # if _age < self.MIN_AGE: + # raise WrongAgeValue + # return _age + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + MAX_AGE = 75 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + # def _age_validator(self, value): + # super()._age_validator(value) + # + # if self._age > self.MAX_AGE: + # raise ValueError + + +user_1 = AdminUser('Ivan', '26', 'Moscow') + +user_1.year_older() +print(vars(user_1)) diff --git a/lessons/lesson.03/step_4.py b/lessons/lesson.03/step_4.py new file mode 100644 index 0000000..2a248e5 --- /dev/null +++ b/lessons/lesson.03/step_4.py @@ -0,0 +1,97 @@ +class WrongIntValue(Exception): + pass + + +class WrongAgeValue(Exception): + pass + + +class User: + # qty = 0 + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = self._age_validator(age) + self._address = address + self._superuser = False + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @staticmethod + def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + @classmethod + def _age_validator(cls, value): + # self.name + # self._age + # self._address + _age = cls._parse_int(value) + if _age < cls.MIN_AGE: + raise WrongAgeValue + return _age + + @classmethod + def create_superuser(cls, *args, **kwargs): + # cls.qty += 1 + inst = cls(*args, **kwargs) + inst._superuser = True + return inst + + # @staticmethod + # def create_superuser(*args, **kwargs): + # inst = User(*args, **kwargs) + # inst._superuser = True + # return inst + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + MAX_AGE = 75 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + @classmethod + def _age_validator(cls, value): + _age = super()._age_validator(value) + + if _age > cls.MAX_AGE: + raise ValueError + + return _age + + # @staticmethod + # def create_superuser(*args, **kwargs): + # inst = AdminUser(*args, **kwargs) + # inst._superuser = True + # return inst + + +# user_1 = AdminUser('Ivan', '26', 'Moscow') +user_1 = AdminUser.create_superuser('Ivan', '26', 'Moscow') + +# user_1._superuser = True +user_1.year_older() +print(vars(user_1)) +print(type(user_1)) diff --git a/lessons/lesson.03/step_5.py b/lessons/lesson.03/step_5.py new file mode 100644 index 0000000..4fc0a39 --- /dev/null +++ b/lessons/lesson.03/step_5.py @@ -0,0 +1,80 @@ +class WrongIntValue(Exception): + pass + + +class WrongAgeValue(Exception): + pass + + +class User: + MIN_AGE = 18 + + def __init__(self, name, age, address=None): + self.name = name + self._age = self._age_validator(age) + self._address = address + self._superuser = False + + @property + def address(self): # lazy attrib + if self._address is None: + self._address = 'compl logic' + return self._address + + @address.setter + def address(self, address): + self._address = address + + @property + def age(self): + return self._age + + @staticmethod + def _parse_int(value): + try: + return int(value) + except ValueError: + raise WrongIntValue + + @classmethod + def _age_validator(cls, value): + _age = cls._parse_int(value) + if _age < cls.MIN_AGE: + raise WrongAgeValue + return _age + + @classmethod + def create_superuser(cls, *args, **kwargs): + # cls.qty += 1 + inst = cls(*args, **kwargs) + inst._superuser = True + return inst + + def year_older(self): + self._age += 1 + + +class AdminUser(User): + MIN_AGE = 25 + MAX_AGE = 75 + + def __init__(self, name, age, address, level=0): + super().__init__(name, age, address) + self.level = level + + @classmethod + def _age_validator(cls, value): + _age = super()._age_validator(value) + + if _age > cls.MAX_AGE: + raise ValueError + + return _age + + +# user_1 = AdminUser('Ivan', '26', 'Moscow') +user_1 = AdminUser.create_superuser('Ivan', '26', 'Moscow') + +user_1.year_older() +print(vars(user_1)) +print(type(user_1)) diff --git a/lessons/lesson.03/step_6.py b/lessons/lesson.03/step_6.py new file mode 100644 index 0000000..15b6514 --- /dev/null +++ b/lessons/lesson.03/step_6.py @@ -0,0 +1,44 @@ +class Vector: + def __init__(self, *values): + self._values = values + + def __add__(self, other) -> 'Vector': + # return [ + # a + b for a, b in zip(self._values, other._values) + # ] + # result = [] + # for idx in range(len(self._values)): + # result.append(self._values[idx] + other._values[idx]) + # return self.__class__(*result) + + return self.__class__( + *( + a + b + for a, b in zip(self._values, other._values) + ), + ) + + def __str__(self): + return str(self._values) + + # __repr__ = __str__ + def __repr__(self): + # Vector(25, 30) + return f'{self.__class__.__name__}{self._values}' + + +a = Vector(25, 30) +b = Vector(0, 10) +c = a + b + a + a +# print(vars(c)) +print(c) +print(str(c)) +print(repr(c)) + +# repr(c) +# c.repr() + +data = [a, b, c] +print(data) +c_clone = eval(repr(c)) +print(c_clone, type(c_clone)) diff --git a/lessons/lesson.03/step_7.py b/lessons/lesson.03/step_7.py new file mode 100644 index 0000000..ae3c447 --- /dev/null +++ b/lessons/lesson.03/step_7.py @@ -0,0 +1,67 @@ +class Vector: + def __init__(self, *values): + self._values = values + self._values_set = set(values) + + def __add__(self, other) -> 'Vector': + return self.__class__( + *( + a + b + for a, b in zip(self._values, other._values) + ), + ) + + def __iadd__(self, other): + self._values = [ + a + b + for a, b in zip(self._values, other._values) + ] + return self + + def __str__(self): + return str(self._values) + + def __repr__(self): + return f'{self.__class__.__name__}{self._values}' + + def __iter__(self): + print('__iter__') + return (el for el in self._values) + + def __contains__(self, item): + print('__contains__') + return item in self._values_set + + def __len__(self): + return len(self._values) + + def __getitem__(self, item): + return self._values[item] + + # def __getattribute__(self, item): + # pass + + # def __getattr__(self, item): + # pass + + +a = Vector(25, 30) +print(id(a)) +a += a +print(id(a)) +print(25 in a) # O(n) -> O(1) +print(50 in a) # O(n) -> O(1) +# iterable VS Iterator +# iterable -> Iterator -> __iter__ +# Iterator -> next() -> __next__ +# __iter__ + __next__ = iterable + Iterator +for el in a: + print(el) + +print(len(a)) +print(a[0]) +# a[0] = 22 + +# a.idx_0 +# a.idx_1 +# a.idx_2 From 672d632f3ff1d855d2b0e87eb76ee0bf8a1e8a8c Mon Sep 17 00:00:00 2001 From: Evgeny Revniakov Date: Wed, 15 Nov 2023 00:19:10 +0500 Subject: [PATCH 05/27] Add lesson 4: Tests, pytest --- README.md | 1 + lessons/lesson.04/otus-1/helper.py | 3 + lessons/lesson.04/otus-1/test_helper.py | 32 ++++++++++ lessons/lesson.04/otus-1/test_helper_2.py | 17 ++++++ lessons/lesson.04/otus-2/helper.py | 3 + lessons/lesson.04/otus-2/test_helper.py | 22 +++++++ lessons/lesson.04/otus-2/tests/__init__.py | 0 .../lesson.04/otus-2/tests/api/__init__.py | 0 .../otus-2/tests/api/monitor/__init__.py | 0 .../otus-2/tests/api/monitor/test_handlers.py | 0 .../otus-2/tests/api/user/__init__.py | 0 .../otus-2/tests/api/user/test_handlers.py | 0 .../otus-2/tests/entities/__init__.py | 0 .../otus-2/tests/fixtures/__init__.py | 0 lessons/lesson.04/otus-2/tests/pytest.ini | 0 lessons/lesson.04/otus-3/db/db_helper.py | 53 +++++++++++++++++ lessons/lesson.04/otus-3/db/test_db_helper.py | 43 ++++++++++++++ lessons/lesson.04/otus-4/db/conftest.py | 25 ++++++++ lessons/lesson.04/otus-4/db/db_helper.py | 53 +++++++++++++++++ .../otus-4/db/redis_tests/__init__.py | 0 .../otus-4/db/redis_tests/conftest.py | 6 ++ lessons/lesson.04/otus-4/db/test_db_helper.py | 16 +++++ lessons/lesson.04/otus-4/pytest.ini | 2 + lessons/lesson.04/otus-5/db/conftest.py | 10 ++++ lessons/lesson.04/otus-5/db/db_helper.py | 59 +++++++++++++++++++ lessons/lesson.04/otus-5/db/test_db_helper.py | 27 +++++++++ 26 files changed, 372 insertions(+) create mode 100644 lessons/lesson.04/otus-1/helper.py create mode 100644 lessons/lesson.04/otus-1/test_helper.py create mode 100644 lessons/lesson.04/otus-1/test_helper_2.py create mode 100644 lessons/lesson.04/otus-2/helper.py create mode 100644 lessons/lesson.04/otus-2/test_helper.py create mode 100644 lessons/lesson.04/otus-2/tests/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/api/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/api/monitor/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/api/monitor/test_handlers.py create mode 100644 lessons/lesson.04/otus-2/tests/api/user/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/api/user/test_handlers.py create mode 100644 lessons/lesson.04/otus-2/tests/entities/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/fixtures/__init__.py create mode 100644 lessons/lesson.04/otus-2/tests/pytest.ini create mode 100644 lessons/lesson.04/otus-3/db/db_helper.py create mode 100644 lessons/lesson.04/otus-3/db/test_db_helper.py create mode 100644 lessons/lesson.04/otus-4/db/conftest.py create mode 100644 lessons/lesson.04/otus-4/db/db_helper.py create mode 100644 lessons/lesson.04/otus-4/db/redis_tests/__init__.py create mode 100644 lessons/lesson.04/otus-4/db/redis_tests/conftest.py create mode 100644 lessons/lesson.04/otus-4/db/test_db_helper.py create mode 100644 lessons/lesson.04/otus-4/pytest.ini create mode 100644 lessons/lesson.04/otus-5/db/conftest.py create mode 100644 lessons/lesson.04/otus-5/db/db_helper.py create mode 100644 lessons/lesson.04/otus-5/db/test_db_helper.py diff --git a/README.md b/README.md index 0ae366d..b489020 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,4 @@ - [Урок 1. Введение в HTTP. Работа с библиотеками requests и BeautifulSoup](lessons/lesson.01/) - [Урок 2. Основы ООП. Принципы ООП](lessons/lesson.02/) - [Урок 3. ООП. Магические методы, утиная типизация, статические методы, методы класса](lessons/lesson.03/) +- [Урок 4. Введение в автотесты. pytest](lessons/lesson.04/) diff --git a/lessons/lesson.04/otus-1/helper.py b/lessons/lesson.04/otus-1/helper.py new file mode 100644 index 0000000..ee474eb --- /dev/null +++ b/lessons/lesson.04/otus-1/helper.py @@ -0,0 +1,3 @@ +def get_least(*args): + args = [el for el in args if el >= 0] + return min(args) diff --git a/lessons/lesson.04/otus-1/test_helper.py b/lessons/lesson.04/otus-1/test_helper.py new file mode 100644 index 0000000..7af4d1e --- /dev/null +++ b/lessons/lesson.04/otus-1/test_helper.py @@ -0,0 +1,32 @@ +from helper import get_least + + +def test_success_get_least(): + args = [0, 1, 2, 3] + result = get_least(*args) + exp_result = 0 + assert result == exp_result, 'fail success_get_least' + + +def test_success_get_least_2(): + args = [-1, 0, 1, 2, 3] + result = get_least(*args) + exp_result = 0 + assert result == exp_result + + +def test_fail_get_least(): + args = ['-1', '0', 1, 2, 3] + # args = [-1, 0, 1, 2, 3] + try: + get_least(*args) + except TypeError: + pass + else: + raise Exception('no exception raised') + + +if __name__ == '__main__': + test_success_get_least() + test_success_get_least_2() + test_fail_get_least() diff --git a/lessons/lesson.04/otus-1/test_helper_2.py b/lessons/lesson.04/otus-1/test_helper_2.py new file mode 100644 index 0000000..b44c5d5 --- /dev/null +++ b/lessons/lesson.04/otus-1/test_helper_2.py @@ -0,0 +1,17 @@ +from unittest import TestCase + +from helper import get_least + + +class TestSuccessGetLeast(TestCase): + def test_success_get_least(self): + args = [0, 1, 2, 3] + result = get_least(*args) + exp_result = 0 + self.assertEqual(result, exp_result) + + def test_success_get_least_2(self): + args = [-1, 0, 1, 2, 3] + result = get_least(*args) + exp_result = 0 + self.assertEqual(result, exp_result) diff --git a/lessons/lesson.04/otus-2/helper.py b/lessons/lesson.04/otus-2/helper.py new file mode 100644 index 0000000..ee474eb --- /dev/null +++ b/lessons/lesson.04/otus-2/helper.py @@ -0,0 +1,3 @@ +def get_least(*args): + args = [el for el in args if el >= 0] + return min(args) diff --git a/lessons/lesson.04/otus-2/test_helper.py b/lessons/lesson.04/otus-2/test_helper.py new file mode 100644 index 0000000..6602b28 --- /dev/null +++ b/lessons/lesson.04/otus-2/test_helper.py @@ -0,0 +1,22 @@ +import pytest + +from helper import get_least + + +@pytest.mark.parametrize( + 'src, exp_result', + [ + ([0, 1, 2, 3], 0), + ([-1, 0, 1, 2, 3], 0), + ([-1, 1, 2, 3], 1), + ] +) +def test_success_get_least(src, exp_result): + result = get_least(*src) + assert result == exp_result + + +def test_fail_get_least(): + args = ['-1', '0', 1, 2, 3] + with pytest.raises(TypeError): # Contex Manager + get_least(*args) diff --git a/lessons/lesson.04/otus-2/tests/__init__.py b/lessons/lesson.04/otus-2/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/api/__init__.py b/lessons/lesson.04/otus-2/tests/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/api/monitor/__init__.py b/lessons/lesson.04/otus-2/tests/api/monitor/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/api/monitor/test_handlers.py b/lessons/lesson.04/otus-2/tests/api/monitor/test_handlers.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/api/user/__init__.py b/lessons/lesson.04/otus-2/tests/api/user/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/api/user/test_handlers.py b/lessons/lesson.04/otus-2/tests/api/user/test_handlers.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/entities/__init__.py b/lessons/lesson.04/otus-2/tests/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/fixtures/__init__.py b/lessons/lesson.04/otus-2/tests/fixtures/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-2/tests/pytest.ini b/lessons/lesson.04/otus-2/tests/pytest.ini new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-3/db/db_helper.py b/lessons/lesson.04/otus-3/db/db_helper.py new file mode 100644 index 0000000..50dda42 --- /dev/null +++ b/lessons/lesson.04/otus-3/db/db_helper.py @@ -0,0 +1,53 @@ +URL = "sqlite:///:memory:" + + +class User: + def __init__(self, username: str): + self.username = username + + def __str__(self): + return self.username + + def delete(self): + print("deleted user", self) + return True + + +class Engine: + def __init__(self, url: str): + self.url = url + + def init_connection(self): + ... + + def destroy_connection(self): + ... + + +class Connection: + def __init__(self, engine: Engine): + self.engine = engine + + def init_conn(self): + self.engine.init_connection() + + def get_user(self, username: str): + print("conn get username", username) + return User(username) + + +def get_engine(url=URL): + return Engine(url) + + +def get_connection(engine=None): + if engine is None: + engine = get_engine() + + return Connection(engine) + + +def get_user(username: str): + conn = get_connection() + # conn = Connection(get_engine()) + return conn.get_user(username) diff --git a/lessons/lesson.04/otus-3/db/test_db_helper.py b/lessons/lesson.04/otus-3/db/test_db_helper.py new file mode 100644 index 0000000..1a9689d --- /dev/null +++ b/lessons/lesson.04/otus-3/db/test_db_helper.py @@ -0,0 +1,43 @@ +import unittest + +from db_helper import User + + +# class UserTest(unittest.TestCase): +# def test_init(self): +# username = 'Otus' +# user = User(username=username) +# self.assertEqual(user.username, username) +# +# def test_str(self): +# username = 'Otus' +# user = User(username=username) +# self.assertEqual(str(user), username) +# +# def test_delete(self): +# username = 'Otus' +# user = User(username=username) +# self.assertTrue(user.delete()) + + +class UserTest(unittest.TestCase): + # def setUp(self): + # print('setUp') + # self.username = 'Otus' + # self.user = User(username=self.username) + + @classmethod + def setUpClass(cls): + super().setUpClass() + print('setUp') + cls.username = 'Otus' + cls.user = User(username=cls.username) + + def test_init(self): + self.assertEqual(self.user.username, self.username) + + def test_str(self): + self.assertEqual(str(self.user), self.username) + + def test_delete(self): + self.assertTrue(self.user.delete()) diff --git a/lessons/lesson.04/otus-4/db/conftest.py b/lessons/lesson.04/otus-4/db/conftest.py new file mode 100644 index 0000000..d199e7f --- /dev/null +++ b/lessons/lesson.04/otus-4/db/conftest.py @@ -0,0 +1,25 @@ +from pytest import fixture + +from db_helper import User + + +@fixture(scope='session', autouse=True) +def clear(): + print('prepare it') + yield + print('crear it') + + +@fixture(scope='session') +# @fixture +def otus_user(): + print('otus_user') + username = 'Otus' + return username, User(username=username) + + +@fixture +def otus_super_user(): + print('otus_super_user') + username = 'SuperOtus' + return username, User(username=username) diff --git a/lessons/lesson.04/otus-4/db/db_helper.py b/lessons/lesson.04/otus-4/db/db_helper.py new file mode 100644 index 0000000..50dda42 --- /dev/null +++ b/lessons/lesson.04/otus-4/db/db_helper.py @@ -0,0 +1,53 @@ +URL = "sqlite:///:memory:" + + +class User: + def __init__(self, username: str): + self.username = username + + def __str__(self): + return self.username + + def delete(self): + print("deleted user", self) + return True + + +class Engine: + def __init__(self, url: str): + self.url = url + + def init_connection(self): + ... + + def destroy_connection(self): + ... + + +class Connection: + def __init__(self, engine: Engine): + self.engine = engine + + def init_conn(self): + self.engine.init_connection() + + def get_user(self, username: str): + print("conn get username", username) + return User(username) + + +def get_engine(url=URL): + return Engine(url) + + +def get_connection(engine=None): + if engine is None: + engine = get_engine() + + return Connection(engine) + + +def get_user(username: str): + conn = get_connection() + # conn = Connection(get_engine()) + return conn.get_user(username) diff --git a/lessons/lesson.04/otus-4/db/redis_tests/__init__.py b/lessons/lesson.04/otus-4/db/redis_tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.04/otus-4/db/redis_tests/conftest.py b/lessons/lesson.04/otus-4/db/redis_tests/conftest.py new file mode 100644 index 0000000..26c8ded --- /dev/null +++ b/lessons/lesson.04/otus-4/db/redis_tests/conftest.py @@ -0,0 +1,6 @@ +from pytest import fixture + + +@fixture +def redis_connection(): + print('redis_connection') diff --git a/lessons/lesson.04/otus-4/db/test_db_helper.py b/lessons/lesson.04/otus-4/db/test_db_helper.py new file mode 100644 index 0000000..d336196 --- /dev/null +++ b/lessons/lesson.04/otus-4/db/test_db_helper.py @@ -0,0 +1,16 @@ +# from conftest import otus_user + + +def test_init(otus_user): + username, user = otus_user + assert user.username, username + + +def test_str(otus_user): + username, user = otus_user + assert str(user) == username + + +def test_delete(otus_super_user): + username, user = otus_super_user + assert user.delete() == True diff --git a/lessons/lesson.04/otus-4/pytest.ini b/lessons/lesson.04/otus-4/pytest.ini new file mode 100644 index 0000000..b4d542d --- /dev/null +++ b/lessons/lesson.04/otus-4/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +addopts = --cov . --cov-report html diff --git a/lessons/lesson.04/otus-5/db/conftest.py b/lessons/lesson.04/otus-5/db/conftest.py new file mode 100644 index 0000000..c9f6b65 --- /dev/null +++ b/lessons/lesson.04/otus-5/db/conftest.py @@ -0,0 +1,10 @@ +from pytest import fixture + +from db_helper import User + + +# @fixture +@fixture(scope='module') +def otus_user(): + username = 'Otus' + return username, User(username=username) diff --git a/lessons/lesson.04/otus-5/db/db_helper.py b/lessons/lesson.04/otus-5/db/db_helper.py new file mode 100644 index 0000000..2373c2c --- /dev/null +++ b/lessons/lesson.04/otus-5/db/db_helper.py @@ -0,0 +1,59 @@ +URL = "sqlite:///:memory:" + + +class User: + def __init__(self, username: str): + self.username = username + + def __str__(self): + return self.username + + def delete(self): + print("deleted user", self) + return True + + +class Engine: + def __init__(self, url: str): + self.url = url + + def init_connection(self): + ... + + def destroy_connection(self): + ... + + +class Connection: + def __init__(self, engine: Engine): + self.engine = engine + + def init_conn(self): + self.engine.init_connection() + + def get_user(self, username: str): + print("conn get username", username) + return User(username) + + +def get_engine(url=URL): + return Engine(url) + + +def get_connection(engine=None): + ... + # if engine is None: + # engine = get_engine() + # + # return Connection(engine) + + +def get_user(username: str): + ... + conn = get_connection() + # conn = get_connection(engine='hello') + # conn = Connection(get_engine()) + # conn.get_user(username) + return conn.get_user(username) + # return conn.get_user(username.upper()) + # return User(username) diff --git a/lessons/lesson.04/otus-5/db/test_db_helper.py b/lessons/lesson.04/otus-5/db/test_db_helper.py new file mode 100644 index 0000000..d626c44 --- /dev/null +++ b/lessons/lesson.04/otus-5/db/test_db_helper.py @@ -0,0 +1,27 @@ +from unittest import mock + +from db_helper import get_user, User + + +# @mock.patch("db_helper.get_connection", spec=True) +@mock.patch("db_helper.get_connection") +def test_get_user(mocked_get_connection, otus_user): + username, user = otus_user + + mocker_conn = mocked_get_connection.return_value + mocked_conn_get_user = mocker_conn.get_user + mocked_conn_get_user.return_value = user + + res = get_user(username) + + mocked_conn_get_user.assert_called() + + assert isinstance(res, User) + assert res.username == user.username + + + mocked_conn_get_user.assert_called_once() + mocked_conn_get_user.assert_called_once_with(username) + + mocked_get_connection.assert_called_once() + mocked_get_connection.assert_called_once_with() From 41e2cc56d60fcbd2347de2fbcc2b26405e16c609 Mon Sep 17 00:00:00 2001 From: Evgeny Revniakov Date: Fri, 17 Nov 2023 00:05:09 +0500 Subject: [PATCH 06/27] Add lesson 5: Docker, docker compose --- README.md | 1 + lessons/lesson.05/.dockerignore | 22 +++ lessons/lesson.05/Dockerfile | 16 +++ lessons/lesson.05/docker-compose.yaml | 23 ++++ lessons/lesson.05/otusblog/manage.py | 23 ++++ .../lesson.05/otusblog/otusblog/__init__.py | 0 lessons/lesson.05/otusblog/otusblog/asgi.py | 16 +++ .../lesson.05/otusblog/otusblog/settings.py | 127 ++++++++++++++++++ lessons/lesson.05/otusblog/otusblog/urls.py | 21 +++ lessons/lesson.05/otusblog/otusblog/wsgi.py | 16 +++ lessons/lesson.05/requirements.txt | 4 + 11 files changed, 269 insertions(+) create mode 100644 lessons/lesson.05/.dockerignore create mode 100644 lessons/lesson.05/Dockerfile create mode 100644 lessons/lesson.05/docker-compose.yaml create mode 100755 lessons/lesson.05/otusblog/manage.py create mode 100644 lessons/lesson.05/otusblog/otusblog/__init__.py create mode 100644 lessons/lesson.05/otusblog/otusblog/asgi.py create mode 100644 lessons/lesson.05/otusblog/otusblog/settings.py create mode 100644 lessons/lesson.05/otusblog/otusblog/urls.py create mode 100644 lessons/lesson.05/otusblog/otusblog/wsgi.py create mode 100644 lessons/lesson.05/requirements.txt diff --git a/README.md b/README.md index b489020..e73e23c 100644 --- a/README.md +++ b/README.md @@ -7,3 +7,4 @@ - [Урок 2. Основы ООП. Принципы ООП](lessons/lesson.02/) - [Урок 3. ООП. Магические методы, утиная типизация, статические методы, методы класса](lessons/lesson.03/) - [Урок 4. Введение в автотесты. pytest](lessons/lesson.04/) +- [Урок 5. Введение в docker, docker-compose](lessons/lesson.05/) diff --git a/lessons/lesson.05/.dockerignore b/lessons/lesson.05/.dockerignore new file mode 100644 index 0000000..fe96768 --- /dev/null +++ b/lessons/lesson.05/.dockerignore @@ -0,0 +1,22 @@ +__pycache__ +*.pyc +*.pyo +*.pyd +.Python +env +pip-log.txt +pip-delete-this-directory.txt +.tox +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.log +.git +.mypy_cache +.pytest_cache +.hypothesis +venv +.idea diff --git a/lessons/lesson.05/Dockerfile b/lessons/lesson.05/Dockerfile new file mode 100644 index 0000000..a3c626b --- /dev/null +++ b/lessons/lesson.05/Dockerfile @@ -0,0 +1,16 @@ +FROM python:3.11 + +ENV PYTHONBUFFERED=1 +ENV DEBUG=1 + +WORKDIR /otus + +COPY requirements.txt requirements.txt + +RUN pip install --no-cache-dir -r requirements.txt + +COPY otusblog . + +EXPOSE 8000 + +CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] diff --git a/lessons/lesson.05/docker-compose.yaml b/lessons/lesson.05/docker-compose.yaml new file mode 100644 index 0000000..2e1c673 --- /dev/null +++ b/lessons/lesson.05/docker-compose.yaml @@ -0,0 +1,23 @@ +version: "3" + +services: + pg: + image: postgres:15 +# build: ... + environment: + POSTGRES_DB: blog + POSTGRES_USER: otus + POSTGRES_PASSWORD: passwd! + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432:5432" + volumes: + - db-data:/var/lib/postgresql/data/pgdata + healthcheck: + test: /healthcheck + +# back: +# ... + +volumes: + db-data: diff --git a/lessons/lesson.05/otusblog/manage.py b/lessons/lesson.05/otusblog/manage.py new file mode 100755 index 0000000..2af5f07 --- /dev/null +++ b/lessons/lesson.05/otusblog/manage.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'otusblog.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/lessons/lesson.05/otusblog/otusblog/__init__.py b/lessons/lesson.05/otusblog/otusblog/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.05/otusblog/otusblog/asgi.py b/lessons/lesson.05/otusblog/otusblog/asgi.py new file mode 100644 index 0000000..72e5831 --- /dev/null +++ b/lessons/lesson.05/otusblog/otusblog/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for otusblog project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'otusblog.settings') + +application = get_asgi_application() diff --git a/lessons/lesson.05/otusblog/otusblog/settings.py b/lessons/lesson.05/otusblog/otusblog/settings.py new file mode 100644 index 0000000..fa56576 --- /dev/null +++ b/lessons/lesson.05/otusblog/otusblog/settings.py @@ -0,0 +1,127 @@ +""" +Django settings for otusblog project. + +Generated by 'django-admin startproject' using Django 3.2. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/3.2/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-l^kk!8l1(+lmfbv8rq!iw0^1=42jes3uyi$net&xo0irqq=bz8' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'otusblog.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'otusblog.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/3.2/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/3.2/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/3.2/howto/static-files/ + +STATIC_URL = '/static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +LOGIN_URL = '/login/' diff --git a/lessons/lesson.05/otusblog/otusblog/urls.py b/lessons/lesson.05/otusblog/otusblog/urls.py new file mode 100644 index 0000000..e6eb2c2 --- /dev/null +++ b/lessons/lesson.05/otusblog/otusblog/urls.py @@ -0,0 +1,21 @@ +"""otusblog URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/3.2/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/lessons/lesson.05/otusblog/otusblog/wsgi.py b/lessons/lesson.05/otusblog/otusblog/wsgi.py new file mode 100644 index 0000000..039eb84 --- /dev/null +++ b/lessons/lesson.05/otusblog/otusblog/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for otusblog project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/3.2/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'otusblog.settings') + +application = get_wsgi_application() diff --git a/lessons/lesson.05/requirements.txt b/lessons/lesson.05/requirements.txt new file mode 100644 index 0000000..0f1b727 --- /dev/null +++ b/lessons/lesson.05/requirements.txt @@ -0,0 +1,4 @@ +asgiref==3.5.2 +Django==3.2 +pytz==2022.6 +sqlparse==0.4.3 From 3dfaa52bb6e18699aa91e140a535781d95f03ec1 Mon Sep 17 00:00:00 2001 From: Evgeny Revniakov Date: Wed, 22 Nov 2023 00:31:41 +0500 Subject: [PATCH 07/27] Add lesson 6: ORM, SQLAlchemy --- README.md | 1 + lessons/lesson.06/config.py | 19 ++ lessons/lesson.06/demo_1_create_table.py | 27 +++ lessons/lesson.06/demo_2_declarative_base.py | 38 ++++ lessons/lesson.06/demo_3_queries.py | 225 +++++++++++++++++++ lessons/lesson.06/docker-compose.yml | 26 +++ lessons/lesson.06/requirements.txt | 2 + 7 files changed, 338 insertions(+) create mode 100644 lessons/lesson.06/config.py create mode 100644 lessons/lesson.06/demo_1_create_table.py create mode 100644 lessons/lesson.06/demo_2_declarative_base.py create mode 100644 lessons/lesson.06/demo_3_queries.py create mode 100644 lessons/lesson.06/docker-compose.yml create mode 100644 lessons/lesson.06/requirements.txt diff --git a/README.md b/README.md index e73e23c..d3b939f 100644 --- a/README.md +++ b/README.md @@ -8,3 +8,4 @@ - [Урок 3. ООП. Магические методы, утиная типизация, статические методы, методы класса](lessons/lesson.03/) - [Урок 4. Введение в автотесты. pytest](lessons/lesson.04/) - [Урок 5. Введение в docker, docker-compose](lessons/lesson.05/) +- [Урок 6. ORM, SQLAlchemy](lessons/lesson.06/) diff --git a/lessons/lesson.06/config.py b/lessons/lesson.06/config.py new file mode 100644 index 0000000..141baf1 --- /dev/null +++ b/lessons/lesson.06/config.py @@ -0,0 +1,19 @@ +# from os import path +from pathlib import Path + +# import sqlalchemy as sa +from sqlalchemy import create_engine + +BASE_DIR = Path(__file__).parent +db_file_path = BASE_DIR / "blog.sqlite3" + +DB_URL = f"sqlite:///{db_file_path}" +# DB_URL = "postgresql+pg8000://user:example@localhost:5432/blog" +# DSN -> username, password, host, dbname +# DB_ECHO = False +DB_ECHO = True + +engine = create_engine( + url=DB_URL, + echo=DB_ECHO, +) diff --git a/lessons/lesson.06/demo_1_create_table.py b/lessons/lesson.06/demo_1_create_table.py new file mode 100644 index 0000000..caf0fcd --- /dev/null +++ b/lessons/lesson.06/demo_1_create_table.py @@ -0,0 +1,27 @@ +from sqlalchemy import ( + MetaData, + Table, + Column, + Integer, + String, +) + +from config import engine + +metadata = MetaData() + +authors_table = Table( + "authors", + metadata, + Column("id", Integer, primary_key=True), + Column("username", String(32), nullable=False, unique=True), + Column("email", String, nullable=True, unique=True), +) + + +def main(): + metadata.create_all(bind=engine) + + +if __name__ == "__main__": + main() diff --git a/lessons/lesson.06/demo_2_declarative_base.py b/lessons/lesson.06/demo_2_declarative_base.py new file mode 100644 index 0000000..ac7856d --- /dev/null +++ b/lessons/lesson.06/demo_2_declarative_base.py @@ -0,0 +1,38 @@ +from sqlalchemy import ( + Column, + Integer, + BigInteger, + String, +) +from sqlalchemy.orm import DeclarativeBase + +from config import engine + + +# from sqlalchemy.orm import declarative_base + +# Base = declarative_base() + + +class Base(DeclarativeBase): + pass + + +# new style -> pydantic +# old style +class Author(Base): + __tablename__ = "cool_authors" + + id = Column(Integer, primary_key=True) + username = Column(String(32), nullable=False, unique=True) + email = Column(String, nullable=True, unique=True) + address = Column(String, nullable=True, unique=False) + + +def main(): + # Base.metadata.drop_all(bind=engine) + Base.metadata.create_all(bind=engine) + + +if __name__ == "__main__": + main() diff --git a/lessons/lesson.06/demo_3_queries.py b/lessons/lesson.06/demo_3_queries.py new file mode 100644 index 0000000..9fd0d21 --- /dev/null +++ b/lessons/lesson.06/demo_3_queries.py @@ -0,0 +1,225 @@ +from typing import Sequence +import contextlib + +from sqlalchemy import ( + Column, + Integer, + String, + and_, + func, + or_, + select, + update, +) +# from sqlalchemy.engine import Result +from sqlalchemy.orm import ( + DeclarativeBase, + Session, # pool, scoped session +) + +from config import engine + + +class Base(DeclarativeBase): + pass + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + username = Column(String(32), nullable=False, unique=True) + email = Column(String, nullable=True, unique=True) + + def __repr__(self): + return str(self) + + def __str__(self): + return ( + f"{self.__class__.__name__}(id={self.id}, " + f"username={self.username!r}, email={self.email!r})" + ) + + +# @contextlib.contextmanager +def add_to_db(func): + def inner(session, **kwargs): + result = func(session, **kwargs) + session.add(result) + # session.flush() + session.commit() + return result + + return inner + + +# def transactional(): +# pass + +# add_to_db(create_user)(session, username) + +@add_to_db +def create_user( + session: Session, + username: str, + email: str | None = None, +) -> User: + user = User( + username=username, + email=email, + ) + print(user) + # session.add(user) + # session.commit() + # session.flush() + # print(user) + # print("saved user") + # print("user details:", user) + # return user + return user + + +def create_users( + session: Session, + *usernames: str, +) -> list[User]: + users = [User(username=username) for username in usernames] + session.add_all(users) + session.commit() + print("saved users:", users) + return users + + +def spameggs(foo, bar): + """ + + :param foo: needs X + :param bar: needs Y + :return: + """ + + +def get_user_by_id( + session: Session, + user_id: int, +) -> User | None: + """ + From cache + + :param session: + :param user_id: + :return: + """ + user = session.get(User, user_id) + print(user) + # if user is None: + # raise ... + return user + + +def find_user_by_id( + session: Session, + user_id: int, +) -> User | None: + stmt = select(User).where(User.id == user_id) + # stmt = select(User).filter(User.id=5) + # print(stmt.compile()) + + # result: Result = session.execute(stmt) + # user = result.scalar_one_or_none() + user = session.scalar(stmt) + if user is None: + print("no user by id", user_id) + else: + print("found user", user) + + return user + + +def find_user_by_username( + session: Session, + username: str, +) -> User | None: + # stmt = select(User).where(User.username == username) + # stmt = select(User).where(User.username.ilike(f'%{username}%')) + stmt = select(User).where(func.lower(User.username) == func.lower(username)) + # result: Result = session.execute(stmt) + # user = result.scalar_one_or_none() + user = session.scalar(stmt) + if user is None: + print("no user by username", username) + else: + print("found user", user) + + return user + + +def demo_update_users(session: Session): + fltr_u_w_o = User.username.ilike("%o%") + stmt_users_w_o = select(User).where(fltr_u_w_o) + users_w_o = session.scalars(stmt_users_w_o).all() + print(users_w_o) + upd_stmt = ( + update(User) + .where(fltr_u_w_o) + .values( + { + User.email: func.concat(User.username, "@ya.ru"), + # User.email: "abc", + } + ) + ) + session.execute(upd_stmt) + session.commit() + users_w_o = session.scalars(stmt_users_w_o).all() + print(users_w_o) + + +def find_users( + session: Session, +) -> Sequence[User]: + stmt = ( + select(User) + .where( + # or_( + and_( + # User.email.isnot(None), + User.username.ilike("%n%"), + ), + ) + # .order_by(User.id) + .order_by(User.id.desc()) + ) + users = session.scalars(stmt).all() + print(users) + return users + + +# @transaction +def main(): + # Base.metadata.drop_all(bind=engine) + # Base.metadata.create_all(bind=engine) + with Session(engine) as session: + create_user(session, username="john") + create_user(session, username="sam") + # create_user(session, username="bob") + # create_user(session, username="nick") + # create_users(session, "sam", "bob", "nick") + # get_user_by_id(session, 1) + # get_user_by_id(session, 2) + # get_user_by_id(session, 1) + # find_user_by_id(session, 1) + # find_user_by_id(session, 2) + # find_user_by_id(session, 5) + # find_user_by_username(session, "qwerty") + # find_user_by_username(session, "bob") + # find_user_by_username(session, "bo") + # find_user_by_username(session, "bOb") + # find_user_by_username(session, "Nick") + # find_user(session) + # demo_update_users(session) + # find_users(session) + + +if __name__ == "__main__": + main() diff --git a/lessons/lesson.06/docker-compose.yml b/lessons/lesson.06/docker-compose.yml new file mode 100644 index 0000000..e599881 --- /dev/null +++ b/lessons/lesson.06/docker-compose.yml @@ -0,0 +1,26 @@ +version: "3" + +services: + + db: + image: postgres + environment: + POSTGRES_DB: blog + POSTGRES_USER: user + POSTGRES_PASSWORD: example + ports: + - "5432:5432" + + adminer: + image: adminer + ports: + - "8080:8080" + + pgadmin: + image: dpage/pgadmin4 + environment: + PGADMIN_DEFAULT_EMAIL: admin@admin.org + PGADMIN_DEFAULT_PASSWORD: admin + PGADMIN_CONFIG_SERVER_MODE: 'False' + ports: + - "5050:80" diff --git a/lessons/lesson.06/requirements.txt b/lessons/lesson.06/requirements.txt new file mode 100644 index 0000000..47a85ee --- /dev/null +++ b/lessons/lesson.06/requirements.txt @@ -0,0 +1,2 @@ +sqlalchemy==2.0 +pg8000==1.30.2 \ No newline at end of file From bcc7ecd29d9d8b60a845da2bd27cb3c2da0b0f54 Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Thu, 23 Nov 2023 18:51:38 +0000 Subject: [PATCH 08/27] add lesson 7: html css js --- README.md | 1 + lessons/lesson.07/templates/contact.html | 50 +++++++++++++++ lessons/lesson.07/templates/index.html | 81 ++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 lessons/lesson.07/templates/contact.html create mode 100644 lessons/lesson.07/templates/index.html diff --git a/README.md b/README.md index d3b939f..2570bf5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,4 @@ - [Урок 4. Введение в автотесты. pytest](lessons/lesson.04/) - [Урок 5. Введение в docker, docker-compose](lessons/lesson.05/) - [Урок 6. ORM, SQLAlchemy](lessons/lesson.06/) +- [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) \ No newline at end of file diff --git a/lessons/lesson.07/templates/contact.html b/lessons/lesson.07/templates/contact.html new file mode 100644 index 0000000..c7f55c8 --- /dev/null +++ b/lessons/lesson.07/templates/contact.html @@ -0,0 +1,50 @@ + + + + + Contact + + + + + +

Contacts

+

You can contact us

+ +
+
    +
  • email
  • +
  • telegram
  • +
  • phone
  • +
+
+ +
+
+
+
+
+ +
+ +
+
+ +Index + + + \ No newline at end of file diff --git a/lessons/lesson.07/templates/index.html b/lessons/lesson.07/templates/index.html new file mode 100644 index 0000000..d30c3c3 --- /dev/null +++ b/lessons/lesson.07/templates/index.html @@ -0,0 +1,81 @@ + + + + + Index + + + +
+

Index

+

You can contact us

+ +
+
+ ... +
+
Laptop
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Buy +
+
+ +
+ ... +
+
Card title
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+ +
+ ... +
+
Card title
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+ +
+ ... +
+
Card title
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+ +
+ ... +
+
Card title
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+
+

+Contacts + +
+ + + + + + \ No newline at end of file From 0636e676c7ad988da45dba72153cea302e01f18a Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Tue, 28 Nov 2023 18:53:47 +0000 Subject: [PATCH 09/27] add lesson 8: flask intro --- README.md | 3 +- lessons/lesson.08/main.py | 39 +++++++++++++++++++++++ lessons/lesson.08/requirements.txt | Bin 0 -> 268 bytes lessons/lesson.08/templates/base.html | 34 ++++++++++++++++++++ lessons/lesson.08/templates/contact.html | 31 ++++++++++++++++++ lessons/lesson.08/templates/index.html | 32 +++++++++++++++++++ lessons/lesson.08/templates/product.html | 10 ++++++ lessons/lesson.08/views/__init__.py | 0 lessons/lesson.08/views/contacts.py | 12 +++++++ 9 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson.08/main.py create mode 100644 lessons/lesson.08/requirements.txt create mode 100644 lessons/lesson.08/templates/base.html create mode 100644 lessons/lesson.08/templates/contact.html create mode 100644 lessons/lesson.08/templates/index.html create mode 100644 lessons/lesson.08/templates/product.html create mode 100644 lessons/lesson.08/views/__init__.py create mode 100644 lessons/lesson.08/views/contacts.py diff --git a/README.md b/README.md index 2570bf5..b26beb6 100644 --- a/README.md +++ b/README.md @@ -9,4 +9,5 @@ - [Урок 4. Введение в автотесты. pytest](lessons/lesson.04/) - [Урок 5. Введение в docker, docker-compose](lessons/lesson.05/) - [Урок 6. ORM, SQLAlchemy](lessons/lesson.06/) -- [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) \ No newline at end of file +- [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) +- [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) \ No newline at end of file diff --git a/lessons/lesson.08/main.py b/lessons/lesson.08/main.py new file mode 100644 index 0000000..5c7b962 --- /dev/null +++ b/lessons/lesson.08/main.py @@ -0,0 +1,39 @@ +# | +from flask import Flask, render_template, request +from werkzeug.exceptions import NotFound +from views.contacts import contacts + +app = Flask(__name__) +app.register_blueprint(contacts) + +PRODUCTS = { + 1: 'Laptop', + 2: 'Smartphone', + 3: 'Notebook', +} + +# PRODUCTS = {} + + +@app.route("/") +def index(): + print('REQUEST') + print(request) + print(request.headers) + print(request.args) + print(request.headers['user-agent']) + return render_template('index.html', products=PRODUCTS) + + +@app.route('/product//') +def product_detail(product_id): + # product = PRODUCTS.get(product_id) + try: + product = PRODUCTS[product_id] + except KeyError: + raise NotFound + return render_template('product.html', product=product) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/lessons/lesson.08/requirements.txt b/lessons/lesson.08/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..2aba745153dcfca764e89ff554c6d434e86969f6 GIT binary patch literal 268 zcmYk0u?~Vj5Jaao@mCBSL~Lv=Osp)d5z!#Z5%d~A9-WtG8gyt; zW5AX##R>&0!4eBp;uX2E4d;|V^>6a;Cx_0K#wE)E4}_bGI^Yo(Bi{CFwYe8J*gBwzk4Rd literal 0 HcmV?d00001 diff --git a/lessons/lesson.08/templates/base.html b/lessons/lesson.08/templates/base.html new file mode 100644 index 0000000..432be04 --- /dev/null +++ b/lessons/lesson.08/templates/base.html @@ -0,0 +1,34 @@ + + + + + + {% block title %} + {% endblock %} + + + + +
+ {% block main %} + {% endblock %} +
+ + + + + + \ No newline at end of file diff --git a/lessons/lesson.08/templates/contact.html b/lessons/lesson.08/templates/contact.html new file mode 100644 index 0000000..f2fe135 --- /dev/null +++ b/lessons/lesson.08/templates/contact.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block title %} + Contacts +{% endblock %} + +{% block main %} +

Contacts

+

You can contact us

+ +
+
    +
  • email: {{ admin_email }}
  • +
  • telegram
  • +
  • phone
  • +
+
+ +
+
+
+
+
+ +
+ +
+
+ +Index +{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.08/templates/index.html b/lessons/lesson.08/templates/index.html new file mode 100644 index 0000000..d00f8a0 --- /dev/null +++ b/lessons/lesson.08/templates/index.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block title %} + Index +{% endblock %} + +{% block main %} +
+ {% if products %} + + {% for id, product in products.items() %} +
+ ... +
+
+ + {{product}} + +
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Buy +
+
+ {% endfor %} + {% else %} + No products + {% endif %} +
+

+Contacts + +{% endblock %} diff --git a/lessons/lesson.08/templates/product.html b/lessons/lesson.08/templates/product.html new file mode 100644 index 0000000..cd3f631 --- /dev/null +++ b/lessons/lesson.08/templates/product.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %} + {{product}} +{% endblock %} + +{% block main %} +

{{product}}

+Something description +{% endblock %} diff --git a/lessons/lesson.08/views/__init__.py b/lessons/lesson.08/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.08/views/contacts.py b/lessons/lesson.08/views/contacts.py new file mode 100644 index 0000000..313d183 --- /dev/null +++ b/lessons/lesson.08/views/contacts.py @@ -0,0 +1,12 @@ +from flask import Blueprint, render_template + + +contacts = Blueprint('contacts', __name__, url_prefix='/contacts') +# contacts = Blueprint('contacts', __name__) + +ADMIN_EMAIL = 'admin@admin.com' + + +@contacts.route("/contacts/") +def contact(): + return render_template('contact.html', admin_email=ADMIN_EMAIL) \ No newline at end of file From e17c16e44fa69ac67038a77d25752660413637bc Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Thu, 30 Nov 2023 18:47:47 +0000 Subject: [PATCH 10/27] add lesson 9: flask plus alchemy --- README.md | 3 +- lessons/lesson.09/forms.py | 7 ++ lessons/lesson.09/migrations/README | 1 + lessons/lesson.09/migrations/alembic.ini | 50 ++++++++ lessons/lesson.09/migrations/env.py | 113 ++++++++++++++++++ lessons/lesson.09/migrations/script.py.mako | 24 ++++ .../migrations/versions/0058c547772d_.py | 32 +++++ .../migrations/versions/9a189cd210c4_.py | 33 +++++ lessons/lesson.09/models/__init__.py | 2 + lessons/lesson.09/models/database.py | 2 + lessons/lesson.09/models/products.py | 10 ++ lessons/lesson.09/requirements.txt | Bin 0 -> 548 bytes lessons/lesson.09/templates/base.html | 34 ++++++ lessons/lesson.09/templates/contact.html | 31 +++++ lessons/lesson.09/templates/create.html | 15 +++ lessons/lesson.09/templates/index.html | 34 ++++++ lessons/lesson.09/templates/product.html | 10 ++ lessons/lesson.09/views/__init__.py | 0 lessons/lesson.09/views/contacts.py | 12 ++ lessons/lesson.09/wsgi.py | 58 +++++++++ 20 files changed, 470 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson.09/forms.py create mode 100644 lessons/lesson.09/migrations/README create mode 100644 lessons/lesson.09/migrations/alembic.ini create mode 100644 lessons/lesson.09/migrations/env.py create mode 100644 lessons/lesson.09/migrations/script.py.mako create mode 100644 lessons/lesson.09/migrations/versions/0058c547772d_.py create mode 100644 lessons/lesson.09/migrations/versions/9a189cd210c4_.py create mode 100644 lessons/lesson.09/models/__init__.py create mode 100644 lessons/lesson.09/models/database.py create mode 100644 lessons/lesson.09/models/products.py create mode 100644 lessons/lesson.09/requirements.txt create mode 100644 lessons/lesson.09/templates/base.html create mode 100644 lessons/lesson.09/templates/contact.html create mode 100644 lessons/lesson.09/templates/create.html create mode 100644 lessons/lesson.09/templates/index.html create mode 100644 lessons/lesson.09/templates/product.html create mode 100644 lessons/lesson.09/views/__init__.py create mode 100644 lessons/lesson.09/views/contacts.py create mode 100644 lessons/lesson.09/wsgi.py diff --git a/README.md b/README.md index b26beb6..87203e6 100644 --- a/README.md +++ b/README.md @@ -10,4 +10,5 @@ - [Урок 5. Введение в docker, docker-compose](lessons/lesson.05/) - [Урок 6. ORM, SQLAlchemy](lessons/lesson.06/) - [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) -- [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) \ No newline at end of file +- [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) +- [Урок 9. Werkzeug; Flask + SQLAlchemy. Работа с моделями данных](lessons/lesson.09/) \ No newline at end of file diff --git a/lessons/lesson.09/forms.py b/lessons/lesson.09/forms.py new file mode 100644 index 0000000..d58e964 --- /dev/null +++ b/lessons/lesson.09/forms.py @@ -0,0 +1,7 @@ +from flask_wtf import FlaskForm +from wtforms import StringField +from wtforms.validators import Length + + +class CreateProductForm(FlaskForm): + name = StringField('name', validators=[Length(max=3)]) \ No newline at end of file diff --git a/lessons/lesson.09/migrations/README b/lessons/lesson.09/migrations/README new file mode 100644 index 0000000..0e04844 --- /dev/null +++ b/lessons/lesson.09/migrations/README @@ -0,0 +1 @@ +Single-database configuration for Flask. diff --git a/lessons/lesson.09/migrations/alembic.ini b/lessons/lesson.09/migrations/alembic.ini new file mode 100644 index 0000000..ec9d45c --- /dev/null +++ b/lessons/lesson.09/migrations/alembic.ini @@ -0,0 +1,50 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic,flask_migrate + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[logger_flask_migrate] +level = INFO +handlers = +qualname = flask_migrate + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/lessons/lesson.09/migrations/env.py b/lessons/lesson.09/migrations/env.py new file mode 100644 index 0000000..4c97092 --- /dev/null +++ b/lessons/lesson.09/migrations/env.py @@ -0,0 +1,113 @@ +import logging +from logging.config import fileConfig + +from flask import current_app + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + + +def get_engine(): + try: + # this works with Flask-SQLAlchemy<3 and Alchemical + return current_app.extensions['migrate'].db.get_engine() + except (TypeError, AttributeError): + # this works with Flask-SQLAlchemy>=3 + return current_app.extensions['migrate'].db.engine + + +def get_engine_url(): + try: + return get_engine().url.render_as_string(hide_password=False).replace( + '%', '%%') + except AttributeError: + return str(get_engine().url).replace('%', '%%') + + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option('sqlalchemy.url', get_engine_url()) +target_db = current_app.extensions['migrate'].db + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def get_metadata(): + if hasattr(target_db, 'metadatas'): + return target_db.metadatas[None] + return target_db.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=get_metadata(), literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + conf_args = current_app.extensions['migrate'].configure_args + if conf_args.get("process_revision_directives") is None: + conf_args["process_revision_directives"] = process_revision_directives + + connectable = get_engine() + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=get_metadata(), + **conf_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/lessons/lesson.09/migrations/script.py.mako b/lessons/lesson.09/migrations/script.py.mako new file mode 100644 index 0000000..2c01563 --- /dev/null +++ b/lessons/lesson.09/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/lessons/lesson.09/migrations/versions/0058c547772d_.py b/lessons/lesson.09/migrations/versions/0058c547772d_.py new file mode 100644 index 0000000..33b6bf1 --- /dev/null +++ b/lessons/lesson.09/migrations/versions/0058c547772d_.py @@ -0,0 +1,32 @@ +"""empty message + +Revision ID: 0058c547772d +Revises: 9a189cd210c4 +Create Date: 2023-11-30 18:00:01.959052 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0058c547772d' +down_revision = '9a189cd210c4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.add_column(sa.Column('description', sa.String(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.drop_column('description') + + # ### end Alembic commands ### diff --git a/lessons/lesson.09/migrations/versions/9a189cd210c4_.py b/lessons/lesson.09/migrations/versions/9a189cd210c4_.py new file mode 100644 index 0000000..89b1bc6 --- /dev/null +++ b/lessons/lesson.09/migrations/versions/9a189cd210c4_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: 9a189cd210c4 +Revises: +Create Date: 2023-11-30 17:55:34.606330 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9a189cd210c4' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('product', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=80), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('product') + # ### end Alembic commands ### diff --git a/lessons/lesson.09/models/__init__.py b/lessons/lesson.09/models/__init__.py new file mode 100644 index 0000000..4827faa --- /dev/null +++ b/lessons/lesson.09/models/__init__.py @@ -0,0 +1,2 @@ +from .database import db +from .products import Product diff --git a/lessons/lesson.09/models/database.py b/lessons/lesson.09/models/database.py new file mode 100644 index 0000000..cc45acb --- /dev/null +++ b/lessons/lesson.09/models/database.py @@ -0,0 +1,2 @@ +from flask_sqlalchemy import SQLAlchemy +db = SQLAlchemy() diff --git a/lessons/lesson.09/models/products.py b/lessons/lesson.09/models/products.py new file mode 100644 index 0000000..feb2865 --- /dev/null +++ b/lessons/lesson.09/models/products.py @@ -0,0 +1,10 @@ +from .database import db + + +class Product(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(80), unique=True, nullable=False) + description = db.Column(db.String, unique=False, nullable=True) + + def __repr__(self): + return '' % self.name diff --git a/lessons/lesson.09/requirements.txt b/lessons/lesson.09/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..17c70c40500ddbdcb5f1c0e6dcab32159ba8c674 GIT binary patch literal 548 zcmZ{hJ8!~35QL|W#81Hj^K2;6P#`Fx6qM*N1{{MOVOxUy_`u8_HV6q>=aY73zkS^G z-{F85N34+`!h~NJ0Z(ZE7CxvPsAWj$J2j3G^$w&*rbpD3J+{06qq~+<&6(#|!P-ln@)hUk7e^(|V= zFQYF;**L`P8Z%+Ez=r*0bZhz?6(g$d_Y?3IYi1kzp)+has^rxL<0*6N?fNN|C*?$~ z!Y{ja*s{tqy=U}y^QZ@P8^ZfaT*%Q|?XV*0%>FfB!B}p0y*Is*f4!y6mEw + + + + + {% block title %} + {% endblock %} + + + + +
+ {% block main %} + {% endblock %} +
+ + + + + + \ No newline at end of file diff --git a/lessons/lesson.09/templates/contact.html b/lessons/lesson.09/templates/contact.html new file mode 100644 index 0000000..f2fe135 --- /dev/null +++ b/lessons/lesson.09/templates/contact.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block title %} + Contacts +{% endblock %} + +{% block main %} +

Contacts

+

You can contact us

+ +
+
    +
  • email: {{ admin_email }}
  • +
  • telegram
  • +
  • phone
  • +
+
+ +
+
+
+
+
+ +
+ +
+
+ +Index +{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.09/templates/create.html b/lessons/lesson.09/templates/create.html new file mode 100644 index 0000000..0d3f755 --- /dev/null +++ b/lessons/lesson.09/templates/create.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block title %} + Create product +{% endblock %} + +{% block main %} +

Create

+
+ {{ form.errors }} + {{ form.csrf_token }} + {{ form.name.label }} {{ form.name(class="form-control") }} + +
+{% endblock %} diff --git a/lessons/lesson.09/templates/index.html b/lessons/lesson.09/templates/index.html new file mode 100644 index 0000000..399c7cb --- /dev/null +++ b/lessons/lesson.09/templates/index.html @@ -0,0 +1,34 @@ +{% extends "base.html" %} + +{% block title %} + Index +{% endblock %} + +{% block main %} +
+ {% if products %} + + {% for product in products %} +
+ ... +
+
+ + {{product.name}} + +
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Buy +
+
+ {% endfor %} + {% else %} + No products + {% endif %} + + Create +
+

+Contacts + +{% endblock %} diff --git a/lessons/lesson.09/templates/product.html b/lessons/lesson.09/templates/product.html new file mode 100644 index 0000000..d5ece3c --- /dev/null +++ b/lessons/lesson.09/templates/product.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %} + {{product.name}} +{% endblock %} + +{% block main %} +

{{product.name}}

+Something description +{% endblock %} diff --git a/lessons/lesson.09/views/__init__.py b/lessons/lesson.09/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.09/views/contacts.py b/lessons/lesson.09/views/contacts.py new file mode 100644 index 0000000..313d183 --- /dev/null +++ b/lessons/lesson.09/views/contacts.py @@ -0,0 +1,12 @@ +from flask import Blueprint, render_template + + +contacts = Blueprint('contacts', __name__, url_prefix='/contacts') +# contacts = Blueprint('contacts', __name__) + +ADMIN_EMAIL = 'admin@admin.com' + + +@contacts.route("/contacts/") +def contact(): + return render_template('contact.html', admin_email=ADMIN_EMAIL) \ No newline at end of file diff --git a/lessons/lesson.09/wsgi.py b/lessons/lesson.09/wsgi.py new file mode 100644 index 0000000..14282af --- /dev/null +++ b/lessons/lesson.09/wsgi.py @@ -0,0 +1,58 @@ +# | +from flask import Flask, render_template, request, redirect +from views.contacts import contacts +from models import db, Product +from flask_migrate import Migrate +from forms import CreateProductForm + + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///shop.db' +app.config['SECRET_KEY'] = 'fdfererddfdfasfdafadf' +app.register_blueprint(contacts) +db.init_app(app) +migrate = Migrate(app, db) + + +@app.cli.command("create-db") +def create_user(): + db.create_all() + + +@app.route("/") +def index(): + products = Product.query.all() + return render_template('index.html', products=products) + + +@app.route('/product//') +def product_detail(product_id): + # product = Product.query.filter_by(id=product_id).first_or_404() + product = Product.query.get_or_404(product_id) + # if product is None: + # raise NotFound + return render_template('product.html', product=product) + + +@app.route('/product/create/', endpoint='create', methods=['GET', 'POST']) +def product_create(): + # if request.method == 'GET': + # return render_template('create.html') + # + # name = request.form.get('product-name') + # product = Product(name=name) + # db.session.add(product) + # db.session.commit() + # return redirect('/') + form = CreateProductForm() + if form.validate_on_submit(): + name = form.name.data + product = Product(name=name) + db.session.add(product) + db.session.commit() + return redirect('/') + return render_template('create.html', form=form) + + +if __name__ == '__main__': + app.run(debug=True) From 7e4ff87d9f5420f53b2bdc3bf95d9841ede689d8 Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Tue, 5 Dec 2023 21:54:20 +0300 Subject: [PATCH 11/27] add lesson 10: flask and docker --- README.md | 3 +- lessons/lesson.10/.dockerignore | 89 ++++++++++++++ lessons/lesson.10/Dockerfile | 7 ++ lessons/lesson.10/dev/Dockerfile | 5 + lessons/lesson.10/docker-compose.yaml | 59 +++++++++ lessons/lesson.10/forms.py | 7 ++ lessons/lesson.10/main.py | 67 +++++++++++ lessons/lesson.10/migrations/README | 1 + lessons/lesson.10/migrations/alembic.ini | 50 ++++++++ lessons/lesson.10/migrations/env.py | 113 ++++++++++++++++++ lessons/lesson.10/migrations/script.py.mako | 24 ++++ .../migrations/versions/0058c547772d_.py | 32 +++++ .../migrations/versions/9a189cd210c4_.py | 33 +++++ .../migrations/versions/c0042cca2e15_.py | 32 +++++ lessons/lesson.10/models/__init__.py | 2 + lessons/lesson.10/models/database.py | 2 + lessons/lesson.10/models/products.py | 10 ++ lessons/lesson.10/prestart.sh | 3 + lessons/lesson.10/production/Dockerfile | 7 ++ lessons/lesson.10/requirements.txt | 18 +++ lessons/lesson.10/templates/base.html | 34 ++++++ lessons/lesson.10/templates/contact.html | 31 +++++ lessons/lesson.10/templates/create.html | 15 +++ lessons/lesson.10/templates/index.html | 34 ++++++ lessons/lesson.10/templates/product.html | 10 ++ lessons/lesson.10/views/__init__.py | 0 lessons/lesson.10/views/contacts.py | 12 ++ 27 files changed, 699 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson.10/.dockerignore create mode 100644 lessons/lesson.10/Dockerfile create mode 100644 lessons/lesson.10/dev/Dockerfile create mode 100644 lessons/lesson.10/docker-compose.yaml create mode 100644 lessons/lesson.10/forms.py create mode 100644 lessons/lesson.10/main.py create mode 100644 lessons/lesson.10/migrations/README create mode 100644 lessons/lesson.10/migrations/alembic.ini create mode 100644 lessons/lesson.10/migrations/env.py create mode 100644 lessons/lesson.10/migrations/script.py.mako create mode 100644 lessons/lesson.10/migrations/versions/0058c547772d_.py create mode 100644 lessons/lesson.10/migrations/versions/9a189cd210c4_.py create mode 100644 lessons/lesson.10/migrations/versions/c0042cca2e15_.py create mode 100644 lessons/lesson.10/models/__init__.py create mode 100644 lessons/lesson.10/models/database.py create mode 100644 lessons/lesson.10/models/products.py create mode 100644 lessons/lesson.10/prestart.sh create mode 100644 lessons/lesson.10/production/Dockerfile create mode 100644 lessons/lesson.10/requirements.txt create mode 100644 lessons/lesson.10/templates/base.html create mode 100644 lessons/lesson.10/templates/contact.html create mode 100644 lessons/lesson.10/templates/create.html create mode 100644 lessons/lesson.10/templates/index.html create mode 100644 lessons/lesson.10/templates/product.html create mode 100644 lessons/lesson.10/views/__init__.py create mode 100644 lessons/lesson.10/views/contacts.py diff --git a/README.md b/README.md index 87203e6..ee42b05 100644 --- a/README.md +++ b/README.md @@ -11,4 +11,5 @@ - [Урок 6. ORM, SQLAlchemy](lessons/lesson.06/) - [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) - [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) -- [Урок 9. Werkzeug; Flask + SQLAlchemy. Работа с моделями данных](lessons/lesson.09/) \ No newline at end of file +- [Урок 9. Werkzeug; Flask + SQLAlchemy. Работа с моделями данных](lessons/lesson.09/) +- [Урок 10. Связь контейнеров в docker. Сборка проекта на Flask](lessons/lesson.10/) \ No newline at end of file diff --git a/lessons/lesson.10/.dockerignore b/lessons/lesson.10/.dockerignore new file mode 100644 index 0000000..b7be024 --- /dev/null +++ b/lessons/lesson.10/.dockerignore @@ -0,0 +1,89 @@ +# Git +.git +.gitignore +.gitattributes + + +# CI +.codeclimate.yml +.travis.yml +.taskcluster.yml + +# Docker +docker-compose.yml +Dockerfile +.docker +.dockerignore + +# Byte-compiled / optimized / DLL files +**/__pycache__/ +**/*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.cache +nosetests.xml +coverage.xml + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Virtual environment +.env +.venv/ +venv/ + +# PyCharm +.idea + +# Python mode for VIM +.ropeproject +**/.ropeproject + +# Vim swap files +**/*.swp + +# VS Code +.vscode/ \ No newline at end of file diff --git a/lessons/lesson.10/Dockerfile b/lessons/lesson.10/Dockerfile new file mode 100644 index 0000000..1360fc5 --- /dev/null +++ b/lessons/lesson.10/Dockerfile @@ -0,0 +1,7 @@ +FROM tiangolo/uwsgi-nginx-flask:python3.11 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt + +COPY ./ /app \ No newline at end of file diff --git a/lessons/lesson.10/dev/Dockerfile b/lessons/lesson.10/dev/Dockerfile new file mode 100644 index 0000000..85df7e3 --- /dev/null +++ b/lessons/lesson.10/dev/Dockerfile @@ -0,0 +1,5 @@ +FROM python:3 + +COPY ./ ./ + +RUN pip install -r requirements.txt diff --git a/lessons/lesson.10/docker-compose.yaml b/lessons/lesson.10/docker-compose.yaml new file mode 100644 index 0000000..8c30839 --- /dev/null +++ b/lessons/lesson.10/docker-compose.yaml @@ -0,0 +1,59 @@ +version: "3" + +services: + pg: + image: postgres:15 +# build: ... + environment: + POSTGRES_DB: shop + POSTGRES_USER: otus + POSTGRES_PASSWORD: ${PG_PASSWORD} + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432:5432" +# volumes: +# - db-data:/var/lib/postgresql/data/pgdata + healthcheck: + test: [ "CMD-SHELL", "pg_isready", "-d", "shop", "-U", "otus" ] + interval: 30s + timeout: 60s + retries: 5 + + dev-backend: + build: . + ports: + - "5000:5000" + depends_on: + pg: + condition: service_healthy + command: bash -c " + flask db upgrade + && python wsgi.py + " + + gunicorn-backend: + build: . + ports: + - "8000:8000" + depends_on: + pg: + condition: service_healthy + command: bash -c " + flask db upgrade + && pip install gunicorn + && gunicorn wsgi:app -b 0.0.0.0 + " + + prod-backend: + environment: + SECRET_KEY: ${FLASK_SECRET_KEY} + SQLALCHEMY_DATABASE_URI: "postgresql+psycopg2://otus:${PG_PASSWORD}@pg:5432/shop" + build: . + ports: + - "9000:80" + depends_on: + pg: + condition: service_healthy + +#volumes: +# db-data: \ No newline at end of file diff --git a/lessons/lesson.10/forms.py b/lessons/lesson.10/forms.py new file mode 100644 index 0000000..d58e964 --- /dev/null +++ b/lessons/lesson.10/forms.py @@ -0,0 +1,7 @@ +from flask_wtf import FlaskForm +from wtforms import StringField +from wtforms.validators import Length + + +class CreateProductForm(FlaskForm): + name = StringField('name', validators=[Length(max=3)]) \ No newline at end of file diff --git a/lessons/lesson.10/main.py b/lessons/lesson.10/main.py new file mode 100644 index 0000000..55864f9 --- /dev/null +++ b/lessons/lesson.10/main.py @@ -0,0 +1,67 @@ +from flask import Flask, render_template, request, redirect +from os import getenv +from views.contacts import contacts +from models import db, Product +from flask_migrate import Migrate +from forms import CreateProductForm + +secret_key = getenv('SECRET_KEY', 'development key') + +DEFAULT_DB_URI = 'postgresql+psycopg2://otus:otus123@localhost:5432/shop' +database_uri = getenv('SQLALCHEMY_DATABASE_URI', DEFAULT_DB_URI) + + +app = Flask(__name__) +app.config['SQLALCHEMY_DATABASE_URI'] = database_uri + +print('SECRET_KEY', secret_key) +print('SQLALCHEMY_DATABASE_URI', database_uri) + +app.config['SECRET_KEY'] = secret_key +app.register_blueprint(contacts) +db.init_app(app) +migrate = Migrate(app, db) + + +@app.cli.command("create-db") +def create_user(): + db.create_all() + + +@app.route("/") +def index(): + products = Product.query.all() + return render_template('index.html', products=products) + + +@app.route('/product//') +def product_detail(product_id): + # product = Product.query.filter_by(id=product_id).first_or_404() + product = Product.query.get_or_404(product_id) + # if product is None: + # raise NotFound + return render_template('product.html', product=product) + + +@app.route('/product/create/', endpoint='create', methods=['GET', 'POST']) +def product_create(): + # if request.method == 'GET': + # return render_template('create.html') + # + # name = request.form.get('product-name') + # product = Product(name=name) + # db.session.add(product) + # db.session.commit() + # return redirect('/') + form = CreateProductForm() + if form.validate_on_submit(): + name = form.name.data + product = Product(name=name) + db.session.add(product) + db.session.commit() + return redirect('/') + return render_template('create.html', form=form) + + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0') diff --git a/lessons/lesson.10/migrations/README b/lessons/lesson.10/migrations/README new file mode 100644 index 0000000..0e04844 --- /dev/null +++ b/lessons/lesson.10/migrations/README @@ -0,0 +1 @@ +Single-database configuration for Flask. diff --git a/lessons/lesson.10/migrations/alembic.ini b/lessons/lesson.10/migrations/alembic.ini new file mode 100644 index 0000000..ec9d45c --- /dev/null +++ b/lessons/lesson.10/migrations/alembic.ini @@ -0,0 +1,50 @@ +# A generic, single database configuration. + +[alembic] +# template used to generate migration files +# file_template = %%(rev)s_%%(slug)s + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic,flask_migrate + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[logger_flask_migrate] +level = INFO +handlers = +qualname = flask_migrate + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/lessons/lesson.10/migrations/env.py b/lessons/lesson.10/migrations/env.py new file mode 100644 index 0000000..4c97092 --- /dev/null +++ b/lessons/lesson.10/migrations/env.py @@ -0,0 +1,113 @@ +import logging +from logging.config import fileConfig + +from flask import current_app + +from alembic import context + +# this is the Alembic Config object, which provides +# access to the values within the .ini file in use. +config = context.config + +# Interpret the config file for Python logging. +# This line sets up loggers basically. +fileConfig(config.config_file_name) +logger = logging.getLogger('alembic.env') + + +def get_engine(): + try: + # this works with Flask-SQLAlchemy<3 and Alchemical + return current_app.extensions['migrate'].db.get_engine() + except (TypeError, AttributeError): + # this works with Flask-SQLAlchemy>=3 + return current_app.extensions['migrate'].db.engine + + +def get_engine_url(): + try: + return get_engine().url.render_as_string(hide_password=False).replace( + '%', '%%') + except AttributeError: + return str(get_engine().url).replace('%', '%%') + + +# add your model's MetaData object here +# for 'autogenerate' support +# from myapp import mymodel +# target_metadata = mymodel.Base.metadata +config.set_main_option('sqlalchemy.url', get_engine_url()) +target_db = current_app.extensions['migrate'].db + +# other values from the config, defined by the needs of env.py, +# can be acquired: +# my_important_option = config.get_main_option("my_important_option") +# ... etc. + + +def get_metadata(): + if hasattr(target_db, 'metadatas'): + return target_db.metadatas[None] + return target_db.metadata + + +def run_migrations_offline(): + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + context.configure( + url=url, target_metadata=get_metadata(), literal_binds=True + ) + + with context.begin_transaction(): + context.run_migrations() + + +def run_migrations_online(): + """Run migrations in 'online' mode. + + In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + # this callback is used to prevent an auto-migration from being generated + # when there are no changes to the schema + # reference: http://alembic.zzzcomputing.com/en/latest/cookbook.html + def process_revision_directives(context, revision, directives): + if getattr(config.cmd_opts, 'autogenerate', False): + script = directives[0] + if script.upgrade_ops.is_empty(): + directives[:] = [] + logger.info('No changes in schema detected.') + + conf_args = current_app.extensions['migrate'].configure_args + if conf_args.get("process_revision_directives") is None: + conf_args["process_revision_directives"] = process_revision_directives + + connectable = get_engine() + + with connectable.connect() as connection: + context.configure( + connection=connection, + target_metadata=get_metadata(), + **conf_args + ) + + with context.begin_transaction(): + context.run_migrations() + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/lessons/lesson.10/migrations/script.py.mako b/lessons/lesson.10/migrations/script.py.mako new file mode 100644 index 0000000..2c01563 --- /dev/null +++ b/lessons/lesson.10/migrations/script.py.mako @@ -0,0 +1,24 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision = ${repr(up_revision)} +down_revision = ${repr(down_revision)} +branch_labels = ${repr(branch_labels)} +depends_on = ${repr(depends_on)} + + +def upgrade(): + ${upgrades if upgrades else "pass"} + + +def downgrade(): + ${downgrades if downgrades else "pass"} diff --git a/lessons/lesson.10/migrations/versions/0058c547772d_.py b/lessons/lesson.10/migrations/versions/0058c547772d_.py new file mode 100644 index 0000000..33b6bf1 --- /dev/null +++ b/lessons/lesson.10/migrations/versions/0058c547772d_.py @@ -0,0 +1,32 @@ +"""empty message + +Revision ID: 0058c547772d +Revises: 9a189cd210c4 +Create Date: 2023-11-30 18:00:01.959052 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '0058c547772d' +down_revision = '9a189cd210c4' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.add_column(sa.Column('description', sa.String(), nullable=True)) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.drop_column('description') + + # ### end Alembic commands ### diff --git a/lessons/lesson.10/migrations/versions/9a189cd210c4_.py b/lessons/lesson.10/migrations/versions/9a189cd210c4_.py new file mode 100644 index 0000000..89b1bc6 --- /dev/null +++ b/lessons/lesson.10/migrations/versions/9a189cd210c4_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: 9a189cd210c4 +Revises: +Create Date: 2023-11-30 17:55:34.606330 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '9a189cd210c4' +down_revision = None +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('product', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('name', sa.String(length=80), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('name') + ) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('product') + # ### end Alembic commands ### diff --git a/lessons/lesson.10/migrations/versions/c0042cca2e15_.py b/lessons/lesson.10/migrations/versions/c0042cca2e15_.py new file mode 100644 index 0000000..bccd1d7 --- /dev/null +++ b/lessons/lesson.10/migrations/versions/c0042cca2e15_.py @@ -0,0 +1,32 @@ +"""empty message + +Revision ID: c0042cca2e15 +Revises: 0058c547772d +Create Date: 2023-12-05 20:18:24.932742 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'c0042cca2e15' +down_revision = '0058c547772d' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.drop_constraint('product_name_key', type_='unique') + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table('product', schema=None) as batch_op: + batch_op.create_unique_constraint('product_name_key', ['name']) + + # ### end Alembic commands ### diff --git a/lessons/lesson.10/models/__init__.py b/lessons/lesson.10/models/__init__.py new file mode 100644 index 0000000..4827faa --- /dev/null +++ b/lessons/lesson.10/models/__init__.py @@ -0,0 +1,2 @@ +from .database import db +from .products import Product diff --git a/lessons/lesson.10/models/database.py b/lessons/lesson.10/models/database.py new file mode 100644 index 0000000..cc45acb --- /dev/null +++ b/lessons/lesson.10/models/database.py @@ -0,0 +1,2 @@ +from flask_sqlalchemy import SQLAlchemy +db = SQLAlchemy() diff --git a/lessons/lesson.10/models/products.py b/lessons/lesson.10/models/products.py new file mode 100644 index 0000000..9888a2d --- /dev/null +++ b/lessons/lesson.10/models/products.py @@ -0,0 +1,10 @@ +from .database import db + + +class Product(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(80), unique=False, nullable=False) + description = db.Column(db.String, unique=False, nullable=True) + + def __repr__(self): + return '' % self.name diff --git a/lessons/lesson.10/prestart.sh b/lessons/lesson.10/prestart.sh new file mode 100644 index 0000000..0c8302c --- /dev/null +++ b/lessons/lesson.10/prestart.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +flask --app main.py db upgrade \ No newline at end of file diff --git a/lessons/lesson.10/production/Dockerfile b/lessons/lesson.10/production/Dockerfile new file mode 100644 index 0000000..aeaca13 --- /dev/null +++ b/lessons/lesson.10/production/Dockerfile @@ -0,0 +1,7 @@ +FROM tiangolo/uwsgi-nginx-flask:python3.11 + +COPY ./requirements.txt /app/requirements.txt + +RUN pip install --no-cache-dir --upgrade -r ./app/requirements.txt + +COPY ./ /app \ No newline at end of file diff --git a/lessons/lesson.10/requirements.txt b/lessons/lesson.10/requirements.txt new file mode 100644 index 0000000..ad24c98 --- /dev/null +++ b/lessons/lesson.10/requirements.txt @@ -0,0 +1,18 @@ +alembic==1.12.1 +blinker==1.7.0 +click==8.1.7 +colorama==0.4.6 +Flask==3.0.0 +Flask-Migrate==4.0.5 +Flask-SQLAlchemy==3.1.1 +Flask-WTF==1.2.1 +greenlet==3.0.1 +itsdangerous==2.1.2 +Jinja2==3.1.2 +Mako==1.3.0 +MarkupSafe==2.1.3 +psycopg2-binary==2.9.9 +SQLAlchemy==2.0.23 +typing_extensions==4.8.0 +Werkzeug==3.0.1 +WTForms==3.1.1 diff --git a/lessons/lesson.10/templates/base.html b/lessons/lesson.10/templates/base.html new file mode 100644 index 0000000..432be04 --- /dev/null +++ b/lessons/lesson.10/templates/base.html @@ -0,0 +1,34 @@ + + + + + + {% block title %} + {% endblock %} + + + + +
+ {% block main %} + {% endblock %} +
+ + + + + + \ No newline at end of file diff --git a/lessons/lesson.10/templates/contact.html b/lessons/lesson.10/templates/contact.html new file mode 100644 index 0000000..f2fe135 --- /dev/null +++ b/lessons/lesson.10/templates/contact.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} + +{% block title %} + Contacts +{% endblock %} + +{% block main %} +

Contacts

+

You can contact us

+ +
+
    +
  • email: {{ admin_email }}
  • +
  • telegram
  • +
  • phone
  • +
+
+ +
+
+
+
+
+ +
+ +
+
+ +Index +{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.10/templates/create.html b/lessons/lesson.10/templates/create.html new file mode 100644 index 0000000..0d3f755 --- /dev/null +++ b/lessons/lesson.10/templates/create.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block title %} + Create product +{% endblock %} + +{% block main %} +

Create

+
+ {{ form.errors }} + {{ form.csrf_token }} + {{ form.name.label }} {{ form.name(class="form-control") }} + +
+{% endblock %} diff --git a/lessons/lesson.10/templates/index.html b/lessons/lesson.10/templates/index.html new file mode 100644 index 0000000..399c7cb --- /dev/null +++ b/lessons/lesson.10/templates/index.html @@ -0,0 +1,34 @@ +{% extends "base.html" %} + +{% block title %} + Index +{% endblock %} + +{% block main %} +
+ {% if products %} + + {% for product in products %} +
+ ... +
+
+ + {{product.name}} + +
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Buy +
+
+ {% endfor %} + {% else %} + No products + {% endif %} + + Create +
+

+Contacts + +{% endblock %} diff --git a/lessons/lesson.10/templates/product.html b/lessons/lesson.10/templates/product.html new file mode 100644 index 0000000..d5ece3c --- /dev/null +++ b/lessons/lesson.10/templates/product.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block title %} + {{product.name}} +{% endblock %} + +{% block main %} +

{{product.name}}

+Something description +{% endblock %} diff --git a/lessons/lesson.10/views/__init__.py b/lessons/lesson.10/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.10/views/contacts.py b/lessons/lesson.10/views/contacts.py new file mode 100644 index 0000000..313d183 --- /dev/null +++ b/lessons/lesson.10/views/contacts.py @@ -0,0 +1,12 @@ +from flask import Blueprint, render_template + + +contacts = Blueprint('contacts', __name__, url_prefix='/contacts') +# contacts = Blueprint('contacts', __name__) + +ADMIN_EMAIL = 'admin@admin.com' + + +@contacts.route("/contacts/") +def contact(): + return render_template('contact.html', admin_email=ADMIN_EMAIL) \ No newline at end of file From a64e7c2785d72f5b941a938c9ac289a61155226d Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Thu, 7 Dec 2023 21:48:35 +0300 Subject: [PATCH 12/27] add lesson 11: django intro --- README.md | 3 +- lessons/lesson.11/Makefile | 17 +++ lessons/lesson.11/docker-compose.yaml | 23 +++ lessons/lesson.11/mainapp/__init__.py | 0 lessons/lesson.11/mainapp/admin.py | 7 + lessons/lesson.11/mainapp/apps.py | 6 + .../lesson.11/mainapp/management/__init__.py | 0 .../mainapp/management/commands/__init__.py | 0 .../mainapp/management/commands/fill_db.py | 66 +++++++++ .../mainapp/migrations/0001_initial.py | 30 ++++ .../migrations/0002_food_animal_food.py | 25 ++++ .../lesson.11/mainapp/migrations/__init__.py | 0 lessons/lesson.11/mainapp/models.py | 29 ++++ lessons/lesson.11/mainapp/tests.py | 3 + lessons/lesson.11/mainapp/views.py | 3 + lessons/lesson.11/manage.py | 22 +++ lessons/lesson.11/requirements.txt | 2 + lessons/lesson.11/settings/__init__.py | 0 lessons/lesson.11/settings/asgi.py | 16 +++ lessons/lesson.11/settings/settings.py | 134 ++++++++++++++++++ lessons/lesson.11/settings/urls.py | 22 +++ lessons/lesson.11/settings/wsgi.py | 16 +++ 22 files changed, 423 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson.11/Makefile create mode 100644 lessons/lesson.11/docker-compose.yaml create mode 100644 lessons/lesson.11/mainapp/__init__.py create mode 100644 lessons/lesson.11/mainapp/admin.py create mode 100644 lessons/lesson.11/mainapp/apps.py create mode 100644 lessons/lesson.11/mainapp/management/__init__.py create mode 100644 lessons/lesson.11/mainapp/management/commands/__init__.py create mode 100644 lessons/lesson.11/mainapp/management/commands/fill_db.py create mode 100644 lessons/lesson.11/mainapp/migrations/0001_initial.py create mode 100644 lessons/lesson.11/mainapp/migrations/0002_food_animal_food.py create mode 100644 lessons/lesson.11/mainapp/migrations/__init__.py create mode 100644 lessons/lesson.11/mainapp/models.py create mode 100644 lessons/lesson.11/mainapp/tests.py create mode 100644 lessons/lesson.11/mainapp/views.py create mode 100755 lessons/lesson.11/manage.py create mode 100644 lessons/lesson.11/requirements.txt create mode 100644 lessons/lesson.11/settings/__init__.py create mode 100644 lessons/lesson.11/settings/asgi.py create mode 100644 lessons/lesson.11/settings/settings.py create mode 100644 lessons/lesson.11/settings/urls.py create mode 100644 lessons/lesson.11/settings/wsgi.py diff --git a/README.md b/README.md index ee42b05..f605ba3 100644 --- a/README.md +++ b/README.md @@ -12,4 +12,5 @@ - [Урок 7. Знакомство с Front-end частью курса. Основы HTML, CSS, методологии верстки. Немного Bootstrap 5](lessons/lesson.07/) - [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) - [Урок 9. Werkzeug; Flask + SQLAlchemy. Работа с моделями данных](lessons/lesson.09/) -- [Урок 10. Связь контейнеров в docker. Сборка проекта на Flask](lessons/lesson.10/) \ No newline at end of file +- [Урок 10. Связь контейнеров в docker. Сборка проекта на Flask](lessons/lesson.10/) +- [Урок 11. Django settings, orm, админка, миграции, superuser](lessons/lesson.11/) \ No newline at end of file diff --git a/lessons/lesson.11/Makefile b/lessons/lesson.11/Makefile new file mode 100644 index 0000000..43fd0f1 --- /dev/null +++ b/lessons/lesson.11/Makefile @@ -0,0 +1,17 @@ +runserver: + python manage.py runserver + +newapp: + python manage.py startapp mainapp + +makemigrations: + python manage.py makemigrations + +migrate: + python manage.py migrate + +createsuperuser: + python manage.py createsuperuser + +fill_db: + python manage.py fill_db diff --git a/lessons/lesson.11/docker-compose.yaml b/lessons/lesson.11/docker-compose.yaml new file mode 100644 index 0000000..415f2ae --- /dev/null +++ b/lessons/lesson.11/docker-compose.yaml @@ -0,0 +1,23 @@ +version: "3" + +services: + pg: + image: postgres:15 +# build: ... + environment: + POSTGRES_DB: shop + POSTGRES_USER: otus + POSTGRES_PASSWORD: otus12345 + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432:5432" +# volumes: +# - db-data:/var/lib/postgresql/data/pgdata + healthcheck: + test: [ "CMD-SHELL", "pg_isready", "-d", "shop", "-U", "otus" ] + interval: 30s + timeout: 60s + retries: 5 + +#volumes: +# db-data: \ No newline at end of file diff --git a/lessons/lesson.11/mainapp/__init__.py b/lessons/lesson.11/mainapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.11/mainapp/admin.py b/lessons/lesson.11/mainapp/admin.py new file mode 100644 index 0000000..b798cf9 --- /dev/null +++ b/lessons/lesson.11/mainapp/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from .models import Animal, Category, Food + + +admin.site.register(Animal) +admin.site.register(Category) +admin.site.register(Food) diff --git a/lessons/lesson.11/mainapp/apps.py b/lessons/lesson.11/mainapp/apps.py new file mode 100644 index 0000000..8aa89a8 --- /dev/null +++ b/lessons/lesson.11/mainapp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MainappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'mainapp' diff --git a/lessons/lesson.11/mainapp/management/__init__.py b/lessons/lesson.11/mainapp/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.11/mainapp/management/commands/__init__.py b/lessons/lesson.11/mainapp/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.11/mainapp/management/commands/fill_db.py b/lessons/lesson.11/mainapp/management/commands/fill_db.py new file mode 100644 index 0000000..0c0b5f1 --- /dev/null +++ b/lessons/lesson.11/mainapp/management/commands/fill_db.py @@ -0,0 +1,66 @@ +from django.core.management.base import BaseCommand, CommandError +from mainapp.models import Food, Category, Animal + + +class Command(BaseCommand): + help = "Fill db with test data" + + def handle(self, *args, **options): + print('Delete categories') + Category.objects.all().delete() + + print('Create categories...') + bear = Category.objects.create(name='Медведь') + tiger = Category.objects.create(name='Тигр') + + print('Delete food') + Food.objects.all().delete() + + print('Create food...') + banana = Food.objects.create(name='Банан') + meat = Food.objects.create(name='Мясо') + honey = Food.objects.create(name='Мёд') + + print('Create animals...') + leo = Animal.objects.create(name='Leo', category=tiger) + boris = Animal.objects.create(name='Boris', category=bear) + + # Many to Many + leo.food.add(banana) + leo.food.add(meat) + leo.save() + + boris.food.add(meat) + boris.food.add(honey) + boris.save() + + print('Update...') + leo.name = 'Tiger Leo' + leo.save() + + print('Get all') + animals = Animal.objects.all() + for animal in animals: + print(animal.name) + print(animal.category.name) + for food in animal.food.all(): + print(food.name) + + print('Get one') + print('First') + first_animal = Animal.objects.filter(id=leo.id).first() + print(first_animal) + + print('Get') + get_animal = Animal.objects.get(id=leo.id) + print(get_animal) + + # + self.stdout.write( + self.style.SUCCESS('Done') + ) + # + # + # self.stdout.write( + # self.style.ERROR('error') + # ) \ No newline at end of file diff --git a/lessons/lesson.11/mainapp/migrations/0001_initial.py b/lessons/lesson.11/mainapp/migrations/0001_initial.py new file mode 100644 index 0000000..8d4b2fd --- /dev/null +++ b/lessons/lesson.11/mainapp/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0 on 2023-12-07 17:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64, unique=True)), + ], + ), + migrations.CreateModel( + name='Animal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64)), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mainapp.category')), + ], + ), + ] diff --git a/lessons/lesson.11/mainapp/migrations/0002_food_animal_food.py b/lessons/lesson.11/mainapp/migrations/0002_food_animal_food.py new file mode 100644 index 0000000..6547879 --- /dev/null +++ b/lessons/lesson.11/mainapp/migrations/0002_food_animal_food.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0 on 2023-12-07 17:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mainapp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Food', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64)), + ], + ), + migrations.AddField( + model_name='animal', + name='food', + field=models.ManyToManyField(to='mainapp.food'), + ), + ] diff --git a/lessons/lesson.11/mainapp/migrations/__init__.py b/lessons/lesson.11/mainapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.11/mainapp/models.py b/lessons/lesson.11/mainapp/models.py new file mode 100644 index 0000000..298f4c3 --- /dev/null +++ b/lessons/lesson.11/mainapp/models.py @@ -0,0 +1,29 @@ +from django.db import models + +# Катерия - Медведь Тигр +# Животное - Тигр Борис +# Еда + +# тигр - мясо +# медведь - мясо +# обезьяна - банан, мясо + + +class Category(models.Model): + name = models.CharField(max_length=64, unique=True) + + def __str__(self): + return f'{self.name}' + + +class Food(models.Model): + name = models.CharField(max_length=64) + + +class Animal(models.Model): + name = models.CharField(max_length=64) + # 1 - 1, 1 - *, * - * + # 1 категория - много животных + # cascad, protect, null + category = models.ForeignKey(Category, on_delete=models.CASCADE) + food = models.ManyToManyField(Food) diff --git a/lessons/lesson.11/mainapp/tests.py b/lessons/lesson.11/mainapp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/lessons/lesson.11/mainapp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/lessons/lesson.11/mainapp/views.py b/lessons/lesson.11/mainapp/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/lessons/lesson.11/mainapp/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/lessons/lesson.11/manage.py b/lessons/lesson.11/manage.py new file mode 100755 index 0000000..5767e97 --- /dev/null +++ b/lessons/lesson.11/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/lessons/lesson.11/requirements.txt b/lessons/lesson.11/requirements.txt new file mode 100644 index 0000000..f3f4879 --- /dev/null +++ b/lessons/lesson.11/requirements.txt @@ -0,0 +1,2 @@ +Django==5.0 +psycopg2-binary==2.9.9 \ No newline at end of file diff --git a/lessons/lesson.11/settings/__init__.py b/lessons/lesson.11/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.11/settings/asgi.py b/lessons/lesson.11/settings/asgi.py new file mode 100644 index 0000000..ca373ea --- /dev/null +++ b/lessons/lesson.11/settings/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for settings project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + +application = get_asgi_application() diff --git a/lessons/lesson.11/settings/settings.py b/lessons/lesson.11/settings/settings.py new file mode 100644 index 0000000..baaa1bf --- /dev/null +++ b/lessons/lesson.11/settings/settings.py @@ -0,0 +1,134 @@ +""" +Django settings for settings project. + +Generated by 'django-admin startproject' using Django 5.0. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-1fj-#yc1+)%cykw61#$s(4$#(wsqu$els+a8v#5by7u7pbfg@%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'mainapp', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'settings.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'settings.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.0/ref/settings/#databases + +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'shop', + 'USER': 'otus', + 'PASSWORD': 'otus12345', + 'HOST': 'localhost', + 'PORT': '5432', + } +} + +# Password validation +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.0/topics/i18n/ + +LANGUAGE_CODE = 'ru-ru' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.0/howto/static-files/ + +STATIC_URL = 'static/' + +# Default primary key field type +# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/lessons/lesson.11/settings/urls.py b/lessons/lesson.11/settings/urls.py new file mode 100644 index 0000000..779efde --- /dev/null +++ b/lessons/lesson.11/settings/urls.py @@ -0,0 +1,22 @@ +""" +URL configuration for settings project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path + +urlpatterns = [ + path('admin/', admin.site.urls), +] diff --git a/lessons/lesson.11/settings/wsgi.py b/lessons/lesson.11/settings/wsgi.py new file mode 100644 index 0000000..50011a2 --- /dev/null +++ b/lessons/lesson.11/settings/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for settings project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + +application = get_wsgi_application() From cf5f124b98a5dd2eff6c1bbe2090a16f462ef72f Mon Sep 17 00:00:00 2001 From: DanteOnline Date: Tue, 12 Dec 2023 21:52:56 +0300 Subject: [PATCH 13/27] add lesson 12: django cbv --- README.md | 3 +- lessons/lesson.12/Makefile | 17 + lessons/lesson.12/docker-compose.yaml | 23 + lessons/lesson.12/mainapp/__init__.py | 0 lessons/lesson.12/mainapp/admin.py | 7 + lessons/lesson.12/mainapp/apps.py | 6 + .../lesson.12/mainapp/management/__init__.py | 0 .../mainapp/management/commands/__init__.py | 0 .../mainapp/management/commands/fill_db.py | 66 + .../mainapp/migrations/0001_initial.py | 30 + .../migrations/0002_food_animal_food.py | 25 + .../lesson.12/mainapp/migrations/__init__.py | 0 lessons/lesson.12/mainapp/models.py | 29 + .../mainapp/templates/mainapp/animals.html | 28 + .../mainapp/category_confirm_delete.html | 31 + .../templates/mainapp/category_detail.html | 28 + .../templates/mainapp/category_form.html | 17 + .../templates/mainapp/category_list.html | 36 + .../mainapp/templates/mainapp/contact.html | 18 + .../mainapp/templates/mainapp/index.html | 23 + lessons/lesson.12/mainapp/tests.py | 3 + lessons/lesson.12/mainapp/urls.py | 16 + lessons/lesson.12/mainapp/views.py | 90 + lessons/lesson.12/manage.py | 22 + lessons/lesson.12/requirements.txt | 2 + lessons/lesson.12/settings/__init__.py | 0 lessons/lesson.12/settings/asgi.py | 16 + lessons/lesson.12/settings/settings.py | 136 + lessons/lesson.12/settings/urls.py | 23 + lessons/lesson.12/settings/wsgi.py | 16 + lessons/lesson.12/static/css/bootstrap.css | 12 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 14079 bytes .../fonts/glyphicons-halflings-regular.svg | 228 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 29512 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 16448 bytes lessons/lesson.12/static/images/favicon.ico | Bin 0 -> 172552 bytes lessons/lesson.12/static/images/logo.png | Bin 0 -> 210139 bytes .../lesson.12/static/js/vendor/bootstrap.js | 5016 ++++++++ .../static/js/vendor/jquery-3.7.0.js | 10704 ++++++++++++++++ lessons/lesson.12/templates/base.html | 73 + 40 files changed, 16743 insertions(+), 1 deletion(-) create mode 100644 lessons/lesson.12/Makefile create mode 100644 lessons/lesson.12/docker-compose.yaml create mode 100644 lessons/lesson.12/mainapp/__init__.py create mode 100644 lessons/lesson.12/mainapp/admin.py create mode 100644 lessons/lesson.12/mainapp/apps.py create mode 100644 lessons/lesson.12/mainapp/management/__init__.py create mode 100644 lessons/lesson.12/mainapp/management/commands/__init__.py create mode 100644 lessons/lesson.12/mainapp/management/commands/fill_db.py create mode 100644 lessons/lesson.12/mainapp/migrations/0001_initial.py create mode 100644 lessons/lesson.12/mainapp/migrations/0002_food_animal_food.py create mode 100644 lessons/lesson.12/mainapp/migrations/__init__.py create mode 100644 lessons/lesson.12/mainapp/models.py create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/animals.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/category_confirm_delete.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/category_detail.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/category_form.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/category_list.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/contact.html create mode 100644 lessons/lesson.12/mainapp/templates/mainapp/index.html create mode 100644 lessons/lesson.12/mainapp/tests.py create mode 100644 lessons/lesson.12/mainapp/urls.py create mode 100644 lessons/lesson.12/mainapp/views.py create mode 100755 lessons/lesson.12/manage.py create mode 100644 lessons/lesson.12/requirements.txt create mode 100644 lessons/lesson.12/settings/__init__.py create mode 100644 lessons/lesson.12/settings/asgi.py create mode 100644 lessons/lesson.12/settings/settings.py create mode 100644 lessons/lesson.12/settings/urls.py create mode 100644 lessons/lesson.12/settings/wsgi.py create mode 100644 lessons/lesson.12/static/css/bootstrap.css create mode 100644 lessons/lesson.12/static/fonts/glyphicons-halflings-regular.eot create mode 100644 lessons/lesson.12/static/fonts/glyphicons-halflings-regular.svg create mode 100644 lessons/lesson.12/static/fonts/glyphicons-halflings-regular.ttf create mode 100644 lessons/lesson.12/static/fonts/glyphicons-halflings-regular.woff create mode 100644 lessons/lesson.12/static/images/favicon.ico create mode 100644 lessons/lesson.12/static/images/logo.png create mode 100644 lessons/lesson.12/static/js/vendor/bootstrap.js create mode 100644 lessons/lesson.12/static/js/vendor/jquery-3.7.0.js create mode 100644 lessons/lesson.12/templates/base.html diff --git a/README.md b/README.md index f605ba3..a51c4a5 100644 --- a/README.md +++ b/README.md @@ -13,4 +13,5 @@ - [Урок 8. Введение в werkzeug; Flask](lessons/lesson.08/) - [Урок 9. Werkzeug; Flask + SQLAlchemy. Работа с моделями данных](lessons/lesson.09/) - [Урок 10. Связь контейнеров в docker. Сборка проекта на Flask](lessons/lesson.10/) -- [Урок 11. Django settings, orm, админка, миграции, superuser](lessons/lesson.11/) \ No newline at end of file +- [Урок 11. Django settings, orm, админка, миграции, superuser](lessons/lesson.11/) +- [Урок 12. Django cbv, шаблоны, наследование шаблонов](lessons/lesson.12/) \ No newline at end of file diff --git a/lessons/lesson.12/Makefile b/lessons/lesson.12/Makefile new file mode 100644 index 0000000..43fd0f1 --- /dev/null +++ b/lessons/lesson.12/Makefile @@ -0,0 +1,17 @@ +runserver: + python manage.py runserver + +newapp: + python manage.py startapp mainapp + +makemigrations: + python manage.py makemigrations + +migrate: + python manage.py migrate + +createsuperuser: + python manage.py createsuperuser + +fill_db: + python manage.py fill_db diff --git a/lessons/lesson.12/docker-compose.yaml b/lessons/lesson.12/docker-compose.yaml new file mode 100644 index 0000000..415f2ae --- /dev/null +++ b/lessons/lesson.12/docker-compose.yaml @@ -0,0 +1,23 @@ +version: "3" + +services: + pg: + image: postgres:15 +# build: ... + environment: + POSTGRES_DB: shop + POSTGRES_USER: otus + POSTGRES_PASSWORD: otus12345 + PGDATA: /var/lib/postgresql/data/pgdata + ports: + - "5432:5432" +# volumes: +# - db-data:/var/lib/postgresql/data/pgdata + healthcheck: + test: [ "CMD-SHELL", "pg_isready", "-d", "shop", "-U", "otus" ] + interval: 30s + timeout: 60s + retries: 5 + +#volumes: +# db-data: \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/__init__.py b/lessons/lesson.12/mainapp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.12/mainapp/admin.py b/lessons/lesson.12/mainapp/admin.py new file mode 100644 index 0000000..b798cf9 --- /dev/null +++ b/lessons/lesson.12/mainapp/admin.py @@ -0,0 +1,7 @@ +from django.contrib import admin +from .models import Animal, Category, Food + + +admin.site.register(Animal) +admin.site.register(Category) +admin.site.register(Food) diff --git a/lessons/lesson.12/mainapp/apps.py b/lessons/lesson.12/mainapp/apps.py new file mode 100644 index 0000000..8aa89a8 --- /dev/null +++ b/lessons/lesson.12/mainapp/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class MainappConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'mainapp' diff --git a/lessons/lesson.12/mainapp/management/__init__.py b/lessons/lesson.12/mainapp/management/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.12/mainapp/management/commands/__init__.py b/lessons/lesson.12/mainapp/management/commands/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.12/mainapp/management/commands/fill_db.py b/lessons/lesson.12/mainapp/management/commands/fill_db.py new file mode 100644 index 0000000..0c0b5f1 --- /dev/null +++ b/lessons/lesson.12/mainapp/management/commands/fill_db.py @@ -0,0 +1,66 @@ +from django.core.management.base import BaseCommand, CommandError +from mainapp.models import Food, Category, Animal + + +class Command(BaseCommand): + help = "Fill db with test data" + + def handle(self, *args, **options): + print('Delete categories') + Category.objects.all().delete() + + print('Create categories...') + bear = Category.objects.create(name='Медведь') + tiger = Category.objects.create(name='Тигр') + + print('Delete food') + Food.objects.all().delete() + + print('Create food...') + banana = Food.objects.create(name='Банан') + meat = Food.objects.create(name='Мясо') + honey = Food.objects.create(name='Мёд') + + print('Create animals...') + leo = Animal.objects.create(name='Leo', category=tiger) + boris = Animal.objects.create(name='Boris', category=bear) + + # Many to Many + leo.food.add(banana) + leo.food.add(meat) + leo.save() + + boris.food.add(meat) + boris.food.add(honey) + boris.save() + + print('Update...') + leo.name = 'Tiger Leo' + leo.save() + + print('Get all') + animals = Animal.objects.all() + for animal in animals: + print(animal.name) + print(animal.category.name) + for food in animal.food.all(): + print(food.name) + + print('Get one') + print('First') + first_animal = Animal.objects.filter(id=leo.id).first() + print(first_animal) + + print('Get') + get_animal = Animal.objects.get(id=leo.id) + print(get_animal) + + # + self.stdout.write( + self.style.SUCCESS('Done') + ) + # + # + # self.stdout.write( + # self.style.ERROR('error') + # ) \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/migrations/0001_initial.py b/lessons/lesson.12/mainapp/migrations/0001_initial.py new file mode 100644 index 0000000..8d4b2fd --- /dev/null +++ b/lessons/lesson.12/mainapp/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0 on 2023-12-07 17:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Category', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64, unique=True)), + ], + ), + migrations.CreateModel( + name='Animal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64)), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mainapp.category')), + ], + ), + ] diff --git a/lessons/lesson.12/mainapp/migrations/0002_food_animal_food.py b/lessons/lesson.12/mainapp/migrations/0002_food_animal_food.py new file mode 100644 index 0000000..6547879 --- /dev/null +++ b/lessons/lesson.12/mainapp/migrations/0002_food_animal_food.py @@ -0,0 +1,25 @@ +# Generated by Django 5.0 on 2023-12-07 17:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mainapp', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Food', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=64)), + ], + ), + migrations.AddField( + model_name='animal', + name='food', + field=models.ManyToManyField(to='mainapp.food'), + ), + ] diff --git a/lessons/lesson.12/mainapp/migrations/__init__.py b/lessons/lesson.12/mainapp/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.12/mainapp/models.py b/lessons/lesson.12/mainapp/models.py new file mode 100644 index 0000000..298f4c3 --- /dev/null +++ b/lessons/lesson.12/mainapp/models.py @@ -0,0 +1,29 @@ +from django.db import models + +# Катерия - Медведь Тигр +# Животное - Тигр Борис +# Еда + +# тигр - мясо +# медведь - мясо +# обезьяна - банан, мясо + + +class Category(models.Model): + name = models.CharField(max_length=64, unique=True) + + def __str__(self): + return f'{self.name}' + + +class Food(models.Model): + name = models.CharField(max_length=64) + + +class Animal(models.Model): + name = models.CharField(max_length=64) + # 1 - 1, 1 - *, * - * + # 1 категория - много животных + # cascad, protect, null + category = models.ForeignKey(Category, on_delete=models.CASCADE) + food = models.ManyToManyField(Food) diff --git a/lessons/lesson.12/mainapp/templates/mainapp/animals.html b/lessons/lesson.12/mainapp/templates/mainapp/animals.html new file mode 100644 index 0000000..178e0e6 --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/animals.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% block title %} + Animals +{% endblock %} + +{% block body %} + + +
+ +
+ {% for object in object_list %} +
+
+ ... +
+
+ {{object.name}} +
+

{{object.category.name}}

+
+
+
+ {% endfor %} +
+

+
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/category_confirm_delete.html b/lessons/lesson.12/mainapp/templates/mainapp/category_confirm_delete.html new file mode 100644 index 0000000..1d0245b --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/category_confirm_delete.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} +{% block title %} + {{object.name}} +{% endblock %} + +{% block body %} + + +
+ +
+ +
+
+ ... +
+
+ {{category.name}} +
+

Вы действительно хотите удалить?

+
+ {% csrf_token %} + +
+
+
+
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/category_detail.html b/lessons/lesson.12/mainapp/templates/mainapp/category_detail.html new file mode 100644 index 0000000..9172fe9 --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/category_detail.html @@ -0,0 +1,28 @@ +{% extends "base.html" %} +{% block title %} + {{object.name}} +{% endblock %} + +{% block body %} + + +
+ +
+ +
+
+ ... +
+
+ {{category.name}} +
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Go somewhere +
+
+
+ +
+
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/category_form.html b/lessons/lesson.12/mainapp/templates/mainapp/category_form.html new file mode 100644 index 0000000..97f7481 --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/category_form.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} +{% block title %} + {{object.name}} +{% endblock %} + +{% block body %} + + +
+
+ {% csrf_token %} + {{form.as_p}} + +
+ +
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/category_list.html b/lessons/lesson.12/mainapp/templates/mainapp/category_list.html new file mode 100644 index 0000000..a4607e2 --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/category_list.html @@ -0,0 +1,36 @@ +{% extends "base.html" %} +{% block title %} + Categories +{% endblock %} + +{% block body %} + + +
+ +
+ {% for category in category_list %} +
+
+ ... +
+
+ + {{category.name}} + +
+

Some quick example text to build on the card title and make up the bulk of the card's content.

+ Update + Delete + Get Animals +
+
+
+ {% endfor %} +
+

+ Create +
+

{{some_text}}

+
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/contact.html b/lessons/lesson.12/mainapp/templates/mainapp/contact.html new file mode 100644 index 0000000..19f9f6e --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/contact.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} +{% block title %} + Contact +{% endblock %} + +{% block body %} + +
+ +

Contact

+

+

+

+
+{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/templates/mainapp/index.html b/lessons/lesson.12/mainapp/templates/mainapp/index.html new file mode 100644 index 0000000..0e9a7cb --- /dev/null +++ b/lessons/lesson.12/mainapp/templates/mainapp/index.html @@ -0,0 +1,23 @@ +{% extends "base.html" %} +{% load static %} + +{% block title %} + Zoo +{% endblock %} + +{% block body %} + +
+ +

Welcome to Zoo!

+

+ You can find your little friends here. +

+ +
+ + +{% endblock %} \ No newline at end of file diff --git a/lessons/lesson.12/mainapp/tests.py b/lessons/lesson.12/mainapp/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/lessons/lesson.12/mainapp/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/lessons/lesson.12/mainapp/urls.py b/lessons/lesson.12/mainapp/urls.py new file mode 100644 index 0000000..87aeacf --- /dev/null +++ b/lessons/lesson.12/mainapp/urls.py @@ -0,0 +1,16 @@ +from django.urls import path + +from . import views + +app_name = 'mainapp' + +urlpatterns = [ + path('', views.index_view, name='index'), + path('category/list/', views.CategoryListView.as_view(), name='category_list'), + path('category//', views.CategoryDetailView.as_view(), name='category_detail'), + path('category/create/', views.CategoryCreateView.as_view(), name='category_create'), + path('category/update//', views.CategoryUpdateView.as_view(), name='category_update'), + path('category/delete//', views.CategoryDeleteView.as_view(), name='category_delete'), + + path('animal/list/', views.AnimalListView.as_view(), name='animal_list'), +] diff --git a/lessons/lesson.12/mainapp/views.py b/lessons/lesson.12/mainapp/views.py new file mode 100644 index 0000000..0fd8a9e --- /dev/null +++ b/lessons/lesson.12/mainapp/views.py @@ -0,0 +1,90 @@ +from django.shortcuts import render +from django.urls import reverse_lazy +from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView +from .models import Category, Animal + + +def index_view(request): + return render(request, 'mainapp/index.html') + + +def category_list_view(request): + category_list = Category.objects.all() + context = {'category_list': category_list} + return render(request, 'mainapp/category_list.html', context=context) + + +class CategoryListView(ListView): + model = Category + ordering = ['pk'] + # template_name = '' + # context_object_name = + + # get - гет запрос + # get_context_data - передача контектса в шаблон + # get_queryset - получение данных + + def get_context_data(self, *args, **kwargs): + context = super().get_context_data(*args, **kwargs) + context['some_text'] = 'Another text' + return context + + + +class CategoryDetailView(DetailView): + model = Category + + # get - гет запрос + # get_context_data - передача контектса в шаблон + # get_queryset - получение данных + # get_object - получение одного объекта + + +class CategoryCreateView(CreateView): + model = Category + fields = '__all__' + success_url = reverse_lazy('mainapp:category_list') + + # get - гет запрос + # get_context_data - передача контектса в шаблон + # post + # form_valid + # get_success_url + +class CategoryUpdateView(UpdateView): + model = Category + fields = '__all__' + success_url = reverse_lazy('mainapp:category_list') + + # get - гет запрос + # get_context_data - передача контектса в шаблон + # post + # form_valid + # get_object + # get_success_url + +class CategoryDeleteView(DeleteView): + model = Category + success_url = reverse_lazy('mainapp:category_list') + # get - гет запрос + # get_context_data - передача контектса в шаблон + # post + # form_valid + # get_object + # get_success_url + + +class AnimalListView(ListView): + model = Animal + template_name = 'mainapp/animals.html' + + def get(self, request, *args, **kwargs): + self.category_id = request.GET.get('category_id', None) + return super().get(request, *args, **kwargs) + + def get_queryset(self): + queryset = super().get_queryset() + if self.category_id is not None: + queryset = queryset.filter(category__id=self.category_id) + return queryset + diff --git a/lessons/lesson.12/manage.py b/lessons/lesson.12/manage.py new file mode 100755 index 0000000..5767e97 --- /dev/null +++ b/lessons/lesson.12/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/lessons/lesson.12/requirements.txt b/lessons/lesson.12/requirements.txt new file mode 100644 index 0000000..f3f4879 --- /dev/null +++ b/lessons/lesson.12/requirements.txt @@ -0,0 +1,2 @@ +Django==5.0 +psycopg2-binary==2.9.9 \ No newline at end of file diff --git a/lessons/lesson.12/settings/__init__.py b/lessons/lesson.12/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lessons/lesson.12/settings/asgi.py b/lessons/lesson.12/settings/asgi.py new file mode 100644 index 0000000..ca373ea --- /dev/null +++ b/lessons/lesson.12/settings/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for settings project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + +application = get_asgi_application() diff --git a/lessons/lesson.12/settings/settings.py b/lessons/lesson.12/settings/settings.py new file mode 100644 index 0000000..0e99dd5 --- /dev/null +++ b/lessons/lesson.12/settings/settings.py @@ -0,0 +1,136 @@ +""" +Django settings for settings project. + +Generated by 'django-admin startproject' using Django 5.0. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.0/ref/settings/ +""" +import os +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-1fj-#yc1+)%cykw61#$s(4$#(wsqu$els+a8v#5by7u7pbfg@%' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'mainapp', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'settings.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [os.path.join(BASE_DIR, 'templates')], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'settings.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.0/ref/settings/#databases + +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': BASE_DIR / 'db.sqlite3', +# } +# } + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'NAME': 'shop', + 'USER': 'otus', + 'PASSWORD': 'otus12345', + 'HOST': 'localhost', + 'PORT': '5432', + } +} + +# Password validation +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.0/topics/i18n/ + +LANGUAGE_CODE = 'ru-ru' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.0/howto/static-files/ + +STATIC_URL = 'static/' + +STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] + +# Default primary key field type +# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/lessons/lesson.12/settings/urls.py b/lessons/lesson.12/settings/urls.py new file mode 100644 index 0000000..efcaac8 --- /dev/null +++ b/lessons/lesson.12/settings/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for settings project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import path, include + +urlpatterns = [ + path('admin/', admin.site.urls), + path('', include('mainapp.urls')), +] diff --git a/lessons/lesson.12/settings/wsgi.py b/lessons/lesson.12/settings/wsgi.py new file mode 100644 index 0000000..50011a2 --- /dev/null +++ b/lessons/lesson.12/settings/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for settings project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings.settings') + +application = get_wsgi_application() diff --git a/lessons/lesson.12/static/css/bootstrap.css b/lessons/lesson.12/static/css/bootstrap.css new file mode 100644 index 0000000..2ce4b63 --- /dev/null +++ b/lessons/lesson.12/static/css/bootstrap.css @@ -0,0 +1,12 @@ +@charset "UTF-8";/*! + * Bootswatch v5.3.2 (https://bootswatch.com) + * Theme: sketchy + * Copyright 2012-2023 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v5.3.2 (https://getbootstrap.com/) + * Copyright 2011-2023 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */@import url(https://fonts.googleapis.com/css?family=Neucha|Cabin+Sketch&display=swap);:root,[data-bs-theme=light]{--bs-blue:#007bff;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#28a745;--bs-teal:#20c997;--bs-cyan:#17a2b8;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#333;--bs-gray-100:#f8f9fa;--bs-gray-200:#f7f7f9;--bs-gray-300:#dee2e6;--bs-gray-400:#ccc;--bs-gray-500:#aaa;--bs-gray-600:#868e96;--bs-gray-700:#555;--bs-gray-800:#333;--bs-gray-900:#212529;--bs-primary:#333;--bs-secondary:#555;--bs-success:#28a745;--bs-info:#17a2b8;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#fff;--bs-dark:#555;--bs-primary-rgb:51,51,51;--bs-secondary-rgb:85,85,85;--bs-success-rgb:40,167,69;--bs-info-rgb:23,162,184;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:255,255,255;--bs-dark-rgb:85,85,85;--bs-primary-text-emphasis:#141414;--bs-secondary-text-emphasis:#222222;--bs-success-text-emphasis:#10431c;--bs-info-text-emphasis:#09414a;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#555;--bs-dark-text-emphasis:#555;--bs-primary-bg-subtle:#d6d6d6;--bs-secondary-bg-subtle:#dddddd;--bs-success-bg-subtle:#d4edda;--bs-info-bg-subtle:#d1ecf1;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ccc;--bs-primary-border-subtle:#adadad;--bs-secondary-border-subtle:#bbbbbb;--bs-success-border-subtle:#a9dcb5;--bs-info-border-subtle:#a2dae3;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--bs-light-border-subtle:#f7f7f9;--bs-dark-border-subtle:#aaa;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:Neucha,-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:700;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-color-rgb:33,37,41;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(33, 37, 41, 0.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#f7f7f9;--bs-secondary-bg-rgb:247,247,249;--bs-tertiary-color:rgba(33, 37, 41, 0.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#333;--bs-link-color-rgb:51,51,51;--bs-link-decoration:underline;--bs-link-hover-color:#292929;--bs-link-hover-color-rgb:41,41,41;--bs-code-color:#e83e8c;--bs-highlight-color:#212529;--bs-highlight-bg:#fff3cd;--bs-border-width:2px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:25px;--bs-border-radius-sm:15px;--bs-border-radius-lg:35px;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(51, 51, 51, 0.25);--bs-form-valid-color:#28a745;--bs-form-valid-border-color:#28a745;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#333;--bs-secondary-bg-rgb:51,51,51;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2a2c2e;--bs-tertiary-bg-rgb:42,44,46;--bs-primary-text-emphasis:#858585;--bs-secondary-text-emphasis:#999999;--bs-success-text-emphasis:#7eca8f;--bs-info-text-emphasis:#74c7d4;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#0a0a0a;--bs-secondary-bg-subtle:#111111;--bs-success-bg-subtle:#08210e;--bs-info-bg-subtle:#052025;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#333;--bs-dark-bg-subtle:#1a1a1a;--bs-primary-border-subtle:#1f1f1f;--bs-secondary-border-subtle:#333333;--bs-success-border-subtle:#186429;--bs-info-border-subtle:#0e616e;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#555;--bs-dark-border-subtle:#333;--bs-heading-color:inherit;--bs-link-color:#858585;--bs-link-hover-color:#9d9d9d;--bs-link-color-rgb:133,133,133;--bs-link-hover-color-rgb:157,157,157;--bs-code-color:#f18bba;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#664d03;--bs-border-color:#555;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#7eca8f;--bs-form-valid-border-color:#7eca8f;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-family:"Cabin Sketch",cursive;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:15px}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#868e96}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:#333;--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:#fff;width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:2px;box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(2px * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:2px 0}.table-bordered>:not(caption)>*>*{border-width:0 2px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d6d6d6;--bs-table-border-color:#ababab;--bs-table-striped-bg:#cbcbcb;--bs-table-striped-color:#fff;--bs-table-active-bg:#c1c1c1;--bs-table-active-color:#fff;--bs-table-hover-bg:#c6c6c6;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#dddddd;--bs-table-border-color:#b1b1b1;--bs-table-striped-bg:#d2d2d2;--bs-table-striped-color:#000;--bs-table-active-bg:#c7c7c7;--bs-table-active-color:#fff;--bs-table-hover-bg:#cccccc;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#d4edda;--bs-table-border-color:#aabeae;--bs-table-striped-bg:#c9e1cf;--bs-table-striped-color:#000;--bs-table-active-bg:#bfd5c4;--bs-table-active-color:#000;--bs-table-hover-bg:#c4dbca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#d1ecf1;--bs-table-border-color:#a7bdc1;--bs-table-striped-bg:#c7e0e5;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd4d9;--bs-table-active-color:#000;--bs-table-hover-bg:#c1dadf;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#ccc2a4;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#c6acae;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#fff;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#fff;--bs-table-border-color:#cccccc;--bs-table-striped-bg:#f2f2f2;--bs-table-striped-color:#000;--bs-table-active-bg:#e6e6e6;--bs-table-active-color:#000;--bs-table-hover-bg:#ececec;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#555;--bs-table-border-color:#777777;--bs-table-striped-bg:#5e5e5e;--bs-table-striped-color:#fff;--bs-table-active-bg:#666666;--bs-table-active-color:#fff;--bs-table-hover-bg:#626262;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:700;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid #333;border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#333;outline:0;box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);border-color:#868e96;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23333' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:700;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid #333;border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#333;outline:0;box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{color:#868e96;background-color:var(--bs-secondary-bg);border-color:#868e96}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#333;outline:0;box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}.form-check-input:checked{background-color:#333;border-color:#333}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#333;border-color:#333;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23333'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(51,51,51,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(51,51,51,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#333;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c2c2c2}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#333;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c2c2c2}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#868e96}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:700;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid #333;border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#333;--bs-btn-border-color:#333;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#2b2b2b;--bs-btn-hover-border-color:#292929;--bs-btn-focus-shadow-rgb:82,82,82;--bs-btn-active-color:#fff;--bs-btn-active-bg:#292929;--bs-btn-active-border-color:#262626;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#333;--bs-btn-disabled-border-color:#333}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#555;--bs-btn-border-color:#555;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#484848;--bs-btn-hover-border-color:#444444;--bs-btn-focus-shadow-rgb:111,111,111;--bs-btn-active-color:#fff;--bs-btn-active-bg:#444444;--bs-btn-active-border-color:#404040;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#555;--bs-btn-disabled-border-color:#555}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#28a745;--bs-btn-border-color:#28a745;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#228e3b;--bs-btn-hover-border-color:#208637;--bs-btn-focus-shadow-rgb:72,180,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#208637;--bs-btn-active-border-color:#1e7d34;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#28a745;--bs-btn-disabled-border-color:#28a745}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#17a2b8;--bs-btn-border-color:#17a2b8;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#148a9c;--bs-btn-hover-border-color:#128293;--bs-btn-focus-shadow-rgb:58,176,195;--bs-btn-active-color:#fff;--bs-btn-active-bg:#128293;--bs-btn-active-border-color:#117a8a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#17a2b8;--bs-btn-disabled-border-color:#17a2b8}.btn-warning{--bs-btn-color:#fff;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#d9a406;--bs-btn-hover-border-color:#cc9a06;--bs-btn-focus-shadow-rgb:255,202,44;--bs-btn-active-color:#fff;--bs-btn-active-bg:#cc9a06;--bs-btn-active-border-color:#bf9105;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d9d9d9;--bs-btn-hover-border-color:#cccccc;--bs-btn-focus-shadow-rgb:217,217,217;--bs-btn-active-color:#fff;--bs-btn-active-bg:#cccccc;--bs-btn-active-border-color:#bfbfbf;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#fff;--bs-btn-disabled-border-color:#fff}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#555;--bs-btn-border-color:#555;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6f6f6f;--bs-btn-hover-border-color:#666666;--bs-btn-focus-shadow-rgb:111,111,111;--bs-btn-active-color:#fff;--bs-btn-active-bg:#777777;--bs-btn-active-border-color:#666666;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#555;--bs-btn-disabled-border-color:#555}.btn-outline-primary{--bs-btn-color:#333;--bs-btn-border-color:#333;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#333;--bs-btn-hover-border-color:#333;--bs-btn-focus-shadow-rgb:51,51,51;--bs-btn-active-color:#fff;--bs-btn-active-bg:#333;--bs-btn-active-border-color:#333;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#333;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#333;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#555;--bs-btn-border-color:#555;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#555;--bs-btn-hover-border-color:#555;--bs-btn-focus-shadow-rgb:85,85,85;--bs-btn-active-color:#fff;--bs-btn-active-bg:#555;--bs-btn-active-border-color:#555;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#555;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#555;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#28a745;--bs-btn-border-color:#28a745;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#28a745;--bs-btn-hover-border-color:#28a745;--bs-btn-focus-shadow-rgb:40,167,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#28a745;--bs-btn-active-border-color:#28a745;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#28a745;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#28a745;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#17a2b8;--bs-btn-border-color:#17a2b8;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#17a2b8;--bs-btn-hover-border-color:#17a2b8;--bs-btn-focus-shadow-rgb:23,162,184;--bs-btn-active-color:#fff;--bs-btn-active-bg:#17a2b8;--bs-btn-active-border-color:#17a2b8;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#17a2b8;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#17a2b8;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#fff;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#fff;--bs-btn-border-color:#fff;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#fff;--bs-btn-hover-border-color:#fff;--bs-btn-focus-shadow-rgb:255,255,255;--bs-btn-active-color:#000;--bs-btn-active-bg:#fff;--bs-btn-active-border-color:#fff;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#fff;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#555;--bs-btn-border-color:#555;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#555;--bs-btn-hover-border-color:#555;--bs-btn-focus-shadow-rgb:85,85,85;--bs-btn-active-color:#fff;--bs-btn-active-bg:#555;--bs-btn-active-border-color:#555;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#555;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#555;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#868e96;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:82,82,82;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:#333;--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:#333;--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:#fff;--bs-dropdown-link-hover-bg:#333;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#333;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#868e96;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#333;--bs-dropdown-border-color:#333;--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:#333;--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#333;--bs-dropdown-link-disabled-color:#aaa;--bs-dropdown-header-color:#aaa}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:#333;--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:#333;--bs-nav-tabs-link-active-color:#333;--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:#333;border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#333}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.55);--bs-navbar-hover-color:rgba(255, 255, 255, 0.75);--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:2px;--bs-card-border-color:#333;--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - 2px);--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23141414'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#333;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(51, 51, 51, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23858585'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23858585'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0.75rem;--bs-breadcrumb-padding-y:0.375rem;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius:0.25rem;--bs-breadcrumb-divider-color:#333;--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:#333;display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:#333;--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:#fff;--bs-pagination-hover-bg:#333;--bs-pagination-hover-border-color:#333;--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(51, 51, 51, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#333;--bs-pagination-active-border-color:#333;--bs-pagination-disabled-color:#ccc;--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:#333;display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:1.2em;--bs-badge-padding-y:0.5em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:#fff;--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#ccc;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:#333;--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:#333;--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:#dee2e6;--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#333;--bs-list-group-active-border-color:#333;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:inherit;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='inherit'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:1;--bs-btn-close-hover-opacity:1;--bs-btn-close-focus-shadow:none;--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:25px;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:2px;--bs-toast-border-color:#333;--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:#333;--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:#333;width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:#333;--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:#333;--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:#333;--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:#333;--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:#333;--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#fff!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#fff!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(41,41,41,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(41,41,41,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(41,41,41,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(68,68,68,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(68,68,68,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(68,68,68,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(32,134,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(32,134,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(32,134,55,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(18,130,147,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(18,130,147,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(18,130,147,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(204,154,6,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(204,154,6,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(204,154,6,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(255,255,255,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(255,255,255,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(255,255,255,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(68,68,68,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(68,68,68,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(68,68,68,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar{border-style:solid;border-width:2px;border-radius:25px 25px 55px 5px/5px 55px 25px 25px}.navbar.bg-light{border-color:#333}.navbar.fixed-top{border-width:0 0 2px;border-radius:0 25px 225px 0/25px 0 25px 255px}.navbar.fixed-bottom{border-width:2px 0 0;border-radius:255px 25px 0 25px/25px 225px 25px 0}.navbar-brand{font-family:"Cabin Sketch",cursive;font-weight:400;text-decoration:none}.btn{text-decoration:none;border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.btn-group-lg>.btn,.btn-lg{border-radius:55px 225px 15px 25px/25px 25px 35px 355px}.btn-group-sm>.btn,.btn-sm{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.btn-check{display:inline-block;opacity:0}button,input,optgroup,select,textarea{font-family:Neucha,-apple-system,system-ui,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif}b,strong{font-family:"Cabin Sketch",cursive}blockquote{border-radius:15px 27px 25px 25px/25px 25px 305px 635px}table td,table th{background-color:#fff}.table-bordered{overflow:hidden;border-spacing:0;border-collapse:separate;background-color:#333;border-radius:5px 25px 5px 25px/25px 5px 25px 5px}.table-bordered td,.table-bordered th{border-radius:5px 5px 25px 4px/5px 4px 3px 5px}.table-bordered .table-success td,.table-bordered .table-success th,.table-bordered .table-success:hover td,.table-bordered .table-success:hover th{color:#fff;background-color:#28a745}.table-bordered .table-info td,.table-bordered .table-info th,.table-bordered .table-info:hover td,.table-bordered .table-info:hover th{color:#fff;background-color:#17a2b8}.table-bordered .table-warning td,.table-bordered .table-warning th,.table-bordered .table-warning:hover td,.table-bordered .table-warning:hover th{color:#fff;background-color:#ffc107}.table-bordered .table-danger td,.table-bordered .table-danger th,.table-bordered .table-danger:hover td,.table-bordered .table-danger:hover th{color:#fff;background-color:#dc3545}.table-dark td,.table-dark th,.table-dark.table-hover .table-active:hover>td,.table-dark.table-hover .table-active:hover>th{background-color:#333}.form-control,.input-group-text,input{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}select,select.form-control,textarea,textarea.form-control{border-radius:55px 225px 15px 25px/25px 25px 35px 355px!important}[type=checkbox]{position:relative;width:0;height:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;border:none}[type=checkbox]::before{position:absolute;top:-.1em;left:0;display:inline-block;width:15px;height:16px;content:"";border:2px solid #333;border-radius:2px 8px 2px 4px/5px 3px 5px 3px}[type=checkbox]:focus::before{box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}[type=checkbox]:checked::after,[type=checkbox]:indeterminate::after{position:absolute;top:0;left:.1em;font-size:1.5rem;line-height:.5;color:#333}[type=checkbox]:checked::after{content:"x"}[type=checkbox]:indeterminate::after{top:.1em;content:"-"}[type=checkbox]:disabled::before{border:2px solid #aaa}[type=radio]{position:relative;width:0;height:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;border:none}[type=radio]::before{position:absolute;top:-.1em;left:0;display:inline-block;width:16px;height:16px;content:"";border:2px solid #333;border-radius:50% 45% 40% 50%/40% 50% 50% 45%}[type=radio]:focus::before{box-shadow:0 0 0 .25rem rgba(51,51,51,.25)}[type=radio]:checked::before{background-color:#333}[type=radio]:disabled::before{border:2px solid #aaa}.form-check-input:focus{box-shadow:none}.form-switch{padding-left:0}.form-switch .form-check-input{position:relative;margin-left:0}.form-switch .form-check-input::before{width:32px;border-radius:30% 35% 30% 30%/30% 50% 30% 45%}.form-switch .form-check-input::after{position:absolute;top:0;left:0;display:inline-block;width:12px;height:12px;content:"";background-color:#fff;border:2px solid #333;border-radius:50% 45% 40% 50%/40% 50% 50% 45%;transition:left .15s ease-in-out}.form-switch .form-check-input:checked::after{top:0;left:18px;background-color:#333}.form-switch .form-check-label{margin-left:.5em}.dropdown-menu{overflow:hidden;border-radius:555px 25px 25px 25px/25px 25px 25px 555px}.dropdown-divider{border-top-width:2px}.list-group{overflow:hidden;background-color:#333;border:2px solid #333;border-radius:45px 15px 35px 5px/15px 5px 15px 65px}.list-group-item{border-top:2px solid #333;border-right:none;border-left:none;border-radius:255px 5px 225px 5px/25px 225px 25px 255px}.list-group-item:first-child{border-top:none}.list-group-item:last-child{border-bottom:none}.nav-pills .nav-link{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.dropdown-item,.list-group-item,.nav-link,.page-link{text-decoration:none}.nav-tabs .nav-link{border-radius:45px 15px 225px 5px/25px 225px 25px 255px}.breadcrumb{border:2px solid #333;border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.pagination .page-link{border-radius:425px 255px 25px 25px/25px 25px 5px 25px}.badge{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.badge-pill{border-radius:7rem 8rem 8rem 8rem/4rem 5rem 6rem 6rem}.badge.bg-light{color:#555}.alert{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.alert .btn-close::before{color:inherit}.progress{border:2px solid #333;border-radius:255px 25px 225px 25px/25px 225px 25px 255px}.card{border-radius:5px 5px 5px 5px/25px 25px 25px 5px}.card-outline-danger,.card-outline-info,.card-outline-primary,.card-outline-success,.card-outline-warning{border-width:2px}.card-header{border-color:inherit;border-bottom-width:2px}.card-header:first-child{border-radius:3px 3px 0 0/23px 23px 0 0}.card-footer{border-top-width:2px}.toast{border-radius:10px 10px 15px 5px/5px 15px 5px 15px}.toast-header{font-family:"Cabin Sketch",cursive}.modal-content{border-radius:15px 5px 5px 25px/5px 25px 25px 5px}.popover{padding:0;border-radius:45px 85px 15px 25px/15px 10px 35px 555px}.popover-title{border-bottom:2px solid #333}.popover.bs-popover-auto[data-popper-placement^=left]::before,.popover.bs-popover-start::before,.popover.bs-tether-element-attached-right::before{right:-13px}.popover.bs-popover-auto[data-popper-placement^=top]::before,.popover.bs-popover-top::before,.popover.bs-tether-element-attached-bottom::before{bottom:-13px}.popover.bs-popover-auto[data-popper-placement^=bottom]::before,.popover.bs-popover-bottom::before,.popover.bs-tether-element-attached-top::before{top:-13px}.popover.bs-popover-auto[data-popper-placement^=right]::before,.popover.bs-popover-end::before,.popover.bs-tether-element-attached-left::before{left:-13px}.tooltip-inner{border-radius:255px 25px 225px 25px/25px 225px 25px 255px}pre{border:2px solid #333;border-radius:15px 5px 5px 25px/5px 25px 25px 5px}.btn-close{background-image:none}.btn-close::before{position:absolute;top:.8rem;right:1rem;content:"X"}.img-thumbnail{border-radius:255px 25px 225px 25px/25px 225px 25px 255px} +/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.eot b/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..87eaa434234e2a984c261e0450a2f4ad837aa7b4 GIT binary patch literal 14079 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 literal 0 HcmV?d00001 diff --git a/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.svg b/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..5fee068 --- /dev/null +++ b/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.ttf b/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..be784dc1d5bcb92ab155f578f3723524a3dd9688 GIT binary patch literal 29512 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 DlhOCh literal 0 HcmV?d00001 diff --git a/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.woff b/lessons/lesson.12/static/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..2cc3e4852a5a42e6aadd6284e067b66e14a57bc7 GIT binary patch literal 16448 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�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 literal 0 HcmV?d00001 diff --git a/lessons/lesson.12/static/images/logo.png b/lessons/lesson.12/static/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..413b3fd703ed159d367101ce027d332e0e7f00d1 GIT binary patch literal 210139 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

xED-HZ6#l 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%0D688`QB`x! zy<{S$OJ%lMmZl#ISO1TI!&Oc}X)Q*J4NVYGlqAE~UZHx|A=)4K0P$!D-{K_8(}RQp zo^91pQqzXfY-i-wn=H=^lT0Qs7>&Z8{q4v9`upF$`JHU$03a0D+|4m9u57OBq_gb- z5^|iGr7^sLr8Rk=qNI)zSJnD=gT82pqJ$s_)RZ^tmAq*H z4RWugf2TI0ti91>*3~T0Xkhi3HF-3^=bhuu&DZcOPg2vgkM_gwqq4pOqshYZ{Hj@n zs;Nxhy~g770Cjth)7157CPssnRUU#4SswN;tuk{tZDrf)236J6TWjnO+V|By^5pxv zJ|?YtZDqAllMM!ON2s0v?|-iBw^~}#h>59otr;iQv>U)^u~Xi52&2t`noKZv`y3@r zU6eF+fsiL0cKWZTF?aKAM1v7Qlu%U#ITp^!yUJKdW*bI_i_qL?Zdq#>W<`$c@c3C{ zof*s2HNj}cx%&W#6*sY^Y5iTvaXpaVSU-`O5gjCH?fc5KM`Pvco0w~wur_xBkPQ0K zx6QbD4O^pIHx~132q<6JDGm=FeTwvy&VR;TgQj+_@Kt z`Ijl_e1Q5VKSJ%JKSt5s!e`NAFI*K)#A6%BPe@Z~O&jI)dl3W?5GZfx&@KBLIuJyWNXW;EXO={k z>L!^?pvZ9~qY=?yVrhDiNN9U%CV)gd!u&*E#)918s$kF2=eT}(>e6@q>FS@Y&F^<7 zd?}fB-Xs}}bnkhHsUUMcc5>?4$}1iHGrry~N}glF@|GXdw{xZ|ixJ$%-I|6cv^;yEIN9vXZ%%X(RWS zK`@%c(z+IV^V*GfCrpB5&?9Ijm1NF_lbt7hO#=e{MTYy%Fx+<gTKZ0#aAb{je1U6VIem!oi1?YRMype7S|&%TJIX%F_jhfzWS z67IRIy0Y4sXZ#Em^%OkzqX=dzN;rUJ&q4h#xmrc;d=)?m_=uc&5%b}bU@&rhB-$H{ zs`u>5x)XY@s2BiP@kM5T=eNH7OP~7eQ@``{^W8u8_ka1$|Fhzc2abMulu@eg-99uq~(s>-^Z{&s)pt+=epuHsT-bJwE`-+Y~DIORSk ziu#6=62a|+67dKly>HXfeUiI3-yjn75)J!Nk~*qiK}j_$o>|rwY_>U3RfSy#pJKfK z99D;meUE;Ki8~i`H?^$O8-U4br*+>+0^S7{CU4Vm`~_x5Ze#)$ZHHFetJBHmETW

3cU~{pr?F1IHjdM3&LSAEMVm4Z^ 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

WLoRmd$*)1aa-Ih-xIPI>AM`?cM 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 gpz;5!x4oTb(2M=x#?_pDdJypXD61k child.matches(selector)); + }, + + parents(element, selector) { + const parents = []; + let ancestor = element.parentNode; + + while (ancestor && ancestor.nodeType === Node.ELEMENT_NODE && ancestor.nodeType !== NODE_TEXT) { + if (ancestor.matches(selector)) { + parents.push(ancestor); + } + + ancestor = ancestor.parentNode; + } + + return parents; + }, + + prev(element, selector) { + let previous = element.previousElementSibling; + + while (previous) { + if (previous.matches(selector)) { + return [previous]; + } + + previous = previous.previousElementSibling; + } + + return []; + }, + + next(element, selector) { + let next = element.nextElementSibling; + + while (next) { + if (next.matches(selector)) { + return [next]; + } + + next = next.nextElementSibling; + } + + return []; + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): util/index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + const MAX_UID = 1000000; + const MILLISECONDS_MULTIPLIER = 1000; + const TRANSITION_END = 'transitionend'; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + const toType = obj => { + if (obj === null || obj === undefined) { + return `${obj}`; + } + + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + }; + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + const getUID = prefix => { + do { + prefix += Math.floor(Math.random() * MAX_UID); + } while (document.getElementById(prefix)); + + return prefix; + }; + + const getSelector = element => { + let selector = element.getAttribute('data-bs-target'); + + if (!selector || selector === '#') { + let hrefAttr = element.getAttribute('href'); // The only valid content that could double as a selector are IDs or classes, + // so everything starting with `#` or `.`. If a "real" URL is used as the selector, + // `document.querySelector` will rightfully complain it is invalid. + // See https://github.com/twbs/bootstrap/issues/32273 + + if (!hrefAttr || !hrefAttr.includes('#') && !hrefAttr.startsWith('.')) { + return null; + } // Just in case some CMS puts out a full URL with the anchor appended + + + if (hrefAttr.includes('#') && !hrefAttr.startsWith('#')) { + hrefAttr = `#${hrefAttr.split('#')[1]}`; + } + + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : null; + } + + return selector; + }; + + const getSelectorFromElement = element => { + const selector = getSelector(element); + + if (selector) { + return document.querySelector(selector) ? selector : null; + } + + return null; + }; + + const getElementFromSelector = element => { + const selector = getSelector(element); + return selector ? document.querySelector(selector) : null; + }; + + const getTransitionDurationFromElement = element => { + if (!element) { + return 0; + } // Get transition-duration of the element + + + let { + transitionDuration, + transitionDelay + } = window.getComputedStyle(element); + const floatTransitionDuration = Number.parseFloat(transitionDuration); + const floatTransitionDelay = Number.parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }; + + const triggerTransitionEnd = element => { + element.dispatchEvent(new Event(TRANSITION_END)); + }; + + const isElement = obj => { + if (!obj || typeof obj !== 'object') { + return false; + } + + if (typeof obj.jquery !== 'undefined') { + obj = obj[0]; + } + + return typeof obj.nodeType !== 'undefined'; + }; + + const getElement = obj => { + if (isElement(obj)) { + // it's a jQuery object or a node element + return obj.jquery ? obj[0] : obj; + } + + if (typeof obj === 'string' && obj.length > 0) { + return SelectorEngine.findOne(obj); + } + + return null; + }; + + const typeCheckConfig = (componentName, config, configTypes) => { + Object.keys(configTypes).forEach(property => { + const expectedTypes = configTypes[property]; + const value = config[property]; + const valueType = value && isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new TypeError(`${componentName.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`); + } + }); + }; + + const isVisible = element => { + if (!isElement(element) || element.getClientRects().length === 0) { + return false; + } + + return getComputedStyle(element).getPropertyValue('visibility') === 'visible'; + }; + + const isDisabled = element => { + if (!element || element.nodeType !== Node.ELEMENT_NODE) { + return true; + } + + if (element.classList.contains('disabled')) { + return true; + } + + if (typeof element.disabled !== 'undefined') { + return element.disabled; + } + + return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'; + }; + + const findShadowRoot = element => { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + const root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return findShadowRoot(element.parentNode); + }; + + const noop = () => {}; + + const reflow = element => element.offsetHeight; + + const getjQuery = () => { + const { + jQuery + } = window; + + if (jQuery && !document.body.hasAttribute('data-bs-no-jquery')) { + return jQuery; + } + + return null; + }; + + const DOMContentLoadedCallbacks = []; + + const onDOMContentLoaded = callback => { + if (document.readyState === 'loading') { + // add listener on the first call when the document is in loading state + if (!DOMContentLoadedCallbacks.length) { + document.addEventListener('DOMContentLoaded', () => { + DOMContentLoadedCallbacks.forEach(callback => callback()); + }); + } + + DOMContentLoadedCallbacks.push(callback); + } else { + callback(); + } + }; + + const isRTL = () => document.documentElement.dir === 'rtl'; + + const defineJQueryPlugin = plugin => { + onDOMContentLoaded(() => { + const $ = getjQuery(); + /* istanbul ignore if */ + + if ($) { + const name = plugin.NAME; + const JQUERY_NO_CONFLICT = $.fn[name]; + $.fn[name] = plugin.jQueryInterface; + $.fn[name].Constructor = plugin; + + $.fn[name].noConflict = () => { + $.fn[name] = JQUERY_NO_CONFLICT; + return plugin.jQueryInterface; + }; + } + }); + }; + + const execute = callback => { + if (typeof callback === 'function') { + callback(); + } + }; + + const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => { + if (!waitForTransition) { + execute(callback); + return; + } + + const durationPadding = 5; + const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding; + let called = false; + + const handler = ({ + target + }) => { + if (target !== transitionElement) { + return; + } + + called = true; + transitionElement.removeEventListener(TRANSITION_END, handler); + execute(callback); + }; + + transitionElement.addEventListener(TRANSITION_END, handler); + setTimeout(() => { + if (!called) { + triggerTransitionEnd(transitionElement); + } + }, emulatedDuration); + }; + /** + * Return the previous/next element of a list. + * + * @param {array} list The list of elements + * @param activeElement The active element + * @param shouldGetNext Choose to get next or previous element + * @param isCycleAllowed + * @return {Element|elem} The proper element + */ + + + const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => { + let index = list.indexOf(activeElement); // if the element does not exist in the list return an element depending on the direction and if cycle is allowed + + if (index === -1) { + return list[!shouldGetNext && isCycleAllowed ? list.length - 1 : 0]; + } + + const listLength = list.length; + index += shouldGetNext ? 1 : -1; + + if (isCycleAllowed) { + index = (index + listLength) % listLength; + } + + return list[Math.max(0, Math.min(index, listLength - 1))]; + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): dom/event-handler.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const namespaceRegex = /[^.]*(?=\..*)\.|.*/; + const stripNameRegex = /\..*/; + const stripUidRegex = /::\d+$/; + const eventRegistry = {}; // Events storage + + let uidEvent = 1; + const customEvents = { + mouseenter: 'mouseover', + mouseleave: 'mouseout' + }; + const customEventsRegex = /^(mouseenter|mouseleave)/i; + const nativeEvents = new Set(['click', 'dblclick', 'mouseup', 'mousedown', 'contextmenu', 'mousewheel', 'DOMMouseScroll', 'mouseover', 'mouseout', 'mousemove', 'selectstart', 'selectend', 'keydown', 'keypress', 'keyup', 'orientationchange', 'touchstart', 'touchmove', 'touchend', 'touchcancel', 'pointerdown', 'pointermove', 'pointerup', 'pointerleave', 'pointercancel', 'gesturestart', 'gesturechange', 'gestureend', 'focus', 'blur', 'change', 'reset', 'select', 'submit', 'focusin', 'focusout', 'load', 'unload', 'beforeunload', 'resize', 'move', 'DOMContentLoaded', 'readystatechange', 'error', 'abort', 'scroll']); + /** + * ------------------------------------------------------------------------ + * Private methods + * ------------------------------------------------------------------------ + */ + + function getUidEvent(element, uid) { + return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++; + } + + function getEvent(element) { + const uid = getUidEvent(element); + element.uidEvent = uid; + eventRegistry[uid] = eventRegistry[uid] || {}; + return eventRegistry[uid]; + } + + function bootstrapHandler(element, fn) { + return function handler(event) { + event.delegateTarget = element; + + if (handler.oneOff) { + EventHandler.off(element, event.type, fn); + } + + return fn.apply(element, [event]); + }; + } + + function bootstrapDelegationHandler(element, selector, fn) { + return function handler(event) { + const domElements = element.querySelectorAll(selector); + + for (let { + target + } = event; target && target !== this; target = target.parentNode) { + for (let i = domElements.length; i--;) { + if (domElements[i] === target) { + event.delegateTarget = target; + + if (handler.oneOff) { + // eslint-disable-next-line unicorn/consistent-destructuring + EventHandler.off(element, event.type, selector, fn); + } + + return fn.apply(target, [event]); + } + } + } // To please ESLint + + + return null; + }; + } + + function findHandler(events, handler, delegationSelector = null) { + const uidEventList = Object.keys(events); + + for (let i = 0, len = uidEventList.length; i < len; i++) { + const event = events[uidEventList[i]]; + + if (event.originalHandler === handler && event.delegationSelector === delegationSelector) { + return event; + } + } + + return null; + } + + function normalizeParams(originalTypeEvent, handler, delegationFn) { + const delegation = typeof handler === 'string'; + const originalHandler = delegation ? delegationFn : handler; + let typeEvent = getTypeEvent(originalTypeEvent); + const isNative = nativeEvents.has(typeEvent); + + if (!isNative) { + typeEvent = originalTypeEvent; + } + + return [delegation, originalHandler, typeEvent]; + } + + function addHandler(element, originalTypeEvent, handler, delegationFn, oneOff) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + + if (!handler) { + handler = delegationFn; + delegationFn = null; + } // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position + // this prevents the handler from being dispatched the same way as mouseover or mouseout does + + + if (customEventsRegex.test(originalTypeEvent)) { + const wrapFn = fn => { + return function (event) { + if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) { + return fn.call(this, event); + } + }; + }; + + if (delegationFn) { + delegationFn = wrapFn(delegationFn); + } else { + handler = wrapFn(handler); + } + } + + const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn); + const events = getEvent(element); + const handlers = events[typeEvent] || (events[typeEvent] = {}); + const previousFn = findHandler(handlers, originalHandler, delegation ? handler : null); + + if (previousFn) { + previousFn.oneOff = previousFn.oneOff && oneOff; + return; + } + + const uid = getUidEvent(originalHandler, originalTypeEvent.replace(namespaceRegex, '')); + const fn = delegation ? bootstrapDelegationHandler(element, handler, delegationFn) : bootstrapHandler(element, handler); + fn.delegationSelector = delegation ? handler : null; + fn.originalHandler = originalHandler; + fn.oneOff = oneOff; + fn.uidEvent = uid; + handlers[uid] = fn; + element.addEventListener(typeEvent, fn, delegation); + } + + function removeHandler(element, events, typeEvent, handler, delegationSelector) { + const fn = findHandler(events[typeEvent], handler, delegationSelector); + + if (!fn) { + return; + } + + element.removeEventListener(typeEvent, fn, Boolean(delegationSelector)); + delete events[typeEvent][fn.uidEvent]; + } + + function removeNamespacedHandlers(element, events, typeEvent, namespace) { + const storeElementEvent = events[typeEvent] || {}; + Object.keys(storeElementEvent).forEach(handlerKey => { + if (handlerKey.includes(namespace)) { + const event = storeElementEvent[handlerKey]; + removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); + } + }); + } + + function getTypeEvent(event) { + // allow to get the native events from namespaced events ('click.bs.button' --> 'click') + event = event.replace(stripNameRegex, ''); + return customEvents[event] || event; + } + + const EventHandler = { + on(element, event, handler, delegationFn) { + addHandler(element, event, handler, delegationFn, false); + }, + + one(element, event, handler, delegationFn) { + addHandler(element, event, handler, delegationFn, true); + }, + + off(element, originalTypeEvent, handler, delegationFn) { + if (typeof originalTypeEvent !== 'string' || !element) { + return; + } + + const [delegation, originalHandler, typeEvent] = normalizeParams(originalTypeEvent, handler, delegationFn); + const inNamespace = typeEvent !== originalTypeEvent; + const events = getEvent(element); + const isNamespace = originalTypeEvent.startsWith('.'); + + if (typeof originalHandler !== 'undefined') { + // Simplest case: handler is passed, remove that listener ONLY. + if (!events || !events[typeEvent]) { + return; + } + + removeHandler(element, events, typeEvent, originalHandler, delegation ? handler : null); + return; + } + + if (isNamespace) { + Object.keys(events).forEach(elementEvent => { + removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1)); + }); + } + + const storeElementEvent = events[typeEvent] || {}; + Object.keys(storeElementEvent).forEach(keyHandlers => { + const handlerKey = keyHandlers.replace(stripUidRegex, ''); + + if (!inNamespace || originalTypeEvent.includes(handlerKey)) { + const event = storeElementEvent[keyHandlers]; + removeHandler(element, events, typeEvent, event.originalHandler, event.delegationSelector); + } + }); + }, + + trigger(element, event, args) { + if (typeof event !== 'string' || !element) { + return null; + } + + const $ = getjQuery(); + const typeEvent = getTypeEvent(event); + const inNamespace = event !== typeEvent; + const isNative = nativeEvents.has(typeEvent); + let jQueryEvent; + let bubbles = true; + let nativeDispatch = true; + let defaultPrevented = false; + let evt = null; + + if (inNamespace && $) { + jQueryEvent = $.Event(event, args); + $(element).trigger(jQueryEvent); + bubbles = !jQueryEvent.isPropagationStopped(); + nativeDispatch = !jQueryEvent.isImmediatePropagationStopped(); + defaultPrevented = jQueryEvent.isDefaultPrevented(); + } + + if (isNative) { + evt = document.createEvent('HTMLEvents'); + evt.initEvent(typeEvent, bubbles, true); + } else { + evt = new CustomEvent(event, { + bubbles, + cancelable: true + }); + } // merge custom information in our event + + + if (typeof args !== 'undefined') { + Object.keys(args).forEach(key => { + Object.defineProperty(evt, key, { + get() { + return args[key]; + } + + }); + }); + } + + if (defaultPrevented) { + evt.preventDefault(); + } + + if (nativeDispatch) { + element.dispatchEvent(evt); + } + + if (evt.defaultPrevented && typeof jQueryEvent !== 'undefined') { + jQueryEvent.preventDefault(); + } + + return evt; + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): dom/data.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + const elementMap = new Map(); + var Data = { + set(element, key, instance) { + if (!elementMap.has(element)) { + elementMap.set(element, new Map()); + } + + const instanceMap = elementMap.get(element); // make it clear we only want one instance per element + // can be removed later when multiple key/instances are fine to be used + + if (!instanceMap.has(key) && instanceMap.size !== 0) { + // eslint-disable-next-line no-console + console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`); + return; + } + + instanceMap.set(key, instance); + }, + + get(element, key) { + if (elementMap.has(element)) { + return elementMap.get(element).get(key) || null; + } + + return null; + }, + + remove(element, key) { + if (!elementMap.has(element)) { + return; + } + + const instanceMap = elementMap.get(element); + instanceMap.delete(key); // free up element references if there are no instances left for an element + + if (instanceMap.size === 0) { + elementMap.delete(element); + } + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): base-component.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const VERSION = '5.0.2'; + + class BaseComponent { + constructor(element) { + element = getElement(element); + + if (!element) { + return; + } + + this._element = element; + Data.set(this._element, this.constructor.DATA_KEY, this); + } + + dispose() { + Data.remove(this._element, this.constructor.DATA_KEY); + EventHandler.off(this._element, this.constructor.EVENT_KEY); + Object.getOwnPropertyNames(this).forEach(propertyName => { + this[propertyName] = null; + }); + } + + _queueCallback(callback, element, isAnimated = true) { + executeAfterTransition(callback, element, isAnimated); + } + /** Static */ + + + static getInstance(element) { + return Data.get(element, this.DATA_KEY); + } + + static getOrCreateInstance(element, config = {}) { + return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null); + } + + static get VERSION() { + return VERSION; + } + + static get NAME() { + throw new Error('You have to implement the static method "NAME", for each component!'); + } + + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): alert.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$c = 'alert'; + const DATA_KEY$b = 'bs.alert'; + const EVENT_KEY$b = `.${DATA_KEY$b}`; + const DATA_API_KEY$8 = '.data-api'; + const SELECTOR_DISMISS = '[data-bs-dismiss="alert"]'; + const EVENT_CLOSE = `close${EVENT_KEY$b}`; + const EVENT_CLOSED = `closed${EVENT_KEY$b}`; + const EVENT_CLICK_DATA_API$7 = `click${EVENT_KEY$b}${DATA_API_KEY$8}`; + const CLASS_NAME_ALERT = 'alert'; + const CLASS_NAME_FADE$6 = 'fade'; + const CLASS_NAME_SHOW$9 = 'show'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Alert extends BaseComponent { + // Getters + static get NAME() { + return NAME$c; + } // Public + + + close(element) { + const rootElement = element ? this._getRootElement(element) : this._element; + + const customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent === null || customEvent.defaultPrevented) { + return; + } + + this._removeElement(rootElement); + } // Private + + + _getRootElement(element) { + return getElementFromSelector(element) || element.closest(`.${CLASS_NAME_ALERT}`); + } + + _triggerCloseEvent(element) { + return EventHandler.trigger(element, EVENT_CLOSE); + } + + _removeElement(element) { + element.classList.remove(CLASS_NAME_SHOW$9); + const isAnimated = element.classList.contains(CLASS_NAME_FADE$6); + + this._queueCallback(() => this._destroyElement(element), element, isAnimated); + } + + _destroyElement(element) { + element.remove(); + EventHandler.trigger(element, EVENT_CLOSED); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Alert.getOrCreateInstance(this); + + if (config === 'close') { + data[config](this); + } + }); + } + + static handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$7, SELECTOR_DISMISS, Alert.handleDismiss(new Alert())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Alert to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Alert); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): button.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$b = 'button'; + const DATA_KEY$a = 'bs.button'; + const EVENT_KEY$a = `.${DATA_KEY$a}`; + const DATA_API_KEY$7 = '.data-api'; + const CLASS_NAME_ACTIVE$3 = 'active'; + const SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]'; + const EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$7}`; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Button extends BaseComponent { + // Getters + static get NAME() { + return NAME$b; + } // Public + + + toggle() { + // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method + this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE$3)); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Button.getOrCreateInstance(this); + + if (config === 'toggle') { + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, event => { + event.preventDefault(); + const button = event.target.closest(SELECTOR_DATA_TOGGLE$5); + const data = Button.getOrCreateInstance(button); + data.toggle(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Button to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Button); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): dom/manipulator.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + function normalizeData(val) { + if (val === 'true') { + return true; + } + + if (val === 'false') { + return false; + } + + if (val === Number(val).toString()) { + return Number(val); + } + + if (val === '' || val === 'null') { + return null; + } + + return val; + } + + function normalizeDataKey(key) { + return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`); + } + + const Manipulator = { + setDataAttribute(element, key, value) { + element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value); + }, + + removeDataAttribute(element, key) { + element.removeAttribute(`data-bs-${normalizeDataKey(key)}`); + }, + + getDataAttributes(element) { + if (!element) { + return {}; + } + + const attributes = {}; + Object.keys(element.dataset).filter(key => key.startsWith('bs')).forEach(key => { + let pureKey = key.replace(/^bs/, ''); + pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length); + attributes[pureKey] = normalizeData(element.dataset[key]); + }); + return attributes; + }, + + getDataAttribute(element, key) { + return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`)); + }, + + offset(element) { + const rect = element.getBoundingClientRect(); + return { + top: rect.top + document.body.scrollTop, + left: rect.left + document.body.scrollLeft + }; + }, + + position(element) { + return { + top: element.offsetTop, + left: element.offsetLeft + }; + } + + }; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): carousel.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$a = 'carousel'; + const DATA_KEY$9 = 'bs.carousel'; + const EVENT_KEY$9 = `.${DATA_KEY$9}`; + const DATA_API_KEY$6 = '.data-api'; + const ARROW_LEFT_KEY = 'ArrowLeft'; + const ARROW_RIGHT_KEY = 'ArrowRight'; + const TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + const SWIPE_THRESHOLD = 40; + const Default$9 = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + const DefaultType$9 = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + const ORDER_NEXT = 'next'; + const ORDER_PREV = 'prev'; + const DIRECTION_LEFT = 'left'; + const DIRECTION_RIGHT = 'right'; + const KEY_TO_DIRECTION = { + [ARROW_LEFT_KEY]: DIRECTION_RIGHT, + [ARROW_RIGHT_KEY]: DIRECTION_LEFT + }; + const EVENT_SLIDE = `slide${EVENT_KEY$9}`; + const EVENT_SLID = `slid${EVENT_KEY$9}`; + const EVENT_KEYDOWN = `keydown${EVENT_KEY$9}`; + const EVENT_MOUSEENTER = `mouseenter${EVENT_KEY$9}`; + const EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY$9}`; + const EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`; + const EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`; + const EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`; + const EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`; + const EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`; + const EVENT_DRAG_START = `dragstart${EVENT_KEY$9}`; + const EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$9}${DATA_API_KEY$6}`; + const EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$9}${DATA_API_KEY$6}`; + const CLASS_NAME_CAROUSEL = 'carousel'; + const CLASS_NAME_ACTIVE$2 = 'active'; + const CLASS_NAME_SLIDE = 'slide'; + const CLASS_NAME_END = 'carousel-item-end'; + const CLASS_NAME_START = 'carousel-item-start'; + const CLASS_NAME_NEXT = 'carousel-item-next'; + const CLASS_NAME_PREV = 'carousel-item-prev'; + const CLASS_NAME_POINTER_EVENT = 'pointer-event'; + const SELECTOR_ACTIVE$1 = '.active'; + const SELECTOR_ACTIVE_ITEM = '.active.carousel-item'; + const SELECTOR_ITEM = '.carousel-item'; + const SELECTOR_ITEM_IMG = '.carousel-item img'; + const SELECTOR_NEXT_PREV = '.carousel-item-next, .carousel-item-prev'; + const SELECTOR_INDICATORS = '.carousel-indicators'; + const SELECTOR_INDICATOR = '[data-bs-target]'; + const SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'; + const SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]'; + const POINTER_TYPE_TOUCH = 'touch'; + const POINTER_TYPE_PEN = 'pen'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Carousel extends BaseComponent { + constructor(element, config) { + super(element); + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent); + + this._addEventListeners(); + } // Getters + + + static get Default() { + return Default$9; + } + + static get NAME() { + return NAME$a; + } // Public + + + next() { + this._slide(ORDER_NEXT); + } + + nextWhenVisible() { + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && isVisible(this._element)) { + this.next(); + } + } + + prev() { + this._slide(ORDER_PREV); + } + + pause(event) { + if (!event) { + this._isPaused = true; + } + + if (SelectorEngine.findOne(SELECTOR_NEXT_PREV, this._element)) { + triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + } + + cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config && this._config.interval && !this._isPaused) { + this._updateInterval(); + + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + } + + to(index) { + this._activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + const activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.to(index)); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV; + + this._slide(order, this._items[index]); + } // Private + + + _getConfig(config) { + config = { ...Default$9, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$a, config, DefaultType$9); + return config; + } + + _handleSwipe() { + const absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + const direction = absDeltax / this.touchDeltaX; + this.touchDeltaX = 0; + + if (!direction) { + return; + } + + this._slide(direction > 0 ? DIRECTION_RIGHT : DIRECTION_LEFT); + } + + _addEventListeners() { + if (this._config.keyboard) { + EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event)); + } + + if (this._config.pause === 'hover') { + EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event)); + EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event)); + } + + if (this._config.touch && this._touchSupported) { + this._addTouchEventListeners(); + } + } + + _addTouchEventListeners() { + const start = event => { + if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) { + this.touchStartX = event.clientX; + } else if (!this._pointerEvent) { + this.touchStartX = event.touches[0].clientX; + } + }; + + const move = event => { + // ensure swiping with one touch and not pinching + this.touchDeltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this.touchStartX; + }; + + const end = event => { + if (this._pointerEvent && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)) { + this.touchDeltaX = event.clientX - this.touchStartX; + } + + this._handleSwipe(); + + if (this._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + this.pause(); + + if (this.touchTimeout) { + clearTimeout(this.touchTimeout); + } + + this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval); + } + }; + + SelectorEngine.find(SELECTOR_ITEM_IMG, this._element).forEach(itemImg => { + EventHandler.on(itemImg, EVENT_DRAG_START, e => e.preventDefault()); + }); + + if (this._pointerEvent) { + EventHandler.on(this._element, EVENT_POINTERDOWN, event => start(event)); + EventHandler.on(this._element, EVENT_POINTERUP, event => end(event)); + + this._element.classList.add(CLASS_NAME_POINTER_EVENT); + } else { + EventHandler.on(this._element, EVENT_TOUCHSTART, event => start(event)); + EventHandler.on(this._element, EVENT_TOUCHMOVE, event => move(event)); + EventHandler.on(this._element, EVENT_TOUCHEND, event => end(event)); + } + } + + _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + const direction = KEY_TO_DIRECTION[event.key]; + + if (direction) { + event.preventDefault(); + + this._slide(direction); + } + } + + _getItemIndex(element) { + this._items = element && element.parentNode ? SelectorEngine.find(SELECTOR_ITEM, element.parentNode) : []; + return this._items.indexOf(element); + } + + _getItemByOrder(order, activeElement) { + const isNext = order === ORDER_NEXT; + return getNextActiveElement(this._items, activeElement, isNext, this._config.wrap); + } + + _triggerSlideEvent(relatedTarget, eventDirectionName) { + const targetIndex = this._getItemIndex(relatedTarget); + + const fromIndex = this._getItemIndex(SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)); + + return EventHandler.trigger(this._element, EVENT_SLIDE, { + relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + } + + _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE$1, this._indicatorsElement); + activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2); + activeIndicator.removeAttribute('aria-current'); + const indicators = SelectorEngine.find(SELECTOR_INDICATOR, this._indicatorsElement); + + for (let i = 0; i < indicators.length; i++) { + if (Number.parseInt(indicators[i].getAttribute('data-bs-slide-to'), 10) === this._getItemIndex(element)) { + indicators[i].classList.add(CLASS_NAME_ACTIVE$2); + indicators[i].setAttribute('aria-current', 'true'); + break; + } + } + } + } + + _updateInterval() { + const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + if (!element) { + return; + } + + const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10); + + if (elementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = elementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + } + + _slide(directionOrOrder, element) { + const order = this._directionToOrder(directionOrOrder); + + const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element); + + const activeElementIndex = this._getItemIndex(activeElement); + + const nextElement = element || this._getItemByOrder(order, activeElement); + + const nextElementIndex = this._getItemIndex(nextElement); + + const isCycling = Boolean(this._interval); + const isNext = order === ORDER_NEXT; + const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END; + const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV; + + const eventDirectionName = this._orderToDirection(order); + + if (nextElement && nextElement.classList.contains(CLASS_NAME_ACTIVE$2)) { + this._isSliding = false; + return; + } + + if (this._isSliding) { + return; + } + + const slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.defaultPrevented) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + this._activeElement = nextElement; + + const triggerSlidEvent = () => { + EventHandler.trigger(this._element, EVENT_SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + }; + + if (this._element.classList.contains(CLASS_NAME_SLIDE)) { + nextElement.classList.add(orderClassName); + reflow(nextElement); + activeElement.classList.add(directionalClassName); + nextElement.classList.add(directionalClassName); + + const completeCallBack = () => { + nextElement.classList.remove(directionalClassName, orderClassName); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName); + this._isSliding = false; + setTimeout(triggerSlidEvent, 0); + }; + + this._queueCallback(completeCallBack, activeElement, true); + } else { + activeElement.classList.remove(CLASS_NAME_ACTIVE$2); + nextElement.classList.add(CLASS_NAME_ACTIVE$2); + this._isSliding = false; + triggerSlidEvent(); + } + + if (isCycling) { + this.cycle(); + } + } + + _directionToOrder(direction) { + if (![DIRECTION_RIGHT, DIRECTION_LEFT].includes(direction)) { + return direction; + } + + if (isRTL()) { + return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT; + } + + return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV; + } + + _orderToDirection(order) { + if (![ORDER_NEXT, ORDER_PREV].includes(order)) { + return order; + } + + if (isRTL()) { + return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT; + } + + return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT; + } // Static + + + static carouselInterface(element, config) { + const data = Carousel.getOrCreateInstance(element, config); + let { + _config + } = data; + + if (typeof config === 'object') { + _config = { ..._config, + ...config + }; + } + + const action = typeof config === 'string' ? config : _config.slide; + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError(`No method named "${action}"`); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + } + + static jQueryInterface(config) { + return this.each(function () { + Carousel.carouselInterface(this, config); + }); + } + + static dataApiClickHandler(event) { + const target = getElementFromSelector(this); + + if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) { + return; + } + + const config = { ...Manipulator.getDataAttributes(target), + ...Manipulator.getDataAttributes(this) + }; + const slideIndex = this.getAttribute('data-bs-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel.carouselInterface(target, config); + + if (slideIndex) { + Carousel.getInstance(target).to(slideIndex); + } + + event.preventDefault(); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, Carousel.dataApiClickHandler); + EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => { + const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE); + + for (let i = 0, len = carousels.length; i < len; i++) { + Carousel.carouselInterface(carousels[i], Carousel.getInstance(carousels[i])); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Carousel to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Carousel); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): collapse.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$9 = 'collapse'; + const DATA_KEY$8 = 'bs.collapse'; + const EVENT_KEY$8 = `.${DATA_KEY$8}`; + const DATA_API_KEY$5 = '.data-api'; + const Default$8 = { + toggle: true, + parent: '' + }; + const DefaultType$8 = { + toggle: 'boolean', + parent: '(string|element)' + }; + const EVENT_SHOW$5 = `show${EVENT_KEY$8}`; + const EVENT_SHOWN$5 = `shown${EVENT_KEY$8}`; + const EVENT_HIDE$5 = `hide${EVENT_KEY$8}`; + const EVENT_HIDDEN$5 = `hidden${EVENT_KEY$8}`; + const EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`; + const CLASS_NAME_SHOW$8 = 'show'; + const CLASS_NAME_COLLAPSE = 'collapse'; + const CLASS_NAME_COLLAPSING = 'collapsing'; + const CLASS_NAME_COLLAPSED = 'collapsed'; + const WIDTH = 'width'; + const HEIGHT = 'height'; + const SELECTOR_ACTIVES = '.show, .collapsing'; + const SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Collapse extends BaseComponent { + constructor(element, config) { + super(element); + this._isTransitioning = false; + this._config = this._getConfig(config); + this._triggerArray = SelectorEngine.find(`${SELECTOR_DATA_TOGGLE$4}[href="#${this._element.id}"],` + `${SELECTOR_DATA_TOGGLE$4}[data-bs-target="#${this._element.id}"]`); + const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4); + + for (let i = 0, len = toggleList.length; i < len; i++) { + const elem = toggleList[i]; + const selector = getSelectorFromElement(elem); + const filterElement = SelectorEngine.find(selector).filter(foundElem => foundElem === this._element); + + if (selector !== null && filterElement.length) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._parent = this._config.parent ? this._getParent() : null; + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._element, this._triggerArray); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + static get Default() { + return Default$8; + } + + static get NAME() { + return NAME$9; + } // Public + + + toggle() { + if (this._element.classList.contains(CLASS_NAME_SHOW$8)) { + this.hide(); + } else { + this.show(); + } + } + + show() { + if (this._isTransitioning || this._element.classList.contains(CLASS_NAME_SHOW$8)) { + return; + } + + let actives; + let activesData; + + if (this._parent) { + actives = SelectorEngine.find(SELECTOR_ACTIVES, this._parent).filter(elem => { + if (typeof this._config.parent === 'string') { + return elem.getAttribute('data-bs-parent') === this._config.parent; + } + + return elem.classList.contains(CLASS_NAME_COLLAPSE); + }); + + if (actives.length === 0) { + actives = null; + } + } + + const container = SelectorEngine.findOne(this._selector); + + if (actives) { + const tempActiveData = actives.find(elem => container !== elem); + activesData = tempActiveData ? Collapse.getInstance(tempActiveData) : null; + + if (activesData && activesData._isTransitioning) { + return; + } + } + + const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$5); + + if (startEvent.defaultPrevented) { + return; + } + + if (actives) { + actives.forEach(elemActive => { + if (container !== elemActive) { + Collapse.collapseInterface(elemActive, 'hide'); + } + + if (!activesData) { + Data.set(elemActive, DATA_KEY$8, null); + } + }); + } + + const dimension = this._getDimension(); + + this._element.classList.remove(CLASS_NAME_COLLAPSE); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.style[dimension] = 0; + + if (this._triggerArray.length) { + this._triggerArray.forEach(element => { + element.classList.remove(CLASS_NAME_COLLAPSED); + element.setAttribute('aria-expanded', true); + }); + } + + this.setTransitioning(true); + + const complete = () => { + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8); + + this._element.style[dimension] = ''; + this.setTransitioning(false); + EventHandler.trigger(this._element, EVENT_SHOWN$5); + }; + + const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + const scrollSize = `scroll${capitalizedDimension}`; + + this._queueCallback(complete, this._element, true); + + this._element.style[dimension] = `${this._element[scrollSize]}px`; + } + + hide() { + if (this._isTransitioning || !this._element.classList.contains(CLASS_NAME_SHOW$8)) { + return; + } + + const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$5); + + if (startEvent.defaultPrevented) { + return; + } + + const dimension = this._getDimension(); + + this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`; + reflow(this._element); + + this._element.classList.add(CLASS_NAME_COLLAPSING); + + this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$8); + + const triggerArrayLength = this._triggerArray.length; + + if (triggerArrayLength > 0) { + for (let i = 0; i < triggerArrayLength; i++) { + const trigger = this._triggerArray[i]; + const elem = getElementFromSelector(trigger); + + if (elem && !elem.classList.contains(CLASS_NAME_SHOW$8)) { + trigger.classList.add(CLASS_NAME_COLLAPSED); + trigger.setAttribute('aria-expanded', false); + } + } + } + + this.setTransitioning(true); + + const complete = () => { + this.setTransitioning(false); + + this._element.classList.remove(CLASS_NAME_COLLAPSING); + + this._element.classList.add(CLASS_NAME_COLLAPSE); + + EventHandler.trigger(this._element, EVENT_HIDDEN$5); + }; + + this._element.style[dimension] = ''; + + this._queueCallback(complete, this._element, true); + } + + setTransitioning(isTransitioning) { + this._isTransitioning = isTransitioning; + } // Private + + + _getConfig(config) { + config = { ...Default$8, + ...config + }; + config.toggle = Boolean(config.toggle); // Coerce string values + + typeCheckConfig(NAME$9, config, DefaultType$8); + return config; + } + + _getDimension() { + return this._element.classList.contains(WIDTH) ? WIDTH : HEIGHT; + } + + _getParent() { + let { + parent + } = this._config; + parent = getElement(parent); + const selector = `${SELECTOR_DATA_TOGGLE$4}[data-bs-parent="${parent}"]`; + SelectorEngine.find(selector, parent).forEach(element => { + const selected = getElementFromSelector(element); + + this._addAriaAndCollapsedClass(selected, [element]); + }); + return parent; + } + + _addAriaAndCollapsedClass(element, triggerArray) { + if (!element || !triggerArray.length) { + return; + } + + const isOpen = element.classList.contains(CLASS_NAME_SHOW$8); + triggerArray.forEach(elem => { + if (isOpen) { + elem.classList.remove(CLASS_NAME_COLLAPSED); + } else { + elem.classList.add(CLASS_NAME_COLLAPSED); + } + + elem.setAttribute('aria-expanded', isOpen); + }); + } // Static + + + static collapseInterface(element, config) { + let data = Collapse.getInstance(element); + const _config = { ...Default$8, + ...Manipulator.getDataAttributes(element), + ...(typeof config === 'object' && config ? config : {}) + }; + + if (!data && _config.toggle && typeof config === 'string' && /show|hide/.test(config)) { + _config.toggle = false; + } + + if (!data) { + data = new Collapse(element, _config); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + } + + static jQueryInterface(config) { + return this.each(function () { + Collapse.collapseInterface(this, config); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function (event) { + // preventDefault only for elements (which change the URL) not inside the collapsible element + if (event.target.tagName === 'A' || event.delegateTarget && event.delegateTarget.tagName === 'A') { + event.preventDefault(); + } + + const triggerData = Manipulator.getDataAttributes(this); + const selector = getSelectorFromElement(this); + const selectorElements = SelectorEngine.find(selector); + selectorElements.forEach(element => { + const data = Collapse.getInstance(element); + let config; + + if (data) { + // update parent attribute + if (data._parent === null && typeof triggerData.parent === 'string') { + data._config.parent = triggerData.parent; + data._parent = data._getParent(); + } + + config = 'toggle'; + } else { + config = triggerData; + } + + Collapse.collapseInterface(element, config); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Collapse to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Collapse); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): dropdown.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$8 = 'dropdown'; + const DATA_KEY$7 = 'bs.dropdown'; + const EVENT_KEY$7 = `.${DATA_KEY$7}`; + const DATA_API_KEY$4 = '.data-api'; + const ESCAPE_KEY$2 = 'Escape'; + const SPACE_KEY = 'Space'; + const TAB_KEY = 'Tab'; + const ARROW_UP_KEY = 'ArrowUp'; + const ARROW_DOWN_KEY = 'ArrowDown'; + const RIGHT_MOUSE_BUTTON = 2; // MouseEvent.button value for the secondary button, usually the right button + + const REGEXP_KEYDOWN = new RegExp(`${ARROW_UP_KEY}|${ARROW_DOWN_KEY}|${ESCAPE_KEY$2}`); + const EVENT_HIDE$4 = `hide${EVENT_KEY$7}`; + const EVENT_HIDDEN$4 = `hidden${EVENT_KEY$7}`; + const EVENT_SHOW$4 = `show${EVENT_KEY$7}`; + const EVENT_SHOWN$4 = `shown${EVENT_KEY$7}`; + const EVENT_CLICK = `click${EVENT_KEY$7}`; + const EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`; + const EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$7}${DATA_API_KEY$4}`; + const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$7}${DATA_API_KEY$4}`; + const CLASS_NAME_SHOW$7 = 'show'; + const CLASS_NAME_DROPUP = 'dropup'; + const CLASS_NAME_DROPEND = 'dropend'; + const CLASS_NAME_DROPSTART = 'dropstart'; + const CLASS_NAME_NAVBAR = 'navbar'; + const SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]'; + const SELECTOR_MENU = '.dropdown-menu'; + const SELECTOR_NAVBAR_NAV = '.navbar-nav'; + const SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'; + const PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'; + const PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'; + const PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'; + const PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'; + const PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'; + const PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'; + const Default$7 = { + offset: [0, 2], + boundary: 'clippingParents', + reference: 'toggle', + display: 'dynamic', + popperConfig: null, + autoClose: true + }; + const DefaultType$7 = { + offset: '(array|string|function)', + boundary: '(string|element)', + reference: '(string|element|object)', + display: 'string', + popperConfig: '(null|object|function)', + autoClose: '(boolean|string)' + }; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Dropdown extends BaseComponent { + constructor(element, config) { + super(element); + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + + this._addEventListeners(); + } // Getters + + + static get Default() { + return Default$7; + } + + static get DefaultType() { + return DefaultType$7; + } + + static get NAME() { + return NAME$8; + } // Public + + + toggle() { + if (isDisabled(this._element)) { + return; + } + + const isActive = this._element.classList.contains(CLASS_NAME_SHOW$7); + + if (isActive) { + this.hide(); + return; + } + + this.show(); + } + + show() { + if (isDisabled(this._element) || this._menu.classList.contains(CLASS_NAME_SHOW$7)) { + return; + } + + const parent = Dropdown.getParentFromElement(this._element); + const relatedTarget = { + relatedTarget: this._element + }; + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, relatedTarget); + + if (showEvent.defaultPrevented) { + return; + } // Totally disable Popper for Dropdowns in Navbar + + + if (this._inNavbar) { + Manipulator.setDataAttribute(this._menu, 'popper', 'none'); + } else { + if (typeof Popper__namespace === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper (https://popper.js.org)'); + } + + let referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (isElement(this._config.reference)) { + referenceElement = getElement(this._config.reference); + } else if (typeof this._config.reference === 'object') { + referenceElement = this._config.reference; + } + + const popperConfig = this._getPopperConfig(); + + const isDisplayStatic = popperConfig.modifiers.find(modifier => modifier.name === 'applyStyles' && modifier.enabled === false); + this._popper = Popper__namespace.createPopper(referenceElement, this._menu, popperConfig); + + if (isDisplayStatic) { + Manipulator.setDataAttribute(this._menu, 'popper', 'static'); + } + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && !parent.closest(SELECTOR_NAVBAR_NAV)) { + [].concat(...document.body.children).forEach(elem => EventHandler.on(elem, 'mouseover', noop)); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + this._menu.classList.toggle(CLASS_NAME_SHOW$7); + + this._element.classList.toggle(CLASS_NAME_SHOW$7); + + EventHandler.trigger(this._element, EVENT_SHOWN$4, relatedTarget); + } + + hide() { + if (isDisabled(this._element) || !this._menu.classList.contains(CLASS_NAME_SHOW$7)) { + return; + } + + const relatedTarget = { + relatedTarget: this._element + }; + + this._completeHide(relatedTarget); + } + + dispose() { + if (this._popper) { + this._popper.destroy(); + } + + super.dispose(); + } + + update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper) { + this._popper.update(); + } + } // Private + + + _addEventListeners() { + EventHandler.on(this._element, EVENT_CLICK, event => { + event.preventDefault(); + this.toggle(); + }); + } + + _completeHide(relatedTarget) { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4, relatedTarget); + + if (hideEvent.defaultPrevented) { + return; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(elem => EventHandler.off(elem, 'mouseover', noop)); + } + + if (this._popper) { + this._popper.destroy(); + } + + this._menu.classList.remove(CLASS_NAME_SHOW$7); + + this._element.classList.remove(CLASS_NAME_SHOW$7); + + this._element.setAttribute('aria-expanded', 'false'); + + Manipulator.removeDataAttribute(this._menu, 'popper'); + EventHandler.trigger(this._element, EVENT_HIDDEN$4, relatedTarget); + } + + _getConfig(config) { + config = { ...this.constructor.Default, + ...Manipulator.getDataAttributes(this._element), + ...config + }; + typeCheckConfig(NAME$8, config, this.constructor.DefaultType); + + if (typeof config.reference === 'object' && !isElement(config.reference) && typeof config.reference.getBoundingClientRect !== 'function') { + // Popper virtual elements require a getBoundingClientRect method + throw new TypeError(`${NAME$8.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`); + } + + return config; + } + + _getMenuElement() { + return SelectorEngine.next(this._element, SELECTOR_MENU)[0]; + } + + _getPlacement() { + const parentDropdown = this._element.parentNode; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) { + return PLACEMENT_RIGHT; + } + + if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) { + return PLACEMENT_LEFT; + } // We need to trim the value because custom properties can also include spaces + + + const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'; + + if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) { + return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP; + } + + return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM; + } + + _detectNavbar() { + return this._element.closest(`.${CLASS_NAME_NAVBAR}`) !== null; + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(val => Number.parseInt(val, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _getPopperConfig() { + const defaultBsPopperConfig = { + placement: this._getPlacement(), + modifiers: [{ + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }] + }; // Disable Popper if we have a static display + + if (this._config.display === 'static') { + defaultBsPopperConfig.modifiers = [{ + name: 'applyStyles', + enabled: false + }]; + } + + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _selectMenuItem({ + key, + target + }) { + const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(isVisible); + + if (!items.length) { + return; + } // if target isn't included in items (e.g. when expanding the dropdown) + // allow cycling to get the last item in case key equals ARROW_UP_KEY + + + getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus(); + } // Static + + + static dropdownInterface(element, config) { + const data = Dropdown.getOrCreateInstance(element, config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + } + + static jQueryInterface(config) { + return this.each(function () { + Dropdown.dropdownInterface(this, config); + }); + } + + static clearMenus(event) { + if (event && (event.button === RIGHT_MOUSE_BUTTON || event.type === 'keyup' && event.key !== TAB_KEY)) { + return; + } + + const toggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE$3); + + for (let i = 0, len = toggles.length; i < len; i++) { + const context = Dropdown.getInstance(toggles[i]); + + if (!context || context._config.autoClose === false) { + continue; + } + + if (!context._element.classList.contains(CLASS_NAME_SHOW$7)) { + continue; + } + + const relatedTarget = { + relatedTarget: context._element + }; + + if (event) { + const composedPath = event.composedPath(); + const isMenuTarget = composedPath.includes(context._menu); + + if (composedPath.includes(context._element) || context._config.autoClose === 'inside' && !isMenuTarget || context._config.autoClose === 'outside' && isMenuTarget) { + continue; + } // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu + + + if (context._menu.contains(event.target) && (event.type === 'keyup' && event.key === TAB_KEY || /input|select|option|textarea|form/i.test(event.target.tagName))) { + continue; + } + + if (event.type === 'click') { + relatedTarget.clickEvent = event; + } + } + + context._completeHide(relatedTarget); + } + } + + static getParentFromElement(element) { + return getElementFromSelector(element) || element.parentNode; + } + + static dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.key === SPACE_KEY || event.key !== ESCAPE_KEY$2 && (event.key !== ARROW_DOWN_KEY && event.key !== ARROW_UP_KEY || event.target.closest(SELECTOR_MENU)) : !REGEXP_KEYDOWN.test(event.key)) { + return; + } + + const isActive = this.classList.contains(CLASS_NAME_SHOW$7); + + if (!isActive && event.key === ESCAPE_KEY$2) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (isDisabled(this)) { + return; + } + + const getToggleButton = () => this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0]; + + if (event.key === ESCAPE_KEY$2) { + getToggleButton().focus(); + Dropdown.clearMenus(); + return; + } + + if (event.key === ARROW_UP_KEY || event.key === ARROW_DOWN_KEY) { + if (!isActive) { + getToggleButton().click(); + } + + Dropdown.getInstance(getToggleButton())._selectMenuItem(event); + + return; + } + + if (!isActive || event.key === SPACE_KEY) { + Dropdown.clearMenus(); + } + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus); + EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus); + EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function (event) { + event.preventDefault(); + Dropdown.dropdownInterface(this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Dropdown to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Dropdown); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): util/scrollBar.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'; + const SELECTOR_STICKY_CONTENT = '.sticky-top'; + + class ScrollBarHelper { + constructor() { + this._element = document.body; + } + + getWidth() { + // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes + const documentWidth = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - documentWidth); + } + + hide() { + const width = this.getWidth(); + + this._disableOverFlow(); // give padding to element to balance the hidden scrollbar width + + + this._setElementAttributes(this._element, 'paddingRight', calculatedValue => calculatedValue + width); // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth + + + this._setElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight', calculatedValue => calculatedValue + width); + + this._setElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight', calculatedValue => calculatedValue - width); + } + + _disableOverFlow() { + this._saveInitialAttribute(this._element, 'overflow'); + + this._element.style.overflow = 'hidden'; + } + + _setElementAttributes(selector, styleProp, callback) { + const scrollbarWidth = this.getWidth(); + + const manipulationCallBack = element => { + if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) { + return; + } + + this._saveInitialAttribute(element, styleProp); + + const calculatedValue = window.getComputedStyle(element)[styleProp]; + element.style[styleProp] = `${callback(Number.parseFloat(calculatedValue))}px`; + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + reset() { + this._resetElementAttributes(this._element, 'overflow'); + + this._resetElementAttributes(this._element, 'paddingRight'); + + this._resetElementAttributes(SELECTOR_FIXED_CONTENT, 'paddingRight'); + + this._resetElementAttributes(SELECTOR_STICKY_CONTENT, 'marginRight'); + } + + _saveInitialAttribute(element, styleProp) { + const actualValue = element.style[styleProp]; + + if (actualValue) { + Manipulator.setDataAttribute(element, styleProp, actualValue); + } + } + + _resetElementAttributes(selector, styleProp) { + const manipulationCallBack = element => { + const value = Manipulator.getDataAttribute(element, styleProp); + + if (typeof value === 'undefined') { + element.style.removeProperty(styleProp); + } else { + Manipulator.removeDataAttribute(element, styleProp); + element.style[styleProp] = value; + } + }; + + this._applyManipulationCallback(selector, manipulationCallBack); + } + + _applyManipulationCallback(selector, callBack) { + if (isElement(selector)) { + callBack(selector); + } else { + SelectorEngine.find(selector, this._element).forEach(callBack); + } + } + + isOverflowing() { + return this.getWidth() > 0; + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): util/backdrop.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + const Default$6 = { + isVisible: true, + // if false, we use the backdrop helper without adding any element to the dom + isAnimated: false, + rootElement: 'body', + // give the choice to place backdrop under different elements + clickCallback: null + }; + const DefaultType$6 = { + isVisible: 'boolean', + isAnimated: 'boolean', + rootElement: '(element|string)', + clickCallback: '(function|null)' + }; + const NAME$7 = 'backdrop'; + const CLASS_NAME_BACKDROP = 'modal-backdrop'; + const CLASS_NAME_FADE$5 = 'fade'; + const CLASS_NAME_SHOW$6 = 'show'; + const EVENT_MOUSEDOWN = `mousedown.bs.${NAME$7}`; + + class Backdrop { + constructor(config) { + this._config = this._getConfig(config); + this._isAppended = false; + this._element = null; + } + + show(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._append(); + + if (this._config.isAnimated) { + reflow(this._getElement()); + } + + this._getElement().classList.add(CLASS_NAME_SHOW$6); + + this._emulateAnimation(() => { + execute(callback); + }); + } + + hide(callback) { + if (!this._config.isVisible) { + execute(callback); + return; + } + + this._getElement().classList.remove(CLASS_NAME_SHOW$6); + + this._emulateAnimation(() => { + this.dispose(); + execute(callback); + }); + } // Private + + + _getElement() { + if (!this._element) { + const backdrop = document.createElement('div'); + backdrop.className = CLASS_NAME_BACKDROP; + + if (this._config.isAnimated) { + backdrop.classList.add(CLASS_NAME_FADE$5); + } + + this._element = backdrop; + } + + return this._element; + } + + _getConfig(config) { + config = { ...Default$6, + ...(typeof config === 'object' ? config : {}) + }; // use getElement() with the default "body" to get a fresh Element on each instantiation + + config.rootElement = getElement(config.rootElement); + typeCheckConfig(NAME$7, config, DefaultType$6); + return config; + } + + _append() { + if (this._isAppended) { + return; + } + + this._config.rootElement.appendChild(this._getElement()); + + EventHandler.on(this._getElement(), EVENT_MOUSEDOWN, () => { + execute(this._config.clickCallback); + }); + this._isAppended = true; + } + + dispose() { + if (!this._isAppended) { + return; + } + + EventHandler.off(this._element, EVENT_MOUSEDOWN); + + this._element.remove(); + + this._isAppended = false; + } + + _emulateAnimation(callback) { + executeAfterTransition(callback, this._getElement(), this._config.isAnimated); + } + + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): modal.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$6 = 'modal'; + const DATA_KEY$6 = 'bs.modal'; + const EVENT_KEY$6 = `.${DATA_KEY$6}`; + const DATA_API_KEY$3 = '.data-api'; + const ESCAPE_KEY$1 = 'Escape'; + const Default$5 = { + backdrop: true, + keyboard: true, + focus: true + }; + const DefaultType$5 = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean' + }; + const EVENT_HIDE$3 = `hide${EVENT_KEY$6}`; + const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$6}`; + const EVENT_HIDDEN$3 = `hidden${EVENT_KEY$6}`; + const EVENT_SHOW$3 = `show${EVENT_KEY$6}`; + const EVENT_SHOWN$3 = `shown${EVENT_KEY$6}`; + const EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$6}`; + const EVENT_RESIZE = `resize${EVENT_KEY$6}`; + const EVENT_CLICK_DISMISS$2 = `click.dismiss${EVENT_KEY$6}`; + const EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$6}`; + const EVENT_MOUSEUP_DISMISS = `mouseup.dismiss${EVENT_KEY$6}`; + const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$6}`; + const EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`; + const CLASS_NAME_OPEN = 'modal-open'; + const CLASS_NAME_FADE$4 = 'fade'; + const CLASS_NAME_SHOW$5 = 'show'; + const CLASS_NAME_STATIC = 'modal-static'; + const SELECTOR_DIALOG = '.modal-dialog'; + const SELECTOR_MODAL_BODY = '.modal-body'; + const SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]'; + const SELECTOR_DATA_DISMISS$2 = '[data-bs-dismiss="modal"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Modal extends BaseComponent { + constructor(element, config) { + super(element); + this._config = this._getConfig(config); + this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element); + this._backdrop = this._initializeBackDrop(); + this._isShown = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollBar = new ScrollBarHelper(); + } // Getters + + + static get Default() { + return Default$5; + } + + static get NAME() { + return NAME$6; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown || this._isTransitioning) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + + if (this._isAnimated()) { + this._isTransitioning = true; + } + + this._scrollBar.hide(); + + document.body.classList.add(CLASS_NAME_OPEN); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, SELECTOR_DATA_DISMISS$2, event => this.hide(event)); + EventHandler.on(this._dialog, EVENT_MOUSEDOWN_DISMISS, () => { + EventHandler.one(this._element, EVENT_MOUSEUP_DISMISS, event => { + if (event.target === this._element) { + this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(() => this._showElement(relatedTarget)); + } + + hide(event) { + if (event && ['A', 'AREA'].includes(event.target.tagName)) { + event.preventDefault(); + } + + if (!this._isShown || this._isTransitioning) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3); + + if (hideEvent.defaultPrevented) { + return; + } + + this._isShown = false; + + const isAnimated = this._isAnimated(); + + if (isAnimated) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + EventHandler.off(document, EVENT_FOCUSIN$2); + + this._element.classList.remove(CLASS_NAME_SHOW$5); + + EventHandler.off(this._element, EVENT_CLICK_DISMISS$2); + EventHandler.off(this._dialog, EVENT_MOUSEDOWN_DISMISS); + + this._queueCallback(() => this._hideModal(), this._element, isAnimated); + } + + dispose() { + [window, this._dialog].forEach(htmlElement => EventHandler.off(htmlElement, EVENT_KEY$6)); + + this._backdrop.dispose(); + + super.dispose(); + /** + * `document` has 2 events `EVENT_FOCUSIN` and `EVENT_CLICK_DATA_API` + * Do not move `document` in `htmlElements` array + * It will remove `EVENT_CLICK_DATA_API` event that should remain + */ + + EventHandler.off(document, EVENT_FOCUSIN$2); + } + + handleUpdate() { + this._adjustDialog(); + } // Private + + + _initializeBackDrop() { + return new Backdrop({ + isVisible: Boolean(this._config.backdrop), + // 'static' option will be translated to true, and booleans will keep their value + isAnimated: this._isAnimated() + }); + } + + _getConfig(config) { + config = { ...Default$5, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$6, config, DefaultType$5); + return config; + } + + _showElement(relatedTarget) { + const isAnimated = this._isAnimated(); + + const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog); + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.scrollTop = 0; + + if (modalBody) { + modalBody.scrollTop = 0; + } + + if (isAnimated) { + reflow(this._element); + } + + this._element.classList.add(CLASS_NAME_SHOW$5); + + if (this._config.focus) { + this._enforceFocus(); + } + + const transitionComplete = () => { + if (this._config.focus) { + this._element.focus(); + } + + this._isTransitioning = false; + EventHandler.trigger(this._element, EVENT_SHOWN$3, { + relatedTarget + }); + }; + + this._queueCallback(transitionComplete, this._dialog, isAnimated); + } + + _enforceFocus() { + EventHandler.off(document, EVENT_FOCUSIN$2); // guard against infinite focus loop + + EventHandler.on(document, EVENT_FOCUSIN$2, event => { + if (document !== event.target && this._element !== event.target && !this._element.contains(event.target)) { + this._element.focus(); + } + }); + } + + _setEscapeEvent() { + if (this._isShown) { + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, event => { + if (this._config.keyboard && event.key === ESCAPE_KEY$1) { + event.preventDefault(); + this.hide(); + } else if (!this._config.keyboard && event.key === ESCAPE_KEY$1) { + this._triggerBackdropTransition(); + } + }); + } else { + EventHandler.off(this._element, EVENT_KEYDOWN_DISMISS$1); + } + } + + _setResizeEvent() { + if (this._isShown) { + EventHandler.on(window, EVENT_RESIZE, () => this._adjustDialog()); + } else { + EventHandler.off(window, EVENT_RESIZE); + } + } + + _hideModal() { + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._isTransitioning = false; + + this._backdrop.hide(() => { + document.body.classList.remove(CLASS_NAME_OPEN); + + this._resetAdjustments(); + + this._scrollBar.reset(); + + EventHandler.trigger(this._element, EVENT_HIDDEN$3); + }); + } + + _showBackdrop(callback) { + EventHandler.on(this._element, EVENT_CLICK_DISMISS$2, event => { + if (this._ignoreBackdropClick) { + this._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + if (this._config.backdrop === true) { + this.hide(); + } else if (this._config.backdrop === 'static') { + this._triggerBackdropTransition(); + } + }); + + this._backdrop.show(callback); + } + + _isAnimated() { + return this._element.classList.contains(CLASS_NAME_FADE$4); + } + + _triggerBackdropTransition() { + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED); + + if (hideEvent.defaultPrevented) { + return; + } + + const { + classList, + scrollHeight, + style + } = this._element; + const isModalOverflowing = scrollHeight > document.documentElement.clientHeight; // return if the following background transition hasn't yet completed + + if (!isModalOverflowing && style.overflowY === 'hidden' || classList.contains(CLASS_NAME_STATIC)) { + return; + } + + if (!isModalOverflowing) { + style.overflowY = 'hidden'; + } + + classList.add(CLASS_NAME_STATIC); + + this._queueCallback(() => { + classList.remove(CLASS_NAME_STATIC); + + if (!isModalOverflowing) { + this._queueCallback(() => { + style.overflowY = ''; + }, this._dialog); + } + }, this._dialog); + + this._element.focus(); + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // ---------------------------------------------------------------------- + + + _adjustDialog() { + const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + const scrollbarWidth = this._scrollBar.getWidth(); + + const isBodyOverflowing = scrollbarWidth > 0; + + if (!isBodyOverflowing && isModalOverflowing && !isRTL() || isBodyOverflowing && !isModalOverflowing && isRTL()) { + this._element.style.paddingLeft = `${scrollbarWidth}px`; + } + + if (isBodyOverflowing && !isModalOverflowing && !isRTL() || !isBodyOverflowing && isModalOverflowing && isRTL()) { + this._element.style.paddingRight = `${scrollbarWidth}px`; + } + } + + _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + } // Static + + + static jQueryInterface(config, relatedTarget) { + return this.each(function () { + const data = Modal.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](relatedTarget); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + EventHandler.one(target, EVENT_SHOW$3, showEvent => { + if (showEvent.defaultPrevented) { + // only register focus restorer if modal will actually get shown + return; + } + + EventHandler.one(target, EVENT_HIDDEN$3, () => { + if (isVisible(this)) { + this.focus(); + } + }); + }); + const data = Modal.getOrCreateInstance(target); + data.toggle(this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Modal to jQuery only if jQuery is present + */ + + defineJQueryPlugin(Modal); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): offcanvas.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$5 = 'offcanvas'; + const DATA_KEY$5 = 'bs.offcanvas'; + const EVENT_KEY$5 = `.${DATA_KEY$5}`; + const DATA_API_KEY$2 = '.data-api'; + const EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$5}${DATA_API_KEY$2}`; + const ESCAPE_KEY = 'Escape'; + const Default$4 = { + backdrop: true, + keyboard: true, + scroll: false + }; + const DefaultType$4 = { + backdrop: 'boolean', + keyboard: 'boolean', + scroll: 'boolean' + }; + const CLASS_NAME_SHOW$4 = 'show'; + const OPEN_SELECTOR = '.offcanvas.show'; + const EVENT_SHOW$2 = `show${EVENT_KEY$5}`; + const EVENT_SHOWN$2 = `shown${EVENT_KEY$5}`; + const EVENT_HIDE$2 = `hide${EVENT_KEY$5}`; + const EVENT_HIDDEN$2 = `hidden${EVENT_KEY$5}`; + const EVENT_FOCUSIN$1 = `focusin${EVENT_KEY$5}`; + const EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$5}${DATA_API_KEY$2}`; + const EVENT_CLICK_DISMISS$1 = `click.dismiss${EVENT_KEY$5}`; + const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$5}`; + const SELECTOR_DATA_DISMISS$1 = '[data-bs-dismiss="offcanvas"]'; + const SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Offcanvas extends BaseComponent { + constructor(element, config) { + super(element); + this._config = this._getConfig(config); + this._isShown = false; + this._backdrop = this._initializeBackDrop(); + + this._addEventListeners(); + } // Getters + + + static get NAME() { + return NAME$5; + } + + static get Default() { + return Default$4; + } // Public + + + toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + } + + show(relatedTarget) { + if (this._isShown) { + return; + } + + const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$2, { + relatedTarget + }); + + if (showEvent.defaultPrevented) { + return; + } + + this._isShown = true; + this._element.style.visibility = 'visible'; + + this._backdrop.show(); + + if (!this._config.scroll) { + new ScrollBarHelper().hide(); + + this._enforceFocusOnElement(this._element); + } + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + this._element.setAttribute('role', 'dialog'); + + this._element.classList.add(CLASS_NAME_SHOW$4); + + const completeCallBack = () => { + EventHandler.trigger(this._element, EVENT_SHOWN$2, { + relatedTarget + }); + }; + + this._queueCallback(completeCallBack, this._element, true); + } + + hide() { + if (!this._isShown) { + return; + } + + const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$2); + + if (hideEvent.defaultPrevented) { + return; + } + + EventHandler.off(document, EVENT_FOCUSIN$1); + + this._element.blur(); + + this._isShown = false; + + this._element.classList.remove(CLASS_NAME_SHOW$4); + + this._backdrop.hide(); + + const completeCallback = () => { + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._element.removeAttribute('role'); + + this._element.style.visibility = 'hidden'; + + if (!this._config.scroll) { + new ScrollBarHelper().reset(); + } + + EventHandler.trigger(this._element, EVENT_HIDDEN$2); + }; + + this._queueCallback(completeCallback, this._element, true); + } + + dispose() { + this._backdrop.dispose(); + + super.dispose(); + EventHandler.off(document, EVENT_FOCUSIN$1); + } // Private + + + _getConfig(config) { + config = { ...Default$4, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' ? config : {}) + }; + typeCheckConfig(NAME$5, config, DefaultType$4); + return config; + } + + _initializeBackDrop() { + return new Backdrop({ + isVisible: this._config.backdrop, + isAnimated: true, + rootElement: this._element.parentNode, + clickCallback: () => this.hide() + }); + } + + _enforceFocusOnElement(element) { + EventHandler.off(document, EVENT_FOCUSIN$1); // guard against infinite focus loop + + EventHandler.on(document, EVENT_FOCUSIN$1, event => { + if (document !== event.target && element !== event.target && !element.contains(event.target)) { + element.focus(); + } + }); + element.focus(); + } + + _addEventListeners() { + EventHandler.on(this._element, EVENT_CLICK_DISMISS$1, SELECTOR_DATA_DISMISS$1, () => this.hide()); + EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => { + if (this._config.keyboard && event.key === ESCAPE_KEY) { + this.hide(); + } + }); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Offcanvas.getOrCreateInstance(this, config); + + if (typeof config !== 'string') { + return; + } + + if (data[config] === undefined || config.startsWith('_') || config === 'constructor') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](this); + }); + } + + } + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function (event) { + const target = getElementFromSelector(this); + + if (['A', 'AREA'].includes(this.tagName)) { + event.preventDefault(); + } + + if (isDisabled(this)) { + return; + } + + EventHandler.one(target, EVENT_HIDDEN$2, () => { + // focus on trigger when it is closed + if (isVisible(this)) { + this.focus(); + } + }); // avoid conflict when clicking a toggler of an offcanvas, while another is open + + const allReadyOpen = SelectorEngine.findOne(OPEN_SELECTOR); + + if (allReadyOpen && allReadyOpen !== target) { + Offcanvas.getInstance(allReadyOpen).hide(); + } + + const data = Offcanvas.getOrCreateInstance(target); + data.toggle(this); + }); + EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => SelectorEngine.find(OPEN_SELECTOR).forEach(el => Offcanvas.getOrCreateInstance(el).show())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + defineJQueryPlugin(Offcanvas); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): util/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + const uriAttrs = new Set(['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']); + const ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + const SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^#&/:?]*(?:[#/?]|$))/i; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + const DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i; + + const allowedAttribute = (attr, allowedAttributeList) => { + const attrName = attr.nodeName.toLowerCase(); + + if (allowedAttributeList.includes(attrName)) { + if (uriAttrs.has(attrName)) { + return Boolean(SAFE_URL_PATTERN.test(attr.nodeValue) || DATA_URL_PATTERN.test(attr.nodeValue)); + } + + return true; + } + + const regExp = allowedAttributeList.filter(attrRegex => attrRegex instanceof RegExp); // Check if a regular expression validates the attribute. + + for (let i = 0, len = regExp.length; i < len; i++) { + if (regExp[i].test(attrName)) { + return true; + } + } + + return false; + }; + + const DefaultAllowlist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + }; + function sanitizeHtml(unsafeHtml, allowList, sanitizeFn) { + if (!unsafeHtml.length) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + const domParser = new window.DOMParser(); + const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + const allowlistKeys = Object.keys(allowList); + const elements = [].concat(...createdDocument.body.querySelectorAll('*')); + + for (let i = 0, len = elements.length; i < len; i++) { + const el = elements[i]; + const elName = el.nodeName.toLowerCase(); + + if (!allowlistKeys.includes(elName)) { + el.remove(); + continue; + } + + const attributeList = [].concat(...el.attributes); + const allowedAttributes = [].concat(allowList['*'] || [], allowList[elName] || []); + attributeList.forEach(attr => { + if (!allowedAttribute(attr, allowedAttributes)) { + el.removeAttribute(attr.nodeName); + } + }); + } + + return createdDocument.body.innerHTML; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): tooltip.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$4 = 'tooltip'; + const DATA_KEY$4 = 'bs.tooltip'; + const EVENT_KEY$4 = `.${DATA_KEY$4}`; + const CLASS_PREFIX$1 = 'bs-tooltip'; + const BSCLS_PREFIX_REGEX$1 = new RegExp(`(^|\\s)${CLASS_PREFIX$1}\\S+`, 'g'); + const DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn']); + const DefaultType$3 = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(array|string|function)', + container: '(string|element|boolean)', + fallbackPlacements: 'array', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + allowList: 'object', + popperConfig: '(null|object|function)' + }; + const AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: isRTL() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: isRTL() ? 'right' : 'left' + }; + const Default$3 = { + animation: true, + template: '

', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: [0, 0], + container: false, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + boundary: 'clippingParents', + customClass: '', + sanitize: true, + sanitizeFn: null, + allowList: DefaultAllowlist, + popperConfig: null + }; + const Event$2 = { + HIDE: `hide${EVENT_KEY$4}`, + HIDDEN: `hidden${EVENT_KEY$4}`, + SHOW: `show${EVENT_KEY$4}`, + SHOWN: `shown${EVENT_KEY$4}`, + INSERTED: `inserted${EVENT_KEY$4}`, + CLICK: `click${EVENT_KEY$4}`, + FOCUSIN: `focusin${EVENT_KEY$4}`, + FOCUSOUT: `focusout${EVENT_KEY$4}`, + MOUSEENTER: `mouseenter${EVENT_KEY$4}`, + MOUSELEAVE: `mouseleave${EVENT_KEY$4}` + }; + const CLASS_NAME_FADE$3 = 'fade'; + const CLASS_NAME_MODAL = 'modal'; + const CLASS_NAME_SHOW$3 = 'show'; + const HOVER_STATE_SHOW = 'show'; + const HOVER_STATE_OUT = 'out'; + const SELECTOR_TOOLTIP_INNER = '.tooltip-inner'; + const TRIGGER_HOVER = 'hover'; + const TRIGGER_FOCUS = 'focus'; + const TRIGGER_CLICK = 'click'; + const TRIGGER_MANUAL = 'manual'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Tooltip extends BaseComponent { + constructor(element, config) { + if (typeof Popper__namespace === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper (https://popper.js.org)'); + } + + super(element); // private + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this._config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + static get Default() { + return Default$3; + } + + static get NAME() { + return NAME$4; + } + + static get Event() { + return Event$2; + } + + static get DefaultType() { + return DefaultType$3; + } // Public + + + enable() { + this._isEnabled = true; + } + + disable() { + this._isEnabled = false; + } + + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + + toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + const context = this._initializeOnDelegatedTarget(event); + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if (this.getTipElement().classList.contains(CLASS_NAME_SHOW$3)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + } + + dispose() { + clearTimeout(this._timeout); + EventHandler.off(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler); + + if (this.tip) { + this.tip.remove(); + } + + if (this._popper) { + this._popper.destroy(); + } + + super.dispose(); + } + + show() { + if (this._element.style.display === 'none') { + throw new Error('Please use show on visible elements'); + } + + if (!(this.isWithContent() && this._isEnabled)) { + return; + } + + const showEvent = EventHandler.trigger(this._element, this.constructor.Event.SHOW); + const shadowRoot = findShadowRoot(this._element); + const isInTheDom = shadowRoot === null ? this._element.ownerDocument.documentElement.contains(this._element) : shadowRoot.contains(this._element); + + if (showEvent.defaultPrevented || !isInTheDom) { + return; + } + + const tip = this.getTipElement(); + const tipId = getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + + this._element.setAttribute('aria-describedby', tipId); + + this.setContent(); + + if (this._config.animation) { + tip.classList.add(CLASS_NAME_FADE$3); + } + + const placement = typeof this._config.placement === 'function' ? this._config.placement.call(this, tip, this._element) : this._config.placement; + + const attachment = this._getAttachment(placement); + + this._addAttachmentClass(attachment); + + const { + container + } = this._config; + Data.set(tip, this.constructor.DATA_KEY, this); + + if (!this._element.ownerDocument.documentElement.contains(this.tip)) { + container.appendChild(tip); + EventHandler.trigger(this._element, this.constructor.Event.INSERTED); + } + + if (this._popper) { + this._popper.update(); + } else { + this._popper = Popper__namespace.createPopper(this._element, tip, this._getPopperConfig(attachment)); + } + + tip.classList.add(CLASS_NAME_SHOW$3); + const customClass = typeof this._config.customClass === 'function' ? this._config.customClass() : this._config.customClass; + + if (customClass) { + tip.classList.add(...customClass.split(' ')); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(element => { + EventHandler.on(element, 'mouseover', noop); + }); + } + + const complete = () => { + const prevHoverState = this._hoverState; + this._hoverState = null; + EventHandler.trigger(this._element, this.constructor.Event.SHOWN); + + if (prevHoverState === HOVER_STATE_OUT) { + this._leave(null, this); + } + }; + + const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3); + + this._queueCallback(complete, this.tip, isAnimated); + } + + hide() { + if (!this._popper) { + return; + } + + const tip = this.getTipElement(); + + const complete = () => { + if (this._isWithActiveTrigger()) { + return; + } + + if (this._hoverState !== HOVER_STATE_SHOW) { + tip.remove(); + } + + this._cleanTipClass(); + + this._element.removeAttribute('aria-describedby'); + + EventHandler.trigger(this._element, this.constructor.Event.HIDDEN); + + if (this._popper) { + this._popper.destroy(); + + this._popper = null; + } + }; + + const hideEvent = EventHandler.trigger(this._element, this.constructor.Event.HIDE); + + if (hideEvent.defaultPrevented) { + return; + } + + tip.classList.remove(CLASS_NAME_SHOW$3); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + [].concat(...document.body.children).forEach(element => EventHandler.off(element, 'mouseover', noop)); + } + + this._activeTrigger[TRIGGER_CLICK] = false; + this._activeTrigger[TRIGGER_FOCUS] = false; + this._activeTrigger[TRIGGER_HOVER] = false; + const isAnimated = this.tip.classList.contains(CLASS_NAME_FADE$3); + + this._queueCallback(complete, this.tip, isAnimated); + + this._hoverState = ''; + } + + update() { + if (this._popper !== null) { + this._popper.update(); + } + } // Protected + + + isWithContent() { + return Boolean(this.getTitle()); + } + + getTipElement() { + if (this.tip) { + return this.tip; + } + + const element = document.createElement('div'); + element.innerHTML = this._config.template; + this.tip = element.children[0]; + return this.tip; + } + + setContent() { + const tip = this.getTipElement(); + this.setElementContent(SelectorEngine.findOne(SELECTOR_TOOLTIP_INNER, tip), this.getTitle()); + tip.classList.remove(CLASS_NAME_FADE$3, CLASS_NAME_SHOW$3); + } + + setElementContent(element, content) { + if (element === null) { + return; + } + + if (isElement(content)) { + content = getElement(content); // content is a DOM node or a jQuery + + if (this._config.html) { + if (content.parentNode !== element) { + element.innerHTML = ''; + element.appendChild(content); + } + } else { + element.textContent = content.textContent; + } + + return; + } + + if (this._config.html) { + if (this._config.sanitize) { + content = sanitizeHtml(content, this._config.allowList, this._config.sanitizeFn); + } + + element.innerHTML = content; + } else { + element.textContent = content; + } + } + + getTitle() { + let title = this._element.getAttribute('data-bs-original-title'); + + if (!title) { + title = typeof this._config.title === 'function' ? this._config.title.call(this._element) : this._config.title; + } + + return title; + } + + updateAttachment(attachment) { + if (attachment === 'right') { + return 'end'; + } + + if (attachment === 'left') { + return 'start'; + } + + return attachment; + } // Private + + + _initializeOnDelegatedTarget(event, context) { + const dataKey = this.constructor.DATA_KEY; + context = context || Data.get(event.delegateTarget, dataKey); + + if (!context) { + context = new this.constructor(event.delegateTarget, this._getDelegateConfig()); + Data.set(event.delegateTarget, dataKey, context); + } + + return context; + } + + _getOffset() { + const { + offset + } = this._config; + + if (typeof offset === 'string') { + return offset.split(',').map(val => Number.parseInt(val, 10)); + } + + if (typeof offset === 'function') { + return popperData => offset(popperData, this._element); + } + + return offset; + } + + _getPopperConfig(attachment) { + const defaultBsPopperConfig = { + placement: attachment, + modifiers: [{ + name: 'flip', + options: { + fallbackPlacements: this._config.fallbackPlacements + } + }, { + name: 'offset', + options: { + offset: this._getOffset() + } + }, { + name: 'preventOverflow', + options: { + boundary: this._config.boundary + } + }, { + name: 'arrow', + options: { + element: `.${this.constructor.NAME}-arrow` + } + }, { + name: 'onChange', + enabled: true, + phase: 'afterWrite', + fn: data => this._handlePopperPlacementChange(data) + }], + onFirstUpdate: data => { + if (data.options.placement !== data.placement) { + this._handlePopperPlacementChange(data); + } + } + }; + return { ...defaultBsPopperConfig, + ...(typeof this._config.popperConfig === 'function' ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig) + }; + } + + _addAttachmentClass(attachment) { + this.getTipElement().classList.add(`${CLASS_PREFIX$1}-${this.updateAttachment(attachment)}`); + } + + _getAttachment(placement) { + return AttachmentMap[placement.toUpperCase()]; + } + + _setListeners() { + const triggers = this._config.trigger.split(' '); + + triggers.forEach(trigger => { + if (trigger === 'click') { + EventHandler.on(this._element, this.constructor.Event.CLICK, this._config.selector, event => this.toggle(event)); + } else if (trigger !== TRIGGER_MANUAL) { + const eventIn = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSEENTER : this.constructor.Event.FOCUSIN; + const eventOut = trigger === TRIGGER_HOVER ? this.constructor.Event.MOUSELEAVE : this.constructor.Event.FOCUSOUT; + EventHandler.on(this._element, eventIn, this._config.selector, event => this._enter(event)); + EventHandler.on(this._element, eventOut, this._config.selector, event => this._leave(event)); + } + }); + + this._hideModalHandler = () => { + if (this._element) { + this.hide(); + } + }; + + EventHandler.on(this._element.closest(`.${CLASS_NAME_MODAL}`), 'hide.bs.modal', this._hideModalHandler); + + if (this._config.selector) { + this._config = { ...this._config, + trigger: 'manual', + selector: '' + }; + } else { + this._fixTitle(); + } + } + + _fixTitle() { + const title = this._element.getAttribute('title'); + + const originalTitleType = typeof this._element.getAttribute('data-bs-original-title'); + + if (title || originalTitleType !== 'string') { + this._element.setAttribute('data-bs-original-title', title || ''); + + if (title && !this._element.getAttribute('aria-label') && !this._element.textContent) { + this._element.setAttribute('aria-label', title); + } + + this._element.setAttribute('title', ''); + } + } + + _enter(event, context) { + context = this._initializeOnDelegatedTarget(event, context); + + if (event) { + context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true; + } + + if (context.getTipElement().classList.contains(CLASS_NAME_SHOW$3) || context._hoverState === HOVER_STATE_SHOW) { + context._hoverState = HOVER_STATE_SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_SHOW; + + if (!context._config.delay || !context._config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(() => { + if (context._hoverState === HOVER_STATE_SHOW) { + context.show(); + } + }, context._config.delay.show); + } + + _leave(event, context) { + context = this._initializeOnDelegatedTarget(event, context); + + if (event) { + context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget); + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HOVER_STATE_OUT; + + if (!context._config.delay || !context._config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(() => { + if (context._hoverState === HOVER_STATE_OUT) { + context.hide(); + } + }, context._config.delay.hide); + } + + _isWithActiveTrigger() { + for (const trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + } + + _getConfig(config) { + const dataAttributes = Manipulator.getDataAttributes(this._element); + Object.keys(dataAttributes).forEach(dataAttr => { + if (DISALLOWED_ATTRIBUTES.has(dataAttr)) { + delete dataAttributes[dataAttr]; + } + }); + config = { ...this.constructor.Default, + ...dataAttributes, + ...(typeof config === 'object' && config ? config : {}) + }; + config.container = config.container === false ? document.body : getElement(config.container); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + typeCheckConfig(NAME$4, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.allowList, config.sanitizeFn); + } + + return config; + } + + _getDelegateConfig() { + const config = {}; + + if (this._config) { + for (const key in this._config) { + if (this.constructor.Default[key] !== this._config[key]) { + config[key] = this._config[key]; + } + } + } + + return config; + } + + _cleanTipClass() { + const tip = this.getTipElement(); + const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX$1); + + if (tabClass !== null && tabClass.length > 0) { + tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass)); + } + } + + _handlePopperPlacementChange(popperData) { + const { + state + } = popperData; + + if (!state) { + return; + } + + this.tip = state.elements.popper; + + this._cleanTipClass(); + + this._addAttachmentClass(this._getAttachment(state.placement)); + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Tooltip.getOrCreateInstance(this, config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Tooltip to jQuery only if jQuery is present + */ + + + defineJQueryPlugin(Tooltip); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): popover.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$3 = 'popover'; + const DATA_KEY$3 = 'bs.popover'; + const EVENT_KEY$3 = `.${DATA_KEY$3}`; + const CLASS_PREFIX = 'bs-popover'; + const BSCLS_PREFIX_REGEX = new RegExp(`(^|\\s)${CLASS_PREFIX}\\S+`, 'g'); + const Default$2 = { ...Tooltip.Default, + placement: 'right', + offset: [0, 8], + trigger: 'click', + content: '', + template: '' + }; + const DefaultType$2 = { ...Tooltip.DefaultType, + content: '(string|element|function)' + }; + const Event$1 = { + HIDE: `hide${EVENT_KEY$3}`, + HIDDEN: `hidden${EVENT_KEY$3}`, + SHOW: `show${EVENT_KEY$3}`, + SHOWN: `shown${EVENT_KEY$3}`, + INSERTED: `inserted${EVENT_KEY$3}`, + CLICK: `click${EVENT_KEY$3}`, + FOCUSIN: `focusin${EVENT_KEY$3}`, + FOCUSOUT: `focusout${EVENT_KEY$3}`, + MOUSEENTER: `mouseenter${EVENT_KEY$3}`, + MOUSELEAVE: `mouseleave${EVENT_KEY$3}` + }; + const CLASS_NAME_FADE$2 = 'fade'; + const CLASS_NAME_SHOW$2 = 'show'; + const SELECTOR_TITLE = '.popover-header'; + const SELECTOR_CONTENT = '.popover-body'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class Popover extends Tooltip { + // Getters + static get Default() { + return Default$2; + } + + static get NAME() { + return NAME$3; + } + + static get Event() { + return Event$1; + } + + static get DefaultType() { + return DefaultType$2; + } // Overrides + + + isWithContent() { + return this.getTitle() || this._getContent(); + } + + getTipElement() { + if (this.tip) { + return this.tip; + } + + this.tip = super.getTipElement(); + + if (!this.getTitle()) { + SelectorEngine.findOne(SELECTOR_TITLE, this.tip).remove(); + } + + if (!this._getContent()) { + SelectorEngine.findOne(SELECTOR_CONTENT, this.tip).remove(); + } + + return this.tip; + } + + setContent() { + const tip = this.getTipElement(); // we use append for html objects to maintain js events + + this.setElementContent(SelectorEngine.findOne(SELECTOR_TITLE, tip), this.getTitle()); + + let content = this._getContent(); + + if (typeof content === 'function') { + content = content.call(this._element); + } + + this.setElementContent(SelectorEngine.findOne(SELECTOR_CONTENT, tip), content); + tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2); + } // Private + + + _addAttachmentClass(attachment) { + this.getTipElement().classList.add(`${CLASS_PREFIX}-${this.updateAttachment(attachment)}`); + } + + _getContent() { + return this._element.getAttribute('data-bs-content') || this._config.content; + } + + _cleanTipClass() { + const tip = this.getTipElement(); + const tabClass = tip.getAttribute('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length > 0) { + tabClass.map(token => token.trim()).forEach(tClass => tip.classList.remove(tClass)); + } + } // Static + + + static jQueryInterface(config) { + return this.each(function () { + const data = Popover.getOrCreateInstance(this, config); + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError(`No method named "${config}"`); + } + + data[config](); + } + }); + } + + } + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + * add .Popover to jQuery only if jQuery is present + */ + + + defineJQueryPlugin(Popover); + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v5.0.2): scrollspy.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + const NAME$2 = 'scrollspy'; + const DATA_KEY$2 = 'bs.scrollspy'; + const EVENT_KEY$2 = `.${DATA_KEY$2}`; + const DATA_API_KEY$1 = '.data-api'; + const Default$1 = { + offset: 10, + method: 'auto', + target: '' + }; + const DefaultType$1 = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + const EVENT_ACTIVATE = `activate${EVENT_KEY$2}`; + const EVENT_SCROLL = `scroll${EVENT_KEY$2}`; + const EVENT_LOAD_DATA_API = `load${EVENT_KEY$2}${DATA_API_KEY$1}`; + const CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'; + const CLASS_NAME_ACTIVE$1 = 'active'; + const SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]'; + const SELECTOR_NAV_LIST_GROUP$1 = '.nav, .list-group'; + const SELECTOR_NAV_LINKS = '.nav-link'; + const SELECTOR_NAV_ITEMS = '.nav-item'; + const SELECTOR_LIST_ITEMS = '.list-group-item'; + const SELECTOR_DROPDOWN$1 = '.dropdown'; + const SELECTOR_DROPDOWN_TOGGLE$1 = '.dropdown-toggle'; + const METHOD_OFFSET = 'offset'; + const METHOD_POSITION = 'position'; + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + class ScrollSpy extends BaseComponent { + constructor(element, config) { + super(element); + this._scrollElement = this._element.tagName === 'BODY' ? window : this._element; + this._config = this._getConfig(config); + this._selector = `${this._config.target} ${SELECTOR_NAV_LINKS}, ${this._config.target} ${SELECTOR_LIST_ITEMS}, ${this._config.target} .${CLASS_NAME_DROPDOWN_ITEM}`; + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + EventHandler.on(this._scrollElement, EVENT_SCROLL, () => this._process()); + this.refresh(); + + this._process(); + } // Getters + + + static get Default() { + return Default$1; + } + + static get NAME() { + return NAME$2; + } // Public + + + refresh() { + const autoMethod = this._scrollElement === this._scrollElement.window ? METHOD_OFFSET : METHOD_POSITION; + const offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + const offsetBase = offsetMethod === METHOD_POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + const targets = SelectorEngine.find(this._selector); + targets.map(element => { + const targetSelector = getSelectorFromElement(element); + const target = targetSelector ? SelectorEngine.findOne(targetSelector) : null; + + if (target) { + const targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(item => item).sort((a, b) => a[0] - b[0]).forEach(item => { + this._offsets.push(item[0]); + + this._targets.push(item[1]); + }); + } + + dispose() { + EventHandler.off(this._scrollElement, EVENT_KEY$2); + super.dispose(); + } // Private + + + _getConfig(config) { + config = { ...Default$1, + ...Manipulator.getDataAttributes(this._element), + ...(typeof config === 'object' && config ? config : {}) + }; + + if (typeof config.target !== 'string' && isElement(config.target)) { + let { + id + } = config.target; + + if (!id) { + id = getUID(NAME$2); + config.target.id = id; + } + + config.target = `#${id}`; + } + + typeCheckConfig(NAME$2, config, DefaultType$1); + return config; + } + + _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + } + + _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + } + + _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + } + + _process() { + const scrollTop = this._getScrollTop() + this._config.offset; + + const scrollHeight = this._getScrollHeight(); + + const maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + const target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + for (let i = this._offsets.length; i--;) { + const isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + } + + _activate(target) { + this._activeTarget = target; + + this._clear(); + + const queries = this._selector.split(',').map(selector => `${selector}[data-bs-target="${target}"],${selector}[href="${target}"]`); + + const link = SelectorEngine.findOne(queries.join(',')); + + if (link.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) { + SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, link.closest(SELECTOR_DROPDOWN$1)).classList.add(CLASS_NAME_ACTIVE$1); + link.classList.add(CLASS_NAME_ACTIVE$1); + } else { + // Set triggered link as active + link.classList.add(CLASS_NAME_ACTIVE$1); + SelectorEngine.parents(link, SELECTOR_NAV_LIST_GROUP$1).forEach(listGroup => { + // Set triggered links parents as active + // With both