+
+
LEADERS IN QUALITY
+ CONSTRUCTION AND
+ INFRASTRUCTURE
+
+
+
+
+
+
+
+
+
+
Preconstruction Planning
+
I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double click me to add your own content and make changes to the font.
+
+
+
+
+
+
Architectural Modelling
+
I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double click me to add your own content and make changes to the font.
+
+
+
+
+
+
Construction Management
+
I'm a paragraph. Click here to add your own text and edit me. It’s easy. Just click “Edit Text” or double click me to add your own content and make changes to the font.
+
+
+
+
+
+
+
+
+
+
I'm a paragraph. Click here to add your own text and edit me. It’s easy.
+ Just click “Edit Text” or double click me to add your own content and make changes to the font. Feel free to
+ drag and drop me anywhere you like on your page. I’m a great place for you to tell a story and let your users know a little more about you.
+ This is a great space to write long text about your company and your services. You can use this space to go into a little more detail about your company.
+ Talk about your team and what services you provide.
+ Tell your visitors the story of how you came up with the idea for your business and what makes you different from your competitors.
+ Make your company stand out and show your visitors who you are.
+
+
+
+
+
+
+
+
2023
+
Year Established
+
+
+
206
+
Projects Completed
+
+
+
870
+
Contractors Appointed
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Jose/html_css/lab3/reset.css b/Code/Jose/html_css/lab3/reset.css
new file mode 100644
index 00000000..af944401
--- /dev/null
+++ b/Code/Jose/html_css/lab3/reset.css
@@ -0,0 +1,48 @@
+/* http://meyerweb.com/eric/tools/css/reset/
+ v2.0 | 20110126
+ License: none (public domain)
+*/
+
+html, body, div, span, applet, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, big, cite, code,
+del, dfn, em, img, ins, kbd, q, s, samp,
+small, strike, strong, sub, sup, tt, var,
+b, u, i, center,
+dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend,
+table, caption, tbody, tfoot, thead, tr, th, td,
+article, aside, canvas, details, embed,
+figure, figcaption, footer, header, hgroup,
+menu, nav, output, ruby, section, summary,
+time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ font: inherit;
+ vertical-align: baseline;
+}
+/* HTML5 display-role reset for older browsers */
+article, aside, details, figcaption, figure,
+footer, header, hgroup, menu, nav, section {
+ display: block;
+}
+body {
+ line-height: 1;
+}
+ol, ul {
+ list-style: none;
+}
+blockquote, q {
+ quotes: none;
+}
+blockquote:before, blockquote:after,
+q:before, q:after {
+ content: '';
+ content: none;
+}
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
\ No newline at end of file
diff --git a/Code/Jose/javascript/lab04/index.html b/Code/Jose/javascript/lab04/index.html
new file mode 100644
index 00000000..27848699
--- /dev/null
+++ b/Code/Jose/javascript/lab04/index.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
To do list
+
+
+
+
+
To do list
+
+
+
+ +
+
+
To do:
+
+
+
Completed:
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Jose/javascript/lab04/static/index.css b/Code/Jose/javascript/lab04/static/index.css
new file mode 100644
index 00000000..c21a5f8d
--- /dev/null
+++ b/Code/Jose/javascript/lab04/static/index.css
@@ -0,0 +1,8 @@
+body {
+ background-color: #8fbc8f;
+ font-family: sans-serif;
+}
+
+#completedList {
+ text-decoration: line-through;
+}
diff --git a/Code/Jose/javascript/lab04/static/todolist.js b/Code/Jose/javascript/lab04/static/todolist.js
new file mode 100644
index 00000000..82d2e05c
--- /dev/null
+++ b/Code/Jose/javascript/lab04/static/todolist.js
@@ -0,0 +1,40 @@
+let todoInput, addTodo, iList, cList, todoText, completedButton, deleteButton, li, todoTextDiv
+
+todoInput = document.querySelector('#todoInput');
+addTodo = document.querySelector('#addTodo');
+iList = document.querySelector('#incompletedList');
+cList = document.querySelector('#completedList');
+
+
+addTodo.onclick = function(){
+ todoText = todoInput.value;
+ todoInput.value = '';
+
+
+ li = document.createElement('li');
+ li.classList.add('todo');
+ todoTextDiv = document.createElement('div');
+ todoTextDiv.innerHTML = todoText;
+
+
+ completedButton = document.createElement('button');
+ completedButton.innerHTML = '✓';
+
+ completedButton.onclick = function(){
+ iList.removeChild(this.parentElement);
+ li = document.createElement('li');
+ li.innerText = todoText;
+ cList.appendChild(li);
+ };
+
+ deleteButton = document.createElement('button');
+ deleteButton.innerHTML = '✗';
+ deleteButton.onclick = function(){
+ iList.removeChild(this.parentElement);
+ };
+
+ li.appendChild(todoTextDiv);
+ li.appendChild(completedButton);
+ li.appendChild(deleteButton);
+ iList.appendChild(li);
+};
\ No newline at end of file
diff --git a/Code/Jose/javascript/lab05/app.py b/Code/Jose/javascript/lab05/app.py
new file mode 100644
index 00000000..c6a8cd77
--- /dev/null
+++ b/Code/Jose/javascript/lab05/app.py
@@ -0,0 +1,8 @@
+from flask import Flask, render_template, request
+app = Flask(__name__)
+
+@app.route('/')
+def index():
+ return render_template('index.html')
+
+app.run(debug = True)
\ No newline at end of file
diff --git a/Code/Jose/javascript/lab05/static/index.css b/Code/Jose/javascript/lab05/static/index.css
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Jose/javascript/lab05/static/js/index.js b/Code/Jose/javascript/lab05/static/js/index.js
new file mode 100644
index 00000000..ee90aded
--- /dev/null
+++ b/Code/Jose/javascript/lab05/static/js/index.js
@@ -0,0 +1,80 @@
+let requestedinputText, searchButton, previousPageButton, nextPageButton,
+quoteText, quoteAuthor, quoteDiv, quoteDivAuthor, userSearch, pageNumber
+
+searchButton = document.querySelector('#searchButton');
+previousPageButton = document.querySelector('#previousPageButton');
+nextPageButton = document.querySelector('#nextPageButton');
+resultText = document.querySelector('#resultText');
+resultAuthor = document.querySelector('#resultAuthor');
+
+quoteNumber = 0;
+pageNumber = 1;
+
+let url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${requestedinputText}`
+
+const headers = {
+ Accept: 'application/json',
+ Authorization: `Token token=${FAVQS_API_KEY}`
+}
+
+
+
+function fetchQuoteData() {
+ requestedinputText = document.querySelector('#searchInput').value;
+
+ fetch(`https://favqs.com/api/quotes?page=${pageNumber}&filter=${requestedinputText}`, {headers})
+ .then((response) => response.json())
+ .then((data) => {
+ author = data.quotes[quoteNumber].author;
+ quoteText = data.quotes[quoteNumber].body;
+ resultText.innerHTML = quoteText;
+ resultAuthor.innerHTML = author;
+ amountofReturnedQuotes = data.quotes.length
+ // Saving the data in a variable to use outside this scope
+ returnedQuotes = data
+ //console.log(returnedQuotes)
+ //console.log(amountofReturnedQuotes)
+ })
+}
+
+function nextPage() {
+ if (quoteNumber < amountofReturnedQuotes-1){
+ quoteNumber++
+ author = returnedQuotes.quotes[quoteNumber].author;
+ quoteText = returnedQuotes.quotes[quoteNumber].body;
+ resultText.innerHTML = quoteText;
+ resultAuthor.innerHTML = author;
+ } else {
+ alert("You've reached the end of the quotes!")
+ }
+}
+
+function previousPage() {
+ if (quoteNumber > 0) {
+ quoteNumber--
+ author = returnedQuotes.quotes[quoteNumber].author;
+ quoteText = returnedQuotes.quotes[quoteNumber].body;
+ resultText.innerHTML = quoteText;
+ resultAuthor.innerHTML = author;
+ } else {
+ alert('This is the beginning of the quotes!')
+ }
+}
+
+
+searchButton.onclick = function(){
+ fetchQuoteData()
+}
+
+nextPageButton.onclick = function(){
+ nextPage()
+}
+
+previousPageButton.onclick = function(){
+ previousPage()
+}
+
+//quoteText = data.quote.body;
+//quoteAuthor = data.quote.author;
+//resultText.innerHTML = quoteText;
+//resultAuthor.innerHTML = quoteAuthor;
\ No newline at end of file
diff --git a/Code/Jose/javascript/lab05/static/styles/mainpage.css b/Code/Jose/javascript/lab05/static/styles/mainpage.css
new file mode 100644
index 00000000..a460a5e7
--- /dev/null
+++ b/Code/Jose/javascript/lab05/static/styles/mainpage.css
@@ -0,0 +1,52 @@
+body {
+ background-color: #8fbc8f;
+ font-family: sans-serif;
+}
+
+.instructions{
+ display: flex;
+ margin-top: 15%;
+ justify-content: center;
+
+}
+
+.instruction-text {
+ font-size: 3rem;
+ font-weight: 600;
+}
+
+.btn {
+ justify-content: center;
+ text-align: center;
+ color: black;
+ font-weight: 700;
+ margin-top: 15px;
+}
+
+.row {
+ margin-left: 45%;
+ width: 10%
+}
+
+.quoteDiv {
+ display: flex;
+ margin-top: 5%;
+ justify-content: center;
+ width: 50%;
+ margin-left: 25%;
+ margin-bottom: -5%;
+ background-color: seagreen;
+ border-radius: 10px;
+ font-size: 1.5rem;
+ font-weight: 600;
+ color: darkslategrey;
+ padding-left: 5%;
+ padding-right: 5%;
+}
+
+.searchBar {
+ display: flex;
+ margin-left: 25%;
+ width: 50%;
+}
+
diff --git a/Code/Jose/javascript/lab05/templates/index.html b/Code/Jose/javascript/lab05/templates/index.html
new file mode 100644
index 00000000..a8807e81
--- /dev/null
+++ b/Code/Jose/javascript/lab05/templates/index.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
Random Quote
+
+
+
+
Enter text for a quote.
+
+
+
+
+
+
+
+ Click to search!
+ Previous Page
+ Next Page
+
+
+
+
+
(your quote will appear here)
+
+
+
-
+
(this is the author's name!)
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/lab01/__init__.py b/Code/Lee/Django/lab01/lab01/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab01/lab01/asgi.py b/Code/Lee/Django/lab01/lab01/asgi.py
new file mode 100644
index 00000000..1b5d1d6f
--- /dev/null
+++ b/Code/Lee/Django/lab01/lab01/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for lab01 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab01.settings')
+
+application = get_asgi_application()
diff --git a/Code/Lee/Django/lab01/lab01/settings.py b/Code/Lee/Django/lab01/lab01/settings.py
new file mode 100644
index 00000000..38af821b
--- /dev/null
+++ b/Code/Lee/Django/lab01/lab01/settings.py
@@ -0,0 +1,125 @@
+"""
+Django settings for lab01 project.
+
+Generated by 'django-admin startproject' using Django 4.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-=5evlnyybe0v*-4e@wqu)(we#bu21%2p^8&4gf%!%$la+ghu+c'
+
+# 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',
+
+ 'todo',
+]
+
+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 = 'lab01.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 = 'lab01.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/Code/Lee/Django/lab01/lab01/urls.py b/Code/Lee/Django/lab01/lab01/urls.py
new file mode 100644
index 00000000..375449bb
--- /dev/null
+++ b/Code/Lee/Django/lab01/lab01/urls.py
@@ -0,0 +1,22 @@
+"""lab01 URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('todo.urls'))
+]
diff --git a/Code/Lee/Django/lab01/lab01/wsgi.py b/Code/Lee/Django/lab01/lab01/wsgi.py
new file mode 100644
index 00000000..cbbde9e6
--- /dev/null
+++ b/Code/Lee/Django/lab01/lab01/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for lab01 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab01.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Lee/Django/lab01/manage.py b/Code/Lee/Django/lab01/manage.py
new file mode 100755
index 00000000..3c36ff59
--- /dev/null
+++ b/Code/Lee/Django/lab01/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', 'lab01.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/Code/Lee/Django/lab01/todo/__init__.py b/Code/Lee/Django/lab01/todo/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab01/todo/admin.py b/Code/Lee/Django/lab01/todo/admin.py
new file mode 100644
index 00000000..990c709e
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+
+# Register your models here.
+from .models import Priority, TodoItem
+
+admin.site.register(Priority)
+admin.site.register(TodoItem)
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/apps.py b/Code/Lee/Django/lab01/todo/apps.py
new file mode 100644
index 00000000..3602af16
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class TodoConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'todo'
diff --git a/Code/Lee/Django/lab01/todo/migrations/0001_initial.py b/Code/Lee/Django/lab01/todo/migrations/0001_initial.py
new file mode 100644
index 00000000..ac6a846b
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.0 on 2021-12-29 02:17
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Priority',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('priority', models.CharField(choices=[('H', 'High'), ('M', 'Meidum'), ('L', 'Low')], max_length=1)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TodoItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('todo_text', models.CharField(max_length=200)),
+ ('completed_date', models.DateTimeField(auto_now_add=True)),
+ ('todo_priority', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='priorities', to='todo.priority')),
+ ],
+ ),
+ ]
diff --git a/Code/Lee/Django/lab01/todo/migrations/0002_alter_priority_priority_and_more.py b/Code/Lee/Django/lab01/todo/migrations/0002_alter_priority_priority_and_more.py
new file mode 100644
index 00000000..20df5bae
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/migrations/0002_alter_priority_priority_and_more.py
@@ -0,0 +1,29 @@
+# Generated by Django 4.0 on 2021-12-30 03:18
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(choices=[('H', 'High'), ('M', 'Medium'), ('L', 'Low')], max_length=1),
+ ),
+ migrations.AlterField(
+ model_name='todoitem',
+ name='completed_date',
+ field=models.DateTimeField(null=True),
+ ),
+ migrations.AlterField(
+ model_name='todoitem',
+ name='todo_priority',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='todo_priority', to='todo.priority'),
+ ),
+ ]
diff --git a/Code/Lee/Django/lab01/todo/migrations/0003_alter_todoitem_completed_date.py b/Code/Lee/Django/lab01/todo/migrations/0003_alter_todoitem_completed_date.py
new file mode 100644
index 00000000..d77b3098
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/migrations/0003_alter_todoitem_completed_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0 on 2021-12-30 04:26
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo', '0002_alter_priority_priority_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='todoitem',
+ name='completed_date',
+ field=models.DateTimeField(blank=True, null=True),
+ ),
+ ]
diff --git a/Code/Lee/Django/lab01/todo/migrations/__init__.py b/Code/Lee/Django/lab01/todo/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab01/todo/models.py b/Code/Lee/Django/lab01/todo/models.py
new file mode 100644
index 00000000..6597cc81
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/models.py
@@ -0,0 +1,24 @@
+from django.db import models
+from django.db.models.deletion import CASCADE
+from django.db.models.fields.related import ForeignKey
+
+
+# Create your models here.
+TODO_PRIORITY_LIST = (
+ ('H', 'High'),
+ ('M', 'Medium'),
+ ('L', 'Low'),
+ )
+class Priority(models.Model):
+ priority = models.CharField(max_length=1, choices=TODO_PRIORITY_LIST)
+
+ def __str__(self):
+ return self.priority
+
+class TodoItem(models.Model):
+ todo_text = models.CharField(max_length=200)
+ todo_priority = ForeignKey(Priority, on_delete=CASCADE, related_name='todo_priority')
+ completed_date = models.DateTimeField(null=True, blank=True)
+
+ def __str__(self):
+ return self.todo_text
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/static/index.css b/Code/Lee/Django/lab01/todo/static/index.css
new file mode 100644
index 00000000..6e361e16
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/static/index.css
@@ -0,0 +1 @@
+/*I don't want to have to use this. Holy spirit, activate. */
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/static/normalize.css b/Code/Lee/Django/lab01/todo/static/normalize.css
new file mode 100644
index 00000000..c45a85f8
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/static/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+ html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ }
+
+ /* Sections
+ ========================================================================== */
+
+ /**
+ * Remove the margin in all browsers.
+ */
+
+ body {
+ margin: 0;
+ }
+
+ /**
+ * Render the `main` element consistently in IE.
+ */
+
+ main {
+ display: block;
+ }
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ ========================================================================== */
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /* Text-level semantics
+ ========================================================================== */
+
+ /**
+ * Remove the gray background on active links in IE 10.
+ */
+
+ a {
+ background-color: transparent;
+ }
+
+ /**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+ abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ /* Embedded content
+ ========================================================================== */
+
+ /**
+ * Remove the border on images inside links in IE 10.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /* Forms
+ ========================================================================== */
+
+ /**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+ }
+
+ /**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+ button,
+ input { /* 1 */
+ overflow: visible;
+ }
+
+ /**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+ button,
+ select { /* 1 */
+ text-transform: none;
+ }
+
+ /**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button;
+ }
+
+ /**
+ * Remove the inner border and padding in Firefox.
+ */
+
+ button::-moz-focus-inner,
+ [type="button"]::-moz-focus-inner,
+ [type="reset"]::-moz-focus-inner,
+ [type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+ button:-moz-focusring,
+ [type="button"]:-moz-focusring,
+ [type="reset"]:-moz-focusring,
+ [type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Correct the padding in Firefox.
+ */
+
+ fieldset {
+ padding: 0.35em 0.75em 0.625em;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+ progress {
+ vertical-align: baseline;
+ }
+
+ /**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+ textarea {
+ overflow: auto;
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+ [type="number"]::-webkit-inner-spin-button,
+ [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+ [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /* Interactive
+ ========================================================================== */
+
+ /*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+ details {
+ display: block;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Misc
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10+.
+ */
+
+ template {
+ display: none;
+ }
+
+ /**
+ * Add the correct display in IE 10.
+ */
+
+ [hidden] {
+ display: none;
+ }
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/static/theme.css b/Code/Lee/Django/lab01/todo/static/theme.css
new file mode 100644
index 00000000..e65d8f7e
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/static/theme.css
@@ -0,0 +1,7 @@
+/* Created with Themestr.app */
+/*! `Poypull` Bootstrap 5 theme */@import url(https://use.fontawesome.com/releases/v5.0.10/css/all.css);@import url(https://fonts.googleapis.com/css?family=Muli:200,300,400,700);/*!
+ * Bootstrap v5.0.1 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #7F0FFF;--bs-secondary: #bed6d5;--bs-success: #420084;--bs-info: #7ebcfa;--bs-warning: #f93;--bs-danger: #f2460d;--bs-light: #eef0f2;--bs-dark: #000633;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--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))}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin-top:0;margin-bottom:.5rem;font-family:Muli;font-weight:500;line-height:1.2}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],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{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:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#7F0FFF;text-decoration:underline}a:hover{color:#660ccc}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}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:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,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]::-webkit-calendar-picker-indicator{display:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]: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-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-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:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.table{--bs-table-bg: rgba(0,0,0,0);--bs-table-accent-bg: rgba(0,0,0,0);--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0,0,0,0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0,0,0,0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0,0,0,0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #e5cfff;--bs-table-striped-bg: #dac5f2;--bs-table-striped-color: #000;--bs-table-active-bg: #cebae6;--bs-table-active-color: #000;--bs-table-hover-bg: #d4bfec;--bs-table-hover-color: #000;color:#000;border-color:#cebae6}.table-secondary{--bs-table-bg: #f2f7f7;--bs-table-striped-bg: #e6ebeb;--bs-table-striped-color: #000;--bs-table-active-bg: #dadede;--bs-table-active-color: #000;--bs-table-hover-bg: #e0e4e4;--bs-table-hover-color: #000;color:#000;border-color:#dadede}.table-success{--bs-table-bg: #d9cce6;--bs-table-striped-bg: #cec2db;--bs-table-striped-color: #000;--bs-table-active-bg: #c3b8cf;--bs-table-active-color: #000;--bs-table-hover-bg: #c9bdd5;--bs-table-hover-color: #000;color:#000;border-color:#c3b8cf}.table-info{--bs-table-bg: #e5f2fe;--bs-table-striped-bg: #dae6f1;--bs-table-striped-color: #000;--bs-table-active-bg: #cedae5;--bs-table-active-color: #000;--bs-table-hover-bg: #d4e0eb;--bs-table-hover-color: #000;color:#000;border-color:#cedae5}.table-warning{--bs-table-bg: #ffebd6;--bs-table-striped-bg: #f2dfcb;--bs-table-striped-color: #000;--bs-table-active-bg: #e6d4c1;--bs-table-active-color: #000;--bs-table-hover-bg: #ecd9c6;--bs-table-hover-color: #000;color:#000;border-color:#e6d4c1}.table-danger{--bs-table-bg: #fcdacf;--bs-table-striped-bg: #efcfc5;--bs-table-striped-color: #000;--bs-table-active-bg: #e3c4ba;--bs-table-active-color: #000;--bs-table-hover-bg: #e9cabf;--bs-table-hover-color: #000;color:#000;border-color:#e3c4ba}.table-light{--bs-table-bg: #eef0f2;--bs-table-striped-bg: #e2e4e6;--bs-table-striped-color: #000;--bs-table-active-bg: #d6d8da;--bs-table-active-color: #000;--bs-table-hover-bg: #dcdee0;--bs-table-hover-color: #000;color:#000;border-color:#d6d8da}.table-dark{--bs-table-bg: #000633;--bs-table-striped-bg: #0d123d;--bs-table-striped-color: #fff;--bs-table-active-bg: #1a1f47;--bs-table-active-color: #fff;--bs-table-hover-bg: #131942;--bs-table-hover-color: #fff;color:#fff;border-color:#1a1f47}.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 + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;appearance:none;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.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:#212529;background-color:#fff;border-color:#bf87ff;outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;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}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;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}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;appearance:none}.form-select:focus{border-color:#bf87ff;outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.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-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,0.25);appearance:none;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:#bf87ff;outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.form-check-input:checked{background-color:#7F0FFF;border-color:#7F0FFF}.form-check-input:checked[type="checkbox"]{background-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 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type="radio"]{background-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:#7F0FFF;border-color:#7F0FFF;background-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{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image: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");background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23bf87ff'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image: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-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}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(127,15,255,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(127,15,255,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#7F0FFF;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#d9b7ff}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#7F0FFF;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#d9b7ff}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.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:focus ~ label,.form-floating>.form-control:not(:placeholder-shown) ~ label,.form-floating>.form-select ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){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:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#420084}.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:rgba(66,0,132,0.9);border-radius:.25rem}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#420084;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='%23420084' d='M2.3 6.73L.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)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#420084;box-shadow:0 0 0 .25rem rgba(66,0,132,0.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)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#420084}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23420084' d='M2.3 6.73L.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-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#420084;box-shadow:0 0 0 .25rem rgba(66,0,132,0.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#420084}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#420084}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(66,0,132,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#420084}.form-check-inline .form-check-input ~ .valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#f2460d}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(242,70,13,0.9);border-radius:.25rem}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#f2460d;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='%23f2460d'%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='%23f2460d' 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)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#f2460d;box-shadow:0 0 0 .25rem rgba(242,70,13,0.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)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#f2460d}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),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='%23f2460d'%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='%23f2460d' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#f2460d;box-shadow:0 0 0 .25rem rgba(242,70,13,0.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#f2460d}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#f2460d}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(242,70,13,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#f2460d}.form-check-inline .form-check-input ~ .invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;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}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.btn-primary:hover{color:#fff;background-color:#6c0dd9;border-color:#660ccc}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#6c0dd9;border-color:#660ccc;box-shadow:0 0 0 .25rem rgba(146,51,255,0.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#660ccc;border-color:#5f0bbf}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(146,51,255,0.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.btn-secondary{color:#000;background-color:#bed6d5;border-color:#bed6d5}.btn-secondary:hover{color:#000;background-color:#c8dcdb;border-color:#c5dad9}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#000;background-color:#c8dcdb;border-color:#c5dad9;box-shadow:0 0 0 .25rem rgba(162,182,181,0.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#000;background-color:#cbdedd;border-color:#c5dad9}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(162,182,181,0.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#000;background-color:#bed6d5;border-color:#bed6d5}.btn-success{color:#fff;background-color:#420084;border-color:#420084}.btn-success:hover{color:#fff;background-color:#380070;border-color:#35006a}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#380070;border-color:#35006a;box-shadow:0 0 0 .25rem rgba(94,38,150,0.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#35006a;border-color:#320063}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(94,38,150,0.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#420084;border-color:#420084}.btn-info{color:#000;background-color:#7ebcfa;border-color:#7ebcfa}.btn-info:hover{color:#000;background-color:#91c6fb;border-color:#8bc3fb}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#91c6fb;border-color:#8bc3fb;box-shadow:0 0 0 .25rem rgba(107,160,213,0.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#98c9fb;border-color:#8bc3fb}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(107,160,213,0.5)}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#7ebcfa;border-color:#7ebcfa}.btn-warning{color:#000;background-color:#f93;border-color:#f93}.btn-warning:hover{color:#000;background-color:#ffa852;border-color:#ffa347}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffa852;border-color:#ffa347;box-shadow:0 0 0 .25rem rgba(217,130,43,0.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffad5c;border-color:#ffa347}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,130,43,0.5)}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#f93;border-color:#f93}.btn-danger{color:#000;background-color:#f2460d;border-color:#f2460d}.btn-danger:hover{color:#000;background-color:#f46231;border-color:#f35925}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#000;background-color:#f46231;border-color:#f35925;box-shadow:0 0 0 .25rem rgba(206,60,11,0.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#000;background-color:#f56b3d;border-color:#f35925}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(206,60,11,0.5)}.btn-danger:disabled,.btn-danger.disabled{color:#000;background-color:#f2460d;border-color:#f2460d}.btn-light{color:#000;background-color:#eef0f2;border-color:#eef0f2}.btn-light:hover{color:#000;background-color:#f1f2f4;border-color:#f0f2f3}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f1f2f4;border-color:#f0f2f3;box-shadow:0 0 0 .25rem rgba(202,204,206,0.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f1f3f5;border-color:#f0f2f3}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(202,204,206,0.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#eef0f2;border-color:#eef0f2}.btn-dark{color:#fff;background-color:#000633;border-color:#000633}.btn-dark:hover{color:#fff;background-color:#00052b;border-color:#000529}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#00052b;border-color:#000529;box-shadow:0 0 0 .25rem rgba(38,43,82,0.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#000529;border-color:#000526}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(38,43,82,0.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#000633;border-color:#000633}.btn-outline-primary{color:#7F0FFF;border-color:#7F0FFF}.btn-outline-primary:hover{color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(127,15,255,0.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(127,15,255,0.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#7F0FFF;background-color:transparent}.btn-outline-secondary{color:#bed6d5;border-color:#bed6d5}.btn-outline-secondary:hover{color:#000;background-color:#bed6d5;border-color:#bed6d5}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(190,214,213,0.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#bed6d5;border-color:#bed6d5}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(190,214,213,0.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#bed6d5;background-color:transparent}.btn-outline-success{color:#420084;border-color:#420084}.btn-outline-success:hover{color:#fff;background-color:#420084;border-color:#420084}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(66,0,132,0.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#420084;border-color:#420084}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(66,0,132,0.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#420084;background-color:transparent}.btn-outline-info{color:#7ebcfa;border-color:#7ebcfa}.btn-outline-info:hover{color:#000;background-color:#7ebcfa;border-color:#7ebcfa}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(126,188,250,0.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#7ebcfa;border-color:#7ebcfa}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(126,188,250,0.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#7ebcfa;background-color:transparent}.btn-outline-warning{color:#f93;border-color:#f93}.btn-outline-warning:hover{color:#000;background-color:#f93;border-color:#f93}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,153,51,0.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#f93;border-color:#f93}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,153,51,0.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#f93;background-color:transparent}.btn-outline-danger{color:#f2460d;border-color:#f2460d}.btn-outline-danger:hover{color:#000;background-color:#f2460d;border-color:#f2460d}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(242,70,13,0.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#000;background-color:#f2460d;border-color:#f2460d}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(242,70,13,0.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#f2460d;background-color:transparent}.btn-outline-light{color:#eef0f2;border-color:#eef0f2}.btn-outline-light:hover{color:#000;background-color:#eef0f2;border-color:#eef0f2}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(238,240,242,0.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#eef0f2;border-color:#eef0f2}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(238,240,242,0.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#eef0f2;background-color:transparent}.btn-outline-dark{color:#000633;border-color:#000633}.btn-outline-dark:hover{color:#fff;background-color:#000633;border-color:#000633}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(0,6,51,0.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#000633;border-color:#000633}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(0,6,51,0.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#000633;background-color:transparent}.btn-link{font-weight:400;color:#7F0FFF;text-decoration:underline}.btn-link:hover{color:#660ccc}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropend,.dropdown,.dropstart{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{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.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:.125rem}.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:.125rem}.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:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,0.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#7F0FFF}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,0.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#7F0FFF}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-1px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.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:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn ~ .btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#7F0FFF;text-decoration:none;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#660ccc}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:none;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#7F0FFF}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{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{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow 0.15s ease-in-out}@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 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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{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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.55);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280,0,0,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:#f3f3f3}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:#f3f3f3;border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='%23f3f3f3' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:#f3f3f3}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,0.125);border-radius:.25rem}.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:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:1px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,0.03);border-top:1px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@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-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{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-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;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}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#720ee6;background-color:#f2e7ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23720ee6'%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");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image: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");background-repeat:no-repeat;background-size:1.25rem;transition:transform 0.2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#bf87ff;outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.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{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#7F0FFF;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;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}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#660ccc;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#660ccc;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#4c0999;background-color:#e5cfff;border-color:#d9b7ff}.alert-primary .alert-link{color:#3d077a}.alert-secondary{color:#4c5655;background-color:#f2f7f7;border-color:#ecf3f2}.alert-secondary .alert-link{color:#3d4544}.alert-success{color:#28004f;background-color:#d9cce6;border-color:#c6b3da}.alert-success .alert-link{color:#20003f}.alert-info{color:#324b64;background-color:#e5f2fe;border-color:#d8ebfe}.alert-info .alert-link{color:#283c50}.alert-warning{color:#995c1f;background-color:#ffebd6;border-color:#ffe0c2}.alert-warning .alert-link{color:#7a4a19}.alert-danger{color:#912a08;background-color:#fcdacf;border-color:#fbc8b6}.alert-danger .alert-link{color:#742206}.alert-light{color:#5f6061;background-color:#fcfcfc;border-color:#fafbfb}.alert-light .alert-link{color:#4c4d4e}.alert-dark{color:#00041f;background-color:#cccdd6;border-color:#b3b4c2}.alert-dark .alert-link{color:#000319}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#7F0FFF;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,0.125)}.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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#7F0FFF;border-color:#7F0FFF}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;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:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#4c0999;background-color:#e5cfff}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#4c0999;background-color:#cebae6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#4c0999;border-color:#4c0999}.list-group-item-secondary{color:#4c5655;background-color:#f2f7f7}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#4c5655;background-color:#dadede}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#4c5655;border-color:#4c5655}.list-group-item-success{color:#28004f;background-color:#d9cce6}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#28004f;background-color:#c3b8cf}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#28004f;border-color:#28004f}.list-group-item-info{color:#324b64;background-color:#e5f2fe}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#324b64;background-color:#cedae5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#324b64;border-color:#324b64}.list-group-item-warning{color:#995c1f;background-color:#ffebd6}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#995c1f;background-color:#e6d4c1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#995c1f;border-color:#995c1f}.list-group-item-danger{color:#912a08;background-color:#fcdacf}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#912a08;background-color:#e3c4ba}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#912a08;border-color:#912a08}.list-group-item-light{color:#5f6061;background-color:#fcfcfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#5f6061;background-color:#e3e3e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#5f6061;border-color:#5f6061}.list-group-item-dark{color:#00041f;background-color:#cccdd6}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#00041f;background-color:#b8b9c1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#00041f;border-color:#00041f}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(127,15,255,0.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.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% - 1rem)}.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% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-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-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@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-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^="right"]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^="left"]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid #d8d8d8;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.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%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{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:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-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%;list-style:none}.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 0.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-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,0.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,0.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,0.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,0.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#7F0FFF}.link-primary:hover,.link-primary:focus{color:#660ccc}.link-secondary{color:#bed6d5}.link-secondary:hover,.link-secondary:focus{color:#cbdedd}.link-success{color:#420084}.link-success:hover,.link-success:focus{color:#35006a}.link-info{color:#7ebcfa}.link-info:hover,.link-info:focus{color:#98c9fb}.link-warning{color:#f93}.link-warning:hover,.link-warning:focus{color:#ffad5c}.link-danger{color:#f2460d}.link-danger:hover,.link-danger:focus{color:#f56b3d}.link-light{color:#eef0f2}.link-light:hover,.link-light:focus{color:#f1f3f5}.link-dark{color:#000633}.link-dark:hover,.link-dark:focus{color:#000529}.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: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.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:sticky;top:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;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}.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}.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}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow: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-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:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{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:1px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:1px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:1px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:1px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:1px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-primary{border-color:#7F0FFF !important}.border-secondary{border-color:#bed6d5 !important}.border-success{border-color:#420084 !important}.border-info{border-color:#7ebcfa !important}.border-warning{border-color:#f93 !important}.border-danger{border-color:#f2460d !important}.border-light{border-color:#eef0f2 !important}.border-dark{border-color:#000633 !important}.border-white{border-color:#fff !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}.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}.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}.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}.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-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !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{color:#7F0FFF !important}.text-secondary{color:#bed6d5 !important}.text-success{color:#420084 !important}.text-info{color:#7ebcfa !important}.text-warning{color:#f93 !important}.text-danger{color:#f2460d !important}.text-light{color:#eef0f2 !important}.text-dark{color:#000633 !important}.text-white{color:#fff !important}.text-body{color:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-reset{color:inherit !important}.bg-primary{background-color:#7F0FFF !important}.bg-secondary{background-color:#bed6d5 !important}.bg-success{background-color:#420084 !important}.bg-info{background-color:#7ebcfa !important}.bg-warning{background-color:#f93 !important}.bg-danger{background-color:#f2460d !important}.bg-light{background-color:#eef0f2 !important}.bg-dark{background-color:#000633 !important}.bg-body{background-color:#fff !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:.25rem !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2rem !important}.rounded-2{border-radius:.25rem !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-end{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-start{border-bottom-left-radius:.25rem !important;border-top-left-radius:.25rem !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float: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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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-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}}
diff --git a/Code/Lee/Django/lab01/todo/templates/base.html b/Code/Lee/Django/lab01/todo/templates/base.html
new file mode 100644
index 00000000..1d4600dd
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/templates/base.html
@@ -0,0 +1,45 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
To-Do List
+
+
+
+
+
+ {% block content %}
+ {% endblock %}
+
+
+
+
+
+
+
+
Copyright © 2021 Lee Colburn (not really)
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/templates/index.html b/Code/Lee/Django/lab01/todo/templates/index.html
new file mode 100644
index 00000000..cce53985
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/templates/index.html
@@ -0,0 +1,73 @@
+{% extends 'base.html' %}
+
+{% block content %}
+
To-Do List
+
+
+
+
+
+
+
+
+
+
+
Completed
+
+ {% for todo in all_todo_items.all %}
+ {% if todo.completed_date %}
+
+ {{ todo.todo_text }}
+
+
+ {% endif %}
+
+
+ {% empty %}
+
+ -
+
+ {% endfor %}
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/tests.py b/Code/Lee/Django/lab01/todo/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Lee/Django/lab01/todo/urls.py b/Code/Lee/Django/lab01/todo/urls.py
new file mode 100644
index 00000000..988ee11b
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/urls.py
@@ -0,0 +1,11 @@
+from django.urls import path
+from . import views
+
+urlpatterns = [
+ path('', views.index, name='index'),
+ path('create/', views.save_todo_item, name='create'),
+ path('complete/
', views.complete_todo_item, name='complete'),
+ path('delete/', views.delete_todo_item, name='delete')
+]
+
+app_name = "todo"
\ No newline at end of file
diff --git a/Code/Lee/Django/lab01/todo/views.py b/Code/Lee/Django/lab01/todo/views.py
new file mode 100644
index 00000000..1d98bcde
--- /dev/null
+++ b/Code/Lee/Django/lab01/todo/views.py
@@ -0,0 +1,68 @@
+from django.shortcuts import get_object_or_404, render
+from django.http import HttpResponse
+from django.db.models.functions import Now
+
+#from Class_Raven.Code.Lee.Django.lab01 import todo
+
+from .models import Priority, TodoItem
+
+# Create your views here.
+
+def index(request):
+ all_todo_items = TodoItem.objects.all().order_by('-id')
+
+ context = {
+ 'all_todo_items': all_todo_items
+ }
+ return render(request, 'index.html', context)
+
+def save_todo_item(request):
+ form = request.POST
+
+ todo_text = form['todo_text']
+ todo_priority = form['todo_priority']
+
+ todo_priority, create = Priority.objects.get_or_create(priority=todo_priority)
+ TodoItem.objects.create(todo_text=todo_text, todo_priority=todo_priority)
+
+ all_todo_items = TodoItem.objects.all().order_by('-id')
+
+ context = {
+ 'all_todo_items': all_todo_items
+ }
+
+ return render(request, 'index.html', context)
+
+def complete_todo_item(request, todo_id):
+
+ # Get todo_item
+ todo_item = get_object_or_404(TodoItem, id=todo_id)
+
+ # Set completed_date field to time Now
+ todo_item.completed_date = Now()
+
+ # Save the item
+ todo_item.save()
+
+ # Re-render page with below
+ all_todo_items = TodoItem.objects.all().order_by('-id')
+ context = {
+ 'all_todo_items': all_todo_items
+ }
+ return render(request, 'index.html', context)
+
+def delete_todo_item(request, todo_id):
+
+ # Get todo_item
+ todo_item = get_object_or_404(TodoItem, id=todo_id)
+
+ # Delete todo_item from db
+ todo_item.delete()
+
+
+ # Re-render page with below
+ all_todo_items = TodoItem.objects.all().order_by('-id')
+ context = {
+ 'all_todo_items': all_todo_items
+ }
+ return render(request, 'index.html', context)
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/blog/__init__.py b/Code/Lee/Django/lab02/blog/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab02/blog/admin.py b/Code/Lee/Django/lab02/blog/admin.py
new file mode 100644
index 00000000..8c38f3f3
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/Code/Lee/Django/lab02/blog/apps.py b/Code/Lee/Django/lab02/blog/apps.py
new file mode 100644
index 00000000..79305878
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class BlogConfig(AppConfig):
+ name = 'blog'
diff --git a/Code/Lee/Django/lab02/blog/forms.py b/Code/Lee/Django/lab02/blog/forms.py
new file mode 100644
index 00000000..7c283db4
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/forms.py
@@ -0,0 +1,17 @@
+from .models import BlogPost
+
+
+from django import forms
+
+
+class BlogForm(forms.ModelForm):
+ class Meta:
+ model = BlogPost
+ fields = [ # '__all__' # can do this if you want allllllll the form fields
+ 'title',
+ 'body',
+ ]
+ widgets = {
+ 'title' : forms.TextInput(attrs={'class':'form-control'}),
+ 'body' : forms.Textarea(attrs={'class':'form-control', 'rows':'4'}),
+ }
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/blog/migrations/0001_initial.py b/Code/Lee/Django/lab02/blog/migrations/0001_initial.py
new file mode 100644
index 00000000..32d2e056
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/migrations/0001_initial.py
@@ -0,0 +1,29 @@
+# Generated by Django 2.2.24 on 2022-01-11 02:31
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BlogPost',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=200)),
+ ('body', models.TextField(max_length=20000)),
+ ('public', models.BooleanField(default=True)),
+ ('date_created', models.DateTimeField(auto_now_add=True)),
+ ('date_edited', models.DateTimeField(auto_now=True)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/Code/Lee/Django/lab02/blog/migrations/__init__.py b/Code/Lee/Django/lab02/blog/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab02/blog/models.py b/Code/Lee/Django/lab02/blog/models.py
new file mode 100644
index 00000000..56b2ea8b
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/models.py
@@ -0,0 +1,13 @@
+from django.db import models
+from django.contrib.auth import get_user_model
+from users.models import User
+# Create your models here.
+
+class BlogPost(models.Model):
+ title = models.CharField(max_length=200)
+ body = models.TextField(max_length=20000)
+ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
+ public = models.BooleanField(default=True)
+ date_created = models.DateTimeField(auto_now_add=True)
+ date_edited = models.DateTimeField(auto_now=True)
+# def save(self, args, kwargs) - Look it up on the django site
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/blog/tests.py b/Code/Lee/Django/lab02/blog/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Lee/Django/lab02/blog/urls.py b/Code/Lee/Django/lab02/blog/urls.py
new file mode 100644
index 00000000..d61deaae
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/urls.py
@@ -0,0 +1,13 @@
+from django.urls import path
+
+from . import views
+
+app_name = 'blog'
+
+urlpatterns = [
+ path('', views.index, name='home'),
+ path('create/', views.create, name='create'),
+ path('/', views.profile, name='profile'),
+
+
+]
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/blog/views.py b/Code/Lee/Django/lab02/blog/views.py
new file mode 100644
index 00000000..0cbdf6ec
--- /dev/null
+++ b/Code/Lee/Django/lab02/blog/views.py
@@ -0,0 +1,52 @@
+from django.shortcuts import (
+ render, # helps render html templates
+ get_object_or_404, # returns the desired object if it exists or raises a 404 error
+ reverse, # lookup the path associated with a view name
+ redirect,
+)
+from django.http import HttpResponse, HttpResponseRedirect ,Http404
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth import (
+ get_user_model,
+)
+
+from .forms import BlogForm
+from .models import BlogPost
+
+# Create your views here.
+def index(request):
+
+ return render(request, 'users/index.html')
+
+
+def profile(request, username):
+
+ user = get_object_or_404(get_user_model(), username=username)
+
+ blogs = BlogPost.objects.all().filter(user=user).order_by('-date_created')
+
+ context = {
+ 'user': user,
+ 'blogs': blogs
+ }
+
+ return render(request, 'blog/profile.html', context)
+
+@login_required
+def create(request):
+ if request.method == 'GET':
+ form = BlogForm
+ return render(request, 'blog/create.html', {'form':form})
+
+ elif request.method == 'POST':
+ form = BlogForm(request.POST)
+
+ if form.is_valid():
+ new_blog = form.save(commit=False)
+
+ new_blog.user = request.user
+
+
+ new_blog.save()
+ print(new_blog)
+ return redirect(reverse('blog:profile', kwargs={'username':request.user.username}))
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/lab02/__init__.py b/Code/Lee/Django/lab02/lab02/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab02/lab02/settings.py b/Code/Lee/Django/lab02/lab02/settings.py
new file mode 100644
index 00000000..c732471b
--- /dev/null
+++ b/Code/Lee/Django/lab02/lab02/settings.py
@@ -0,0 +1,136 @@
+"""
+Django settings for lab02 project.
+
+Generated by 'django-admin startproject' using Django 2.2.24.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.2/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '$2b-&5vm9($--j1c-)hx+$qyslo!tfhl4@mx-&m@a3qub@7sq5'
+
+# 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',
+
+ # my apps
+ 'users',
+ 'blog',
+]
+
+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 = 'lab02.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': ['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 = 'lab02.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.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/2.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/2.2/howto/static-files/
+
+STATIC_URL = '/static/'
+
+# LTC - Adding project level static folder
+STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] #[str(BASE_DIR.joinpath('static'))]
+
+# LTC - Add the CustomUser model as default user modeling
+AUTH_USER_MODEL = 'users.User'
+
+# LTC - Not exactly sure why Keegan added this, but I'll do it to be safe...
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/lab02/urls.py b/Code/Lee/Django/lab02/lab02/urls.py
new file mode 100644
index 00000000..f28811b8
--- /dev/null
+++ b/Code/Lee/Django/lab02/lab02/urls.py
@@ -0,0 +1,23 @@
+"""lab02 URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.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, include
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('users/', include('users.urls')),
+ path('', include('blog.urls')),
+]
diff --git a/Code/Lee/Django/lab02/lab02/wsgi.py b/Code/Lee/Django/lab02/lab02/wsgi.py
new file mode 100644
index 00000000..48249c44
--- /dev/null
+++ b/Code/Lee/Django/lab02/lab02/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for lab02 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/2.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab02.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Lee/Django/lab02/manage.py b/Code/Lee/Django/lab02/manage.py
new file mode 100755
index 00000000..12db0e6b
--- /dev/null
+++ b/Code/Lee/Django/lab02/manage.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab02.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/Code/Lee/Django/lab02/static/index.css b/Code/Lee/Django/lab02/static/index.css
new file mode 100644
index 00000000..e99d02da
--- /dev/null
+++ b/Code/Lee/Django/lab02/static/index.css
@@ -0,0 +1 @@
+/* Use this to consolidate css files for apps */
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/static/normalize.css b/Code/Lee/Django/lab02/static/normalize.css
new file mode 100644
index 00000000..7aa705db
--- /dev/null
+++ b/Code/Lee/Django/lab02/static/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+ html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ }
+
+ /* Sections
+ ========================================================================== */
+
+ /**
+ * Remove the margin in all browsers.
+ */
+
+ body {
+ margin: 0;
+ }
+
+ /**
+ * Render the `main` element consistently in IE.
+ */
+
+ main {
+ display: block;
+ }
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ ========================================================================== */
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /* Text-level semantics
+ ========================================================================== */
+
+ /**
+ * Remove the gray background on active links in IE 10.
+ */
+
+ a {
+ background-color: transparent;
+ }
+
+ /**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+ abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ /* Embedded content
+ ========================================================================== */
+
+ /**
+ * Remove the border on images inside links in IE 10.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /* Forms
+ ========================================================================== */
+
+ /**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+ }
+
+ /**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+ button,
+ input { /* 1 */
+ overflow: visible;
+ }
+
+ /**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+ button,
+ select { /* 1 */
+ text-transform: none;
+ }
+
+ /**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button;
+ }
+
+ /**
+ * Remove the inner border and padding in Firefox.
+ */
+
+ button::-moz-focus-inner,
+ [type="button"]::-moz-focus-inner,
+ [type="reset"]::-moz-focus-inner,
+ [type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+ button:-moz-focusring,
+ [type="button"]:-moz-focusring,
+ [type="reset"]:-moz-focusring,
+ [type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Correct the padding in Firefox.
+ */
+
+ fieldset {
+ padding: 0.35em 0.75em 0.625em;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+ progress {
+ vertical-align: baseline;
+ }
+
+ /**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+ textarea {
+ overflow: auto;
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+ [type="number"]::-webkit-inner-spin-button,
+ [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+ [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /* Interactive
+ ========================================================================== */
+
+ /*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+ details {
+ display: block;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Misc
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10+.
+ */
+
+ template {
+ display: none;
+ }
+
+ /**
+ * Add the correct display in IE 10.
+ */
+
+ [hidden] {
+ display: none;
+ }
diff --git a/Code/Lee/Django/lab02/static/raven.png b/Code/Lee/Django/lab02/static/raven.png
new file mode 100644
index 00000000..b995587b
Binary files /dev/null and b/Code/Lee/Django/lab02/static/raven.png differ
diff --git a/Code/Lee/Django/lab02/templates/base.html b/Code/Lee/Django/lab02/templates/base.html
new file mode 100644
index 00000000..5ec315ee
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/base.html
@@ -0,0 +1,28 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Blog
+
+
+
+
+ {% include 'partials/_navbar.html' %}
+
+ {% block content%}
+ {% endblock %}
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/templates/blog/create.html b/Code/Lee/Django/lab02/templates/blog/create.html
new file mode 100644
index 00000000..e3a39959
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/blog/create.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %} {% block content %}
+
+ New Entry
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/templates/blog/profile.html b/Code/Lee/Django/lab02/templates/blog/profile.html
new file mode 100644
index 00000000..8a67c877
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/blog/profile.html
@@ -0,0 +1,18 @@
+{% extends 'base.html' %}
+{% load static %}
+
+{% block content %}
+ Welcome to {{ user.username }} 's Blog History
+
+ {% for blog in blogs %}
+
+
+
+
{{ blog.title }}
+
{{ blog.body }}
+
+
+ {% endfor %}
+
+{% endblock content %}
+
diff --git a/Code/Lee/Django/lab02/templates/partials/_navbar.html b/Code/Lee/Django/lab02/templates/partials/_navbar.html
new file mode 100644
index 00000000..6a3126e5
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/partials/_navbar.html
@@ -0,0 +1,16 @@
+{%load static%}
+
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/templates/users/index.html b/Code/Lee/Django/lab02/templates/users/index.html
new file mode 100644
index 00000000..3bd5d32b
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/users/index.html
@@ -0,0 +1,5 @@
+{% extends 'base.html' %} {% block content %}
+ Class Raven's Blog Home Page
+
+{% endblock %}
+
diff --git a/Code/Lee/Django/lab02/templates/users/login.html b/Code/Lee/Django/lab02/templates/users/login.html
new file mode 100644
index 00000000..5c8caed5
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/users/login.html
@@ -0,0 +1,25 @@
+
+
+{% extends 'base.html' %}
+
+{% block content %}
+
+{% if error %}
+{{ error }}
+{% endif %}
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/templates/users/register.html b/Code/Lee/Django/lab02/templates/users/register.html
new file mode 100644
index 00000000..894505fe
--- /dev/null
+++ b/Code/Lee/Django/lab02/templates/users/register.html
@@ -0,0 +1,17 @@
+{% extends 'base.html' %}
+
+{% block content %}
+ Register for the Blog
+
+
+
+
+{% endblock content %}
+
diff --git a/Code/Lee/Django/lab02/users/__init__.py b/Code/Lee/Django/lab02/users/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab02/users/admin.py b/Code/Lee/Django/lab02/users/admin.py
new file mode 100644
index 00000000..8c38f3f3
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/Code/Lee/Django/lab02/users/apps.py b/Code/Lee/Django/lab02/users/apps.py
new file mode 100644
index 00000000..4ce1fabc
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class UsersConfig(AppConfig):
+ name = 'users'
diff --git a/Code/Lee/Django/lab02/users/forms.py b/Code/Lee/Django/lab02/users/forms.py
new file mode 100644
index 00000000..21f7174f
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/forms.py
@@ -0,0 +1,28 @@
+from django import forms
+from .models import User
+
+class UserForm(forms.ModelForm):
+
+ class Meta:
+ model = User
+
+ fields = [
+ 'first_name',
+ 'last_name',
+ 'email',
+ 'username',
+ 'password',
+ ]
+
+ #Customize the HTML Class for each
+ widgets = {
+ 'first_name': forms.TextInput(attrs={'class':'form-control'}),
+ 'last_name': forms.TextInput(attrs={'class':'form-control'}),
+ 'email' : forms.TextInput(attrs={'class':'form-control'}),
+ 'username': forms.TextInput(attrs={'class':'form-control', 'id':'check-users-forms-py'}),
+ 'password': forms.PasswordInput(attrs={'class':'form-control'}),
+ }
+
+class UserAuthForm(UserForm):
+ class Meta(UserForm.Meta):
+ fields = ['username', 'password', ]
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/users/migrations/0001_initial.py b/Code/Lee/Django/lab02/users/migrations/0001_initial.py
new file mode 100644
index 00000000..0467f5d5
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/migrations/0001_initial.py
@@ -0,0 +1,44 @@
+# Generated by Django 2.2.24 on 2022-01-04 04:03
+
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('auth', '0011_update_proxy_permissions'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='User',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('password', models.CharField(max_length=128, verbose_name='password')),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
+ ],
+ options={
+ 'verbose_name': 'user',
+ 'verbose_name_plural': 'users',
+ 'abstract': False,
+ },
+ managers=[
+ ('objects', django.contrib.auth.models.UserManager()),
+ ],
+ ),
+ ]
diff --git a/Code/Lee/Django/lab02/users/migrations/__init__.py b/Code/Lee/Django/lab02/users/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab02/users/models.py b/Code/Lee/Django/lab02/users/models.py
new file mode 100644
index 00000000..df505777
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/models.py
@@ -0,0 +1,13 @@
+from django.db import models
+from django.contrib.auth.models import AbstractUser
+
+# Create your models here.
+class User(AbstractUser):
+
+ # add more User fields here
+ # Keegan did this, so I do this ¯\_(ツ)_/¯
+ pass
+
+
+ def __str__(self):
+ return self.username
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/users/tests.py b/Code/Lee/Django/lab02/users/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Lee/Django/lab02/users/urls.py b/Code/Lee/Django/lab02/users/urls.py
new file mode 100644
index 00000000..14170e37
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/urls.py
@@ -0,0 +1,10 @@
+from django.urls import path
+
+from . import views
+
+app_name='users'
+urlpatterns = [
+ path('register/', views.register, name='register'),
+ path('login/', views.login, name='login'),
+ path('logout', views.logout, name='logout'),
+]
\ No newline at end of file
diff --git a/Code/Lee/Django/lab02/users/views.py b/Code/Lee/Django/lab02/users/views.py
new file mode 100644
index 00000000..85c26dda
--- /dev/null
+++ b/Code/Lee/Django/lab02/users/views.py
@@ -0,0 +1,75 @@
+from django.http.response import HttpResponse
+from django.shortcuts import get_object_or_404, render, reverse, redirect
+from django.http import HttpResponseRedirect
+from django.contrib.auth import (
+ authenticate,
+ login as user_login,
+ logout as user_logout,
+)
+from django.contrib.auth.decorators import login_required
+from .forms import UserForm, UserAuthForm
+from django.contrib.auth.models import User
+
+
+
+
+# Create your views here.
+# when register/ is visited with a GET request, the form will load. When register/ is visited with a POST request, the form will be processed
+def register(request):
+ # if 'GET' Request, serve the blank form
+ if request.method == 'GET':
+ new_form = UserForm()
+ context = { 'form' : new_form }
+ return render(request, 'users/register.html', context)
+
+ # if 'POST' Request, check values are valid and (if they are) create a new user with the info
+ elif request.method == 'POST':
+ form = UserAuthForm(request.POST)
+
+ if not form.is_valid():
+
+ context = {
+ 'form' : UserAuthForm(),
+ 'error' : form.errors,
+ }
+
+ elif form.is_valid():
+
+ add_user = form.save(commit=False)
+
+ add_user.set_password(form.cleaned_data['password'])
+
+ add_user.save()
+
+ return HttpResponseRedirect(reverse('blog:home'))
+
+
+def login(request):
+ # If the login request is 'GET', render the login page
+ if request.method == 'GET':
+ login_form = UserAuthForm()
+ return render(request, 'users/login.html', {'form':login_form})
+
+ # if it's a POST request, retrieve and send the login data to be authenticated in the DB
+ elif request.method == 'POST':
+
+ username = request.POST['username']
+ password = request.POST['password']
+ authenticated_user = authenticate(request, username=username, password=password)
+
+ # If invalid credentials, kick the user back to the login page with error message
+ if authenticated_user is None:
+ context = {
+ 'form': UserAuthForm(),
+ 'error': ['Username or password is incorrect! Please try again...']
+ }
+ return render(request, 'users/login.html', context)
+ else:
+ username = authenticated_user.username
+ user_login(request, authenticated_user)
+ return HttpResponseRedirect(reverse('blog:home'))
+
+
+def logout(request):
+ user_logout(request)
+ return redirect(reverse('users:login'))
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/lab03/__init__.py b/Code/Lee/Django/lab03/lab03/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab03/lab03/settings.py b/Code/Lee/Django/lab03/lab03/settings.py
new file mode 100644
index 00000000..184e47b7
--- /dev/null
+++ b/Code/Lee/Django/lab03/lab03/settings.py
@@ -0,0 +1,126 @@
+"""
+Django settings for lab03 project.
+
+Generated by 'django-admin startproject' using Django 2.2.24.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/2.2/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/2.2/ref/settings/
+"""
+
+from pathlib import Path
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'ewy%2g8k45+)&)0tdo5vlnz4rcn-)+wbdidb!42$qu2=8ux9ua'
+
+# 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',
+
+ 'pokedex',
+]
+
+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 = 'lab03.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [str(BASE_DIR.joinpath('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 = 'lab03.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/2.2/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': str(BASE_DIR / "db.sqlite3"),
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/2.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/2.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/2.2/howto/static-files/
+
+STATIC_URL = '/static/'
+STATICFILES_DIRS = [
+ str(BASE_DIR.joinpath('static'))
+]
+
diff --git a/Code/Lee/Django/lab03/lab03/urls.py b/Code/Lee/Django/lab03/lab03/urls.py
new file mode 100644
index 00000000..4b70d5dd
--- /dev/null
+++ b/Code/Lee/Django/lab03/lab03/urls.py
@@ -0,0 +1,23 @@
+"""lab03 URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/2.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
+from django.urls.conf import include
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('', include('pokedex.urls'),),
+]
diff --git a/Code/Lee/Django/lab03/lab03/wsgi.py b/Code/Lee/Django/lab03/lab03/wsgi.py
new file mode 100644
index 00000000..46c1deb0
--- /dev/null
+++ b/Code/Lee/Django/lab03/lab03/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for lab03 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/2.2/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab03.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Lee/Django/lab03/manage.py b/Code/Lee/Django/lab03/manage.py
new file mode 100755
index 00000000..ac3e265a
--- /dev/null
+++ b/Code/Lee/Django/lab03/manage.py
@@ -0,0 +1,21 @@
+#!/usr/bin/env python3
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lab03.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/Code/Lee/Django/lab03/pokedex/__init__.py b/Code/Lee/Django/lab03/pokedex/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab03/pokedex/admin.py b/Code/Lee/Django/lab03/pokedex/admin.py
new file mode 100644
index 00000000..35509e76
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+
+from .models import Pokemon
+# Register your models here.
+
+admin.site.register(Pokemon)
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/pokedex/apps.py b/Code/Lee/Django/lab03/pokedex/apps.py
new file mode 100644
index 00000000..25c82280
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class PokedexConfig(AppConfig):
+ name = 'pokedex'
diff --git a/Code/Lee/Django/lab03/pokedex/management/commands/load_pokemon.py b/Code/Lee/Django/lab03/pokedex/management/commands/load_pokemon.py
new file mode 100644
index 00000000..31971b8a
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/management/commands/load_pokemon.py
@@ -0,0 +1,34 @@
+from django.core.management.base import BaseCommand
+import requests
+from pokedex.models import Pokemon, PokemonType
+import json
+
+class Command(BaseCommand):
+
+ def handle(self, *args, **options):
+ Pokemon.objects.all().delete()
+ PokemonType.objects.all().delete()
+ pokedex = open('/home/pop/Documents/pdx_code/Class_Raven/Code/Lee/Django/lab03/pokedex/management/commands/pokemon.json')
+ pokedex = json.load(pokedex)
+ for pokemon in pokedex['pokemon']:
+ print(f"loading {pokemon['number']}. {pokemon['name']}")
+ number = int(pokemon["number"])
+ name = pokemon['name']
+ height = int(pokemon['height'])
+ weight = int(pokemon['weight'])
+ image_front = pokemon['image_front']
+ image_back = pokemon['image_back']
+ types = pokemon['types']
+
+ new_pokemon = Pokemon.objects.create(
+ number=number,
+ name=name,
+ height=height,
+ weight=weight,
+ image_front=image_front,
+ image_back=image_back,
+ )
+
+ for type in types:
+ pokemon_type, created = PokemonType.objects.get_or_create(name=type.capitalize())
+ new_pokemon.types.add(pokemon_type)
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/pokedex/management/commands/pokemon.json b/Code/Lee/Django/lab03/pokedex/management/commands/pokemon.json
new file mode 100644
index 00000000..0e383d62
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/management/commands/pokemon.json
@@ -0,0 +1,1883 @@
+{
+ "pokemon": [
+ {
+ "number": 1,
+ "name": "bulbasaur",
+ "height": 7,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/1.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bulbasaur"
+ },
+ {
+ "number": 2,
+ "name": "ivysaur",
+ "height": 10,
+ "weight": 130,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/2.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ivysaur"
+ },
+ {
+ "number": 3,
+ "name": "venusaur",
+ "height": 20,
+ "weight": 1000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/3.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venusaur"
+ },
+ {
+ "number": 4,
+ "name": "charmander",
+ "height": 6,
+ "weight": 85,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/4.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmander"
+ },
+ {
+ "number": 5,
+ "name": "charmeleon",
+ "height": 11,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/5.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmeleon"
+ },
+ {
+ "number": 6,
+ "name": "charizard",
+ "height": 17,
+ "weight": 905,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/6.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charizard"
+ },
+ {
+ "number": 7,
+ "name": "squirtle",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/7.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/squirtle"
+ },
+ {
+ "number": 8,
+ "name": "wartortle",
+ "height": 10,
+ "weight": 225,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/8.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wartortle"
+ },
+ {
+ "number": 9,
+ "name": "blastoise",
+ "height": 16,
+ "weight": 855,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/9.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/blastoise"
+ },
+ {
+ "number": 10,
+ "name": "caterpie",
+ "height": 3,
+ "weight": 29,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/10.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/caterpie"
+ },
+ {
+ "number": 11,
+ "name": "metapod",
+ "height": 7,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/11.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/metapod"
+ },
+ {
+ "number": 12,
+ "name": "butterfree",
+ "height": 11,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/12.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/butterfree"
+ },
+ {
+ "number": 13,
+ "name": "weedle",
+ "height": 3,
+ "weight": 32,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/13.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/13.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weedle"
+ },
+ {
+ "number": 14,
+ "name": "kakuna",
+ "height": 6,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/14.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/14.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kakuna"
+ },
+ {
+ "number": 15,
+ "name": "beedrill",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/15.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/15.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/beedrill"
+ },
+ {
+ "number": 16,
+ "name": "pidgey",
+ "height": 3,
+ "weight": 18,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/16.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/16.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgey"
+ },
+ {
+ "number": 17,
+ "name": "pidgeotto",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/17.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/17.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeotto"
+ },
+ {
+ "number": 18,
+ "name": "pidgeot",
+ "height": 15,
+ "weight": 395,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/18.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/18.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeot"
+ },
+ {
+ "number": 19,
+ "name": "rattata",
+ "height": 3,
+ "weight": 35,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/19.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/19.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rattata"
+ },
+ {
+ "number": 20,
+ "name": "raticate",
+ "height": 7,
+ "weight": 185,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/20.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/20.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raticate"
+ },
+ {
+ "number": 21,
+ "name": "spearow",
+ "height": 3,
+ "weight": 20,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/21.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/21.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/spearow"
+ },
+ {
+ "number": 22,
+ "name": "fearow",
+ "height": 12,
+ "weight": 380,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/22.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/22.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/fearow"
+ },
+ {
+ "number": 23,
+ "name": "ekans",
+ "height": 20,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/23.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/23.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ekans"
+ },
+ {
+ "number": 24,
+ "name": "arbok",
+ "height": 35,
+ "weight": 650,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/24.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/24.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arbok"
+ },
+ {
+ "number": 25,
+ "name": "pikachu",
+ "height": 4,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/25.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pikachu"
+ },
+ {
+ "number": 26,
+ "name": "raichu",
+ "height": 8,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/26.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/26.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raichu"
+ },
+ {
+ "number": 27,
+ "name": "sandshrew",
+ "height": 6,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/27.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/27.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandshrew"
+ },
+ {
+ "number": 28,
+ "name": "sandslash",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/28.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/28.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandslash"
+ },
+ {
+ "number": 29,
+ "name": "nidoran-f",
+ "height": 4,
+ "weight": 70,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/29.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/29.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-f"
+ },
+ {
+ "number": 30,
+ "name": "nidorina",
+ "height": 8,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/30.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/30.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorina"
+ },
+ {
+ "number": 31,
+ "name": "nidoqueen",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/31.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/31.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoqueen"
+ },
+ {
+ "number": 32,
+ "name": "nidoran-m",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/32.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/32.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-m"
+ },
+ {
+ "number": 33,
+ "name": "nidorino",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/33.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/33.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorino"
+ },
+ {
+ "number": 34,
+ "name": "nidoking",
+ "height": 14,
+ "weight": 620,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/34.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/34.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoking"
+ },
+ {
+ "number": 35,
+ "name": "clefairy",
+ "height": 6,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/35.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/35.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefairy"
+ },
+ {
+ "number": 36,
+ "name": "clefable",
+ "height": 13,
+ "weight": 400,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/36.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/36.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefable"
+ },
+ {
+ "number": 37,
+ "name": "vulpix",
+ "height": 6,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/37.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/37.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vulpix"
+ },
+ {
+ "number": 38,
+ "name": "ninetales",
+ "height": 11,
+ "weight": 199,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/38.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/38.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ninetales"
+ },
+ {
+ "number": 39,
+ "name": "jigglypuff",
+ "height": 5,
+ "weight": 55,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/39.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/39.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jigglypuff"
+ },
+ {
+ "number": 40,
+ "name": "wigglytuff",
+ "height": 10,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/40.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/40.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wigglytuff"
+ },
+ {
+ "number": 41,
+ "name": "zubat",
+ "height": 8,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/41.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/41.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zubat"
+ },
+ {
+ "number": 42,
+ "name": "golbat",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/42.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/42.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golbat"
+ },
+ {
+ "number": 43,
+ "name": "oddish",
+ "height": 5,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/43.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/43.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/oddish"
+ },
+ {
+ "number": 44,
+ "name": "gloom",
+ "height": 8,
+ "weight": 86,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/44.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/44.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gloom"
+ },
+ {
+ "number": 45,
+ "name": "vileplume",
+ "height": 12,
+ "weight": 186,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/45.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/45.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vileplume"
+ },
+ {
+ "number": 46,
+ "name": "paras",
+ "height": 3,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/46.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/46.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/paras"
+ },
+ {
+ "number": 47,
+ "name": "parasect",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/47.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/47.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/parasect"
+ },
+ {
+ "number": 48,
+ "name": "venonat",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/48.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/48.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venonat"
+ },
+ {
+ "number": 49,
+ "name": "venomoth",
+ "height": 15,
+ "weight": 125,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/49.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/49.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venomoth"
+ },
+ {
+ "number": 50,
+ "name": "diglett",
+ "height": 2,
+ "weight": 8,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/50.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/50.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/diglett"
+ },
+ {
+ "number": 51,
+ "name": "dugtrio",
+ "height": 7,
+ "weight": 333,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/51.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/51.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dugtrio"
+ },
+ {
+ "number": 52,
+ "name": "meowth",
+ "height": 4,
+ "weight": 42,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/52.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/52.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/meowth"
+ },
+ {
+ "number": 53,
+ "name": "persian",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/53.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/53.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/persian"
+ },
+ {
+ "number": 54,
+ "name": "psyduck",
+ "height": 8,
+ "weight": 196,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/54.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/54.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/psyduck"
+ },
+ {
+ "number": 55,
+ "name": "golduck",
+ "height": 17,
+ "weight": 766,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/55.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/55.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golduck"
+ },
+ {
+ "number": 56,
+ "name": "mankey",
+ "height": 5,
+ "weight": 280,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/56.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/56.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mankey"
+ },
+ {
+ "number": 57,
+ "name": "primeape",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/57.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/57.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/primeape"
+ },
+ {
+ "number": 58,
+ "name": "growlithe",
+ "height": 7,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/58.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/58.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/growlithe"
+ },
+ {
+ "number": 59,
+ "name": "arcanine",
+ "height": 19,
+ "weight": 1550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/59.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/59.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arcanine"
+ },
+ {
+ "number": 60,
+ "name": "poliwag",
+ "height": 6,
+ "weight": 124,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/60.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/60.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwag"
+ },
+ {
+ "number": 61,
+ "name": "poliwhirl",
+ "height": 10,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/61.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/61.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwhirl"
+ },
+ {
+ "number": 62,
+ "name": "poliwrath",
+ "height": 13,
+ "weight": 540,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/62.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/62.png",
+ "types": [
+ "fighting",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwrath"
+ },
+ {
+ "number": 63,
+ "name": "abra",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/63.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/63.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/abra"
+ },
+ {
+ "number": 64,
+ "name": "kadabra",
+ "height": 13,
+ "weight": 565,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/64.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/64.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kadabra"
+ },
+ {
+ "number": 65,
+ "name": "alakazam",
+ "height": 15,
+ "weight": 480,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/65.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/65.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/alakazam"
+ },
+ {
+ "number": 66,
+ "name": "machop",
+ "height": 8,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/66.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/66.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machop"
+ },
+ {
+ "number": 67,
+ "name": "machoke",
+ "height": 15,
+ "weight": 705,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/67.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/67.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machoke"
+ },
+ {
+ "number": 68,
+ "name": "machamp",
+ "height": 16,
+ "weight": 1300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/68.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/68.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machamp"
+ },
+ {
+ "number": 69,
+ "name": "bellsprout",
+ "height": 7,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/69.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/69.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bellsprout"
+ },
+ {
+ "number": 70,
+ "name": "weepinbell",
+ "height": 10,
+ "weight": 64,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/70.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/70.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weepinbell"
+ },
+ {
+ "number": 71,
+ "name": "victreebel",
+ "height": 17,
+ "weight": 155,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/71.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/71.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/victreebel"
+ },
+ {
+ "number": 72,
+ "name": "tentacool",
+ "height": 9,
+ "weight": 455,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/72.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/72.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacool"
+ },
+ {
+ "number": 73,
+ "name": "tentacruel",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/73.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/73.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacruel"
+ },
+ {
+ "number": 74,
+ "name": "geodude",
+ "height": 4,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/74.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/74.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/geodude"
+ },
+ {
+ "number": 75,
+ "name": "graveler",
+ "height": 10,
+ "weight": 1050,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/75.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/75.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/graveler"
+ },
+ {
+ "number": 76,
+ "name": "golem",
+ "height": 14,
+ "weight": 3000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/76.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/76.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golem"
+ },
+ {
+ "number": 77,
+ "name": "ponyta",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/77.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/77.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ponyta"
+ },
+ {
+ "number": 78,
+ "name": "rapidash",
+ "height": 17,
+ "weight": 950,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/78.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/78.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rapidash"
+ },
+ {
+ "number": 79,
+ "name": "slowpoke",
+ "height": 12,
+ "weight": 360,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/79.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/79.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowpoke"
+ },
+ {
+ "number": 80,
+ "name": "slowbro",
+ "height": 16,
+ "weight": 785,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/80.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/80.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowbro"
+ },
+ {
+ "number": 81,
+ "name": "magnemite",
+ "height": 3,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/81.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/81.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magnemite"
+ },
+ {
+ "number": 82,
+ "name": "magneton",
+ "height": 10,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/82.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/82.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magneton"
+ },
+ {
+ "number": 83,
+ "name": "farfetchd",
+ "height": 8,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/83.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/83.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/farfetchd"
+ },
+ {
+ "number": 84,
+ "name": "doduo",
+ "height": 14,
+ "weight": 392,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/84.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/84.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/doduo"
+ },
+ {
+ "number": 85,
+ "name": "dodrio",
+ "height": 18,
+ "weight": 852,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/85.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/85.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dodrio"
+ },
+ {
+ "number": 86,
+ "name": "seel",
+ "height": 11,
+ "weight": 900,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/86.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/86.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seel"
+ },
+ {
+ "number": 87,
+ "name": "dewgong",
+ "height": 17,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/87.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/87.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dewgong"
+ },
+ {
+ "number": 88,
+ "name": "grimer",
+ "height": 9,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/88.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/88.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/grimer"
+ },
+ {
+ "number": 89,
+ "name": "muk",
+ "height": 12,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/89.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/89.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/muk"
+ },
+ {
+ "number": 90,
+ "name": "shellder",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/90.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/90.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/shellder"
+ },
+ {
+ "number": 91,
+ "name": "cloyster",
+ "height": 15,
+ "weight": 1325,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/91.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/91.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cloyster"
+ },
+ {
+ "number": 92,
+ "name": "gastly",
+ "height": 13,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/92.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/92.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gastly"
+ },
+ {
+ "number": 93,
+ "name": "haunter",
+ "height": 16,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/93.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/93.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/haunter"
+ },
+ {
+ "number": 94,
+ "name": "gengar",
+ "height": 15,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/94.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/94.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gengar"
+ },
+ {
+ "number": 95,
+ "name": "onix",
+ "height": 88,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/95.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/95.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/onix"
+ },
+ {
+ "number": 96,
+ "name": "drowzee",
+ "height": 10,
+ "weight": 324,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/96.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/96.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/drowzee"
+ },
+ {
+ "number": 97,
+ "name": "hypno",
+ "height": 16,
+ "weight": 756,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/97.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/97.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hypno"
+ },
+ {
+ "number": 98,
+ "name": "krabby",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/98.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/98.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/krabby"
+ },
+ {
+ "number": 99,
+ "name": "kingler",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/99.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/99.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kingler"
+ },
+ {
+ "number": 100,
+ "name": "voltorb",
+ "height": 5,
+ "weight": 104,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/100.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/100.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/voltorb"
+ },
+ {
+ "number": 101,
+ "name": "electrode",
+ "height": 12,
+ "weight": 666,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/101.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/101.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electrode"
+ },
+ {
+ "number": 102,
+ "name": "exeggcute",
+ "height": 4,
+ "weight": 25,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/102.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/102.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggcute"
+ },
+ {
+ "number": 103,
+ "name": "exeggutor",
+ "height": 20,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/103.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/103.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggutor"
+ },
+ {
+ "number": 104,
+ "name": "cubone",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/104.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/104.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cubone"
+ },
+ {
+ "number": 105,
+ "name": "marowak",
+ "height": 10,
+ "weight": 450,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/105.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/105.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/marowak"
+ },
+ {
+ "number": 106,
+ "name": "hitmonlee",
+ "height": 15,
+ "weight": 498,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/106.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/106.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonlee"
+ },
+ {
+ "number": 107,
+ "name": "hitmonchan",
+ "height": 14,
+ "weight": 502,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/107.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/107.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonchan"
+ },
+ {
+ "number": 108,
+ "name": "lickitung",
+ "height": 12,
+ "weight": 655,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/108.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/108.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lickitung"
+ },
+ {
+ "number": 109,
+ "name": "koffing",
+ "height": 6,
+ "weight": 10,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/109.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/109.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/koffing"
+ },
+ {
+ "number": 110,
+ "name": "weezing",
+ "height": 12,
+ "weight": 95,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/110.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/110.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weezing"
+ },
+ {
+ "number": 111,
+ "name": "rhyhorn",
+ "height": 10,
+ "weight": 1150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/111.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/111.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhyhorn"
+ },
+ {
+ "number": 112,
+ "name": "rhydon",
+ "height": 19,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/112.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/112.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhydon"
+ },
+ {
+ "number": 113,
+ "name": "chansey",
+ "height": 11,
+ "weight": 346,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/113.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/113.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/chansey"
+ },
+ {
+ "number": 114,
+ "name": "tangela",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/114.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/114.png",
+ "types": [
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tangela"
+ },
+ {
+ "number": 115,
+ "name": "kangaskhan",
+ "height": 22,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/115.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/115.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kangaskhan"
+ },
+ {
+ "number": 116,
+ "name": "horsea",
+ "height": 4,
+ "weight": 80,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/116.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/116.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/horsea"
+ },
+ {
+ "number": 117,
+ "name": "seadra",
+ "height": 12,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/117.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/117.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seadra"
+ },
+ {
+ "number": 118,
+ "name": "goldeen",
+ "height": 6,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/118.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/118.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/goldeen"
+ },
+ {
+ "number": 119,
+ "name": "seaking",
+ "height": 13,
+ "weight": 390,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/119.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/119.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seaking"
+ },
+ {
+ "number": 120,
+ "name": "staryu",
+ "height": 8,
+ "weight": 345,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/120.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/120.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/staryu"
+ },
+ {
+ "number": 121,
+ "name": "starmie",
+ "height": 11,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/121.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/121.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/starmie"
+ },
+ {
+ "number": 122,
+ "name": "mr-mime",
+ "height": 13,
+ "weight": 545,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/122.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/122.png",
+ "types": [
+ "fairy",
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mr-mime"
+ },
+ {
+ "number": 123,
+ "name": "scyther",
+ "height": 15,
+ "weight": 560,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/123.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/123.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/scyther"
+ },
+ {
+ "number": 124,
+ "name": "jynx",
+ "height": 14,
+ "weight": 406,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/124.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/124.png",
+ "types": [
+ "psychic",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jynx"
+ },
+ {
+ "number": 125,
+ "name": "electabuzz",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/125.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/125.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electabuzz"
+ },
+ {
+ "number": 126,
+ "name": "magmar",
+ "height": 13,
+ "weight": 445,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/126.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/126.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magmar"
+ },
+ {
+ "number": 127,
+ "name": "pinsir",
+ "height": 15,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/127.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/127.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pinsir"
+ },
+ {
+ "number": 128,
+ "name": "tauros",
+ "height": 14,
+ "weight": 884,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/128.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/128.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tauros"
+ },
+ {
+ "number": 129,
+ "name": "magikarp",
+ "height": 9,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/129.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/129.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magikarp"
+ },
+ {
+ "number": 130,
+ "name": "gyarados",
+ "height": 65,
+ "weight": 2350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/130.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/130.png",
+ "types": [
+ "flying",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gyarados"
+ },
+ {
+ "number": 131,
+ "name": "lapras",
+ "height": 25,
+ "weight": 2200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/131.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/131.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lapras"
+ },
+ {
+ "number": 132,
+ "name": "ditto",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/132.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/132.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ditto"
+ },
+ {
+ "number": 133,
+ "name": "eevee",
+ "height": 3,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/133.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/133.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/eevee"
+ },
+ {
+ "number": 134,
+ "name": "vaporeon",
+ "height": 10,
+ "weight": 290,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/134.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/134.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vaporeon"
+ },
+ {
+ "number": 135,
+ "name": "jolteon",
+ "height": 8,
+ "weight": 245,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/135.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/135.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jolteon"
+ },
+ {
+ "number": 136,
+ "name": "flareon",
+ "height": 9,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/136.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/136.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/flareon"
+ },
+ {
+ "number": 137,
+ "name": "porygon",
+ "height": 8,
+ "weight": 365,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/137.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/137.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/porygon"
+ },
+ {
+ "number": 138,
+ "name": "omanyte",
+ "height": 4,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/138.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/138.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omanyte"
+ },
+ {
+ "number": 139,
+ "name": "omastar",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/139.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/139.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omastar"
+ },
+ {
+ "number": 140,
+ "name": "kabuto",
+ "height": 5,
+ "weight": 115,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/140.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/140.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabuto"
+ },
+ {
+ "number": 141,
+ "name": "kabutops",
+ "height": 13,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/141.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/141.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabutops"
+ },
+ {
+ "number": 142,
+ "name": "aerodactyl",
+ "height": 18,
+ "weight": 590,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/142.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/142.png",
+ "types": [
+ "flying",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/aerodactyl"
+ },
+ {
+ "number": 143,
+ "name": "snorlax",
+ "height": 21,
+ "weight": 4600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/143.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/143.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/snorlax"
+ },
+ {
+ "number": 144,
+ "name": "articuno",
+ "height": 17,
+ "weight": 554,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/144.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/144.png",
+ "types": [
+ "flying",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/articuno"
+ },
+ {
+ "number": 145,
+ "name": "zapdos",
+ "height": 16,
+ "weight": 526,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/145.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/145.png",
+ "types": [
+ "flying",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zapdos"
+ },
+ {
+ "number": 146,
+ "name": "moltres",
+ "height": 20,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/146.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/146.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/moltres"
+ },
+ {
+ "number": 147,
+ "name": "dratini",
+ "height": 18,
+ "weight": 33,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/147.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/147.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dratini"
+ },
+ {
+ "number": 148,
+ "name": "dragonair",
+ "height": 40,
+ "weight": 165,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/148.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/148.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonair"
+ },
+ {
+ "number": 149,
+ "name": "dragonite",
+ "height": 22,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/149.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/149.png",
+ "types": [
+ "flying",
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonite"
+ },
+ {
+ "number": 150,
+ "name": "mewtwo",
+ "height": 20,
+ "weight": 1220,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/150.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/150.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mewtwo"
+ },
+ {
+ "number": 151,
+ "name": "mew",
+ "height": 4,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/151.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/151.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mew"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/pokedex/migrations/0001_initial.py b/Code/Lee/Django/lab03/pokedex/migrations/0001_initial.py
new file mode 100644
index 00000000..6123b6b5
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/migrations/0001_initial.py
@@ -0,0 +1,34 @@
+# Generated by Django 2.2.24 on 2022-01-13 02:30
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='PokemonType',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Pokemon',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('number', models.IntegerField()),
+ ('name', models.CharField(max_length=100)),
+ ('height', models.FloatField()),
+ ('weight', models.FloatField()),
+ ('image_front', models.CharField(max_length=100)),
+ ('image_back', models.CharField(max_length=100)),
+ ('types', models.ManyToManyField(to='pokedex.PokemonType')),
+ ],
+ ),
+ ]
diff --git a/Code/Lee/Django/lab03/pokedex/migrations/__init__.py b/Code/Lee/Django/lab03/pokedex/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Lee/Django/lab03/pokedex/models.py b/Code/Lee/Django/lab03/pokedex/models.py
new file mode 100644
index 00000000..be6aa696
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/models.py
@@ -0,0 +1,19 @@
+from django.db import models
+
+# Create your models here.
+class PokemonType(models.Model):
+ name = models.CharField(max_length=100)
+ def __str__(self):
+ return self.name
+
+class Pokemon(models.Model):
+ number = models.IntegerField()
+ name = models.CharField(max_length=100)
+ height = models.FloatField()
+ weight = models.FloatField()
+ image_front = models.CharField(max_length=100)
+ image_back = models.CharField(max_length=100)
+ types = models.ManyToManyField(to=PokemonType, related_name="pokemon")
+
+ def __str__(self):
+ return self.name
diff --git a/Code/Lee/Django/lab03/pokedex/tests.py b/Code/Lee/Django/lab03/pokedex/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Lee/Django/lab03/pokedex/urls.py b/Code/Lee/Django/lab03/pokedex/urls.py
new file mode 100644
index 00000000..adf244e8
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/urls.py
@@ -0,0 +1,9 @@
+from django.urls import path
+from . import views
+
+
+app_name='pokedex'
+urlpatterns = [
+ path('', views.index, name='index'),
+ path('', views.select_element, name='select_element')
+]
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/pokedex/views.py b/Code/Lee/Django/lab03/pokedex/views.py
new file mode 100644
index 00000000..f41ac7b9
--- /dev/null
+++ b/Code/Lee/Django/lab03/pokedex/views.py
@@ -0,0 +1,28 @@
+from django.shortcuts import render
+from .models import Pokemon
+
+# Create your views here.
+def index(request):
+ """Takes in number or name of pokemon from navbar. Pulls list of all pokemon and filters against input. Returns search results or all Pokemonz."""
+
+ pokemon = Pokemon.objects.all().order_by('number') # All pokemon in DB
+ pokemon_search = request.POST.get('pokemon_search') # User request
+
+ if pokemon_search is None:
+ return render(request, 'index.html', {'pokemon':pokemon})
+
+ if pokemon.filter(name__icontains=pokemon_search):
+ pokemon = pokemon.filter(name__icontains=pokemon_search)
+ return render(request, 'index.html', {'pokemon':pokemon})
+
+ try:
+ pokemon = pokemon.filter(number=pokemon_search)
+ return render(request, 'index.html', {'pokemon':pokemon})
+
+ except ValueError:
+ return render(request, 'index.html', {'pokemon':pokemon})
+
+def select_element(request, element_id):
+ pokemon = Pokemon.objects.all().order_by('number')
+ pokemon = pokemon.filter(types__name__icontains=element_id) # searches for element of pokemon
+ return render(request, 'index.html', {'pokemon':pokemon})
diff --git a/Code/Lee/Django/lab03/static/index.css b/Code/Lee/Django/lab03/static/index.css
new file mode 100644
index 00000000..e99d02da
--- /dev/null
+++ b/Code/Lee/Django/lab03/static/index.css
@@ -0,0 +1 @@
+/* Use this to consolidate css files for apps */
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/static/normalize.css b/Code/Lee/Django/lab03/static/normalize.css
new file mode 100644
index 00000000..7aa705db
--- /dev/null
+++ b/Code/Lee/Django/lab03/static/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+ html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ }
+
+ /* Sections
+ ========================================================================== */
+
+ /**
+ * Remove the margin in all browsers.
+ */
+
+ body {
+ margin: 0;
+ }
+
+ /**
+ * Render the `main` element consistently in IE.
+ */
+
+ main {
+ display: block;
+ }
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ ========================================================================== */
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /* Text-level semantics
+ ========================================================================== */
+
+ /**
+ * Remove the gray background on active links in IE 10.
+ */
+
+ a {
+ background-color: transparent;
+ }
+
+ /**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+ abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ /* Embedded content
+ ========================================================================== */
+
+ /**
+ * Remove the border on images inside links in IE 10.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /* Forms
+ ========================================================================== */
+
+ /**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+ }
+
+ /**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+ button,
+ input { /* 1 */
+ overflow: visible;
+ }
+
+ /**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+ button,
+ select { /* 1 */
+ text-transform: none;
+ }
+
+ /**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button;
+ }
+
+ /**
+ * Remove the inner border and padding in Firefox.
+ */
+
+ button::-moz-focus-inner,
+ [type="button"]::-moz-focus-inner,
+ [type="reset"]::-moz-focus-inner,
+ [type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+ button:-moz-focusring,
+ [type="button"]:-moz-focusring,
+ [type="reset"]:-moz-focusring,
+ [type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Correct the padding in Firefox.
+ */
+
+ fieldset {
+ padding: 0.35em 0.75em 0.625em;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+ progress {
+ vertical-align: baseline;
+ }
+
+ /**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+ textarea {
+ overflow: auto;
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+ [type="number"]::-webkit-inner-spin-button,
+ [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+ [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /* Interactive
+ ========================================================================== */
+
+ /*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+ details {
+ display: block;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Misc
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10+.
+ */
+
+ template {
+ display: none;
+ }
+
+ /**
+ * Add the correct display in IE 10.
+ */
+
+ [hidden] {
+ display: none;
+ }
diff --git a/Code/Lee/Django/lab03/templates/base.html b/Code/Lee/Django/lab03/templates/base.html
new file mode 100644
index 00000000..15e998a6
--- /dev/null
+++ b/Code/Lee/Django/lab03/templates/base.html
@@ -0,0 +1,31 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Pokedex
+
+
+
+
+ {% include 'partials/navbar.html' %}
+
+
+ {% block content%}
+ {% endblock %}
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Django/lab03/templates/index.html b/Code/Lee/Django/lab03/templates/index.html
new file mode 100644
index 00000000..4c6df405
--- /dev/null
+++ b/Code/Lee/Django/lab03/templates/index.html
@@ -0,0 +1,31 @@
+{% extends 'base.html' %} {% load static %}{% block content %}
+ Pokedex
+
+
+{% for item in pokemon %}
+
+
+
+
+
+
+
+
{{item.number}}. {{item.name.upper}}
+
+
+
+ Height: {{item.height}}'
+ Weight: {{item.weight}} lbs
+ Type: {% for type in item.types.all %}
+ {{type}}
+ {% endfor %}
+
+
+
+
+
+
+{% endfor %}
+
+
+{% endblock %}
diff --git a/Code/Lee/Django/lab03/templates/partials/navbar.html b/Code/Lee/Django/lab03/templates/partials/navbar.html
new file mode 100644
index 00000000..6ba0dcef
--- /dev/null
+++ b/Code/Lee/Django/lab03/templates/partials/navbar.html
@@ -0,0 +1,71 @@
+{%load static%}
+
+
+
+
+
+
+
+
+
Open
+
+
+
Complete
+
+
+
+
+
+
+
+
+
+
+
Copyright © 2021 Lee Colburn Jk, not really.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Javascript/lab04/todo.js b/Code/Lee/Javascript/lab04/todo.js
new file mode 100644
index 00000000..b8aca911
--- /dev/null
+++ b/Code/Lee/Javascript/lab04/todo.js
@@ -0,0 +1,127 @@
+$(document).ready(function () {
+ let todoList = [
+ {item : "This is the first item",
+ complete : false},
+ {item : "This item should be struck through because it is complete",
+ complete : true},
+ {item : "Go to the store",
+ complete : false},
+]
+
+let $openList = $("#openList");
+let $completeList = $("#completeList");
+let $newTask = $("#newTask");
+
+// Generates new todo based on button click
+$newTask.click(()=>{
+ addTodo()
+ createTodoList()
+ })
+
+// Opens prompt to take in todo item, and adds it to the list of oustanding tasks
+function addTodo() {
+ let newTodo = prompt("Enter your todo item: ") // get new todo
+ appendTodo(newTodo)
+}
+
+// Takes in a new todo from addTodo and appends it to todoList
+function appendTodo(todo) {
+ let newItem = {
+ item: todo,
+ complete: false
+ }
+ todoList = todoList.concat(newItem)
+ createTodoList()
+
+ }
+
+
+// delete the todo entry to be removed entirely from the list
+function deleteTodo(todoToDelete){
+ for(let i=0; i < todoList.length; i++) {
+ if(todoList[i].item === todoToDelete.item){
+ todoList.splice(i,1)
+ return
+ }
+ }
+}
+
+// Allow the todo item to change to/from open & complete
+function changeTodo(targetTodo) {
+ for (let i=0; i < todoList.length; i++) {
+ if(todoList[i].item === targetTodo.item) {
+ todoList[i].complete = !todoList[i].complete
+ }
+ }
+ }
+
+
+
+// Create a todo item
+function makeNewTodoItem(todo) {
+ let $newTodoItem, $newButtons
+
+ // new div for the item
+ $newTodoItem = $(`
${todo.item}
`)
+ $newTodoItem.addClass("col-12 col-lg-6 offset-lg-3")
+
+ $newButtons = makeNewButtons(todo) // make them buttons
+
+ $newTodoItem.append($newButtons)
+ console.log($newTodoItem)
+
+ return $newTodoItem
+}
+
+// Create complete and delete buttons. Add to new div.
+function makeNewButtons(todo) {
+ let $buttons, $completeButton, $deleteButton
+
+ $buttons = $('
')
+ $buttons.addClass('mx-2')
+
+ // make a new complete button with function to toggle complete/open
+ $completeButton = $(`
`)
+ $completeButton.addClass('bi bi-check-square')
+ $completeButton.click(() => {
+ changeTodo(todo)
+ createTodoList()
+ })
+
+ // make a new delete button. add function to delete todo item on click
+ $deleteButton = $(`
`)
+ $deleteButton.addClass('bi bi-trash mx-1')
+ $deleteButton.click(() => {
+ deleteTodo(todo)
+ createTodoList()
+ })
+ $buttons.append([$completeButton, $deleteButton])
+ return $buttons
+}
+
+// Clear the Todo List
+function clearTodoList() {
+ $completeList.html('')
+ $openList.html('')
+}
+
+// Update the Open and Complete lists
+function createTodoList () {
+ let $todoItem
+
+ clearTodoList()
+ todoList.forEach(todo => { // cycles through the todo list items and makes a new div item from makeNewTodoItem.
+ $todoItem = makeNewTodoItem(todo)
+ // filter the todo items into the completed or open lists
+ if (todo.complete) {
+ $completeList.append($todoItem)
+
+ } else {
+ $openList.append($todoItem)
+ }
+ });
+}
+
+createTodoList()
+
+})
diff --git a/Code/Lee/Javascript/lab05/css/index.css b/Code/Lee/Javascript/lab05/css/index.css
new file mode 100644
index 00000000..6b733a7c
--- /dev/null
+++ b/Code/Lee/Javascript/lab05/css/index.css
@@ -0,0 +1,19 @@
+.quote-item {
+ margin: 10px 10px;
+ font-size: 1.5rem;
+}
+
+.card-body {
+ margin: 10px 10px;
+}
+
+.blockquote {
+ margin: 10px 10px;
+}
+
+#quote-author {
+ margin: 10px 50px;
+ margin-bottom: 3rem;
+ text-align: right;
+}
+
diff --git a/Code/Lee/Javascript/lab05/css/theme.css b/Code/Lee/Javascript/lab05/css/theme.css
new file mode 100644
index 00000000..5d4ac443
--- /dev/null
+++ b/Code/Lee/Javascript/lab05/css/theme.css
@@ -0,0 +1,7 @@
+/* Created with Themestr.app */
+/*! `Custom` Bootstrap 5 theme */@import url(https://fonts.googleapis.com/css?family=Comfortaa:200,300,400,700);/*!
+ * Bootstrap v5.0.1 (https://getbootstrap.com/)
+ * Copyright 2011-2021 The Bootstrap Authors
+ * Copyright 2011-2021 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
+ */:root{--bs-blue: #0d6efd;--bs-indigo: #6610f2;--bs-purple: #6f42c1;--bs-pink: #d63384;--bs-red: #dc3545;--bs-orange: #fd7e14;--bs-yellow: #ffc107;--bs-green: #198754;--bs-teal: #20c997;--bs-cyan: #0dcaf0;--bs-white: #fff;--bs-gray: #6c757d;--bs-gray-dark: #343a40;--bs-primary: #083358;--bs-secondary: #F67280;--bs-success: #0074E4;--bs-info: #74DBEF;--bs-warning: #FC3C3C;--bs-danger: #FF4057;--bs-light: #F2F2F0;--bs-dark: #072247;--bs-font-sans-serif: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--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))}*,*::before,*::after{box-sizing:border-box}@media (prefers-reduced-motion: no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-font-sans-serif);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0)}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:3px}h1,.h1,h2,.h2,h3,.h3,h4,.h4,h5,.h5,h6,.h6{margin-top:0;margin-bottom:.5rem;font-family:Comfortaa;font-weight:500;line-height:1.2}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],abbr[data-bs-original-title]{text-decoration:underline dotted;cursor:help;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}ol,ul,dl{margin-top:0;margin-bottom:1rem}ol ol,ul ul,ol ul,ul ol{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:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#083358;text-decoration:underline}a:hover{color:#062946}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}pre,code,kbd,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr /* rtl:ignore */;unicode-bidi:bidi-override}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:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}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:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}thead,tbody,tfoot,tr,td,th{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}input,button,select,optgroup,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]::-webkit-calendar-picker-indicator{display:none}button,[type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button:not(:disabled),[type="button"]:not(:disabled),[type="reset"]:not(:disabled),[type="submit"]: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-fields-wrapper,::-webkit-datetime-edit-text,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type="search"]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-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:#6c757d}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:3px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.table{--bs-table-bg: rgba(0,0,0,0);--bs-table-accent-bg: rgba(0,0,0,0);--bs-table-striped-color: #212529;--bs-table-striped-bg: rgba(0,0,0,0.05);--bs-table-active-color: #212529;--bs-table-active-bg: rgba(0,0,0,0.1);--bs-table-hover-color: #212529;--bs-table-hover-bg: rgba(0,0,0,0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:3px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:last-child)>:last-child>*{border-bottom-color:currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:3px 0}.table-bordered>:not(caption)>*>*{border-width:0 3px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-striped>tbody>tr:nth-of-type(odd){--bs-table-accent-bg: var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg: var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover{--bs-table-accent-bg: var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg: #ced6de;--bs-table-striped-bg: #c4cbd3;--bs-table-striped-color: #000;--bs-table-active-bg: #b9c1c8;--bs-table-active-color: #000;--bs-table-hover-bg: #bfc6cd;--bs-table-hover-color: #000;color:#000;border-color:#b9c1c8}.table-secondary{--bs-table-bg: #fde3e6;--bs-table-striped-bg: #f0d8db;--bs-table-striped-color: #000;--bs-table-active-bg: #e4cccf;--bs-table-active-color: #000;--bs-table-hover-bg: #ead2d5;--bs-table-hover-color: #000;color:#000;border-color:#e4cccf}.table-success{--bs-table-bg: #cce3fa;--bs-table-striped-bg: #c2d8ee;--bs-table-striped-color: #000;--bs-table-active-bg: #b8cce1;--bs-table-active-color: #000;--bs-table-hover-bg: #bdd2e7;--bs-table-hover-color: #000;color:#000;border-color:#b8cce1}.table-info{--bs-table-bg: #e3f8fc;--bs-table-striped-bg: #d8ecef;--bs-table-striped-color: #000;--bs-table-active-bg: #ccdfe3;--bs-table-active-color: #000;--bs-table-hover-bg: #d2e5e9;--bs-table-hover-color: #000;color:#000;border-color:#ccdfe3}.table-warning{--bs-table-bg: #fed8d8;--bs-table-striped-bg: #f1cdcd;--bs-table-striped-color: #000;--bs-table-active-bg: #e5c2c2;--bs-table-active-color: #000;--bs-table-hover-bg: #ebc8c8;--bs-table-hover-color: #000;color:#000;border-color:#e5c2c2}.table-danger{--bs-table-bg: #ffd9dd;--bs-table-striped-bg: #f2ced2;--bs-table-striped-color: #000;--bs-table-active-bg: #e6c3c7;--bs-table-active-color: #000;--bs-table-hover-bg: #ecc9cc;--bs-table-hover-color: #000;color:#000;border-color:#e6c3c7}.table-light{--bs-table-bg: #F2F2F0;--bs-table-striped-bg: #e6e6e4;--bs-table-striped-color: #000;--bs-table-active-bg: #dadad8;--bs-table-active-color: #000;--bs-table-hover-bg: #e0e0de;--bs-table-hover-color: #000;color:#000;border-color:#dadad8}.table-dark{--bs-table-bg: #072247;--bs-table-striped-bg: #132d50;--bs-table-striped-color: #fff;--bs-table-active-bg: #203859;--bs-table-active-color: #fff;--bs-table-hover-bg: #1a3355;--bs-table-hover-color: #fff;color:#fff;border-color:#203859}.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 + 3px);padding-bottom:calc(.375rem + 3px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 3px);padding-bottom:calc(.5rem + 3px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 3px);padding-bottom:calc(.25rem + 3px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:3px solid #ced4da;appearance:none;border-radius:.25rem;transition:border-color 0.15s ease-in-out,box-shadow 0.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:#212529;background-color:#fff;border-color:#8499ac;outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:3px;border-radius:0;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}@media (prefers-reduced-motion: reduce){.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:3px;border-radius:0;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}@media (prefers-reduced-motion: reduce){.form-control::-webkit-file-upload-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:3px 0}.form-control-plaintext.form-control-sm,.form-control-plaintext.form-control-lg{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 6px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 6px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 6px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 6px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 6px)}.form-control-color{max-width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:3px solid #ced4da;border-radius:.25rem;appearance:none}.form-select:focus{border-color:#8499ac;outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.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-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,0.25);appearance:none;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:#8499ac;outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.form-check-input:checked{background-color:#083358;border-color:#083358}.form-check-input:checked[type="checkbox"]{background-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 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type="radio"]{background-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:#083358;border-color:#083358;background-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{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image: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");background-position:left center;border-radius:2em;transition:background-position 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%238499ac'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image: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-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}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(8,51,88,0.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(8,51,88,0.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#083358;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-webkit-slider-thumb{transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b5c2cd}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#083358;border:0;border-radius:1rem;transition:background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out;appearance:none}@media (prefers-reduced-motion: reduce){.form-range::-moz-range-thumb{transition:none}}.form-range::-moz-range-thumb:active{background-color:#b5c2cd}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 6px);padding:1rem .75rem}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:3px solid transparent;transform-origin:0 0;transition:opacity 0.1s ease-in-out,transform 0.1s ease-in-out}@media (prefers-reduced-motion: reduce){.form-floating>label{transition:none}}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.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:focus ~ label,.form-floating>.form-control:not(:placeholder-shown) ~ label,.form-floating>.form-select ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.form-floating>.form-control:-webkit-autofill ~ label{opacity:.65;transform:scale(0.85) translateY(-0.5rem) translateX(0.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:3px solid #ced4da;border-radius:.25rem}.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text,.input-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text,.input-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu),.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu),.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4){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:-3px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#0074E4}.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:rgba(0,116,228,0.9);border-radius:.25rem}.was-validated :valid ~ .valid-feedback,.was-validated :valid ~ .valid-tooltip,.is-valid ~ .valid-feedback,.is-valid ~ .valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#0074E4;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='%230074E4' d='M2.3 6.73L.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)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#0074E4;box-shadow:0 0 0 .25rem rgba(0,116,228,0.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)}.was-validated .form-select:valid,.form-select.is-valid{border-color:#0074E4}.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"],.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%230074E4' d='M2.3 6.73L.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-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:valid:focus,.form-select.is-valid:focus{border-color:#0074E4;box-shadow:0 0 0 .25rem rgba(0,116,228,0.25)}.was-validated .form-check-input:valid,.form-check-input.is-valid{border-color:#0074E4}.was-validated .form-check-input:valid:checked,.form-check-input.is-valid:checked{background-color:#0074E4}.was-validated .form-check-input:valid:focus,.form-check-input.is-valid:focus{box-shadow:0 0 0 .25rem rgba(0,116,228,0.25)}.was-validated .form-check-input:valid ~ .form-check-label,.form-check-input.is-valid ~ .form-check-label{color:#0074E4}.form-check-inline .form-check-input ~ .valid-feedback{margin-left:.5em}.was-validated .input-group .form-control:valid,.input-group .form-control.is-valid,.was-validated .input-group .form-select:valid,.input-group .form-select.is-valid{z-index:1}.was-validated .input-group .form-control:valid:focus,.input-group .form-control.is-valid:focus,.was-validated .input-group .form-select:valid:focus,.input-group .form-select.is-valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#FF4057}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#000;background-color:rgba(255,64,87,0.9);border-radius:.25rem}.was-validated :invalid ~ .invalid-feedback,.was-validated :invalid ~ .invalid-tooltip,.is-invalid ~ .invalid-feedback,.is-invalid ~ .invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#FF4057;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='%23FF4057'%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='%23FF4057' 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)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#FF4057;box-shadow:0 0 0 .25rem rgba(255,64,87,0.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)}.was-validated .form-select:invalid,.form-select.is-invalid{border-color:#FF4057}.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"],.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),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='%23FF4057'%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='%23FF4057' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.was-validated .form-select:invalid:focus,.form-select.is-invalid:focus{border-color:#FF4057;box-shadow:0 0 0 .25rem rgba(255,64,87,0.25)}.was-validated .form-check-input:invalid,.form-check-input.is-invalid{border-color:#FF4057}.was-validated .form-check-input:invalid:checked,.form-check-input.is-invalid:checked{background-color:#FF4057}.was-validated .form-check-input:invalid:focus,.form-check-input.is-invalid:focus{box-shadow:0 0 0 .25rem rgba(255,64,87,0.25)}.was-validated .form-check-input:invalid ~ .form-check-label,.form-check-input.is-invalid ~ .form-check-label{color:#FF4057}.form-check-inline .form-check-input ~ .invalid-feedback{margin-left:.5em}.was-validated .input-group .form-control:invalid,.input-group .form-control.is-invalid,.was-validated .input-group .form-select:invalid,.input-group .form-select.is-invalid{z-index:2}.was-validated .input-group .form-control:invalid:focus,.input-group .form-control.is-invalid:focus,.was-validated .input-group .form-select:invalid:focus,.input-group .form-select.is-invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;user-select:none;background-color:transparent;border:3px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:1.35rem;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}@media (prefers-reduced-motion: reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.btn:disabled,.btn.disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#083358;border-color:#083358}.btn-primary:hover{color:#fff;background-color:#072b4b;border-color:#062946}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#072b4b;border-color:#062946;box-shadow:0 0 0 .25rem rgba(45,82,113,0.5)}.btn-check:checked+.btn-primary,.btn-check:active+.btn-primary,.btn-primary:active,.btn-primary.active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#062946;border-color:#062642}.btn-check:checked+.btn-primary:focus,.btn-check:active+.btn-primary:focus,.btn-primary:active:focus,.btn-primary.active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(45,82,113,0.5)}.btn-primary:disabled,.btn-primary.disabled{color:#fff;background-color:#083358;border-color:#083358}.btn-secondary{color:#000;background-color:#F67280;border-color:#F67280}.btn-secondary:hover{color:#000;background-color:#f78793;border-color:#f7808d}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#000;background-color:#f78793;border-color:#f7808d;box-shadow:0 0 0 .25rem rgba(209,97,109,0.5)}.btn-check:checked+.btn-secondary,.btn-check:active+.btn-secondary,.btn-secondary:active,.btn-secondary.active,.show>.btn-secondary.dropdown-toggle{color:#000;background-color:#f88e99;border-color:#f7808d}.btn-check:checked+.btn-secondary:focus,.btn-check:active+.btn-secondary:focus,.btn-secondary:active:focus,.btn-secondary.active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(209,97,109,0.5)}.btn-secondary:disabled,.btn-secondary.disabled{color:#000;background-color:#F67280;border-color:#F67280}.btn-success{color:#fff;background-color:#0074E4;border-color:#0074E4}.btn-success:hover{color:#fff;background-color:#0063c2;border-color:#005db6}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#0063c2;border-color:#005db6;box-shadow:0 0 0 .25rem rgba(38,137,232,0.5)}.btn-check:checked+.btn-success,.btn-check:active+.btn-success,.btn-success:active,.btn-success.active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#005db6;border-color:#0057ab}.btn-check:checked+.btn-success:focus,.btn-check:active+.btn-success:focus,.btn-success:active:focus,.btn-success.active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(38,137,232,0.5)}.btn-success:disabled,.btn-success.disabled{color:#fff;background-color:#0074E4;border-color:#0074E4}.btn-info{color:#000;background-color:#74DBEF;border-color:#74DBEF}.btn-info:hover{color:#000;background-color:#89e0f1;border-color:#82dff1}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#89e0f1;border-color:#82dff1;box-shadow:0 0 0 .25rem rgba(99,186,203,0.5)}.btn-check:checked+.btn-info,.btn-check:active+.btn-info,.btn-info:active,.btn-info.active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#90e2f2;border-color:#82dff1}.btn-check:checked+.btn-info:focus,.btn-check:active+.btn-info:focus,.btn-info:active:focus,.btn-info.active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(99,186,203,0.5)}.btn-info:disabled,.btn-info.disabled{color:#000;background-color:#74DBEF;border-color:#74DBEF}.btn-warning{color:#000;background-color:#FC3C3C;border-color:#FC3C3C}.btn-warning:hover{color:#000;background-color:#fc5959;border-color:#fc5050}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#fc5959;border-color:#fc5050;box-shadow:0 0 0 .25rem rgba(214,51,51,0.5)}.btn-check:checked+.btn-warning,.btn-check:active+.btn-warning,.btn-warning:active,.btn-warning.active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#fd6363;border-color:#fc5050}.btn-check:checked+.btn-warning:focus,.btn-check:active+.btn-warning:focus,.btn-warning:active:focus,.btn-warning.active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(214,51,51,0.5)}.btn-warning:disabled,.btn-warning.disabled{color:#000;background-color:#FC3C3C;border-color:#FC3C3C}.btn-danger{color:#000;background-color:#FF4057;border-color:#FF4057}.btn-danger:hover{color:#000;background-color:#ff5d70;border-color:#ff5368}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#000;background-color:#ff5d70;border-color:#ff5368;box-shadow:0 0 0 .25rem rgba(217,54,74,0.5)}.btn-check:checked+.btn-danger,.btn-check:active+.btn-danger,.btn-danger:active,.btn-danger.active,.show>.btn-danger.dropdown-toggle{color:#000;background-color:#ff6679;border-color:#ff5368}.btn-check:checked+.btn-danger:focus,.btn-check:active+.btn-danger:focus,.btn-danger:active:focus,.btn-danger.active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,54,74,0.5)}.btn-danger:disabled,.btn-danger.disabled{color:#000;background-color:#FF4057;border-color:#FF4057}.btn-light{color:#000;background-color:#F2F2F0;border-color:#F2F2F0}.btn-light:hover{color:#000;background-color:#f4f4f2;border-color:#f3f3f2}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f4f4f2;border-color:#f3f3f2;box-shadow:0 0 0 .25rem rgba(206,206,204,0.5)}.btn-check:checked+.btn-light,.btn-check:active+.btn-light,.btn-light:active,.btn-light.active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f5f5f3;border-color:#f3f3f2}.btn-check:checked+.btn-light:focus,.btn-check:active+.btn-light:focus,.btn-light:active:focus,.btn-light.active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(206,206,204,0.5)}.btn-light:disabled,.btn-light.disabled{color:#000;background-color:#F2F2F0;border-color:#F2F2F0}.btn-dark{color:#fff;background-color:#072247;border-color:#072247}.btn-dark:hover{color:#fff;background-color:#061d3c;border-color:#061b39}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#061d3c;border-color:#061b39;box-shadow:0 0 0 .25rem rgba(44,67,99,0.5)}.btn-check:checked+.btn-dark,.btn-check:active+.btn-dark,.btn-dark:active,.btn-dark.active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#061b39;border-color:#051a35}.btn-check:checked+.btn-dark:focus,.btn-check:active+.btn-dark:focus,.btn-dark:active:focus,.btn-dark.active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(44,67,99,0.5)}.btn-dark:disabled,.btn-dark.disabled{color:#fff;background-color:#072247;border-color:#072247}.btn-outline-primary{color:#083358;border-color:#083358}.btn-outline-primary:hover{color:#fff;background-color:#083358;border-color:#083358}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(8,51,88,0.5)}.btn-check:checked+.btn-outline-primary,.btn-check:active+.btn-outline-primary,.btn-outline-primary:active,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show{color:#fff;background-color:#083358;border-color:#083358}.btn-check:checked+.btn-outline-primary:focus,.btn-check:active+.btn-outline-primary:focus,.btn-outline-primary:active:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(8,51,88,0.5)}.btn-outline-primary:disabled,.btn-outline-primary.disabled{color:#083358;background-color:transparent}.btn-outline-secondary{color:#F67280;border-color:#F67280}.btn-outline-secondary:hover{color:#000;background-color:#F67280;border-color:#F67280}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(246,114,128,0.5)}.btn-check:checked+.btn-outline-secondary,.btn-check:active+.btn-outline-secondary,.btn-outline-secondary:active,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show{color:#000;background-color:#F67280;border-color:#F67280}.btn-check:checked+.btn-outline-secondary:focus,.btn-check:active+.btn-outline-secondary:focus,.btn-outline-secondary:active:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(246,114,128,0.5)}.btn-outline-secondary:disabled,.btn-outline-secondary.disabled{color:#F67280;background-color:transparent}.btn-outline-success{color:#0074E4;border-color:#0074E4}.btn-outline-success:hover{color:#fff;background-color:#0074E4;border-color:#0074E4}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(0,116,228,0.5)}.btn-check:checked+.btn-outline-success,.btn-check:active+.btn-outline-success,.btn-outline-success:active,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show{color:#fff;background-color:#0074E4;border-color:#0074E4}.btn-check:checked+.btn-outline-success:focus,.btn-check:active+.btn-outline-success:focus,.btn-outline-success:active:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(0,116,228,0.5)}.btn-outline-success:disabled,.btn-outline-success.disabled{color:#0074E4;background-color:transparent}.btn-outline-info{color:#74DBEF;border-color:#74DBEF}.btn-outline-info:hover{color:#000;background-color:#74DBEF;border-color:#74DBEF}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(116,219,239,0.5)}.btn-check:checked+.btn-outline-info,.btn-check:active+.btn-outline-info,.btn-outline-info:active,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show{color:#000;background-color:#74DBEF;border-color:#74DBEF}.btn-check:checked+.btn-outline-info:focus,.btn-check:active+.btn-outline-info:focus,.btn-outline-info:active:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(116,219,239,0.5)}.btn-outline-info:disabled,.btn-outline-info.disabled{color:#74DBEF;background-color:transparent}.btn-outline-warning{color:#FC3C3C;border-color:#FC3C3C}.btn-outline-warning:hover{color:#000;background-color:#FC3C3C;border-color:#FC3C3C}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(252,60,60,0.5)}.btn-check:checked+.btn-outline-warning,.btn-check:active+.btn-outline-warning,.btn-outline-warning:active,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show{color:#000;background-color:#FC3C3C;border-color:#FC3C3C}.btn-check:checked+.btn-outline-warning:focus,.btn-check:active+.btn-outline-warning:focus,.btn-outline-warning:active:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(252,60,60,0.5)}.btn-outline-warning:disabled,.btn-outline-warning.disabled{color:#FC3C3C;background-color:transparent}.btn-outline-danger{color:#FF4057;border-color:#FF4057}.btn-outline-danger:hover{color:#000;background-color:#FF4057;border-color:#FF4057}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(255,64,87,0.5)}.btn-check:checked+.btn-outline-danger,.btn-check:active+.btn-outline-danger,.btn-outline-danger:active,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show{color:#000;background-color:#FF4057;border-color:#FF4057}.btn-check:checked+.btn-outline-danger:focus,.btn-check:active+.btn-outline-danger:focus,.btn-outline-danger:active:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(255,64,87,0.5)}.btn-outline-danger:disabled,.btn-outline-danger.disabled{color:#FF4057;background-color:transparent}.btn-outline-light{color:#F2F2F0;border-color:#F2F2F0}.btn-outline-light:hover{color:#000;background-color:#F2F2F0;border-color:#F2F2F0}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(242,242,240,0.5)}.btn-check:checked+.btn-outline-light,.btn-check:active+.btn-outline-light,.btn-outline-light:active,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show{color:#000;background-color:#F2F2F0;border-color:#F2F2F0}.btn-check:checked+.btn-outline-light:focus,.btn-check:active+.btn-outline-light:focus,.btn-outline-light:active:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(242,242,240,0.5)}.btn-outline-light:disabled,.btn-outline-light.disabled{color:#F2F2F0;background-color:transparent}.btn-outline-dark{color:#072247;border-color:#072247}.btn-outline-dark:hover{color:#fff;background-color:#072247;border-color:#072247}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(7,34,71,0.5)}.btn-check:checked+.btn-outline-dark,.btn-check:active+.btn-outline-dark,.btn-outline-dark:active,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show{color:#fff;background-color:#072247;border-color:#072247}.btn-check:checked+.btn-outline-dark:focus,.btn-check:active+.btn-outline-dark:focus,.btn-outline-dark:active:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus{box-shadow:0 0 0 .25rem rgba(7,34,71,0.5)}.btn-outline-dark:disabled,.btn-outline-dark.disabled{color:#072247;background-color:transparent}.btn-link{font-weight:400;color:#083358;text-decoration:underline}.btn-link:hover{color:#062946}.btn-link:disabled,.btn-link.disabled{color:#6c757d}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity 0.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 0.35s ease}@media (prefers-reduced-motion: reduce){.collapsing{transition:none}}.dropup,.dropend,.dropdown,.dropstart{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{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:3px solid rgba(0,0,0,0.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position: start}.dropdown-menu-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-end{--bs-position: end}.dropdown-menu-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}@media (min-width: 576px){.dropdown-menu-sm-start{--bs-position: start}.dropdown-menu-sm-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-sm-end{--bs-position: end}.dropdown-menu-sm-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 768px){.dropdown-menu-md-start{--bs-position: start}.dropdown-menu-md-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-md-end{--bs-position: end}.dropdown-menu-md-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 992px){.dropdown-menu-lg-start{--bs-position: start}.dropdown-menu-lg-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-lg-end{--bs-position: end}.dropdown-menu-lg-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1200px){.dropdown-menu-xl-start{--bs-position: start}.dropdown-menu-xl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xl-end{--bs-position: end}.dropdown-menu-xl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}@media (min-width: 1400px){.dropdown-menu-xxl-start{--bs-position: start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto /* rtl:ignore */;left:0 /* rtl:ignore */}.dropdown-menu-xxl-end{--bs-position: end}.dropdown-menu-xxl-end[data-bs-popper]{right:0 /* rtl:ignore */;left:auto /* rtl:ignore */}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.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:.125rem}.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:.125rem}.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:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,0.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#083358}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:hover,.dropdown-menu-dark .dropdown-item:focus{color:#fff;background-color:rgba(255,255,255,0.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#083358}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,0.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex:1 1 auto}.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn:hover,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn.active{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child),.btn-group>.btn-group:not(:first-child){margin-left:-3px}.btn-group>.btn:not(:last-child):not(.dropdown-toggle),.btn-group>.btn-group:not(:last-child)>.btn{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn,.btn-group>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-sm+.dropdown-toggle-split,.btn-group-sm>.btn+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.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:not(:first-child),.btn-group-vertical>.btn-group:not(:first-child){margin-top:-3px}.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle),.btn-group-vertical>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn ~ .btn,.btn-group-vertical>.btn-group:not(:first-child)>.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#083358;text-decoration:none;transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out}@media (prefers-reduced-motion: reduce){.nav-link{transition:none}}.nav-link:hover,.nav-link:focus{color:#062946}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:3px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-3px;background:none;border:3px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-3px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#083358}.nav-fill>.nav-link,.nav-fill .nav-item{flex:1 1 auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{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{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-sm,.navbar>.container-md,.navbar>.container-lg,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:3px solid transparent;border-radius:1.35rem;transition:box-shadow 0.15s ease-in-out}@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 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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}}@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:.5rem;padding-left:.5rem}.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{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:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex !important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,0.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,0.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,0.55)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,0.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,0.3)}.navbar-light .navbar-nav .show>.nav-link,.navbar-light .navbar-nav .nav-link.active{color:rgba(0,0,0,0.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,0.55);border-color:rgba(0,0,0,0.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280,0,0,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,0.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(0,0,0,0.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:hover,.navbar-dark .navbar-brand:focus{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,0.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,0.25)}.navbar-dark .navbar-nav .show>.nav-link,.navbar-dark .navbar-nav .nav-link.active{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,0.55);border-color:rgba(255,255,255,0.1)}.navbar-dark .navbar-toggler-icon{background-image: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")}.navbar-dark .navbar-text{color:rgba(255,255,255,0.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:3px solid rgba(0,0,0,0.125);border-radius:.25rem}.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:calc(.25rem - 3px);border-top-right-radius:calc(.25rem - 3px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 3px);border-bottom-left-radius:calc(.25rem - 3px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,0.03);border-bottom:3px solid rgba(0,0,0,0.125)}.card-header:first-child{border-radius:calc(.25rem - 3px) calc(.25rem - 3px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,0.03);border-top:3px solid rgba(0,0,0,0.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 3px) calc(.25rem - 3px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 3px)}.card-img,.card-img-top,.card-img-bottom{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 3px);border-top-right-radius:calc(.25rem - 3px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 3px);border-bottom-left-radius:calc(.25rem - 3px)}.card-group>.card{margin-bottom:.75rem}@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-img-top,.card-group>.card:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer{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-img-top,.card-group>.card:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;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}@media (prefers-reduced-motion: reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#072e4f;background-color:#e6ebee;box-shadow:inset 0 -3px 0 rgba(0,0,0,0.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23072e4f'%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");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image: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");background-repeat:no-repeat;background-size:1.25rem;transition:transform 0.2s ease-in-out}@media (prefers-reduced-motion: reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#8499ac;outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:3px solid rgba(0,0,0,0.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 3px);border-top-right-radius:calc(.25rem - 3px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 3px);border-bottom-left-radius:calc(.25rem - 3px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.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{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#083358;text-decoration:none;background-color:#fff;border:3px solid #dee2e6;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}@media (prefers-reduced-motion: reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#062946;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#062946;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25)}.page-item:not(:first-child) .page-link{margin-left:-3px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#083358;border-color:#083358}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:3px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#051f35;background-color:#ced6de;border-color:#b5c2cd}.alert-primary .alert-link{color:#04192a}.alert-secondary{color:#94444d;background-color:#fde3e6;border-color:#fcd5d9}.alert-secondary .alert-link{color:#76363e}.alert-success{color:#004689;background-color:#cce3fa;border-color:#b3d5f7}.alert-success .alert-link{color:#00386e}.alert-info{color:#2e5860;background-color:#e3f8fc;border-color:#d5f4fa}.alert-info .alert-link{color:#25464d}.alert-warning{color:#972424;background-color:#fed8d8;border-color:#fec5c5}.alert-warning .alert-link{color:#791d1d}.alert-danger{color:#992634;background-color:#ffd9dd;border-color:#ffc6cd}.alert-danger .alert-link{color:#7a1e2a}.alert-light{color:#616160;background-color:#fcfcfc;border-color:#fbfbfb}.alert-light .alert-link{color:#4e4e4d}.alert-dark{color:#04142b;background-color:#cdd3da;border-color:#b5bdc8}.alert-dark .alert-link{color:#031022}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#083358;transition:width 0.6s ease}@media (prefers-reduced-motion: reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:1rem 1rem}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion: reduce){.progress-bar-animated{animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:hover,.list-group-item-action:focus{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:3px solid rgba(0,0,0,0.125)}.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:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#083358;border-color:#083358}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-3px;border-top-width:3px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}@media (min-width: 576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}}@media (min-width: 768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}}@media (min-width: 992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}}@media (min-width: 1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}}@media (min-width: 1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;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:3px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-3px;border-left-width:3px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 3px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#051f35;background-color:#ced6de}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#051f35;background-color:#b9c1c8}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#051f35;border-color:#051f35}.list-group-item-secondary{color:#94444d;background-color:#fde3e6}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#94444d;background-color:#e4cccf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#94444d;border-color:#94444d}.list-group-item-success{color:#004689;background-color:#cce3fa}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#004689;background-color:#b8cce1}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#004689;border-color:#004689}.list-group-item-info{color:#2e5860;background-color:#e3f8fc}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#2e5860;background-color:#ccdfe3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#2e5860;border-color:#2e5860}.list-group-item-warning{color:#972424;background-color:#fed8d8}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#972424;background-color:#e5c2c2}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#972424;border-color:#972424}.list-group-item-danger{color:#992634;background-color:#ffd9dd}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#992634;background-color:#e6c3c7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#992634;border-color:#992634}.list-group-item-light{color:#616160;background-color:#fcfcfc}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#616160;background-color:#e3e3e3}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#616160;border-color:#616160}.list-group-item-dark{color:#04142b;background-color:#cdd3da}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#04142b;background-color:#b9bec4}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#04142b;border-color:#04142b}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(8,51,88,0.25);opacity:1}.btn-close:disabled,.btn-close.disabled{pointer-events:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border:1px solid rgba(0,0,0,0.1);box-shadow:0 0.5rem 1rem rgba(0,0,0,0.15);border-radius:.25rem}.toast:not(.showing):not(.show){opacity:0}.toast.hide{display:none}.toast-container{width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,0.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,0.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1060;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform 0.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% - 1rem)}.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% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:3px solid rgba(0,0,0,0.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:3px solid #dee2e6;border-top-left-radius:calc(.3rem - 3px);border-top-right-radius:calc(.3rem - 3px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:3px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 3px);border-bottom-left-radius:calc(.3rem - 3px)}.modal-footer>*{margin:.25rem}@media (min-width: 576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width: 992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width: 1200px){.modal-xl{max-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-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@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-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@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-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[data-popper-placement^="top"]{padding:.4rem 0}.bs-tooltip-top .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow{bottom:0}.bs-tooltip-top .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="top"] .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-end,.bs-tooltip-auto[data-popper-placement^="right"]{padding:0 .4rem}.bs-tooltip-end .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-end .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="right"] .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[data-popper-placement^="bottom"]{padding:.4rem 0}.bs-tooltip-bottom .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow{top:0}.bs-tooltip-bottom .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="bottom"] .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-start,.bs-tooltip-auto[data-popper-placement^="left"]{padding:0 .4rem}.bs-tooltip-start .tooltip-arrow,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-start .tooltip-arrow::before,.bs-tooltip-auto[data-popper-placement^="left"] .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0 /* rtl:ignore */;z-index:1070;display:block;max-width:276px;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;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:3px solid rgba(0,0,0,0.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::before,.popover .popover-arrow::after{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-top>.popover-arrow,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow{bottom:calc(-.5rem - 3px)}.bs-popover-top>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,0.25)}.bs-popover-top>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="top"]>.popover-arrow::after{bottom:3px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-end>.popover-arrow,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow{left:calc(-.5rem - 3px);width:.5rem;height:1rem}.bs-popover-end>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,0.25)}.bs-popover-end>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="right"]>.popover-arrow::after{left:3px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom>.popover-arrow,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow{top:calc(-.5rem - 3px)}.bs-popover-bottom>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,0.25)}.bs-popover-bottom>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="bottom"]>.popover-arrow::after{top:3px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-bottom .popover-header::before,.bs-popover-auto[data-popper-placement^="bottom"] .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:3px solid #f0f0f0}.bs-popover-start>.popover-arrow,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow{right:calc(-.5rem - 3px);width:.5rem;height:1rem}.bs-popover-start>.popover-arrow::before,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,0.25)}.bs-popover-start>.popover-arrow::after,.bs-popover-auto[data-popper-placement^="left"]>.popover-arrow::after{right:3px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:3px solid #d8d8d8;border-top-left-radius:calc(.3rem - 3px);border-top-right-radius:calc(.3rem - 3px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.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%;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion: reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-start),.active.carousel-item-end{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-end),.active.carousel-item-start{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item.active,.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end{z-index:1;opacity:1}.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion: reduce){.carousel-fade .active.carousel-item-start,.carousel-fade .active.carousel-item-end{transition:none}}.carousel-control-prev,.carousel-control-next{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:none;border:0;opacity:.5;transition:opacity 0.15s ease}@media (prefers-reduced-motion: reduce){.carousel-control-prev,.carousel-control-next{transition:none}}.carousel-control-prev:hover,.carousel-control-prev:focus,.carousel-control-next:hover,.carousel-control-next:focus{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-prev-icon,.carousel-control-next-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%;list-style:none}.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 0.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-prev-icon,.carousel-dark .carousel-control-next-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@keyframes spinner-border{to{transform:rotate(360deg) /* rtl:ignore */}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion: reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1050;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion: reduce){.offcanvas{transition:none}}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:3px solid rgba(0,0,0,0.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:3px solid rgba(0,0,0,0.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:3px solid rgba(0,0,0,0.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:3px solid rgba(0,0,0,0.2);transform:translateY(100%)}.offcanvas.show{transform:none}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#083358}.link-primary:hover,.link-primary:focus{color:#062946}.link-secondary{color:#F67280}.link-secondary:hover,.link-secondary:focus{color:#f88e99}.link-success{color:#0074E4}.link-success:hover,.link-success:focus{color:#005db6}.link-info{color:#74DBEF}.link-info:hover,.link-info:focus{color:#90e2f2}.link-warning{color:#FC3C3C}.link-warning:hover,.link-warning:focus{color:#fd6363}.link-danger{color:#FF4057}.link-danger:hover,.link-danger:focus{color:#ff6679}.link-light{color:#F2F2F0}.link-light:hover,.link-light:focus{color:#f5f5f3}.link-dark{color:#072247}.link-dark:hover,.link-dark:focus{color:#061b39}.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: calc(3 / 4 * 100%)}.ratio-16x9{--bs-aspect-ratio: calc(9 / 16 * 100%)}.ratio-21x9{--bs-aspect-ratio: calc(9 / 21 * 100%)}.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:sticky;top:0;z-index:1020}@media (min-width: 576px){.sticky-sm-top{position:sticky;top:0;z-index:1020}}@media (min-width: 768px){.sticky-md-top{position:sticky;top:0;z-index:1020}}@media (min-width: 992px){.sticky-lg-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1200px){.sticky-xl-top{position:sticky;top:0;z-index:1020}}@media (min-width: 1400px){.sticky-xxl-top{position:sticky;top:0;z-index:1020}}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute !important;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}.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}.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}.overflow-auto{overflow:auto !important}.overflow-hidden{overflow:hidden !important}.overflow-visible{overflow:visible !important}.overflow-scroll{overflow: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-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:0 0.5rem 1rem rgba(0,0,0,0.15) !important}.shadow-sm{box-shadow:0 0.125rem 0.25rem rgba(0,0,0,0.075) !important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,0.175) !important}.shadow-none{box-shadow:none !important}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.position-sticky{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:3px solid #dee2e6 !important}.border-0{border:0 !important}.border-top{border-top:3px solid #dee2e6 !important}.border-top-0{border-top:0 !important}.border-end{border-right:3px solid #dee2e6 !important}.border-end-0{border-right:0 !important}.border-bottom{border-bottom:3px solid #dee2e6 !important}.border-bottom-0{border-bottom:0 !important}.border-start{border-left:3px solid #dee2e6 !important}.border-start-0{border-left:0 !important}.border-primary{border-color:#083358 !important}.border-secondary{border-color:#F67280 !important}.border-success{border-color:#0074E4 !important}.border-info{border-color:#74DBEF !important}.border-warning{border-color:#FC3C3C !important}.border-danger{border-color:#FF4057 !important}.border-light{border-color:#F2F2F0 !important}.border-dark{border-color:#072247 !important}.border-white{border-color:#fff !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}.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}.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}.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}.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-light{font-weight:300 !important}.fw-lighter{font-weight:lighter !important}.fw-normal{font-weight:400 !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{color:#083358 !important}.text-secondary{color:#F67280 !important}.text-success{color:#0074E4 !important}.text-info{color:#74DBEF !important}.text-warning{color:#FC3C3C !important}.text-danger{color:#FF4057 !important}.text-light{color:#F2F2F0 !important}.text-dark{color:#072247 !important}.text-white{color:#fff !important}.text-body{color:#212529 !important}.text-muted{color:#6c757d !important}.text-black-50{color:rgba(0,0,0,0.5) !important}.text-white-50{color:rgba(255,255,255,0.5) !important}.text-reset{color:inherit !important}.bg-primary{background-color:#083358 !important}.bg-secondary{background-color:#F67280 !important}.bg-success{background-color:#0074E4 !important}.bg-info{background-color:#74DBEF !important}.bg-warning{background-color:#FC3C3C !important}.bg-danger{background-color:#FF4057 !important}.bg-light{background-color:#F2F2F0 !important}.bg-dark{background-color:#072247 !important}.bg-body{background-color:#fff !important}.bg-white{background-color:#fff !important}.bg-transparent{background-color:rgba(0,0,0,0) !important}.bg-gradient{background-image:var(--bs-gradient) !important}.user-select-all{user-select:all !important}.user-select-auto{user-select:auto !important}.user-select-none{user-select:none !important}.pe-none{pointer-events:none !important}.pe-auto{pointer-events:auto !important}.rounded{border-radius:.25rem !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:.2rem !important}.rounded-2{border-radius:.25rem !important}.rounded-3{border-radius:.3rem !important}.rounded-circle{border-radius:50% !important}.rounded-pill{border-radius:50rem !important}.rounded-top{border-top-left-radius:.25rem !important;border-top-right-radius:.25rem !important}.rounded-end{border-top-right-radius:.25rem !important;border-bottom-right-radius:.25rem !important}.rounded-bottom{border-bottom-right-radius:.25rem !important;border-bottom-left-radius:.25rem !important}.rounded-start{border-bottom-left-radius:.25rem !important;border-top-left-radius:.25rem !important}.visible{visibility:visible !important}.invisible{visibility:hidden !important}@media (min-width: 576px){.float-sm-start{float:left !important}.float-sm-end{float:right !important}.float-sm-none{float: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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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}.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-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}.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}.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}.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-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}}
diff --git a/Code/Lee/Javascript/lab05/index.html b/Code/Lee/Javascript/lab05/index.html
new file mode 100644
index 00000000..ccddf51a
--- /dev/null
+++ b/Code/Lee/Javascript/lab05/index.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Quote API
+
+
+
+
+
+
Quote Search
+
+
+
+
+
Previous Page
+
Next Page
+
+
+
+
+
+
+
quote
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.
+
+
+
+
+
text
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Javascript/lab05/index.js b/Code/Lee/Javascript/lab05/index.js
new file mode 100644
index 00000000..282cf6bd
--- /dev/null
+++ b/Code/Lee/Javascript/lab05/index.js
@@ -0,0 +1,136 @@
+let nextPageButton = document.getElementById("nextPageButton");
+let result = document.getElementById("result") // target for templated quotes
+let bootstrapQuoteTemplate = document.getElementById("bootstrapQuoteTemplate")
+let submitButton = document.getElementById("searchTopic") // Search button
+let previousButton = document.getElementById("previousPageButton") // Previous button
+let pageNumberValue = document.getElementById("pageNumberValue")
+let queryString = "running" // search topic input field
+let quoteTemplate = document.querySelector("#bootstrapQuoteTemplate") // update when the time comes: "bootstrapQuoteTemplate"
+
+let pageNumber, newQuote;
+
+pageNumber = 1;
+
+let url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`
+
+const headers = {
+ Authorization: `Token token=${FAVQS_API_KEY}`
+}
+
+const params = {
+ page: pageNumber,
+ filter: queryString
+}
+
+// to replace processInfo and processAuthors
+function newProcess (response) {
+ let fullQuote = response.data.quotes.map((quote) => ({quote:quote.body, author:quote.author}))
+ return fullQuote
+}
+
+// Takes in a single array of {body, author} and fills template
+function newFillTemplate (quote) {
+ let newQuote = document.createElement('div') // create div for a new quote
+ let newTemplate = quoteTemplate.content.cloneNode(true) // copy template from index.html
+ newQuote.appendChild(newTemplate) // add the content to the div
+ let quoteText = newQuote.querySelector('.blockquote') // select the inner element of the quote template
+ let quoteAuthor = newQuote.querySelector('#quote-author')
+ quoteText.innerHTML = quote.quote // set the quote text
+ quoteAuthor.innerHTML = quote.author
+ result.appendChild(quoteText)
+ result.appendChild(quoteAuthor)
+ return
+}
+
+function lastPage (jsonOutput) {
+ if (jsonOutput.data.last_page) {
+ // True means this is the last page. Deactivate the Next Button.
+ deactivateTheButton(nextPageButton)
+ return
+ } else if (!jsonOutput.data.last_page){
+ // False means this is NOT the last page. Re-activate the button.
+ buttonReactivation(nextPageButton);
+ return
+ } else {
+ console.log('did not read last page info')
+ } return
+}
+
+function lockPreviousPage (pageNumber) {
+ if (pageNumber <=1 ) {
+ deactivateTheButton(previousButton)
+ return
+ } else {
+ previousButtonReactivation(previousButton)
+ return
+ }
+}
+
+function activateTheButton (button) {
+ button.addEventListener('click', pageActivation)
+}
+
+function pageActivation () {
+ url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`
+ getQuotes(url)
+}
+
+function buttonReactivation (button) {
+ button.setAttribute('class', 'btn btn-outline-primary btn-block my-2')
+ button.addEventListener('click', pageActivation)
+}
+
+function previousButtonReactivation (button) {
+ button.setAttribute('class', 'btn btn-outline-primary btn-block my-2')
+ button.addEventListener('click', previousButtonActivation)
+}
+
+function previousButtonActivation () {
+ pageNumber = pageNumber-2
+ url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`
+ getQuotes(url)
+}
+
+// reformats the next page button to outline red. Also removes 'click' event listener
+function deactivateTheButton (button) {
+ button.removeAttribute("class")
+ button.setAttribute('class', 'btn btn-outline-danger btn-block my-2 disabled')
+ button.removeEventListener("click", pageActivation)
+ button.removeEventListener('click', previousButtonActivation)
+}
+
+function getQuotes (url) {
+ axios
+ .get(
+ url,
+ {
+ headers: headers
+ })
+ .then( response => {
+ pageNumberValue.innerHTML = `-- Page ${pageNumber} --`
+ lockPreviousPage(pageNumber)
+ pageNumber++
+ console.log(url)
+ result.innerHTML = '' // clear result area
+ lastPage(response) // disables next page button if there are no additional pages remaining
+ response = newProcess(response)
+
+ response.forEach(item => {
+ newFillTemplate(item)
+ })
+
+ })
+ .catch(error => console.log('error!', error))
+}
+
+getQuotes(url)
+activateTheButton(nextPageButton)
+
+submitButton.addEventListener('click', ()=>{
+ pageNumber = 1;
+ console.log(pageNumber)
+ queryString = document.getElementById("topicText").value
+ url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`
+ getQuotes(url)
+})
+
diff --git a/Code/Lee/Javascript/lab_04/index.html b/Code/Lee/Javascript/lab_04/index.html
new file mode 100644
index 00000000..7c2a62ad
--- /dev/null
+++ b/Code/Lee/Javascript/lab_04/index.html
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Todo List
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Open
+
+
+
Complete
+
+
+
+
+
+
+
+
+
+
+
Copyright © 2021 Lee Colburn Jk, not really.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Lee/Javascript/lab_04/todo.js b/Code/Lee/Javascript/lab_04/todo.js
new file mode 100644
index 00000000..b8aca911
--- /dev/null
+++ b/Code/Lee/Javascript/lab_04/todo.js
@@ -0,0 +1,127 @@
+$(document).ready(function () {
+ let todoList = [
+ {item : "This is the first item",
+ complete : false},
+ {item : "This item should be struck through because it is complete",
+ complete : true},
+ {item : "Go to the store",
+ complete : false},
+]
+
+let $openList = $("#openList");
+let $completeList = $("#completeList");
+let $newTask = $("#newTask");
+
+// Generates new todo based on button click
+$newTask.click(()=>{
+ addTodo()
+ createTodoList()
+ })
+
+// Opens prompt to take in todo item, and adds it to the list of oustanding tasks
+function addTodo() {
+ let newTodo = prompt("Enter your todo item: ") // get new todo
+ appendTodo(newTodo)
+}
+
+// Takes in a new todo from addTodo and appends it to todoList
+function appendTodo(todo) {
+ let newItem = {
+ item: todo,
+ complete: false
+ }
+ todoList = todoList.concat(newItem)
+ createTodoList()
+
+ }
+
+
+// delete the todo entry to be removed entirely from the list
+function deleteTodo(todoToDelete){
+ for(let i=0; i < todoList.length; i++) {
+ if(todoList[i].item === todoToDelete.item){
+ todoList.splice(i,1)
+ return
+ }
+ }
+}
+
+// Allow the todo item to change to/from open & complete
+function changeTodo(targetTodo) {
+ for (let i=0; i < todoList.length; i++) {
+ if(todoList[i].item === targetTodo.item) {
+ todoList[i].complete = !todoList[i].complete
+ }
+ }
+ }
+
+
+
+// Create a todo item
+function makeNewTodoItem(todo) {
+ let $newTodoItem, $newButtons
+
+ // new div for the item
+ $newTodoItem = $(`
${todo.item}
`)
+ $newTodoItem.addClass("col-12 col-lg-6 offset-lg-3")
+
+ $newButtons = makeNewButtons(todo) // make them buttons
+
+ $newTodoItem.append($newButtons)
+ console.log($newTodoItem)
+
+ return $newTodoItem
+}
+
+// Create complete and delete buttons. Add to new div.
+function makeNewButtons(todo) {
+ let $buttons, $completeButton, $deleteButton
+
+ $buttons = $('
')
+ $buttons.addClass('mx-2')
+
+ // make a new complete button with function to toggle complete/open
+ $completeButton = $(`
`)
+ $completeButton.addClass('bi bi-check-square')
+ $completeButton.click(() => {
+ changeTodo(todo)
+ createTodoList()
+ })
+
+ // make a new delete button. add function to delete todo item on click
+ $deleteButton = $(`
`)
+ $deleteButton.addClass('bi bi-trash mx-1')
+ $deleteButton.click(() => {
+ deleteTodo(todo)
+ createTodoList()
+ })
+ $buttons.append([$completeButton, $deleteButton])
+ return $buttons
+}
+
+// Clear the Todo List
+function clearTodoList() {
+ $completeList.html('')
+ $openList.html('')
+}
+
+// Update the Open and Complete lists
+function createTodoList () {
+ let $todoItem
+
+ clearTodoList()
+ todoList.forEach(todo => { // cycles through the todo list items and makes a new div item from makeNewTodoItem.
+ $todoItem = makeNewTodoItem(todo)
+ // filter the todo items into the completed or open lists
+ if (todo.complete) {
+ $completeList.append($todoItem)
+
+ } else {
+ $openList.append($todoItem)
+ }
+ });
+}
+
+createTodoList()
+
+})
diff --git a/Code/Lee/Notes/classes.py b/Code/Lee/Notes/classes.py
index 45ba7bf1..4a71f1e0 100644
--- a/Code/Lee/Notes/classes.py
+++ b/Code/Lee/Notes/classes.py
@@ -1,5 +1,3 @@
-# python3 -m http.server # starts a server at localhost port 8000
-
"""
Encapsulation - Hides the internal components of a class
Inheritance - Derives one type from another type ('has-a' relation)
diff --git a/Code/Lee/Python/lab_02.py b/Code/Lee/Python/lab_02.py
index 0930604d..049394dd 100644
--- a/Code/Lee/Python/lab_02.py
+++ b/Code/Lee/Python/lab_02.py
@@ -13,24 +13,24 @@
# Quarter
quarter = user_input // 25
-user_input = user_input % 25
+user_input %= 25
# print(f"Quarters: {quarter}")
# print(f"remainder: {user_input}")
# Dimes
dime = user_input // 10
-user_input = user_input % 10
+user_input %= 10
# print(f"Dimes: {dime}")
# print(f"remainder: {user_input}")
# Nickels
nickel = user_input // 5
-user_input = user_input % 5
+user_input %= 5
# print(f"Nickels: {nickel}")
# print(f"remainder: {user_input}")
# Pennies
-penny = user_input
+penny = user_input
# print(f"Pennies: {penny}")
# Print F statement summarizing change breakdown
diff --git a/Code/Lee/Python/lab_03.py b/Code/Lee/Python/lab_03.py
index 80df59b4..cd5d2659 100644
--- a/Code/Lee/Python/lab_03.py
+++ b/Code/Lee/Python/lab_03.py
@@ -16,7 +16,7 @@ def ave_example(nums):
running_list = []
# loop over the elements
for num in nums:
- running_value = running_value + int(num)
+ running_value += int(num)
running_list.append(num)
running_length = len(running_list)
running_average = running_value / running_length
@@ -34,7 +34,7 @@ def user_directed(nums):
running_list = []
# loop over the elements
for num in nums:
- running_value = running_value + int(num)
+ running_value += int(num)
running_list.append(num)
running_length = len(running_list)
running_average = running_value / running_length
diff --git a/Code/Lee/Python/lab_08.py b/Code/Lee/Python/lab_08.py
index b5f17104..918be746 100644
--- a/Code/Lee/Python/lab_08.py
+++ b/Code/Lee/Python/lab_08.py
@@ -15,11 +15,7 @@ def pick6(ticket):
def num_matches(winning, guess):
"""Takes in winning string and guess string. evaluates returns total match count"""
- match = 0
- for (w, g) in zip(winning, guess):
- if w == g:
- match += 1
- return match
+ return sum(w == g for (w, g) in zip(winning, guess))
# Start your balances at 0
balance = 0
@@ -28,8 +24,8 @@ def num_matches(winning, guess):
winnings = 0
pick6(winning_ticket)
-# Loop 100,000 times:
-for i in range(1_000_000):
+# Loop 100,000 times:
+for _ in range(1_000_000):
# Generate a list of 6 random numbers representing the ticket
guess_ticket = []
pick6(guess_ticket)
diff --git a/Code/Lee/Python/lab_09.py b/Code/Lee/Python/lab_09.py
index 246b9a22..488f3922 100644
--- a/Code/Lee/Python/lab_09.py
+++ b/Code/Lee/Python/lab_09.py
@@ -7,11 +7,9 @@
def blackjack_score(user_card):
"""takes in user score and returns integer of the card's value"""
- if user_card == "a" or "j" or "q" or "k":
- user_card = user_card.upper()
+ user_card = user_card.upper()
if user_card in all_cards:
- value = all_cards[user_card]
- return value
+ return all_cards[user_card]
def blackjack_advice(total):
"""Takes in total score and advices if user is bust, has blackjack, should stay, or should hit"""
@@ -28,7 +26,7 @@ def blackjack_advice(total):
def low_or_high(aces_low, aces_high):
"""Work in progress - this function will consider the aces high and aces low scores and return the ideal option for the user"""
if aces_low or aces_high == 21:
- print(f"\nYour total is 21 - Blackjack!")
+ print('\nYour total is 21 - Blackjack!')
return
return
diff --git a/Code/Lee/Python/lab_10.py b/Code/Lee/Python/lab_10.py
index 74386f95..9bad2001 100644
--- a/Code/Lee/Python/lab_10.py
+++ b/Code/Lee/Python/lab_10.py
@@ -3,6 +3,7 @@
Evening Bootcamp - PDX Code Guild
Lab 10 - Dad Jokes ... and Their APIs
"""
+
import requests
url = "https://icanhazdadjoke.com/search?term="
user_search_term = input("Enter a search term: ")
@@ -23,7 +24,5 @@
if counter > total_results:
break
more_jokes = input("\nWant more? Enter 1 to continue: ")
- if more_jokes == "1":
- pass
- else:
+ if more_jokes != "1":
break
diff --git a/Code/Lee/Python/lab_11.py b/Code/Lee/Python/lab_11.py
index 905cbf54..d39f4fa5 100644
--- a/Code/Lee/Python/lab_11.py
+++ b/Code/Lee/Python/lab_11.py
@@ -14,10 +14,10 @@ def encrypt(user_string,rot):
for i in range(len(user_string)):
encrypted_index = alphabet_printable.find(user_string[i])
if encrypted_index == -1:
- encrypted_message = encrypted_message + user_string[i]
+ encrypted_message += user_string[i]
else:
- encrypted_message = encrypted_message + shifted_alphabet_printable[encrypted_index]
-
+ encrypted_message += shifted_alphabet_printable[encrypted_index]
+
return encrypted_message
def decrypt(user_string, rot):
@@ -30,39 +30,43 @@ def decrypt(user_string, rot):
complete = False
while not complete:
- # Select Option 1-Pass Message, 2-Exit, 3+ Try Again
- start = int(input(f'\nPlease select from the following options:\n 1. Encode a string with ROT based encryption \n 2. Decrypt last message (or your own) \n 3. Exit Program \n\n Enter the number of your choice: \n'))
+ # Select Option 1-Pass Message, 2-Exit, 3+ Try Again
+ start = int(
+ input(
+ '\nPlease select from the following options:\n 1. Encode a string with ROT based encryption \n 2. Decrypt last message (or your own) \n 3. Exit Program \n\n Enter the number of your choice: \n'
+ )
+ )
+
- ################### DIRECTORY ################################################################
- # Allow user to escape
- if start == 3:
- print(f"\nClosing application.\n")
- complete = True
- break
+ ################### DIRECTORY ################################################################
+ # Allow user to escape
+ if start == 3:
+ print('\nClosing application.\n')
+ complete = True
+ break
- if start > 3:
- print(f'\n Try again:\n')
- continue
-
- # Direct user to appropriate function: Select Option 1 - Pass Message to encrypt or 2 - Decrypt a stored message (or your own)
- if start == 1:
+ if start > 3:
+ print('\n Try again:\n')
+ continue
- user_string = input("Enter your string: ")
- rot = int(input("Enter the number of digits you'd like to offset the data (1-101): "))
- encrypted_string = encrypt(user_string, rot)
- print(f"\nYour encrypted string is: {encrypted_string}\n\n If you'd like to decrypt this string, please remember it has been offset {rot} digits. \n Returning to main menu...")
+ # Direct user to appropriate function: Select Option 1 - Pass Message to encrypt or 2 - Decrypt a stored message (or your own)
+ if start == 1:
+ user_string = input("Enter your string: ")
+ rot = int(input("Enter the number of digits you'd like to offset the data (1-101): "))
+ encrypted_string = encrypt(user_string, rot)
+ print(f"\nYour encrypted string is: {encrypted_string}\n\n If you'd like to decrypt this string, please remember it has been offset {rot} digits. \n Returning to main menu...")
- if start == 2:
- decrypted_string = ""
- selection = int(input(f"Would you like to: \n 1. If available, decrypt the stored message: {encrypted_string} \n 2. Decrypt your own message \n"))
+ elif start == 2:
+ decrypted_string = ""
+ selection = int(input(f"Would you like to: \n 1. If available, decrypt the stored message: {encrypted_string} \n 2. Decrypt your own message \n"))
- if selection == 1:
- rot = int(input("Enter the amount of digits the string is offset (1-101): \n"))
- decrypt(encrypted_string, rot)
- print(decrypted_string)
+ if selection == 1:
+ rot = int(input("Enter the amount of digits the string is offset (1-101): \n"))
+ decrypt(encrypted_string, rot)
+ print(decrypted_string)
- if selection == 2:
- user_string = input("Enter the encrypted string: ")
- rot = int(input("Enter the amount of digits the string is offset (1-101): \n"))
- decrypted_string = decrypt(user_string, rot)
- print(f"Decrypted string: {decrypted_string} \n")
\ No newline at end of file
+ elif selection == 2:
+ user_string = input("Enter the encrypted string: ")
+ rot = int(input("Enter the amount of digits the string is offset (1-101): \n"))
+ decrypted_string = decrypt(user_string, rot)
+ print(f"Decrypted string: {decrypted_string} \n")
\ No newline at end of file
diff --git a/Code/Lee/Python/lab_14.py b/Code/Lee/Python/lab_14.py
index 0c8243ec..0378db2d 100644
--- a/Code/Lee/Python/lab_14.py
+++ b/Code/Lee/Python/lab_14.py
@@ -18,10 +18,7 @@ def deposit(self, amount):
return self.balance
def check_withdrawal(self, amount):
- if amount <= self.balance:
- return True
- else:
- return False
+ return amount <= self.balance
def withdraw(self, amount):
self.balance = self.balance - amount
diff --git a/Code/Lee/Python/lab_15.py b/Code/Lee/Python/lab_15.py
index 64d44915..68ad5bdf 100644
--- a/Code/Lee/Python/lab_15.py
+++ b/Code/Lee/Python/lab_15.py
@@ -10,16 +10,12 @@
import math
def average(x):
- total = 0
- for i in range(len(x)):
- total += x[i]
+ total = sum(x[i] for i in range(len(x)))
return total / len(x)
def variance(x):
mu = average(x)
- total = 0
- for i in range(len(x)):
- total += (x[i] - mu)**2
+ total = sum((x[i] - mu)**2 for i in range(len(x)))
return total / len(x)
def standard_deviation(x):
@@ -52,10 +48,10 @@ def most_rain(x):
data_dict[date] = total
except IndexError:
continue
-
+
del data_dict['Date']
- for entry in data_dict.keys():
+ for entry in data_dict:
entry = datetime.strptime(entry, '%d-%b-%Y')
daily_rainfall = []
@@ -65,5 +61,5 @@ def most_rain(x):
value = 0
value = int(value)
daily_rainfall.append(0+value)
-
+
most_rain(daily_rainfall)
\ No newline at end of file
diff --git a/Code/Lee/Python/lab_17.py b/Code/Lee/Python/lab_17.py
index d46c7693..9ece9e63 100644
--- a/Code/Lee/Python/lab_17.py
+++ b/Code/Lee/Python/lab_17.py
@@ -38,35 +38,27 @@ def __init__(self, ):
def load(self):
# 1) open 'contacts.json' with option 'r' for read
f = open('contacts.json', 'r')
-
+
# 2) get the text from the file
contents = f.read()
# 3) convert the text into a python dictionary (json.loads)
contents = json.loads(contents)
- list_of_contents = []
-
- # 4) get the list of contacts out of the dictionary
- for i in contents['contacts']:
- list_of_contents.append(i)
+ list_of_contents = [i for i in contents['contacts']]
# 5) assign the list of dictionaries to self.contacts
self.contacts = list_of_contents
return
def count(self):
- # return the length of self.contacts
- count = len(self.contacts)
- return count
+ return len(self.contacts)
def save(self):
# 1) open 'contacts.json' with open 'w' for write
f = open('contacts.json', 'w')
# 2) put self.contacts in a dictionary with the key 'contacts'
contacts_list = self.contacts
- contacts = {}
- contacts['contacts'] = contacts_list
-
+ contacts = {'contacts': contacts_list}
# 3) convert the dictionary to a json string (json.dumps)
json_contacts = json.dumps(contacts, indent=2)
# 4) write the json string to the file
@@ -74,11 +66,7 @@ def save(self):
return
def print(self, contact=False):
- # loop over self.contacts
- # print the information for each contact on a separate line
- counter=1
-
- for i in self.contacts:
+ for counter, i in enumerate(self.contacts, start=1):
display = (
f"\nContact {counter}:\n"
@@ -87,7 +75,6 @@ def print(self, contact=False):
f"Email: {i['email']}"
)
print(display)
- counter += 1
return
def add(self, name, phone_number, email):
@@ -111,17 +98,15 @@ def remove(self, name_to_delete):
def update(self, old_name, new_name, new_phone_number, new_email):
- index = 0
listing = self.contacts
# find the contact in self.contacts with the given old_name
- for entry in listing:
+ for index, entry in enumerate(listing):
name_check = entry['name']
# set that contacts' name, phone number, etc to the given values
if name_check == old_name:
entry['name'] = new_name
entry['phone_number'] = new_phone_number
entry['email'] = new_email
- index += 1
return
diff --git a/Code/Lee/Python/lab_19.py b/Code/Lee/Python/lab_19.py
index 7f2e1af2..82f88b1b 100644
--- a/Code/Lee/Python/lab_19.py
+++ b/Code/Lee/Python/lab_19.py
@@ -12,19 +12,9 @@
def api_request(difficulty='any', type='any', category='any'):
"""Takes in question parameters and returns a list of questions"""
- if category == 'any':
- category_url = ""
- else:
- category_url = f"&category={category}"
- if type == 'any':
- type_url = ""
- else:
- type_url = f"&type={type}"
- if difficulty == 'any':
- difficulty_url = ""
- else:
- difficulty_url = f"&difficulty={difficulty}"
-
+ category_url = "" if category == 'any' else f"&category={category}"
+ type_url = "" if type == 'any' else f"&type={type}"
+ difficulty_url = "" if difficulty == 'any' else f"&difficulty={difficulty}"
url = f"https://opentdb.com/api.php?amount=10{category_url}{difficulty_url}{type_url}"
response = requests.request("GET", url).json()
@@ -47,22 +37,20 @@ def test(question_list):
generated_question = html.unescape(question.get("question"))
generated_answer = html.unescape(question.get("correct_answer"))
generated_incorrect_answer = html.unescape(question.get("incorrect_answers"))
- generated_type = html.unescape(question.get("type"))
+ generated_type = html.unescape(question.get("type"))
if generated_type == 'multiple':
answer = multiple_choice(generated_question, generated_answer, generated_incorrect_answer)
elif generated_type == 'boolean':
answer = true_false(generated_question)
-
+
if answer == str.lower(generated_answer):
print(f"{answer.capitalize()} is correct!\n")
question['user_answer'] = 'correct'
score_counter += 1
- complete = True
else:
print(f"'{answer}' is not correct. Correct Answer: '{generated_answer}'\n")
question['user_answer'] = 'incorrect'
- complete = True
-
+ complete = True
print(f'You scored {score_counter}/10 questions right!\n')
return
@@ -96,22 +84,20 @@ def custom_game():
def multiple_choice(question, correct, incorrect):
"""Takes in correct and incorrect answer options to make a blinded list for user to evaluate the question. Returns user answer"""
- blinded_list = []
- blinded_list.append(correct)
+ blinded_list = [correct]
blinded_list.extend(incorrect)
random.shuffle(blinded_list)
html.unescape(blinded_list)
print(f"{question}")
print(*blinded_list, sep=', ')
- answer = input(f"\nAnswer: ")
+ answer = input('\nAnswer: ')
return str.lower(answer)
def true_false(question):
"""Presents question to user and returns a formatted user response"""
print(f"{question}")
- answer = input(f" Answer True or False: ")
+ answer = input(' Answer True or False: ')
return str.lower(answer)
- ...
diff --git a/Code/Lee/initial.py b/Code/Lee/initial.py
index 0658394f..ed0f110e 100644
--- a/Code/Lee/initial.py
+++ b/Code/Lee/initial.py
@@ -1,3 +1 @@
-print('hello')
-
-# python3 -m http.server # starts a server at localhost port 8000
\ No newline at end of file
+print('hello')
\ No newline at end of file
diff --git a/Code/Michael/Python/5-palindrome_checker.py b/Code/Michael/Python/5-palindrome_checker.py
index 913b1ace..7f29ecb5 100644
--- a/Code/Michael/Python/5-palindrome_checker.py
+++ b/Code/Michael/Python/5-palindrome_checker.py
@@ -43,4 +43,6 @@ def check_palindrome(list_of_strings)->list:
case unknown_command:
print (f"\nUnknown command '{unknown_command}' Please enter Palindrome or Anagram or Quit.")
valid_command = False
+
+
print("\nGoodbye. Thank you for using this program.")
\ No newline at end of file
diff --git a/Code/Michael/Python/email_test.py b/Code/Michael/Python/email_test.py
new file mode 100644
index 00000000..7f6c5b1d
--- /dev/null
+++ b/Code/Michael/Python/email_test.py
@@ -0,0 +1,26 @@
+from smtplib import SMTP
+from email.message import EmailMessage
+
+
+def email_alert(to, subject="Alert", body="Alert!"):
+ msg = EmailMessage()
+ msg.set_content(body)
+ msg["Subject"] = subject
+ msg["To"] = to
+
+ user = "mrnotifi@gmail.com"
+ msg["From"] = user
+ password = "nixqgstknzqcfqig"
+ port = int(587)
+
+ with SMTP("smtp.gmail.com", port) as server:
+ server.starttls()
+ server.login(user, password)
+
+ server.send_message(msg)
+
+
+if __name__ == "__main__":
+
+ print("test")
+ email_alert("broetjem@gmail.com", "hey", "hello world")
diff --git a/Code/Michael/django/lab01/lab01project/.gitignore b/Code/Michael/django/lab01/lab01project/.gitignore
new file mode 100644
index 00000000..b176143d
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/.gitignore
@@ -0,0 +1,152 @@
+# 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
+
+# poetry
+# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+# This is especially recommended for binary packages to ensure reproducibility, and is more
+# commonly ignored for libraries.
+# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.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/
+
+# PyCharm
+# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
+# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+# and can be added to the global gitignore or merged into this file. For a more nuclear
+# option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
\ No newline at end of file
diff --git a/Code/Michael/django/lab01/lab01project/README.md b/Code/Michael/django/lab01/lab01project/README.md
new file mode 100644
index 00000000..ca358897
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/README.md
@@ -0,0 +1,8 @@
+# Personal Assistant
+
+## Install
+
+- pip3 install -r requirements.txt
+- python3 manage.py migrate
+- Optional: python3 manage.py createsuperuser
+- python3 manage.py runserver
diff --git a/Code/Michael/django/lab01/lab01project/assistant/__init__.py b/Code/Michael/django/lab01/lab01project/assistant/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Michael/django/lab01/lab01project/assistant/admin.py b/Code/Michael/django/lab01/lab01project/assistant/admin.py
new file mode 100644
index 00000000..0dacfa2a
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+
+# Register your models here.
+from .models import *
+
+admin.site.register(Priority)
+admin.site.register(TodoItem)
diff --git a/Code/Michael/django/lab01/lab01project/assistant/apps.py b/Code/Michael/django/lab01/lab01project/assistant/apps.py
new file mode 100644
index 00000000..00c54201
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class AssistantConfig(AppConfig):
+ default_auto_field = "django.db.models.BigAutoField"
+ name = "assistant"
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0001_initial.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0001_initial.py
new file mode 100644
index 00000000..26fbc154
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0001_initial.py
@@ -0,0 +1,62 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:32
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = []
+
+ operations = [
+ migrations.CreateModel(
+ name="Priority",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ (
+ "name",
+ models.CharField(
+ choices=[
+ ("High", "High"),
+ ("Medium", "Medium"),
+ ("Low", "Low"),
+ ],
+ default="Medium",
+ max_length=6,
+ ),
+ ),
+ ],
+ options={
+ "ordering": ["-name"],
+ },
+ ),
+ migrations.CreateModel(
+ name="TodoItem",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("name", models.CharField(max_length=250)),
+ ("description", models.TextField()),
+ ("completed", models.DateTimeField(blank=True, null=True)),
+ ],
+ options={
+ "ordering": ["-priority"],
+ },
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0002_initial.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0002_initial.py
new file mode 100644
index 00000000..fc0b4c88
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0002_initial.py
@@ -0,0 +1,32 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:32
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("assistant", "0001_initial"),
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="todoitem",
+ name="owner",
+ field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL
+ ),
+ ),
+ migrations.AddField(
+ model_name="todoitem",
+ name="priority",
+ field=models.ForeignKey(
+ on_delete=django.db.models.deletion.CASCADE, to="assistant.priority"
+ ),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0003_alter_priority_name.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0003_alter_priority_name.py
new file mode 100644
index 00000000..5dbae452
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0003_alter_priority_name.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:47
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("assistant", "0002_initial"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="priority",
+ name="name",
+ field=models.CharField(
+ choices=[(1, "High"), (2, "Medium"), (3, "Low")],
+ default=2,
+ max_length=6,
+ ),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0004_alter_priority_name.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0004_alter_priority_name.py
new file mode 100644
index 00000000..391d509b
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0004_alter_priority_name.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("assistant", "0003_alter_priority_name"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="priority",
+ name="name",
+ field=models.CharField(
+ choices=[("High", 1), ("Medium", 2), ("Low", 3)],
+ default="Medium",
+ max_length=6,
+ ),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0005_alter_priority_name.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0005_alter_priority_name.py
new file mode 100644
index 00000000..e07242fb
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0005_alter_priority_name.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:50
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("assistant", "0004_alter_priority_name"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="priority",
+ name="name",
+ field=models.CharField(
+ choices=[(1, "High"), ("Medium", 2), ("Low", 3)],
+ default="Medium",
+ max_length=6,
+ ),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0006_alter_priority_name.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0006_alter_priority_name.py
new file mode 100644
index 00000000..6b7eacf2
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0006_alter_priority_name.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("assistant", "0005_alter_priority_name"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="priority",
+ name="name",
+ field=models.CharField(
+ choices=[(1, 1), (2, 2), (3, 3)], default="Medium", max_length=6
+ ),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0007_auto_20220306_1000.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0007_auto_20220306_1000.py
new file mode 100644
index 00000000..5d1c44e7
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0007_auto_20220306_1000.py
@@ -0,0 +1,22 @@
+# Generated by Django 3.2.10 on 2022-03-06 18:00
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("assistant", "0006_alter_priority_name"),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name="priority",
+ options={"ordering": ["-name"], "verbose_name_plural": "Priorities"},
+ ),
+ migrations.AlterField(
+ model_name="priority",
+ name="name",
+ field=models.IntegerField(choices=[(1, "Low"), (2, "Medium"), (3, "High")]),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/0008_alter_priority_options_alter_priority_name.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/0008_alter_priority_options_alter_priority_name.py
new file mode 100644
index 00000000..39c129c9
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/migrations/0008_alter_priority_options_alter_priority_name.py
@@ -0,0 +1,22 @@
+# Generated by Django 4.0 on 2022-03-07 01:37
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('assistant', '0007_auto_20220306_1000'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='priority',
+ options={'ordering': ['name'], 'verbose_name_plural': 'Priorities'},
+ ),
+ migrations.AlterField(
+ model_name='priority',
+ name='name',
+ field=models.IntegerField(choices=[(0, 'Completed'), (1, 'Low'), (2, 'Medium'), (3, 'High')], default=2),
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/migrations/__init__.py b/Code/Michael/django/lab01/lab01project/assistant/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Michael/django/lab01/lab01project/assistant/models.py b/Code/Michael/django/lab01/lab01project/assistant/models.py
new file mode 100644
index 00000000..d0f7d970
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/models.py
@@ -0,0 +1,41 @@
+from django.db import models
+from users.models import CustomUser
+
+
+class Priority(models.Model):
+
+ PRIORITY_CHOICES = [
+ (0, "Completed"),
+ (1, "Low"),
+ (2, "Medium"),
+ (3, "High"),
+ ]
+ name = models.IntegerField(choices=PRIORITY_CHOICES, default=2)
+
+ def __str__(self):
+ if self.name == 1:
+ return "Low"
+ elif self.name == 2:
+ return "Medium"
+ elif self.name == 3:
+ return "High"
+ elif self.name == 0:
+ return "Completed"
+
+ class Meta:
+ verbose_name_plural = "Priorities"
+ ordering = ["name"]
+
+
+class TodoItem(models.Model):
+ name = models.CharField(max_length=250)
+ description = models.TextField()
+ priority = models.ForeignKey("Priority", on_delete=models.CASCADE)
+ owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
+ completed = models.DateTimeField(null=True, blank=True)
+
+ def __str__(self):
+ return self.name
+
+ class Meta:
+ ordering = ["-priority"]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/tests.py b/Code/Michael/django/lab01/lab01project/assistant/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Michael/django/lab01/lab01project/assistant/urls.py b/Code/Michael/django/lab01/lab01project/assistant/urls.py
new file mode 100644
index 00000000..3dd95d6e
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/urls.py
@@ -0,0 +1,11 @@
+from django.urls import path
+from . import views
+
+app_name = "assistant"
+urlpatterns = [
+ path("index/", views.index, name="index"), # TODO: Change to landing page
+ path("new/", views.create_task, name="create_task"),
+ path("", views.view_all_tasks, name="view_all_tasks"),
+ path("delete/
/", views.delete_task, name="delete_task"),
+ path("complete//", views.complete_task, name="complete_task"),
+]
diff --git a/Code/Michael/django/lab01/lab01project/assistant/views.py b/Code/Michael/django/lab01/lab01project/assistant/views.py
new file mode 100644
index 00000000..92203e85
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/assistant/views.py
@@ -0,0 +1,58 @@
+from datetime import datetime
+from random import randint
+from django.shortcuts import render, get_object_or_404, reverse
+from django.http import HttpResponseRedirect
+from .models import *
+from django.contrib.auth.decorators import login_required
+
+
+# Index page
+def index(request):
+ return HttpResponseRedirect(reverse("assistant:view_all_tasks"))
+
+
+# Creates a task
+@login_required
+def create_task(request):
+ if request.method == "POST":
+ try:
+ Priority.objects.get(name=int(request.POST["priority"]))
+ except:
+ Priority.objects.create(name=int(request.POST["priority"]))
+ TodoItem(
+ name=request.POST["name"],
+ description=request.POST["description"],
+ owner=request.user,
+ priority=Priority.objects.get(name=int(request.POST["priority"])),
+ ).save()
+ return HttpResponseRedirect(reverse("assistant:view_all_tasks"))
+ else:
+ return render(request, "assistant/create_task.html")
+
+
+# Deletes a task
+@login_required
+def delete_task(request, task_id):
+ get_object_or_404(TodoItem, pk=task_id).delete()
+ return HttpResponseRedirect(reverse("assistant:view_all_tasks"))
+
+
+# Shows all tasks
+@login_required
+def view_all_tasks(request):
+ tasks = TodoItem.objects.all()
+ return render(request, "assistant/task_list.html", {"tasks": tasks})
+
+
+# Completes a task
+@login_required
+def complete_task(request, task_id):
+ try:
+ Priority.objects.get(name=0)
+ except:
+ Priority.objects.create(name=0)
+ task = get_object_or_404(TodoItem, pk=task_id)
+ task.completed = datetime.now()
+ task.priority = Priority.objects.get(name=0)
+ task.save()
+ return HttpResponseRedirect(reverse("assistant:view_all_tasks"))
diff --git a/Code/Michael/django/lab01/lab01project/manage.py b/Code/Michael/django/lab01/lab01project/manage.py
new file mode 100644
index 00000000..385f01bd
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/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", "personalassistant.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/Code/Michael/django/lab01/lab01project/personalassistant.sqlite b/Code/Michael/django/lab01/lab01project/personalassistant.sqlite
new file mode 100644
index 00000000..e87b233a
Binary files /dev/null and b/Code/Michael/django/lab01/lab01project/personalassistant.sqlite differ
diff --git a/Code/Michael/django/lab01/lab01project/personalassistant/__init__.py b/Code/Michael/django/lab01/lab01project/personalassistant/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Michael/django/lab01/lab01project/personalassistant/asgi.py b/Code/Michael/django/lab01/lab01project/personalassistant/asgi.py
new file mode 100644
index 00000000..83e32069
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/personalassistant/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for personalassistant 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "personalassistant.settings")
+
+application = get_asgi_application()
diff --git a/Code/Michael/django/lab01/lab01project/personalassistant/settings.py b/Code/Michael/django/lab01/lab01project/personalassistant/settings.py
new file mode 100644
index 00000000..9dabe58f
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/personalassistant/settings.py
@@ -0,0 +1,128 @@
+"""
+Django settings for personalassistant project.
+
+Generated by 'django-admin startproject' using Django 4.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = "django-insecure-+3)ix-qjqtkqc=4sqw$9%tc4klv-gfu9cl-vje#=dmhxux9g4%"
+
+# 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",
+ "users",
+ "assistant",
+]
+
+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 = "personalassistant.urls"
+
+TEMPLATES = [
+ {
+ "BACKEND": "django.template.backends.django.DjangoTemplates",
+ "DIRS": ["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 = "personalassistant.wsgi.application"
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ "default": {
+ "ENGINE": "django.db.backends.sqlite3",
+ "NAME": "personalassistant.sqlite",
+ }
+}
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = "en-us"
+
+TIME_ZONE = "UTC"
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = "static/"
+STATICFILES_DIRS = [str(BASE_DIR.joinpath("static"))]
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
+
+AUTH_USER_MODEL = "users.CustomUser"
+
+LOGIN_URL = "/users/login/"
diff --git a/Code/Michael/django/lab01/lab01project/personalassistant/urls.py b/Code/Michael/django/lab01/lab01project/personalassistant/urls.py
new file mode 100644
index 00000000..be22452b
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/personalassistant/urls.py
@@ -0,0 +1,23 @@
+"""personalassistant URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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 include, path
+
+urlpatterns = [
+ path("admin/", admin.site.urls),
+ path("users/", include("users.urls")),
+ path("", include("assistant.urls")),
+]
diff --git a/Code/Michael/django/lab01/lab01project/personalassistant/wsgi.py b/Code/Michael/django/lab01/lab01project/personalassistant/wsgi.py
new file mode 100644
index 00000000..54eeddcb
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/personalassistant/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for personalassistant 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "personalassistant.settings")
+
+application = get_wsgi_application()
diff --git a/Code/Michael/django/lab01/lab01project/requirements.txt b/Code/Michael/django/lab01/lab01project/requirements.txt
new file mode 100644
index 00000000..c0382900
Binary files /dev/null and b/Code/Michael/django/lab01/lab01project/requirements.txt differ
diff --git a/Code/Michael/django/lab01/lab01project/static/css/reset.css b/Code/Michael/django/lab01/lab01project/static/css/reset.css
new file mode 100644
index 00000000..c75ebbca
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/static/css/reset.css
@@ -0,0 +1,173 @@
+/*
+html5doctor.com Reset Stylesheet
+v1.6.1
+Last Updated: 2010-09-17
+Author: Richard Clark - http://richclarkdesign.com
+Twitter: @rich_clark
+*/
+
+html,
+body,
+div,
+span,
+object,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+blockquote,
+pre,
+abbr,
+address,
+cite,
+code,
+del,
+dfn,
+em,
+img,
+ins,
+kbd,
+q,
+samp,
+small,
+strong,
+sub,
+sup,
+var,
+b,
+i,
+dl,
+dt,
+dd,
+ol,
+ul,
+li,
+fieldset,
+form,
+label,
+legend,
+table,
+caption,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+article,
+aside,
+canvas,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+summary,
+time,
+mark,
+audio,
+video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ outline: 0;
+ font-size: 100%;
+ vertical-align: baseline;
+ background: transparent;
+}
+
+body {
+ line-height: 1;
+}
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section {
+ display: block;
+}
+
+nav ul {
+ list-style: none;
+}
+
+blockquote,
+q {
+ quotes: none;
+}
+
+blockquote:before,
+blockquote:after,
+q:before,
+q:after {
+ content: "";
+ content: none;
+}
+
+a {
+ margin: 0;
+ padding: 0;
+ font-size: 100%;
+ vertical-align: baseline;
+ background: transparent;
+}
+
+/* change colours to suit your needs */
+ins {
+ background-color: #ff9;
+ color: #000;
+ text-decoration: none;
+}
+
+/* change colours to suit your needs */
+mark {
+ background-color: #ff9;
+ color: #000;
+ font-style: italic;
+ font-weight: bold;
+}
+
+del {
+ text-decoration: line-through;
+}
+
+abbr[title],
+dfn[title] {
+ border-bottom: 1px dotted;
+ cursor: help;
+}
+
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+/* change border colour to suit your needs */
+hr {
+ display: block;
+ height: 1px;
+ border: 0;
+ border-top: 1px solid #cccccc;
+ margin: 1em 0;
+ padding: 0;
+}
+
+input,
+select {
+ vertical-align: middle;
+}
diff --git a/Code/Michael/django/lab01/lab01project/static/js/main.js b/Code/Michael/django/lab01/lab01project/static/js/main.js
new file mode 100644
index 00000000..c7830dc0
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/static/js/main.js
@@ -0,0 +1,7 @@
+// Toggle display of id edit-form when edit edit-button is clicked
+$(document).ready(function () {
+ $("#edit-form").toggle();
+ $("#edit-button").click(function () {
+ $("#edit-form").toggle();
+ });
+});
diff --git a/Code/Michael/django/lab01/lab01project/templates/assistant/create_task.html b/Code/Michael/django/lab01/lab01project/templates/assistant/create_task.html
new file mode 100644
index 00000000..32921aad
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/assistant/create_task.html
@@ -0,0 +1,41 @@
+{% extends 'base.html' %} {% block content %} {% load static %}
+
+
+
+{% endblock %}
diff --git a/Code/Michael/django/lab01/lab01project/templates/assistant/index.html b/Code/Michael/django/lab01/lab01project/templates/assistant/index.html
new file mode 100644
index 00000000..70bad81c
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/assistant/index.html
@@ -0,0 +1,4 @@
+{% extends 'base.html' %} {% block content %} {% load static %}
+Todo Today
+Hello Moto World!
+{% endblock %}
diff --git a/Code/Michael/django/lab01/lab01project/templates/assistant/task_list.html b/Code/Michael/django/lab01/lab01project/templates/assistant/task_list.html
new file mode 100644
index 00000000..d001e0b5
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/assistant/task_list.html
@@ -0,0 +1,51 @@
+{% extends 'base.html' %} {% block content %} {% load static %}
+
+
+
+
+
+ #
+ Name
+ Description
+ Priority
+ Owner
+ Actions
+
+
+
+ {% for task in tasks %}
+ {% if task.completed %}
+
+ {% elif task.priority == "High" %}
+
+ {% elif task.priority == "Medium" %}
+
+ {% elif task.priority == "Low" %}
+
+ {% else %}
+
+ {% endif %}
+ {{ task.id }}
+ {{ task.name }}
+ {{ task.description }}
+ {{ task.priority }}
+ {{ task.owner }}
+
+ {% if not task.completed %}
+ Completed
+ {% else %}
+ Completed
+ {% endif %}
+ Delete
+
+
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
diff --git a/Code/Michael/django/lab01/lab01project/templates/base.html b/Code/Michael/django/lab01/lab01project/templates/base.html
new file mode 100644
index 00000000..c806724a
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/base.html
@@ -0,0 +1,49 @@
+{% load static %}
+
+
+
+
+
+
+ Personal Assistant
+
+
+
+
+
+
+
+
+
+ {% block navbar %} {% include 'partials/_navbar.html' %}
+
+ {% endblock %}
+
+
+
+
+
+ {% block content %}{% endblock %}
+
+
+
+
+ {% block footer %} {% include 'partials/_footer.html' %}
+
+ {% endblock %}
+
+
+
+
+
+
+
diff --git a/Code/Michael/django/lab01/lab01project/templates/partials/_footer.html b/Code/Michael/django/lab01/lab01project/templates/partials/_footer.html
new file mode 100644
index 00000000..6604a867
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/partials/_footer.html
@@ -0,0 +1,7 @@
+{% load static %}
+
diff --git a/Code/Michael/django/lab01/lab01project/templates/partials/_navbar.html b/Code/Michael/django/lab01/lab01project/templates/partials/_navbar.html
new file mode 100644
index 00000000..58d4f049
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/partials/_navbar.html
@@ -0,0 +1,69 @@
+{% load static %}
+
diff --git a/Code/Michael/django/lab01/lab01project/templates/users/account.html b/Code/Michael/django/lab01/lab01project/templates/users/account.html
new file mode 100644
index 00000000..703d5e1a
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/users/account.html
@@ -0,0 +1,37 @@
+{% extends 'base.html' %}{% block content %}{% load static %}
+
+Account
+
+{% if error%}
+{{error}}
+{% endif%} {% csrf_token %}
+
+Username: {{user.username}}
+Email: {{user.email}}
+First Name: {{user.first_name}}
+Last Name: {{user.last_name}}
+
+
+Edit
+
+
+
+{% endblock content %}
diff --git a/Code/Michael/django/lab01/lab01project/templates/users/login.html b/Code/Michael/django/lab01/lab01project/templates/users/login.html
new file mode 100644
index 00000000..f3e93f83
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/users/login.html
@@ -0,0 +1,18 @@
+{% extends 'base.html' %} {% block content %} {% load static %}
+Log in
+
+
+
+{% endblock content %}
diff --git a/Code/Michael/django/lab01/lab01project/templates/users/register.html b/Code/Michael/django/lab01/lab01project/templates/users/register.html
new file mode 100644
index 00000000..e00e91f2
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/templates/users/register.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %} {% block content %} {% load static %}
+Register
+
+
+
+{% endblock content %}
diff --git a/Code/Michael/django/lab01/lab01project/users/__init__.py b/Code/Michael/django/lab01/lab01project/users/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Michael/django/lab01/lab01project/users/admin.py b/Code/Michael/django/lab01/lab01project/users/admin.py
new file mode 100644
index 00000000..7fe4a5c0
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+from .models import CustomUser
+
+# Register your models here.
+admin.site.register(CustomUser, UserAdmin)
diff --git a/Code/Michael/django/lab01/lab01project/users/apps.py b/Code/Michael/django/lab01/lab01project/users/apps.py
new file mode 100644
index 00000000..88f7b179
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class UsersConfig(AppConfig):
+ default_auto_field = "django.db.models.BigAutoField"
+ name = "users"
diff --git a/Code/Michael/django/lab01/lab01project/users/migrations/0001_initial.py b/Code/Michael/django/lab01/lab01project/users/migrations/0001_initial.py
new file mode 100644
index 00000000..db75b6b3
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/migrations/0001_initial.py
@@ -0,0 +1,132 @@
+# Generated by Django 3.2.10 on 2022-03-06 17:32
+
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ("auth", "0012_alter_user_first_name_max_length"),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name="CustomUser",
+ fields=[
+ (
+ "id",
+ models.BigAutoField(
+ auto_created=True,
+ primary_key=True,
+ serialize=False,
+ verbose_name="ID",
+ ),
+ ),
+ ("password", models.CharField(max_length=128, verbose_name="password")),
+ (
+ "last_login",
+ models.DateTimeField(
+ blank=True, null=True, verbose_name="last login"
+ ),
+ ),
+ (
+ "is_superuser",
+ models.BooleanField(
+ default=False,
+ help_text="Designates that this user has all permissions without explicitly assigning them.",
+ verbose_name="superuser status",
+ ),
+ ),
+ (
+ "username",
+ models.CharField(
+ error_messages={
+ "unique": "A user with that username already exists."
+ },
+ help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
+ max_length=150,
+ unique=True,
+ validators=[
+ django.contrib.auth.validators.UnicodeUsernameValidator()
+ ],
+ verbose_name="username",
+ ),
+ ),
+ (
+ "first_name",
+ models.CharField(
+ blank=True, max_length=150, verbose_name="first name"
+ ),
+ ),
+ (
+ "last_name",
+ models.CharField(
+ blank=True, max_length=150, verbose_name="last name"
+ ),
+ ),
+ (
+ "email",
+ models.EmailField(
+ blank=True, max_length=254, verbose_name="email address"
+ ),
+ ),
+ (
+ "is_staff",
+ models.BooleanField(
+ default=False,
+ help_text="Designates whether the user can log into this admin site.",
+ verbose_name="staff status",
+ ),
+ ),
+ (
+ "is_active",
+ models.BooleanField(
+ default=True,
+ help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
+ verbose_name="active",
+ ),
+ ),
+ (
+ "date_joined",
+ models.DateTimeField(
+ default=django.utils.timezone.now, verbose_name="date joined"
+ ),
+ ),
+ (
+ "groups",
+ models.ManyToManyField(
+ blank=True,
+ help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
+ related_name="user_set",
+ related_query_name="user",
+ to="auth.Group",
+ verbose_name="groups",
+ ),
+ ),
+ (
+ "user_permissions",
+ models.ManyToManyField(
+ blank=True,
+ help_text="Specific permissions for this user.",
+ related_name="user_set",
+ related_query_name="user",
+ to="auth.Permission",
+ verbose_name="user permissions",
+ ),
+ ),
+ ],
+ options={
+ "verbose_name": "user",
+ "verbose_name_plural": "users",
+ "abstract": False,
+ },
+ managers=[
+ ("objects", django.contrib.auth.models.UserManager()),
+ ],
+ ),
+ ]
diff --git a/Code/Michael/django/lab01/lab01project/users/migrations/__init__.py b/Code/Michael/django/lab01/lab01project/users/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Michael/django/lab01/lab01project/users/models.py b/Code/Michael/django/lab01/lab01project/users/models.py
new file mode 100644
index 00000000..c4b04105
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/models.py
@@ -0,0 +1,13 @@
+from django.contrib.auth.models import AbstractUser
+
+# Create your models here.
+class CustomUser(AbstractUser):
+ """
+ Custom user model
+ """
+
+ pass
+
+
+def __str__(self):
+ return self.username
diff --git a/Code/Michael/django/lab01/lab01project/users/tests.py b/Code/Michael/django/lab01/lab01project/users/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Michael/django/lab01/lab01project/users/urls.py b/Code/Michael/django/lab01/lab01project/users/urls.py
new file mode 100644
index 00000000..51f1164e
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/urls.py
@@ -0,0 +1,12 @@
+from django.urls import path
+
+from . import views
+
+app_name = "users"
+urlpatterns = [
+ path("register/", views.register, name="register"),
+ path("login/", views.login, name="login"),
+ path("logout/", views.logout, name="logout"),
+ path("account/", views.account, name="account"),
+ # path('account/', views.edit_user, name='edit_user'),
+]
diff --git a/Code/Michael/django/lab01/lab01project/users/views.py b/Code/Michael/django/lab01/lab01project/users/views.py
new file mode 100644
index 00000000..c84782ec
--- /dev/null
+++ b/Code/Michael/django/lab01/lab01project/users/views.py
@@ -0,0 +1,70 @@
+from django.shortcuts import render, reverse
+from django.http import HttpResponseRedirect
+from django.contrib.auth import (
+ authenticate,
+ login as django_login,
+ logout as django_logout,
+)
+from users.models import CustomUser
+
+
+def register(request):
+ if request.method == "GET":
+ return render(request, "users/register.html")
+
+ elif request.method == "POST":
+ form = request.POST
+
+ username = form["username"]
+ password = form["password"]
+
+ new_user = CustomUser.objects.create_user(
+ username=username,
+ password=password,
+ )
+
+ django_login(request, new_user)
+ return HttpResponseRedirect(reverse("assistant:index"))
+
+
+def login(request):
+ if request.method == "GET":
+ return render(request, "users/login.html")
+
+ elif request.method == "POST":
+ form = request.POST
+
+ username = form["username"]
+ password = form["password"]
+
+ user = authenticate(request, username=username, password=password)
+
+ if user is None:
+ return render(
+ request, "users/login.html", {"error": "Invalid Username or Password!"}
+ )
+
+ django_login(request, user)
+ return HttpResponseRedirect(reverse("assistant:index"))
+
+
+def logout(request):
+ django_logout(request)
+ return HttpResponseRedirect(reverse("assistant:index"))
+
+
+def account(request):
+ if request.method == "GET":
+ return render(request, "users/account.html")
+ elif request.method == "POST":
+ form = request.POST
+
+ username = form["username"]
+ password = form["password"]
+
+ user = CustomUser.objects.get(username=username)
+ user.set_password(password)
+ user.save()
+
+ django_login(request, user)
+ return render(request, "users/account.html")
diff --git a/Code/Michael/javascript/lab03/assets/index.js b/Code/Michael/javascript/lab03/assets/index.js
new file mode 100644
index 00000000..dac14d43
--- /dev/null
+++ b/Code/Michael/javascript/lab03/assets/index.js
@@ -0,0 +1,46 @@
+let stringToEncrypt, intNumberRotations;
+
+function getInput() {
+ while (
+ stringToEncrypt == "" ||
+ stringToEncrypt == null ||
+ stringToEncrypt == undefined ||
+ stringToEncrypt == " "
+ ) {
+ // Check if input is empty
+ stringToEncrypt = prompt("Enter a string to be encrypted: ");
+ }
+
+ while (
+ intNumberRotations == "" ||
+ intNumberRotations == null ||
+ intNumberRotations == undefined ||
+ isNaN(intNumberRotations)
+ ) {
+ // Check if input is empty
+ intNumberRotations = parseInt(prompt("Enter the number of rotations: "));
+ }
+}
+
+function rot13(str, rotations) {
+ let result = "";
+ for (let i = 0; i < str.length; i++) {
+ let charCode = str.charCodeAt(i);
+ if (charCode >= 65 && charCode <= 90) {
+ // Uppercase
+ charCode = ((charCode - 65 + rotations) % 26) + 65;
+ } else if (charCode >= 97 && charCode <= 122) {
+ // Lowercase
+ charCode = ((charCode - 97 + rotations) % 26) + 97;
+ } else if (charCode >= 48 && charCode <= 57) {
+ // Numbers
+ charCode = ((charCode - 48 + rotations) % 10) + 48;
+ }
+ result += String.fromCharCode(charCode); // Convert back to string
+ }
+ return result;
+}
+
+getInput();
+alert(`Your string '${stringToEncrypt}'
+has been encrypted to '${rot13(stringToEncrypt, intNumberRotations)}'`);
diff --git a/Code/Michael/javascript/lab03/index.html b/Code/Michael/javascript/lab03/index.html
new file mode 100644
index 00000000..f4af2244
--- /dev/null
+++ b/Code/Michael/javascript/lab03/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Lab 03 Python Redo
+
+
+
+
+
diff --git a/Code/Michael/javascript/lab04/assets/js/index.js b/Code/Michael/javascript/lab04/assets/js/index.js
new file mode 100644
index 00000000..97064142
--- /dev/null
+++ b/Code/Michael/javascript/lab04/assets/js/index.js
@@ -0,0 +1,90 @@
+function addItem(item) {
+ // Add item to todo-list.
+ // Do not add item if it already exists on either list or is empty.
+ var li = document.getElementById("li-" + item); // Attempt to get item.
+ var li2 = document.getElementById("completed-li-" + item); // Attempt to get item.
+ if (li2 != null || li != null || item == "") {
+ //If item exists in a list or if it is empty.
+ return; //Do not add item.
+ }
+ var ul = document.getElementById("todo-list"); // Get todo-list.
+ var li = document.createElement("li"); // Create li element.
+ var label = document.createElement("label"); // Create label element.
+ li.setAttribute("id", "li-" + item); //Set id of item.
+ var checkbox = document.createElement("input"); //Create checkbox.
+ label.innerHTML = " " + item; //Set label text.
+ label.setAttribute("for", "checkbox-" + item); //Set for attribute.
+ label.setAttribute("id", "label-" + item); //Set id attribute.
+ checkbox.setAttribute("type", "checkbox"); //Set type to checkbox.
+ checkbox.setAttribute("id", "checkbox-" + item); //Set id of checkbox.
+ checkbox.setAttribute("onclick", "markItem('li-" + item + "')"); //Add onclick attribute.
+ ul.appendChild(li); //Add item to list.
+ li.appendChild(checkbox); //Add checkbox to item.
+ li.appendChild(label); //Add label to item.
+}
+
+function removeItem(list, item) {
+ // Remove item from list.
+ var ul = document.getElementById(list); // Get list.
+ var li = document.getElementById(item); // Get item.
+ ul.removeChild(li); // Remove item from list.
+}
+
+function markItem(item) {
+ // Mark item as completed.
+ var ul = document.getElementById("todo-list"); // Get todo-list.
+ var li = document.getElementById(item); // Get item.
+ var label = li.getElementsByTagName("label")[0]; // Get label.
+ var lineThrough = document.createElement("s"); // Create line-through element.
+ lineThrough.innerHTML = label.innerHTML; // Set innerHTML of line-through element to innerHTML of label.
+ lineThrough.setAttribute("id", "completed-" + item.substring(3)); //Set id of line-through element.
+ label.innerHTML = ""; // Remove label text.
+ ul.removeChild(li); // Remove li item from list.
+ var ul2 = document.getElementById("completed-list"); // Get completed list.
+ li.setAttribute("id", "completed-" + item); // Set id of li item.
+ ul2.appendChild(li); // Add li item to completed-list.
+ var checkbox = document.getElementById("checkbox-" + item.substring(3)); // Get checkbox but remove `li-` from item.
+ checkbox.remove(); // Remove checkbox.
+ li.appendChild(lineThrough); // Add line-through element to label.
+}
+
+document.getElementById("button").addEventListener("click", function () {
+ // Add event listener to button.
+ var item = document.getElementById("task").value; //Get value of task input.
+ addItem(item); //Add item to list.
+});
+
+document.getElementById("task").addEventListener("keyup", function (event) {
+ // Add event listener to input.
+ if (event.code === "Enter") {
+ // If enter key is pressed.
+ event.preventDefault(); //Prevent form from submitting with default.
+ document.getElementById("button").click(); //Call button click event.
+ }
+});
+
+document
+ .getElementById("todo-list")
+ .addEventListener("contextmenu", function (event) {
+ // Add event listener to todo-list.
+ event.preventDefault(); // Prevent default context menu.
+ removeItem("todo-list", "li-" + event.target.id.substring(6)); // Remove item from todo-list.
+ });
+
+document
+ .getElementById("completed-list")
+ .addEventListener("contextmenu", function (event) {
+ // Add event listener to completed-list.
+ event.preventDefault(); //Prevent default context menu.
+ if (event.target.id.includes("completed-li-")) {
+ // If item includes `completed-li-`.
+ removeItem("completed-list", event.target.id); // Remove item from completed-list.
+ } else {
+ // If item does not include `completed-li-`.
+ removeItem(
+ // Remove item from completed-list.
+ "completed-list",
+ "completed-li-" + event.target.id.substring(10)
+ );
+ }
+ });
diff --git a/Code/Michael/javascript/lab04/index.html b/Code/Michael/javascript/lab04/index.html
new file mode 100644
index 00000000..41574380
--- /dev/null
+++ b/Code/Michael/javascript/lab04/index.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+ JS Lab 04
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Instructions
+
+
+
+ Add a task by typing it into the text box and clicking the button or pressing enter.
+
+
+ Click on a task to mark it as complete.
+
+
+ Right Click on the any tasks to remove them.
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Michael/javascript/lab05/assets/css/index.css b/Code/Michael/javascript/lab05/assets/css/index.css
new file mode 100644
index 00000000..30886d17
--- /dev/null
+++ b/Code/Michael/javascript/lab05/assets/css/index.css
@@ -0,0 +1,15 @@
+#random-quote {
+ position: fixed;
+ background-color: rgb(29, 29, 29);
+ padding: 5px;
+ padding-bottom: 0;
+ bottom: 10px;
+ left: middle;
+ width: fit-content;
+}
+
+#top-bar {
+ position: static;
+ width: fit-content;
+ padding: 0 0 0 0;
+}
diff --git a/Code/Michael/javascript/lab05/assets/javascript/index.js b/Code/Michael/javascript/lab05/assets/javascript/index.js
new file mode 100644
index 00000000..45895d29
--- /dev/null
+++ b/Code/Michael/javascript/lab05/assets/javascript/index.js
@@ -0,0 +1,294 @@
+/* Use the favqs.com api to show a random quote. To start, use https://favqs.com/api/qotd to GET a quote, then display it on the page.
+The API also supports browsing quotes. */
+let debugging = false; // Set this to true to see console.log() statements. Keybind: Shift + I
+let quoteNumber = 0;
+let pageNumber = 1;
+let timer1;
+let focus = true;
+
+const headers = {
+ Accept: "application/json", // This is the type of data that we are expecting back from the server.
+ Authorization: `Token token=${FAVQS_API_KEY}`, // This is the key that we need to use to access the API.
+};
+
+// This is to change the background image every time the quote changes.
+function backgroundImages() {
+ let width = window.innerWidth; // Get the width of the window.
+ let height = window.innerHeight; // This is the height of the screen.
+ let deviceOrientation = window.orientation; // Doesn't actually do anything, just declaring the variable for later.
+
+ if (width < height) {
+ // If the width is less than the height, then the device is in portrait mode.
+ deviceOrientation = "portrait";
+ } else {
+ // If the width is greater than the height, then the device is in landscape mode.
+ deviceOrientation = "landscape";
+ }
+
+ let random = Math.floor(Math.random() * 10000) + 1; // This is to make sure that the background image is different every time.
+
+ const url = `https://source.unsplash.com/random/${width}x${height}?sig=${random}&orientation=${deviceOrientation}&fit=fillmax&fill=blur`; // This is the url to the background image.
+ fetch(url).then((data) => {
+ // This is to fetch the background image.
+ let image = data.url; // This is to get the url of the background image.
+ document.body.style.backgroundImage = `url(${image})`; // This is to set the background image.
+ });
+}
+
+// This is to get a random quote from the API.
+function randomQuote() {
+ clearTimeout(timer1); // This is to prevent the quote from changing when the window is not active.
+ if (focus) {
+ // This is to prevent the quote from changing when the window is not active.
+ fetch("https://favqs.com/api/qotd", { headers }) // This is to fetch the quote from the API.
+ .then((response) => response.json()) // This is to get the response from the API.
+ .then((data) => {
+ // This is to get the data from the API.
+ debugging ? console.log(focus) : null;
+ const author = data.quote.author; // This is to get the author of the quote.
+ const quoteText = data.quote.body; // This is to get the quote.
+ const quoteHTML = `
${quoteText} - ${author}
`; // This is to create the HTML for the quote.
+ document.getElementById("quote").innerHTML = quoteHTML; // This is to display the quote on the page.
+ timer1 = setTimeout(randomQuote, delayQuote()); // This is to set a timer to change the quote.
+ backgroundImages(); // This is to change the background image every time the quote changes.
+ });
+ } else {
+ clearTimeout(timer1); // This is to prevent the quote from changing when the window is not active. Probably not needed anymore.
+ }
+}
+
+//This is the function that runs when the window is not active.
+window.onblur = function () {
+ debugging ? console.log("Window is not active.") : null;
+
+ // The below is to prevent the quote from changing when the window is not active.
+ focus = false;
+ clearTimeout(timer1);
+};
+
+//This is the function that runs when the window is active.
+window.onfocus = function () {
+ debugging ? console.log("Window is active.") : null;
+ focus = true; // This is to allow the quote to change when the window is active.
+ clearTimeout(timer1); //This is to prevent the quote from changing when the window is not active. Probably not needed anymore.
+ randomQuote(); //This is to start the quote changing when the window is active.
+};
+
+//This is a test function to see if promises work. Not using it, but does work.
+function promiseTest() {
+ let width = window.innerWidth; // Get the width of the window.
+ let height = window.innerHeight; // This is the height of the screen.
+ let deviceOrientation = window.orientation; // Doesn't actually do anything, just declaring the variable for later.
+
+ if (width < height) {
+ // If the width is less than the height, then the device is in portrait mode.
+ deviceOrientation = "portrait";
+ } else {
+ // If the width is greater than the height, then the device is in landscape mode.
+ deviceOrientation = "landscape";
+ }
+ let promise1 = fetch("https://favqs.com/api/qotd", { headers }).then(
+ // This is to fetch the quote from the API.
+ (response) => response.json() // This is to get the response from the API.
+ );
+ let promise2 = fetch(
+ `https://api.unsplash.com/photos/random?client_id=${UNSPLASH_API_KEY}&orientation=${deviceOrientation}` // This is to fetch the background image.
+ ).then((response) => response.json()); // This is to get the response from the API.
+ Promise.all([promise1, promise2]).then((values) => {
+ // This is to get both the quote and the background image.
+ data = values[0]; // This is to get the quote from the API.
+ data2 = values[1]; // This is to get the background image from the API.
+ const author = data.quote.author; // This is to get the author of the quote.
+ const quoteText = data.quote.body; // This is to get the quote.
+ const quoteHTML = `
${quoteText} - ${author}
`; // This is to create the HTML for the quote.
+ const image = data2.urls.raw; // This is to get the url of the background image.
+ document.body.style.backgroundImage = `url(${image}&orientation=${deviceOrientation}&fit=fillmax&fill=blur&w=${width}&h=${height})`; // This is to set the background image.
+ document.getElementById("quote").innerHTML = quoteHTML; // This is to display the quote on the page.
+ setTimeout(promiseTest, delayQuote()); // This is to set a timer to change the quote.
+ });
+}
+
+// This is to get a random background image from the API.
+function randomBackground() {
+ let width = window.innerWidth; // Get the width of the window.
+ let height = window.innerHeight; // This is the height of the screen.
+ let deviceOrientation = window.orientation; // Doesn't actually do anything, just declaring the variable for later.
+
+ if (width < height) {
+ // If the width is less than the height, then the device is in portrait mode.
+ deviceOrientation = "portrait";
+ } else {
+ // If the width is greater than the height, then the device is in landscape mode.
+ deviceOrientation = "landscape";
+ }
+
+ fetch(
+ `https://api.unsplash.com/photos/random?client_id=${UNSPLASH_API_KEY2}&orientation=${deviceOrientation}`
+ ) // This is to fetch the background image.
+ .then((response) => response.json()) // This is to get the response from the API.
+ .then((data) => {
+ // This is to get the background image from the API.
+ const image = data.urls.raw; // This is to get the url of the background image.
+ document.body.style.backgroundImage = `url(${image}&orientation=${deviceOrientation}&fit=fillmax&fill=blur&w=${width}&h=${height})`; // This is to set the background image.
+ });
+}
+
+// This is to get a calculated delay for the quote changing.
+function delayQuote() {
+ const wpm = 180; // This is the average words per minute for humans.
+ const quote = document.getElementById("quote").innerHTML; // This is to get the quote.
+ const quoteLength = quote.length; // This is to get the length of the quote.
+ const words = quote.split(" "); // This is to split the quote into words.
+ const wordCount = words.length; // This is to get the number of words in the quote.
+ const avgWordLength = quoteLength / wordCount; // This is to get the average length of the words in the quote.
+ const delay = (quoteLength / avgWordLength / wpm) * 60000 + 2500; // This is to get the delay for the quote changing.
+ debugging ? console.log(delay) : null;
+ return delay; // This is to return the delay.
+}
+
+// This is to search for quotes.
+function searchQuotes(quoteNumber, pageNumber) {
+ // Disable elements while fetching.
+ document.getElementById("search-box").disabled = true;
+ document.getElementById("search-box").style.cursor = "not-allowed";
+ document.getElementById("search").disabled = true;
+ document.getElementById("search").style.cursor = "not-allowed";
+ document.getElementById("random-btn").disabled = true;
+ document.getElementById("random-btn").style.cursor = "not-allowed";
+ document.getElementById("left-btn").disabled = true;
+ document.getElementById("left-btn").style.cursor = "not-allowed";
+ document.getElementById("right-btn").disabled = true;
+ document.getElementById("right-btn").style.cursor = "not-allowed";
+
+ const searchTerm = document.getElementById("search-box").value;
+ fetch(
+ `https://favqs.com/api/quotes?filter=${searchTerm}&page=${pageNumber}`,
+ {
+ headers,
+ }
+ ) // This is to fetch the quotes from the API.
+ .then((response) => response.json()) // This is to get the response from the API.
+ .then((data) => {
+ // This is to get the quotes from the API.
+ // Enable elements after fetching.
+ document.getElementById("search-box").disabled = false;
+ document.getElementById("search-box").style.cursor = "auto";
+ document.getElementById("search").disabled = false;
+ document.getElementById("search").style.cursor = "auto";
+ if (quoteNumber > data.quotes.length - 1) {
+ // If the quote number is greater than the number of quotes, then set the quote number to the last quote.
+ quoteNumber = data.quotes.length - 1; // This is to set the quote number to the last quote.
+ }
+ debugging ? console.log(quoteNumber, " quoteNumber") : null;
+ let author; // This is to declare the author variable. Fixed an error, probably not needed anymore.
+ try {
+ // This is to try to get the author of the quote. Probably not needed anymore.
+ author = data.quotes[quoteNumber].author; // This is to get the author of the quote.
+ } catch (error) {
+ // This is to catch an error. Probably not needed anymore.
+ author = `Unknown [${error}]`; // This is to set the author to Unknown. Probably not needed anymore.
+ }
+ const quoteText = data.quotes[quoteNumber].body; // This is to get the quote.
+ const quoteHTML = `
${quoteText} - ${author}
`; // This is to get the quote in HTML.
+ debugging ? console.log(data) : null;
+ if (data.quotes.length === 1) {
+ // This is to check if there is only one quote. (If there is only one quote, it means no quotes, this is probably the wrong way to handle it and will cause errors, but time is short.)
+ document.getElementById("quote-result").innerHTML =
+ "
No quotes found. "; // This is to display no quotes.
+ } else {
+ // This is to check if there is more than one quote.
+ document.getElementById("quote-result").innerHTML = quoteHTML; // This is to display the quote.
+ document.getElementById("random-btn").disabled = false; // This is to enable the random button.
+ document.getElementById("random-btn").style.cursor = "auto"; // This is to set the cursor to auto.
+ }
+ if (data.last_page === false) {
+ // This is to check if there are more quotes.
+ //Enable right-btn
+ document.getElementById("right-btn").disabled = false; // This is to enable the right button.
+ document.getElementById("right-btn").style.cursor = "auto"; // This is to set the cursor to auto.
+ } else {
+ // This is to check if there are no more quotes.
+ //Disable right-btn
+ document.getElementById("right-btn").disabled = true; // This is to disable the right button.
+ document.getElementById("right-btn").style.cursor = "not-allowed"; // This is to set the cursor to not-allowed.
+ }
+
+ if (data.page === 1) {
+ // This is to check if the page is the first page.
+ //Disable left-btn
+ document.getElementById("left-btn").disabled = true; // This is to disable the left button.
+ document.getElementById("left-btn").style.cursor = "not-allowed"; // This is to set the cursor to not-allowed.
+ } else {
+ // This is to check if the page is not the first page.
+ //Enable left-btn
+ document.getElementById("left-btn").disabled = false; // This is to enable the left button.
+ document.getElementById("left-btn").style.cursor = "auto"; // This is to set the cursor to auto.
+ }
+ pageNumber = data.page; // This is to set the page number.
+ //backgroundImages(); // This is too spammy. Need a better function, no time to write.
+ //randomBackground(); // Disabled because of lack of API key.
+ });
+}
+
+// Event listeners
+document.getElementById("search-box").addEventListener("keydown", (event) => {
+ // This is to listen for keydown events on the search box.
+ if (event.code === "Enter") {
+ // This is to check if the keydown event is enter.
+ (quoteNumber = 0), (pageNumber = 1); // This is to reset the quote number and page number.
+ searchQuotes(quoteNumber, pageNumber); // This is to search the quotes.
+ }
+});
+// Event Listener for Search
+document.getElementById("search").addEventListener("click", function (_event) {
+ // This is to listen for click events on the search button.
+ (quoteNumber = 0), (pageNumber = 1); // This is to reset the quote number and page number.
+ searchQuotes(quoteNumber, pageNumber); // This is to search the quotes.
+});
+// Event Listener for Random
+document
+ .getElementById("random-btn")
+ .addEventListener("click", function (_event) {
+ // This is to listen for click events on the random button.
+ quoteNumber = Math.floor(Math.random() * 24); // This is to get a random number between 0 and 23.
+ debugging ? console.log(quoteNumber) : null;
+ searchQuotes(quoteNumber, pageNumber); // This is to search the quotes.
+ });
+// Event Listener for Next
+document
+ .getElementById("right-btn")
+ .addEventListener("click", function (_event) {
+ // This is to listen for click events on the right button.
+ pageNumber++; // This is to increment the page number.
+ debugging ? console.log(pageNumber) : null;
+ searchQuotes(quoteNumber, pageNumber); // This is to search the quotes.
+ });
+// Event Listener for Previous
+document
+ .getElementById("left-btn")
+ .addEventListener("click", function (_event) {
+ // This is to listen for click events on the left button.
+ pageNumber--; // This is to decrement the page number.
+ debugging ? console.log(pageNumber) : null;
+ searchQuotes(quoteNumber, pageNumber); // This is to search the quotes.
+ });
+window.addEventListener("keydown", (event) => {
+ // This is to listen for keydown events on the window.
+ if (event.code === "KeyI" && event.shiftKey) {
+ // If the key is I and shift is held down, toggle debugging.
+ debugging = !debugging; // Toggle debugging.
+ console.log("Debugging is now " + debugging); // Log the new value of debugging.
+ }
+});
+
+window.addEventListener("resize", () => {
+ // This is to listen for resize events on the window.
+ backgroundImages(); // This is to change the background images.
+ //This could be done better, but time constraints.
+});
+
+backgroundImages(); // This function to load a random background image when the page loads.
+randomQuote(); //This is to start the quote changing when the page is loaded.
+//promiseTest(); This fuction works, but because of API limitations and lack of API keys, I'm not using it.
+
+// I'm doing too much. I have to stop this so I can turn it in.
diff --git a/Code/Michael/javascript/lab05/index.html b/Code/Michael/javascript/lab05/index.html
new file mode 100644
index 00000000..8f81d696
--- /dev/null
+++ b/Code/Michael/javascript/lab05/index.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
Javascript Lab 06 Quotes API
+
+
+
+
+
+
+ Search
+ ←
+ ?
+ →
+
+
+
+
+
+
+
+
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/manage.py b/Code/Philip/Django/Lab01_Todo/todo_project/manage.py
new file mode 100755
index 00000000..1d0193af
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/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', 'todo_project.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/Code/Philip/Django/Lab01_Todo/todo_project/static/index.css b/Code/Philip/Django/Lab01_Todo/todo_project/static/index.css
new file mode 100644
index 00000000..dfa2fb8a
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/static/index.css
@@ -0,0 +1,62 @@
+@import url('https://fonts.googleapis.com/css2?family=Ubuntu:ital@1&display=swap');
+
+header {
+ background: slategray;
+ padding: 30px 40px;
+ color: white;
+ text-align: center;
+}
+
+h1 {
+ font-family: 'Ubuntu', sans-serif;
+ margin-bottom: 15px;;
+ text-align: center;
+}
+
+ul li {
+ cursor: pointer;
+ position: relative;
+ padding: 4px 4px 4px 20px;
+ list-style-type: none;
+ background: rgba(105, 90, 205, 0.096);
+ font-size: 18px;
+ transition: 0.2s;
+ margin: 3%;
+ border-radius: 20px;
+ border-color:slateblue;
+ border-width:.2em;
+ border-style:solid;
+ font-family: 'Ubuntu', sans-serif;
+}
+
+ul li:hover {
+ background: rgba(105, 90, 205, 0.288)
+}
+
+.subtask {
+ background-color: rgba(137, 43, 226, 0.397);
+ border-color:rgba(137, 43, 226, 0.11)
+}
+
+.completed {
+ text-decoration: line-through;
+ border-color:#555;
+ background: rgb(145, 163, 182);
+ color: #fff;
+}
+
+.new-todo {
+ text-align: center;
+ font-size: xx-large;
+}
+
+a:link, a:visited, a:hover{
+ text-decoration:none;
+ color:#555;
+}
+
+.fas:hover {
+ border-radius: 50%;
+ background-color: rgba(75, 109, 139, 0.445);
+ color: white;
+}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/templates/base.html b/Code/Philip/Django/Lab01_Todo/todo_project/templates/base.html
new file mode 100644
index 00000000..d901b063
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/templates/base.html
@@ -0,0 +1,11 @@
+{% load static%}
+
+
+
+
+
+
+ {% block content%}
+ {% endblock %}
+
+
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/templates/todo_app/todo_form.html b/Code/Philip/Django/Lab01_Todo/todo_project/templates/todo_app/todo_form.html
new file mode 100644
index 00000000..16ad342e
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/templates/todo_app/todo_form.html
@@ -0,0 +1,32 @@
+{% load static %}
+
+
+
+
+
+
+
New Honey Do
+
+
+
+
+
+
+
+
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/__init__.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/admin.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/admin.py
new file mode 100644
index 00000000..9ad62fb0
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/admin.py
@@ -0,0 +1,12 @@
+from django.contrib import admin
+
+from .models import Todo
+from .models import Priority
+
+@admin.register(Todo)
+class TodoAdmin(admin.ModelAdmin):
+ list_display=['title','created_date','priority_choice','completed']
+
+@admin.register(Priority)
+class PriorityAdmin(admin.ModelAdmin):
+ list_display=['priority']
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/apps.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/apps.py
new file mode 100644
index 00000000..d8f1498d
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class TodoAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'todo_app'
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0001_initial.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0001_initial.py
new file mode 100644
index 00000000..a9709512
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0001_initial.py
@@ -0,0 +1,32 @@
+# Generated by Django 3.2.7 on 2021-12-30 02:11
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Priority',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('priority', models.CharField(choices=[('H', 'High'), ('M', 'Medium'), ('L', 'Low')], max_length=100)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Todo',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=100)),
+ ('completed', models.BooleanField(default=False)),
+ ('completed_date', models.DateTimeField(blank=True, null=True)),
+ ('priority_choice', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='todo_app.priority')),
+ ],
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0002_alter_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0002_alter_priority_priority.py
new file mode 100644
index 00000000..1f28006d
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0002_alter_priority_priority.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2021-12-30 03:07
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(max_length=7),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0003_todo_created_date.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0003_todo_created_date.py
new file mode 100644
index 00000000..e3a89ed3
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0003_todo_created_date.py
@@ -0,0 +1,20 @@
+# Generated by Django 3.2.7 on 2021-12-30 04:33
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0002_alter_priority_priority'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='todo',
+ name='created_date',
+ field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
+ preserve_default=False,
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0004_remove_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0004_remove_priority_priority.py
new file mode 100644
index 00000000..77f83ef6
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0004_remove_priority_priority.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.2.7 on 2022-01-12 02:45
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0003_todo_created_date'),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name='priority',
+ name='priority',
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0005_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0005_priority_priority.py
new file mode 100644
index 00000000..7b18a403
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0005_priority_priority.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-12 02:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0004_remove_priority_priority'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(choices=[('LOW', 'low'), ('MEDIUM', 'medium'), ('HIGH', 'high')], default='low', max_length=7),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0006_auto_20220112_0302.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0006_auto_20220112_0302.py
new file mode 100644
index 00000000..ff84158e
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0006_auto_20220112_0302.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.7 on 2022-01-12 03:02
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0005_priority_priority'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(choices=[('LOW', 'low'), ('MEDIUM', 'medium'), ('HIGH', 'high')], max_length=7),
+ ),
+ migrations.AlterField(
+ model_name='todo',
+ name='priority_choice',
+ field=models.ForeignKey(blank=True, default='low', null=True, on_delete=django.db.models.deletion.CASCADE, to='todo_app.priority'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0007_alter_todo_priority_choice.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0007_alter_todo_priority_choice.py
new file mode 100644
index 00000000..c174fb09
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0007_alter_todo_priority_choice.py
@@ -0,0 +1,19 @@
+# Generated by Django 3.2.7 on 2022-01-12 03:03
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0006_auto_20220112_0302'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='todo',
+ name='priority_choice',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='todo_app.priority'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0008_alter_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0008_alter_priority_priority.py
new file mode 100644
index 00000000..f6988ac4
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0008_alter_priority_priority.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-12 04:03
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0007_alter_todo_priority_choice'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(max_length=20),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0009_alter_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0009_alter_priority_priority.py
new file mode 100644
index 00000000..6eee2308
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0009_alter_priority_priority.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-12 04:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0008_alter_priority_priority'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], default='low', max_length=20),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0010_alter_priority_priority.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0010_alter_priority_priority.py
new file mode 100644
index 00000000..d5f9e7e1
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/0010_alter_priority_priority.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-12 04:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todo_app', '0009_alter_priority_priority'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='priority',
+ name='priority',
+ field=models.CharField(choices=[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')], max_length=20),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/__init__.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/models.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/models.py
new file mode 100644
index 00000000..7ff99955
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/models.py
@@ -0,0 +1,26 @@
+from django.db import models
+from django.db.models.deletion import SET_DEFAULT
+from django.db.models.fields import CharField
+from django.db import models
+
+
+
+class Priority(models.Model):
+ priority= models.CharField(max_length=20)
+
+ def __str__(self):
+ return self.priority
+
+priority, created = Priority.objects.get_or_create(priority='High')
+priority, created = Priority.objects.get_or_create(priority='Medium')
+priority, created = Priority.objects.get_or_create(priority='Low')
+
+class Todo(models.Model):
+ title = models.CharField(max_length=100)
+ created_date = models.DateTimeField(auto_now_add=True)
+ completed = models.BooleanField(default=False)
+ completed_date = models.DateTimeField(null=True, blank=True)
+ priority_choice = models.ForeignKey(Priority,on_delete=models.CASCADE, blank=True, null=True)
+
+ def __str__(self):
+ return self.title + self.priority_choice
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/index.html b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/index.html
new file mode 100644
index 00000000..b9b91aa5
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/index.html
@@ -0,0 +1,67 @@
+{% load static %}
+
+
+
+
+
+
+
+
Honey Do List
+
+
+
+
+
+
+
+
+
+
+
+
+
Honey Do List
+
Today is: {% now "jS F Y" %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% for each_todo in items%}
+
+ {{each_todo.title}}
+
+
+ Priority: {{each_todo.priority_choice}}
+ Created: {{each_todo.created_date}}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/todo_detail.html b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/todo_detail.html
new file mode 100644
index 00000000..f60e18bc
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/templates/todo_detail.html
@@ -0,0 +1,35 @@
+{% load static %}
+
+
+
+
+
+
+
New Honey Do
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/tests.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/views.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/views.py
new file mode 100644
index 00000000..ef5037d0
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_app/views.py
@@ -0,0 +1,63 @@
+from django.shortcuts import render
+
+from datetime import datetime
+from django.views.generic import CreateView, ListView
+
+from .models import Todo
+
+#Using class based views
+#List View for main page
+class TodoListView(ListView):
+ model = Todo
+ context_object_name = "items"
+ template_name = "index.html"
+
+#Create item view
+class TodoCreateView(CreateView):
+ model = Todo
+ fields = ['title','priority_choice']
+ success_url = '/index'
+
+
+
+
+
+
+
+
+
+#Function based views
+'''def index(request):
+ all_todos = Todo.objects.all()
+ return render(request, 'index.html',{
+ 'all_todos':all_todos,
+ })
+
+def details(request, item_id):
+ each_todo = Todo.objects.get(id=item_id)
+ return render(request, 'save_todo_item.html', {
+ 'each_todo':each_todo,
+ })
+
+def save_todo_item(request,item_id):
+ new_todo = Todo.objects.create()
+
+def todo_detail(request, item_id):
+ item = Todo.objects.get(id=item_id)
+ return render(request, 'todo_detail.html', {'item':item,})
+
+class TodoCreateView(CreateView):
+ model = Todo
+ fields = ['title','priority_choice']
+ success_url = '/index'
+
+class TodoUpdateView(UpdateView):
+ model = Todo
+ fields = ['title','priority_choice','complete','completed_date']
+ success_url = '/index'
+
+class TodoDetailView(DetailView):
+ model = Todo
+ context_object_name = 'todo_detail'
+ template_name = 'todo_detail.html'
+ '''
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/__init__.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/asgi.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/asgi.py
new file mode 100644
index 00000000..e793c4bc
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for todo_project 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', 'todo_project.settings')
+
+application = get_asgi_application()
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/settings.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/settings.py
new file mode 100644
index 00000000..a4d0ca5f
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/settings.py
@@ -0,0 +1,133 @@
+"""
+Django settings for todo_project project.
+
+Generated by 'django-admin startproject' using Django 3.2.7.
+
+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-0x+1)7@!sce-o_aq^o%&220z!$_17s0*i=pk5-bj3vi7cbi=hc'
+
+# 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',
+
+ 'todo_app',
+]
+
+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 = 'todo_project.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': ['templates',
+ BASE_DIR / 'static',
+ ],
+ '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 = 'todo_project.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/'
+ #helps to lead Django to our static url
+STATICFILES_DIRS = [
+ BASE_DIR / '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'
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/urls.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/urls.py
new file mode 100644
index 00000000..3eb29953
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/urls.py
@@ -0,0 +1,14 @@
+from django.contrib import admin
+from django.urls import path
+
+from todo_app import views
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+ path('', views.TodoListView.as_view(), name='home.list'),
+ #path('
/', views.TodoDetailView.as_view(), name='todo_detail'),
+ path('index/', views.TodoListView.as_view(), name='index.list'),
+ path('todo_form/', views.TodoCreateView.as_view(), name='todo_form.new'),
+ # path('details/', views.TodoDetailView.as_view(), name='todo_form.details')
+
+]
diff --git a/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/wsgi.py b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/wsgi.py
new file mode 100644
index 00000000..5c559837
--- /dev/null
+++ b/Code/Philip/Django/Lab01_Todo/todo_project/todo_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for todo_project 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', 'todo_project.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit/__init__.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit/asgi.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit/asgi.py
new file mode 100644
index 00000000..f13674b1
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for blogit 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogit.settings')
+
+application = get_asgi_application()
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit/settings.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit/settings.py
new file mode 100644
index 00000000..cba8bce0
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit/settings.py
@@ -0,0 +1,126 @@
+"""
+Django settings for blogit project.
+
+Generated by 'django-admin startproject' using Django 4.0.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-++4wythj)-65ja(uk30a!^3qlkc3u!k3zaet(*mz-aj5i0t4ql'
+
+# 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',
+ 'blogit_app',
+]
+
+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 = 'blogit.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [str(BASE_DIR.joinpath('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 = 'blogit.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+STATICFILES_DIRS = [str(BASE_DIR.joinpath('static'))]
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+LOGIN_REDIRECT_URL = 'profile'
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit/urls.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit/urls.py
new file mode 100644
index 00000000..e4e2a2a6
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit/urls.py
@@ -0,0 +1,22 @@
+"""blogit URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('blogit_app.urls')),
+]
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit/wsgi.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit/wsgi.py
new file mode 100644
index 00000000..498de725
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for blogit 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogit.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/__init__.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/admin.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/admin.py
new file mode 100644
index 00000000..47f03fdd
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/admin.py
@@ -0,0 +1,4 @@
+from django.contrib import admin
+from .models import Post
+
+admin.site.register(Post)
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/apps.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/apps.py
new file mode 100644
index 00000000..93fe12c7
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class BlogitAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'blogit_app'
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/forms.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/forms.py
new file mode 100644
index 00000000..f1cdedac
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/forms.py
@@ -0,0 +1,28 @@
+from django import forms
+from .models import Post
+
+class PostForm(forms.ModelForm):
+ class Meta:
+ model = Post
+ fields = ('title', 'title_tag', 'body', 'public')
+
+ widgets = {
+ 'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'give your thoughts a title here'}),
+ 'title_tag': forms.TextInput(attrs={'class': 'form-control', 'placeholder':'tell us what its about'}),
+ 'user': forms.Select(attrs={'class': 'form-control'}),
+ 'body': forms.Textarea(attrs={'class': 'form-control', 'placeholder':'go ahead, get creative'}),
+ 'public': forms.NullBooleanSelect(attrs={'class': 'form-control', 'placeholder':'would you like the world to know?'}),
+ }
+
+class EditForm(forms.ModelForm):
+ class Meta:
+ model = Post
+ fields = ('title', 'title_tag', 'body', 'public')
+
+ widgets = {
+ 'title': forms.TextInput(attrs={'class': 'form-control', 'placeholder': 'give your thoughts a title here'}),
+ 'title_tag': forms.TextInput(attrs={'class': 'form-control', 'placeholder':'tell us what its about'}),
+ #'author': forms.Select(attrs={'class': 'form-control'}),
+ 'body': forms.Textarea(attrs={'class': 'form-control', 'placeholder':'go ahead, get creative'}),
+ 'public': forms.NullBooleanSelect(attrs={'class': 'form-control', 'placeholder':'would you like the world to know?'}),
+ }
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0001_initial.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0001_initial.py
new file mode 100644
index 00000000..ba90b675
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0001_initial.py
@@ -0,0 +1,30 @@
+# Generated by Django 3.2.7 on 2022-01-13 01:34
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Post',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=255)),
+ ('title_tag', models.CharField(max_length=255)),
+ ('body', models.TextField()),
+ ('public', models.BooleanField(default=True)),
+ ('date_created', models.DateTimeField(auto_now_add=True)),
+ ('date_edited', models.DateTimeField(auto_now=True)),
+ ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0002_rename_author_post_user.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0002_rename_author_post_user.py
new file mode 100644
index 00000000..6d459374
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/0002_rename_author_post_user.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-13 02:33
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('blogit_app', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.RenameField(
+ model_name='post',
+ old_name='author',
+ new_name='user',
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/__init__.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/models.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/models.py
new file mode 100644
index 00000000..ed8458fc
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/models.py
@@ -0,0 +1,21 @@
+from django.db import models
+from django.contrib.auth.models import User
+from django.contrib.auth import get_user_model
+from django.urls import reverse
+from datetime import datetime, date
+
+class Post(models.Model):
+ title = models.CharField(max_length=255)
+ title_tag = models.CharField(max_length=255)
+ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notes')
+ body = models.TextField()
+ public = models.BooleanField(default=True)
+ date_created = models.DateTimeField(auto_now_add=True)
+ date_edited = models.DateTimeField(auto_now=True, blank=True)
+
+
+ def __str__(self):
+ return self.title + ' by ' + str(self.user)
+
+ def get_absolute_url(self):
+ return reverse('profile')
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/tests.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/urls.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/urls.py
new file mode 100644
index 00000000..5de1abc0
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/urls.py
@@ -0,0 +1,17 @@
+
+from django.urls import path
+from . import views
+from .views import ArticleDetailView, AddPostView, UpdatePostView, DeletePostView, LoginInterfaceView, LogoutInterfaceView, SignupView, HomeView
+
+urlpatterns = [
+
+ path('', HomeView.as_view(), name="home"),
+ path('profile',HomeView.as_view(), name="profile"),
+ path('post/', ArticleDetailView.as_view(), name='post_detail'),
+ path('add_post/', AddPostView.as_view(), name='add_post'),
+ path('post//edit', UpdatePostView.as_view(), name='update_post'),
+ path('post//delete', DeletePostView.as_view(), name='delete_post'),
+ path('login', LoginInterfaceView.as_view(), name='login'),
+ path('logout', LogoutInterfaceView.as_view(), name='logout'),
+ path('register', SignupView.as_view(), name='register'),
+ ]
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/views.py b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/views.py
new file mode 100644
index 00000000..7d7ba4e6
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/blogit_app/views.py
@@ -0,0 +1,77 @@
+"""Django Lab02 Blog Post
+By: Philip Bartoo
+1/11/2022
+
+Build a blog using Django.
+
+I used almost all Class based views as this is much quicker to set up CRUD operations than working through function based views.
+The primary thing I learned was the need to build an app along a template first, then to customize later.
+This should allow me to develop apps faster. I also added a url.py file to the app, which simplified template access that I struggled with in my first Django app. The other big learning point was setup of
+the login function. In this project the login is built into the app. Alternatively the login could be built as its own app. I didn't add
+a static folder to this app in the interest of time, but will plan to go back and update at a later point in time. There are several
+relatively simple functional improvements which need to be made, such as only showing the logout function when logged in. I also did not
+include a list of all posts, another item I'd really like to update in future revisions. """
+
+from django.contrib.auth.forms import UserCreationForm
+from django.shortcuts import render
+from django.views.generic import ListView, DetailView, CreateView, UpdateView, DeleteView
+from .models import Post, User
+from .forms import PostForm, EditForm
+from django.urls import reverse_lazy
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.http.response import HttpResponseRedirect
+from django.contrib.auth.views import LoginView, LogoutView
+
+
+
+class LoginInterfaceView(LoginView):
+ template_name = 'login.html'
+
+class LogoutInterfaceView(LogoutView):
+ template_name = 'logout.html'
+
+class SignupView(CreateView):
+ form_class = UserCreationForm
+ template_name = 'register.html'
+ success_url = reverse_lazy('profile')
+
+#def home(request):
+ #posts=Post.objects.order_by('-date_created')
+ #return render(request,'home.html', {'posts':posts})
+
+class HomeView(LoginRequiredMixin, ListView):
+ model = Post
+ template_name = 'home.html'
+ ordering = ['-date_created']
+ login_url = "login"
+
+ def get_queryset(self):
+ return self.request.user.notes.all()
+
+class ArticleDetailView(DetailView):
+ model = Post
+ template_name = 'post_details.html'
+
+class AddPostView(CreateView):
+ model = Post
+ form_class = PostForm
+ template_name = 'add_post.html'
+ #fields = '__all__'
+ #fields = ('title', 'title_tag','body','public')
+
+ def form_valid(self, form):
+ self.object = form.save(commit=False)
+ self.object.user = self.request.user
+ self.object.save()
+ return HttpResponseRedirect(self.get_success_url())
+
+class UpdatePostView(UpdateView):
+ model = Post
+ form_class = EditForm
+ template_name = 'update_post.html'
+ #fields = ['title', 'title_tag', 'body', 'public',]
+
+class DeletePostView(DeleteView):
+ model = Post
+ template_name = 'delete_post.html'
+ success_url = reverse_lazy('profile')
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/manage.py b/Code/Philip/Django/Lab02_Blog/blogit/manage.py
new file mode 100755
index 00000000..9b3c20d6
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/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', 'blogit.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/Code/Philip/Django/Lab02_Blog/blogit/static/styles.css b/Code/Philip/Django/Lab02_Blog/blogit/static/styles.css
new file mode 100644
index 00000000..f76dd28b
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/static/styles.css
@@ -0,0 +1,81 @@
+@import url('https://fonts.googleapis.com/css2?family=Rock+Salt&display=swap');
+@import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@1,300&family=Sora:wght@100&display=swap');
+
+.flex-container {
+ display: flex;
+ flex-flow: row wrap;
+ justify-content: space-evenly;
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ background-image: linear-gradient(to right, slateblue, #f28500);
+ }
+ .flex-item {
+ padding: 5px;
+ margin: 0px;
+ width: auto;
+ height: 50px;
+ line-height: 2.2em;
+ color: whitesmoke;
+ font-size: 1.5em;
+ text-align: center;
+ font-family: 'Sora', sans-serif;
+ }
+ .heading {
+ font-family: 'Rock Salt', cursive;
+ font-size:xx-large;
+ text-align: center;
+ font-size: 3em;
+ }
+ .blog-article {
+ background-color: #f2f1f8;
+ margin: 5%;
+ border-style: solid;
+ border-color:#f28500;
+ border-width: 1px;
+ padding: 30px;
+ border-radius: 30px;
+ list-style-type: none;
+
+ }
+ .blog-entry {
+ display:flex;
+ color: #f28500;
+ font-size: 2em;
+ font-weight:bolder;
+ font-family: 'Montserrat', sans-serif;
+ text-align:center;
+ }
+
+
+ .paragraph {
+ color: #333333;
+ font-family: 'Sora', sans-serif;
+ font-size: 1.2em;
+ line-height: 1.4em;
+ letter-spacing: 0.03em;
+ }
+
+ .item {
+ list-style-type:none;
+ }
+ .date {
+ font-family: 'Sora', sans-serif;
+ color: slateblue;
+ }
+ .details {
+ border-radius: 100px;
+ text-align:center;
+ border-style: solid;
+ border-color:slateblue;
+ border-width: 1px;
+ margin: 50px;
+ padding: 0px;
+
+
+ }
+ .authors-info {
+ font-family: 'Sora', sans-serif;
+ color: slateblue;
+
+ }
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/add_post.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/add_post.html
new file mode 100644
index 00000000..d672b52c
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/add_post.html
@@ -0,0 +1,21 @@
+{% extends 'base.html' %}
+{% block title %}Create a new blog post{% endblock %}
+{% block content %}
+
+Add Post
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/base.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/base.html
new file mode 100644
index 00000000..4f4b38a8
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/base.html
@@ -0,0 +1,55 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+ {% block title%}My Blog{% endblock %}
+
+
+
+
+
+
+
+
+ {% block content %}
+
+ {% endblock %}
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/delete_post.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/delete_post.html
new file mode 100644
index 00000000..5e86177f
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/delete_post.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% block title %}Delete blog post{% endblock %}
+{% block content %}
+
+Delete Post
+Delete: {{ post.title }}
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/home.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/home.html
new file mode 100644
index 00000000..15d6d8ca
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/home.html
@@ -0,0 +1,30 @@
+{% extends 'base.html' %}
+{% load static %}
+{% block content %}
+
+
+
Welcome to BlogIt!
+
+
+
+Profile Page
+{{ user.first_name }} {{ user.last_name }}
+
+
+
+{% for post in object_list %}
+
+ {{ post.title }}
+
+
+ Created: {{ post.date_created }} |
+ Edit |
+ Delete
+
+
+
+
+{% endfor %}
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/login.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/login.html
new file mode 100644
index 00000000..2ef6412a
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/login.html
@@ -0,0 +1,19 @@
+{% extends 'base.html' %}
+{% block title %}Welcome to BlogIt{% endblock %}
+{% block content %}
+
+Welcome to BlogIt
+
+Login
+
+
+
+
+Register
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/logout.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/logout.html
new file mode 100644
index 00000000..245f6d91
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/logout.html
@@ -0,0 +1,11 @@
+{% extends 'base.html' %}
+{% block title %}Logout{% endblock %}
+{% block content %}
+
+Thanks for Stopping By!
+
+
+Login Page
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/post_details.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/post_details.html
new file mode 100644
index 00000000..3a18e043
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/post_details.html
@@ -0,0 +1,19 @@
+{% extends 'base.html' %}
+{% block title %}{{ post.title_tag }}{% endblock %}
+{% block content %}
+
+{{ post.title }}
+{{ post.author.first_name }} {{ post.author.last_name }} Created: {{ post.date_created }} |
+ Edit |
+ Delete
+
+
+
+
+
+{{ post.body }}
+
+
+Back
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/register.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/register.html
new file mode 100644
index 00000000..fd441b0c
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/register.html
@@ -0,0 +1,16 @@
+{% extends 'base.html' %}
+{% block title %}Register{% endblock %}
+{% block content %}
+
+Register
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab02_Blog/blogit/templates/update_post.html b/Code/Philip/Django/Lab02_Blog/blogit/templates/update_post.html
new file mode 100644
index 00000000..53d3e5d2
--- /dev/null
+++ b/Code/Philip/Django/Lab02_Blog/blogit/templates/update_post.html
@@ -0,0 +1,21 @@
+{% extends 'base.html' %}
+{% block title %}Edit blog post{% endblock %}
+{% block content %}
+
+Update Post
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/manage.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/manage.py
new file mode 100755
index 00000000..6adc02e8
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/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', 'pokedex.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/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/__init__.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/asgi.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/asgi.py
new file mode 100644
index 00000000..03bf1b13
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for pokedex 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings')
+
+application = get_asgi_application()
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/settings.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/settings.py
new file mode 100644
index 00000000..59a35528
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/settings.py
@@ -0,0 +1,128 @@
+"""
+Django settings for pokedex project.
+
+Generated by 'django-admin startproject' using Django 4.0.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.0/ref/settings/
+"""
+
+from pathlib import Path
+import os
+
+# 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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-**zsaza72784dpb1iezda*1$o_hmp--k50_36c@!cm7bn1g#0^'
+
+# 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',
+ 'pokedex_app',
+]
+
+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 = 'pokedex.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [str(BASE_DIR.joinpath('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 = 'pokedex.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+STATICFILES_DIRS = [str(BASE_DIR.joinpath('static'))]
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/urls.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/urls.py
new file mode 100644
index 00000000..6f25965e
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/urls.py
@@ -0,0 +1,22 @@
+"""pokedex URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('pokedex_app.urls')),
+]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/wsgi.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/wsgi.py
new file mode 100644
index 00000000..8b6d1551
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for pokedex 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/__init__.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/admin.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/admin.py
new file mode 100644
index 00000000..7521ffb2
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from .models import Pokemon, PokemonType
+
+admin.site.register(Pokemon)
+admin.site.register(PokemonType)
+
+
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/apps.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/apps.py
new file mode 100644
index 00000000..14f7ad62
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class PokedexAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'pokedex_app'
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/management/commands/load_pokemon.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/management/commands/load_pokemon.py
new file mode 100644
index 00000000..9ee6addc
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/management/commands/load_pokemon.py
@@ -0,0 +1,151 @@
+'''Django Lab03 Pokedex
+By Philip Bartoo
+January 15, 2022
+
+Pokedex
+Let's build a searchable pokedex! First we'll load the data from a json file into our own database. Then we'll list those pokemon in the page and add search.
+The Pokédex (Japanese: ポケモン図鑑 illustrated Pokémon encyclopedia) is a digital encyclopedia for Trainers in the Pokémon world. It gives information about all Pokémon in the world that are contained in its database.
+Pokédex entries typically describe a Pokémon in only two or three sentences. They may give background information on the habitat or activities of a Pokémon in the wild or other information on the Pokémon's history or anatomy.
+Pokédex entries also include height, weight, cry, footprint, location, other forms, and a picture of the Pokémon.
+Pokedex Wiki, Pokemon.com
+Part 1
+Create an app pokedex and add two models to store our pokemon, Pokemon and PokemonType.
+PokemonType should have the following fields:
+name (CharField)
+Pokemon should have the following fields:
+number (IntegerField)
+name (CharField)
+height (FloatField)
+weight (FloatField)
+image_front (CharField)
+image_back (CharField)
+types (ManyToManyField with PokemonType)
+Part 2
+Write a custom management command load_pokemon.py to load the data from pokemon.json into your database. You can do this by saving the file next to your .py file and using opening the file. To handle the types, check out many to many fields. In the first line of your management command, you may want to delete all the records in the table so each time you run it you start with a clean slate. To verify that the data was loaded, open your admin panel and check that the pokemon are there.
+Part 3
+Write a view, route and template to show a list of pokemon on the front page. You can either show all the information as a table, or show only their name and icon and link to a detail page with all their information. Use to display their front and back image.
+Part 4 (optional)
+Check out the script that creates the json file, you can use it to load even more pokemon into your database!
+
+Notes: This was my first Custom Management Command.
+What really helped was looking at the raw JSON and writing down the structure to understand the nesting.
+It's like peeling an onion back one layer at a time, where the key that picked the lock was accessing the
+first dictionary in the 'data=pokemon['pokemon']' code. The trickiest part is dealing with the types.
+First, the types are a list nested within the dictionary for each item.
+'''
+
+from django.core.management.base import BaseCommand, CommandError
+from pokedex_app.models import Pokemon,PokemonType
+#import requests
+import json
+#import pyperclip
+
+class Command(BaseCommand):
+ help = 'Imports Pokedex JSON'
+
+ def handle(self, *args, **kwargs):
+
+ Pokemon.objects.all().delete()
+ PokemonType.objects.all().delete()
+
+ file = open("pokemon.json")
+ pokemon = json.load(file)
+ data=pokemon['pokemon']
+
+ for row in data:
+ number=int(row['number'])
+ name=row['name']
+ height=int(row['height'])
+ weight=int(row['weight'])
+ image_front=row['image_front']
+ image_back=row['image_back']
+ type=row['types']
+
+ #print(types)
+
+
+
+ pokemon = Pokemon.objects.create(
+ number=number,
+ name=str.title(name),
+ height=height,
+ weight=weight,
+ image_front=image_front,
+ image_back=image_back
+ )
+ for type in type:
+ type, created = PokemonType.objects.get_or_create(name=type)
+ pokemon.types.add(type)
+ #print('success??')
+
+
+ #for row in pokemon:
+ #pokemon = pokemon['pokemon']
+ #name = row["Name"]
+ #pokemon.name = row['Name']
+ #pokemon.height = int(row['height'])
+ #pokemon.weight = int(row['weight'])
+ #pokemon.image_front = row['image_front']
+ #pokemon.image_back = row['image_back']
+ #pokemon.type = [type['type']['name'] for type in pokemon['types']]
+
+ #file.close()
+
+ #print(pokemon.type)
+'''
+ print('Creating Pokemon Type Data')
+ for
+
+ url = 'https://pokeapi.co/api/v2/pokemon/3'
+ response = requests.get(url)
+ item = response.json()
+ number = int(item['id'])
+ name = item['name']
+ types = [type['type']['name'] for type in item['types']]
+ print(name, types)
+
+ pokemontype, created = PokemonType.objects.get_or_create(id=number)
+ print(pokemontype)
+
+ data = {'pokemon':[]}
+ num_pokemon = 1
+
+ for i in range(1, num_pokemon):
+# get the data from the pokemon api
+ response = requests.get('https://pokeapi.co/api/v2/pokemon/' + str(i))
+ pokeapi_data = json.loads(response.text)
+
+# extract the relevant portions of data
+ number = pokeapi_data['id']
+ name = pokeapi_data['name']
+ height = pokeapi_data['height']
+ weight = pokeapi_data['weight']
+ image_front = pokeapi_data['sprites']['front_default']
+ image_back = pokeapi_data['sprites']['back_default']
+ url = 'https://pokemon.fandom.com/wiki/' + name
+ types = [type['type']['name'] for type in pokeapi_data['types']]
+
+ pokemontype, created = PokemonType.objects.get_or_create(name=types)
+ print(pokemontype)
+
+ # put the relevant data into a dictionary
+ pokemon = {
+ 'number': number,
+ 'name': name,
+ 'height': height,
+ 'weight': weight,
+ 'image_front': image_front,
+ 'image_back': image_back,
+ 'types': types,
+ 'url': url
+ }
+
+ # add the pokemon to our list
+ data['pokemon'].append(pokemon)
+
+ # give the user some feedback
+ print(str(round(i/num_pokemon*100,2))+'%')
+
+# copy the resulting json to the clipboard
+ pyperclip.copy(json.dumps(data, indent=4))
+'''
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0001_initial.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0001_initial.py
new file mode 100644
index 00000000..7c69fc2e
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0001_initial.py
@@ -0,0 +1,34 @@
+# Generated by Django 4.0.1 on 2022-01-14 02:48
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='PokemonType',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Pokemon',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('number', models.IntegerField(max_length=100)),
+ ('name', models.CharField(max_length=100)),
+ ('height', models.FloatField(max_length=100, null=True)),
+ ('weight', models.FloatField(max_length=100, null=True)),
+ ('image_front', models.CharField(max_length=100)),
+ ('image_back', models.CharField(max_length=100)),
+ ('types', models.ManyToManyField(blank=True, to='pokedex_app.PokemonType')),
+ ],
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0002_alter_pokemon_height_alter_pokemon_number_and_more.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0002_alter_pokemon_height_alter_pokemon_number_and_more.py
new file mode 100644
index 00000000..6ba717d4
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0002_alter_pokemon_height_alter_pokemon_number_and_more.py
@@ -0,0 +1,28 @@
+# Generated by Django 4.0.1 on 2022-01-14 02:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='height',
+ field=models.FloatField(null=True),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='number',
+ field=models.IntegerField(),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='weight',
+ field=models.FloatField(null=True),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0003_alter_pokemon_height_alter_pokemon_image_back_and_more.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0003_alter_pokemon_height_alter_pokemon_image_back_and_more.py
new file mode 100644
index 00000000..15105daf
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0003_alter_pokemon_height_alter_pokemon_image_back_and_more.py
@@ -0,0 +1,33 @@
+# Generated by Django 4.0.1 on 2022-01-14 03:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0002_alter_pokemon_height_alter_pokemon_number_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='height',
+ field=models.FloatField(blank=True, null=True),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_back',
+ field=models.CharField(blank=True, max_length=100),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_front',
+ field=models.CharField(blank=True, max_length=100),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='weight',
+ field=models.FloatField(blank=True, null=True),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0004_alter_pokemon_image_back_alter_pokemon_image_front.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0004_alter_pokemon_image_back_alter_pokemon_image_front.py
new file mode 100644
index 00000000..9fda3e71
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0004_alter_pokemon_image_back_alter_pokemon_image_front.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.1 on 2022-01-14 04:08
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0003_alter_pokemon_height_alter_pokemon_image_back_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_back',
+ field=models.ImageField(blank=True, upload_to=True),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_front',
+ field=models.ImageField(blank=True, upload_to='images/'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0005_alter_pokemon_image_back_alter_pokemon_image_front.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0005_alter_pokemon_image_back_alter_pokemon_image_front.py
new file mode 100644
index 00000000..beea3ca1
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0005_alter_pokemon_image_back_alter_pokemon_image_front.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.1 on 2022-01-14 04:10
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0004_alter_pokemon_image_back_alter_pokemon_image_front'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_back',
+ field=models.ImageField(blank=True, upload_to='images_back'),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_front',
+ field=models.ImageField(blank=True, upload_to='images_front/'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0006_alter_pokemon_types.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0006_alter_pokemon_types.py
new file mode 100644
index 00000000..b5d3ea2d
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0006_alter_pokemon_types.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-14 21:43
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0005_alter_pokemon_image_back_alter_pokemon_image_front'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='types',
+ field=models.ManyToManyField(blank=True, related_name='type_name', to='pokedex_app.PokemonType'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0007_alter_pokemon_types.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0007_alter_pokemon_types.py
new file mode 100644
index 00000000..dd9acba3
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0007_alter_pokemon_types.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-15 16:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0006_alter_pokemon_types'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='types',
+ field=models.ManyToManyField(blank=True, to='pokedex_app.PokemonType'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0008_alter_pokemon_image_front.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0008_alter_pokemon_image_front.py
new file mode 100644
index 00000000..cf6bd4c5
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0008_alter_pokemon_image_front.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.7 on 2022-01-15 16:21
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0007_alter_pokemon_types'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_front',
+ field=models.ImageField(blank=True, upload_to='images_front'),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0009_auto_20220115_2347.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0009_auto_20220115_2347.py
new file mode 100644
index 00000000..8686dc46
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/0009_auto_20220115_2347.py
@@ -0,0 +1,28 @@
+# Generated by Django 3.2.7 on 2022-01-15 23:47
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0008_alter_pokemon_image_front'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_back',
+ field=models.ImageField(blank=True, upload_to='images_back/'),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='image_front',
+ field=models.ImageField(blank=True, upload_to='images_front/'),
+ ),
+ migrations.AlterField(
+ model_name='pokemon',
+ name='number',
+ field=models.CharField(max_length=100),
+ ),
+ ]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/__init__.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/models.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/models.py
new file mode 100644
index 00000000..3c601223
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/models.py
@@ -0,0 +1,24 @@
+from django.db import models
+from django.urls import reverse
+
+
+class PokemonType(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __str__(self):
+ return self.name
+
+class Pokemon(models.Model):
+ number = models.CharField(max_length=100)
+ name = models.CharField(max_length=100)
+ height = models.FloatField(null=True, blank=True)
+ weight = models.FloatField(null=True, blank=True)
+ image_front = models.ImageField(blank=True, upload_to='images_front/')
+ image_back = models.ImageField(blank=True, upload_to='images_back/')
+ types = models.ManyToManyField('PokemonType', blank=True)
+
+ def __str__(self):
+ return f"Entry: {self.number} | Name: {self.name} | Type: {self.types}"
+
+ def get_absolute_url(self):
+ return reverse('profile')
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/static/styles.css b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/static/styles.css
new file mode 100644
index 00000000..6a42fdb5
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/static/styles.css
@@ -0,0 +1,72 @@
+.flip-card {
+ display: flex;
+ background-color: transparent;
+ width: 100%;
+ height: auto;
+ perspective: 1000px;
+ margin-bottom: 0rem !important;
+}
+
+.flip-card-inner {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ text-align: center;
+ transition: transform 0.6s;
+ transform-style: preserve-3d;
+ margin-bottom: 0rem !important;
+}
+
+.flip-card:hover .flip-card-inner {
+ display: flex;
+ transform: rotateY(180deg);
+}
+
+.flip-card-front,
+.flip-card-back {
+ display: flex;
+ width: 100%;
+ height: 100%;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ margin-bottom: 0rem !important;
+}
+
+.flip-card-front {
+ position: absolute;
+ color: black;
+}
+
+.flip-card-back {
+ transform: rotateY(180deg);
+}
+
+.album {
+ background-color: rgb(51, 50, 50) !important;
+}
+
+.card {
+ background-color: rgb(235, 242, 247) !important;
+}
+
+.card-body {
+ font-size: large !important;
+}
+
+.card-text {
+ margin-bottom: 3px !important;
+}
+
+.card-title {
+ text-align: center;
+ font-size: x-large;
+}
+
+.modal-content {
+ width: fit-content;
+ height: auto
+}
+
+.skillz {
+ text-align: center;
+}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/base.html b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/base.html
new file mode 100644
index 00000000..5488b7eb
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/base.html
@@ -0,0 +1,92 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+ My Inner Pokemon
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% block content %}
+
+ {% endblock %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/home.html b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/home.html
new file mode 100644
index 00000000..c5b2ff28
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/home.html
@@ -0,0 +1,62 @@
+{% extends "base.html" %}
+{% block content %}
+
+
+
+
+
+
Find Your Spirit Pokemon
+
Are you a obsessed with Pokemon? Do you find yourself wondering how to train Pokemon in
+ your spare time? What the heck even is a Pokemon? Who knows, it doesn't matter, because you have found a home dedicated to
+ discovering your inner Pokemon!
+
+
+
+
+
Discover Your Spririt Pokemon
+
Ask The Oracle
+
+
+
+
+
+
+ {% for item in names %}
+ {% csrf_token %}
+
+
+
{{item.number}}
+
+
+
+
+
+
+
+
+
+
+
+
{{item.name}}
+
Height: {{item.height}}
+
Weight: {{item.weight}}
+
Skillz: {% for i in item.types.all %}| {{ i.name }} {% endfor %}|
+
+
+
+
+
+ {% endfor %}
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/random.html b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/random.html
new file mode 100644
index 00000000..3945f0ae
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/templates/random.html
@@ -0,0 +1,57 @@
+{% extends "base.html" %}
+{% block content %}
+
+
+
+
The Oracle Has Spoken
+
Your spirit Pokemon is:
+
+
+
+
+
+
+
+
+
+
{{name.number}}
+
+
+
+
+
+
+
+
+
+
+
+
{{name.name}}
+
Height: {{name.height}}
+
Weight: {{name.weight}}
+
Skillz:
+
+ {% for i in name.types.all %}
+ {{ i.name }}
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/tests.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/urls.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/urls.py
new file mode 100644
index 00000000..0ced483a
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/urls.py
@@ -0,0 +1,12 @@
+from django.urls import path
+from pokedex_app import views
+
+
+urlpatterns = [
+
+ path('', views.listview, name="home"),
+ path('profile/', views.listview, name="profile"),
+ path('random/', views.randomview, name="random"),
+
+
+]
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/views.py b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/views.py
new file mode 100644
index 00000000..716c4c5c
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokedex_app/views.py
@@ -0,0 +1,18 @@
+from django.shortcuts import render
+from .models import Pokemon, PokemonType
+from django.db.models import Q
+
+
+def listview(request):
+ names = Pokemon.objects.all()
+ #types = PokemonType.objects.all()
+ search_post = request.GET.get('search')
+ if search_post:
+ names = Pokemon.objects.filter(Q(name__icontains=search_post))
+ else:
+ names = Pokemon.objects.all()
+ return render(request,'home.html',{'names':names})
+
+def randomview(request):
+ name=Pokemon.objects.order_by("?").first()
+ return render(request,'random.html', {'name':name})
\ No newline at end of file
diff --git a/Code/Philip/Django/Lab03_Pokedex/pokedex/pokemon.json b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokemon.json
new file mode 100644
index 00000000..0e383d62
--- /dev/null
+++ b/Code/Philip/Django/Lab03_Pokedex/pokedex/pokemon.json
@@ -0,0 +1,1883 @@
+{
+ "pokemon": [
+ {
+ "number": 1,
+ "name": "bulbasaur",
+ "height": 7,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/1.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bulbasaur"
+ },
+ {
+ "number": 2,
+ "name": "ivysaur",
+ "height": 10,
+ "weight": 130,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/2.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ivysaur"
+ },
+ {
+ "number": 3,
+ "name": "venusaur",
+ "height": 20,
+ "weight": 1000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/3.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venusaur"
+ },
+ {
+ "number": 4,
+ "name": "charmander",
+ "height": 6,
+ "weight": 85,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/4.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmander"
+ },
+ {
+ "number": 5,
+ "name": "charmeleon",
+ "height": 11,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/5.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmeleon"
+ },
+ {
+ "number": 6,
+ "name": "charizard",
+ "height": 17,
+ "weight": 905,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/6.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charizard"
+ },
+ {
+ "number": 7,
+ "name": "squirtle",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/7.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/squirtle"
+ },
+ {
+ "number": 8,
+ "name": "wartortle",
+ "height": 10,
+ "weight": 225,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/8.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wartortle"
+ },
+ {
+ "number": 9,
+ "name": "blastoise",
+ "height": 16,
+ "weight": 855,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/9.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/blastoise"
+ },
+ {
+ "number": 10,
+ "name": "caterpie",
+ "height": 3,
+ "weight": 29,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/10.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/caterpie"
+ },
+ {
+ "number": 11,
+ "name": "metapod",
+ "height": 7,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/11.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/metapod"
+ },
+ {
+ "number": 12,
+ "name": "butterfree",
+ "height": 11,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/12.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/butterfree"
+ },
+ {
+ "number": 13,
+ "name": "weedle",
+ "height": 3,
+ "weight": 32,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/13.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/13.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weedle"
+ },
+ {
+ "number": 14,
+ "name": "kakuna",
+ "height": 6,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/14.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/14.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kakuna"
+ },
+ {
+ "number": 15,
+ "name": "beedrill",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/15.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/15.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/beedrill"
+ },
+ {
+ "number": 16,
+ "name": "pidgey",
+ "height": 3,
+ "weight": 18,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/16.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/16.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgey"
+ },
+ {
+ "number": 17,
+ "name": "pidgeotto",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/17.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/17.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeotto"
+ },
+ {
+ "number": 18,
+ "name": "pidgeot",
+ "height": 15,
+ "weight": 395,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/18.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/18.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeot"
+ },
+ {
+ "number": 19,
+ "name": "rattata",
+ "height": 3,
+ "weight": 35,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/19.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/19.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rattata"
+ },
+ {
+ "number": 20,
+ "name": "raticate",
+ "height": 7,
+ "weight": 185,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/20.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/20.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raticate"
+ },
+ {
+ "number": 21,
+ "name": "spearow",
+ "height": 3,
+ "weight": 20,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/21.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/21.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/spearow"
+ },
+ {
+ "number": 22,
+ "name": "fearow",
+ "height": 12,
+ "weight": 380,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/22.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/22.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/fearow"
+ },
+ {
+ "number": 23,
+ "name": "ekans",
+ "height": 20,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/23.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/23.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ekans"
+ },
+ {
+ "number": 24,
+ "name": "arbok",
+ "height": 35,
+ "weight": 650,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/24.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/24.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arbok"
+ },
+ {
+ "number": 25,
+ "name": "pikachu",
+ "height": 4,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/25.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pikachu"
+ },
+ {
+ "number": 26,
+ "name": "raichu",
+ "height": 8,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/26.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/26.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raichu"
+ },
+ {
+ "number": 27,
+ "name": "sandshrew",
+ "height": 6,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/27.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/27.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandshrew"
+ },
+ {
+ "number": 28,
+ "name": "sandslash",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/28.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/28.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandslash"
+ },
+ {
+ "number": 29,
+ "name": "nidoran-f",
+ "height": 4,
+ "weight": 70,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/29.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/29.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-f"
+ },
+ {
+ "number": 30,
+ "name": "nidorina",
+ "height": 8,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/30.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/30.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorina"
+ },
+ {
+ "number": 31,
+ "name": "nidoqueen",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/31.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/31.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoqueen"
+ },
+ {
+ "number": 32,
+ "name": "nidoran-m",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/32.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/32.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-m"
+ },
+ {
+ "number": 33,
+ "name": "nidorino",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/33.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/33.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorino"
+ },
+ {
+ "number": 34,
+ "name": "nidoking",
+ "height": 14,
+ "weight": 620,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/34.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/34.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoking"
+ },
+ {
+ "number": 35,
+ "name": "clefairy",
+ "height": 6,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/35.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/35.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefairy"
+ },
+ {
+ "number": 36,
+ "name": "clefable",
+ "height": 13,
+ "weight": 400,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/36.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/36.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefable"
+ },
+ {
+ "number": 37,
+ "name": "vulpix",
+ "height": 6,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/37.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/37.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vulpix"
+ },
+ {
+ "number": 38,
+ "name": "ninetales",
+ "height": 11,
+ "weight": 199,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/38.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/38.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ninetales"
+ },
+ {
+ "number": 39,
+ "name": "jigglypuff",
+ "height": 5,
+ "weight": 55,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/39.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/39.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jigglypuff"
+ },
+ {
+ "number": 40,
+ "name": "wigglytuff",
+ "height": 10,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/40.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/40.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wigglytuff"
+ },
+ {
+ "number": 41,
+ "name": "zubat",
+ "height": 8,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/41.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/41.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zubat"
+ },
+ {
+ "number": 42,
+ "name": "golbat",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/42.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/42.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golbat"
+ },
+ {
+ "number": 43,
+ "name": "oddish",
+ "height": 5,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/43.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/43.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/oddish"
+ },
+ {
+ "number": 44,
+ "name": "gloom",
+ "height": 8,
+ "weight": 86,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/44.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/44.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gloom"
+ },
+ {
+ "number": 45,
+ "name": "vileplume",
+ "height": 12,
+ "weight": 186,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/45.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/45.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vileplume"
+ },
+ {
+ "number": 46,
+ "name": "paras",
+ "height": 3,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/46.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/46.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/paras"
+ },
+ {
+ "number": 47,
+ "name": "parasect",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/47.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/47.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/parasect"
+ },
+ {
+ "number": 48,
+ "name": "venonat",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/48.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/48.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venonat"
+ },
+ {
+ "number": 49,
+ "name": "venomoth",
+ "height": 15,
+ "weight": 125,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/49.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/49.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venomoth"
+ },
+ {
+ "number": 50,
+ "name": "diglett",
+ "height": 2,
+ "weight": 8,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/50.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/50.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/diglett"
+ },
+ {
+ "number": 51,
+ "name": "dugtrio",
+ "height": 7,
+ "weight": 333,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/51.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/51.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dugtrio"
+ },
+ {
+ "number": 52,
+ "name": "meowth",
+ "height": 4,
+ "weight": 42,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/52.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/52.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/meowth"
+ },
+ {
+ "number": 53,
+ "name": "persian",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/53.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/53.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/persian"
+ },
+ {
+ "number": 54,
+ "name": "psyduck",
+ "height": 8,
+ "weight": 196,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/54.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/54.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/psyduck"
+ },
+ {
+ "number": 55,
+ "name": "golduck",
+ "height": 17,
+ "weight": 766,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/55.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/55.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golduck"
+ },
+ {
+ "number": 56,
+ "name": "mankey",
+ "height": 5,
+ "weight": 280,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/56.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/56.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mankey"
+ },
+ {
+ "number": 57,
+ "name": "primeape",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/57.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/57.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/primeape"
+ },
+ {
+ "number": 58,
+ "name": "growlithe",
+ "height": 7,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/58.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/58.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/growlithe"
+ },
+ {
+ "number": 59,
+ "name": "arcanine",
+ "height": 19,
+ "weight": 1550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/59.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/59.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arcanine"
+ },
+ {
+ "number": 60,
+ "name": "poliwag",
+ "height": 6,
+ "weight": 124,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/60.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/60.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwag"
+ },
+ {
+ "number": 61,
+ "name": "poliwhirl",
+ "height": 10,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/61.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/61.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwhirl"
+ },
+ {
+ "number": 62,
+ "name": "poliwrath",
+ "height": 13,
+ "weight": 540,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/62.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/62.png",
+ "types": [
+ "fighting",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwrath"
+ },
+ {
+ "number": 63,
+ "name": "abra",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/63.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/63.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/abra"
+ },
+ {
+ "number": 64,
+ "name": "kadabra",
+ "height": 13,
+ "weight": 565,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/64.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/64.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kadabra"
+ },
+ {
+ "number": 65,
+ "name": "alakazam",
+ "height": 15,
+ "weight": 480,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/65.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/65.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/alakazam"
+ },
+ {
+ "number": 66,
+ "name": "machop",
+ "height": 8,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/66.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/66.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machop"
+ },
+ {
+ "number": 67,
+ "name": "machoke",
+ "height": 15,
+ "weight": 705,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/67.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/67.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machoke"
+ },
+ {
+ "number": 68,
+ "name": "machamp",
+ "height": 16,
+ "weight": 1300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/68.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/68.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machamp"
+ },
+ {
+ "number": 69,
+ "name": "bellsprout",
+ "height": 7,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/69.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/69.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bellsprout"
+ },
+ {
+ "number": 70,
+ "name": "weepinbell",
+ "height": 10,
+ "weight": 64,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/70.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/70.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weepinbell"
+ },
+ {
+ "number": 71,
+ "name": "victreebel",
+ "height": 17,
+ "weight": 155,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/71.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/71.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/victreebel"
+ },
+ {
+ "number": 72,
+ "name": "tentacool",
+ "height": 9,
+ "weight": 455,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/72.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/72.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacool"
+ },
+ {
+ "number": 73,
+ "name": "tentacruel",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/73.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/73.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacruel"
+ },
+ {
+ "number": 74,
+ "name": "geodude",
+ "height": 4,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/74.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/74.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/geodude"
+ },
+ {
+ "number": 75,
+ "name": "graveler",
+ "height": 10,
+ "weight": 1050,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/75.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/75.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/graveler"
+ },
+ {
+ "number": 76,
+ "name": "golem",
+ "height": 14,
+ "weight": 3000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/76.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/76.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golem"
+ },
+ {
+ "number": 77,
+ "name": "ponyta",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/77.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/77.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ponyta"
+ },
+ {
+ "number": 78,
+ "name": "rapidash",
+ "height": 17,
+ "weight": 950,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/78.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/78.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rapidash"
+ },
+ {
+ "number": 79,
+ "name": "slowpoke",
+ "height": 12,
+ "weight": 360,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/79.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/79.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowpoke"
+ },
+ {
+ "number": 80,
+ "name": "slowbro",
+ "height": 16,
+ "weight": 785,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/80.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/80.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowbro"
+ },
+ {
+ "number": 81,
+ "name": "magnemite",
+ "height": 3,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/81.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/81.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magnemite"
+ },
+ {
+ "number": 82,
+ "name": "magneton",
+ "height": 10,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/82.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/82.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magneton"
+ },
+ {
+ "number": 83,
+ "name": "farfetchd",
+ "height": 8,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/83.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/83.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/farfetchd"
+ },
+ {
+ "number": 84,
+ "name": "doduo",
+ "height": 14,
+ "weight": 392,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/84.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/84.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/doduo"
+ },
+ {
+ "number": 85,
+ "name": "dodrio",
+ "height": 18,
+ "weight": 852,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/85.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/85.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dodrio"
+ },
+ {
+ "number": 86,
+ "name": "seel",
+ "height": 11,
+ "weight": 900,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/86.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/86.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seel"
+ },
+ {
+ "number": 87,
+ "name": "dewgong",
+ "height": 17,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/87.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/87.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dewgong"
+ },
+ {
+ "number": 88,
+ "name": "grimer",
+ "height": 9,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/88.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/88.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/grimer"
+ },
+ {
+ "number": 89,
+ "name": "muk",
+ "height": 12,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/89.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/89.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/muk"
+ },
+ {
+ "number": 90,
+ "name": "shellder",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/90.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/90.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/shellder"
+ },
+ {
+ "number": 91,
+ "name": "cloyster",
+ "height": 15,
+ "weight": 1325,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/91.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/91.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cloyster"
+ },
+ {
+ "number": 92,
+ "name": "gastly",
+ "height": 13,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/92.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/92.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gastly"
+ },
+ {
+ "number": 93,
+ "name": "haunter",
+ "height": 16,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/93.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/93.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/haunter"
+ },
+ {
+ "number": 94,
+ "name": "gengar",
+ "height": 15,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/94.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/94.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gengar"
+ },
+ {
+ "number": 95,
+ "name": "onix",
+ "height": 88,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/95.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/95.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/onix"
+ },
+ {
+ "number": 96,
+ "name": "drowzee",
+ "height": 10,
+ "weight": 324,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/96.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/96.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/drowzee"
+ },
+ {
+ "number": 97,
+ "name": "hypno",
+ "height": 16,
+ "weight": 756,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/97.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/97.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hypno"
+ },
+ {
+ "number": 98,
+ "name": "krabby",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/98.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/98.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/krabby"
+ },
+ {
+ "number": 99,
+ "name": "kingler",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/99.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/99.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kingler"
+ },
+ {
+ "number": 100,
+ "name": "voltorb",
+ "height": 5,
+ "weight": 104,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/100.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/100.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/voltorb"
+ },
+ {
+ "number": 101,
+ "name": "electrode",
+ "height": 12,
+ "weight": 666,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/101.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/101.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electrode"
+ },
+ {
+ "number": 102,
+ "name": "exeggcute",
+ "height": 4,
+ "weight": 25,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/102.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/102.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggcute"
+ },
+ {
+ "number": 103,
+ "name": "exeggutor",
+ "height": 20,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/103.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/103.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggutor"
+ },
+ {
+ "number": 104,
+ "name": "cubone",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/104.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/104.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cubone"
+ },
+ {
+ "number": 105,
+ "name": "marowak",
+ "height": 10,
+ "weight": 450,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/105.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/105.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/marowak"
+ },
+ {
+ "number": 106,
+ "name": "hitmonlee",
+ "height": 15,
+ "weight": 498,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/106.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/106.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonlee"
+ },
+ {
+ "number": 107,
+ "name": "hitmonchan",
+ "height": 14,
+ "weight": 502,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/107.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/107.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonchan"
+ },
+ {
+ "number": 108,
+ "name": "lickitung",
+ "height": 12,
+ "weight": 655,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/108.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/108.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lickitung"
+ },
+ {
+ "number": 109,
+ "name": "koffing",
+ "height": 6,
+ "weight": 10,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/109.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/109.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/koffing"
+ },
+ {
+ "number": 110,
+ "name": "weezing",
+ "height": 12,
+ "weight": 95,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/110.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/110.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weezing"
+ },
+ {
+ "number": 111,
+ "name": "rhyhorn",
+ "height": 10,
+ "weight": 1150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/111.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/111.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhyhorn"
+ },
+ {
+ "number": 112,
+ "name": "rhydon",
+ "height": 19,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/112.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/112.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhydon"
+ },
+ {
+ "number": 113,
+ "name": "chansey",
+ "height": 11,
+ "weight": 346,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/113.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/113.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/chansey"
+ },
+ {
+ "number": 114,
+ "name": "tangela",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/114.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/114.png",
+ "types": [
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tangela"
+ },
+ {
+ "number": 115,
+ "name": "kangaskhan",
+ "height": 22,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/115.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/115.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kangaskhan"
+ },
+ {
+ "number": 116,
+ "name": "horsea",
+ "height": 4,
+ "weight": 80,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/116.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/116.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/horsea"
+ },
+ {
+ "number": 117,
+ "name": "seadra",
+ "height": 12,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/117.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/117.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seadra"
+ },
+ {
+ "number": 118,
+ "name": "goldeen",
+ "height": 6,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/118.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/118.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/goldeen"
+ },
+ {
+ "number": 119,
+ "name": "seaking",
+ "height": 13,
+ "weight": 390,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/119.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/119.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seaking"
+ },
+ {
+ "number": 120,
+ "name": "staryu",
+ "height": 8,
+ "weight": 345,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/120.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/120.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/staryu"
+ },
+ {
+ "number": 121,
+ "name": "starmie",
+ "height": 11,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/121.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/121.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/starmie"
+ },
+ {
+ "number": 122,
+ "name": "mr-mime",
+ "height": 13,
+ "weight": 545,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/122.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/122.png",
+ "types": [
+ "fairy",
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mr-mime"
+ },
+ {
+ "number": 123,
+ "name": "scyther",
+ "height": 15,
+ "weight": 560,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/123.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/123.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/scyther"
+ },
+ {
+ "number": 124,
+ "name": "jynx",
+ "height": 14,
+ "weight": 406,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/124.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/124.png",
+ "types": [
+ "psychic",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jynx"
+ },
+ {
+ "number": 125,
+ "name": "electabuzz",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/125.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/125.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electabuzz"
+ },
+ {
+ "number": 126,
+ "name": "magmar",
+ "height": 13,
+ "weight": 445,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/126.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/126.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magmar"
+ },
+ {
+ "number": 127,
+ "name": "pinsir",
+ "height": 15,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/127.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/127.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pinsir"
+ },
+ {
+ "number": 128,
+ "name": "tauros",
+ "height": 14,
+ "weight": 884,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/128.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/128.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tauros"
+ },
+ {
+ "number": 129,
+ "name": "magikarp",
+ "height": 9,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/129.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/129.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magikarp"
+ },
+ {
+ "number": 130,
+ "name": "gyarados",
+ "height": 65,
+ "weight": 2350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/130.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/130.png",
+ "types": [
+ "flying",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gyarados"
+ },
+ {
+ "number": 131,
+ "name": "lapras",
+ "height": 25,
+ "weight": 2200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/131.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/131.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lapras"
+ },
+ {
+ "number": 132,
+ "name": "ditto",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/132.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/132.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ditto"
+ },
+ {
+ "number": 133,
+ "name": "eevee",
+ "height": 3,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/133.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/133.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/eevee"
+ },
+ {
+ "number": 134,
+ "name": "vaporeon",
+ "height": 10,
+ "weight": 290,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/134.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/134.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vaporeon"
+ },
+ {
+ "number": 135,
+ "name": "jolteon",
+ "height": 8,
+ "weight": 245,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/135.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/135.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jolteon"
+ },
+ {
+ "number": 136,
+ "name": "flareon",
+ "height": 9,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/136.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/136.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/flareon"
+ },
+ {
+ "number": 137,
+ "name": "porygon",
+ "height": 8,
+ "weight": 365,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/137.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/137.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/porygon"
+ },
+ {
+ "number": 138,
+ "name": "omanyte",
+ "height": 4,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/138.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/138.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omanyte"
+ },
+ {
+ "number": 139,
+ "name": "omastar",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/139.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/139.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omastar"
+ },
+ {
+ "number": 140,
+ "name": "kabuto",
+ "height": 5,
+ "weight": 115,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/140.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/140.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabuto"
+ },
+ {
+ "number": 141,
+ "name": "kabutops",
+ "height": 13,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/141.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/141.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabutops"
+ },
+ {
+ "number": 142,
+ "name": "aerodactyl",
+ "height": 18,
+ "weight": 590,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/142.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/142.png",
+ "types": [
+ "flying",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/aerodactyl"
+ },
+ {
+ "number": 143,
+ "name": "snorlax",
+ "height": 21,
+ "weight": 4600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/143.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/143.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/snorlax"
+ },
+ {
+ "number": 144,
+ "name": "articuno",
+ "height": 17,
+ "weight": 554,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/144.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/144.png",
+ "types": [
+ "flying",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/articuno"
+ },
+ {
+ "number": 145,
+ "name": "zapdos",
+ "height": 16,
+ "weight": 526,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/145.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/145.png",
+ "types": [
+ "flying",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zapdos"
+ },
+ {
+ "number": 146,
+ "name": "moltres",
+ "height": 20,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/146.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/146.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/moltres"
+ },
+ {
+ "number": 147,
+ "name": "dratini",
+ "height": 18,
+ "weight": 33,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/147.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/147.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dratini"
+ },
+ {
+ "number": 148,
+ "name": "dragonair",
+ "height": 40,
+ "weight": 165,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/148.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/148.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonair"
+ },
+ {
+ "number": 149,
+ "name": "dragonite",
+ "height": 22,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/149.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/149.png",
+ "types": [
+ "flying",
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonite"
+ },
+ {
+ "number": 150,
+ "name": "mewtwo",
+ "height": 20,
+ "weight": 1220,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/150.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/150.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mewtwo"
+ },
+ {
+ "number": 151,
+ "name": "mew",
+ "height": 4,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/151.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/151.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mew"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Code/Philip/Javascript/Lab04_Todo_List/index.html b/Code/Philip/Javascript/Lab04_Todo_List/index.html
new file mode 100644
index 00000000..6b509834
--- /dev/null
+++ b/Code/Philip/Javascript/Lab04_Todo_List/index.html
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+ HoneyDo List
+
+
+
+
+
+
+
+
Honey Do List
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Philip/Javascript/Lab04_Todo_List/static/app.js b/Code/Philip/Javascript/Lab04_Todo_List/static/app.js
new file mode 100644
index 00000000..6d64356d
--- /dev/null
+++ b/Code/Philip/Javascript/Lab04_Todo_List/static/app.js
@@ -0,0 +1,106 @@
+let honeydoList
+let honeydoObjList = []
+let completedList
+let honeydoButton
+let completedButton
+let trashcan
+let honeydoText
+let counter = 0
+let honeydoDiv
+let newHoneydo
+let item
+let honeydo
+
+completedList = document.querySelector ('.completed_list');
+honeydoList = document.querySelector('.honeydo_list');
+honeydoButton = document.querySelector('.honeydo_button');
+honeydoButton.addEventListener("click", addHoneydo)
+honeydoList.addEventListener("click", trashOrComplete)
+completedList.addEventListener("click", trashOrComplete)
+
+function addHoneydo(action) {
+ //prevent form from submitting and refreshing
+ action.preventDefault();
+ //create todo DIV
+ honeydoDiv = document.createElement('div');
+ //assign the new DIV a todo class that will be used to style the div
+ honeydoDiv.classList.add('honeydo');
+ //create todo li that will be used to display the text value of the input
+ newHoneydo = document.createElement('li');
+ //get input value and save to the honeydoText variable
+ honeydoText = document.getElementById("enterTask").value;
+ //bind the newTodo element with the text value
+ newHoneydo.innerText = honeydoText;
+ //assign the element a class of honeydo_item
+ newHoneydo.classList.add('honeydo_item');
+ //place the element inside of the todoDiv as a child
+ honeydoDiv.appendChild(newHoneydo);
+ //if nothing is entered in the input return null
+ //if(honeydoText === ""){
+ // return null
+ //}
+ //create counter to populate object id
+ counter++;
+ //build an object for the honeydoObjList
+ honeydoObject = {
+ id: counter,
+ honeydoText: honeydoText,
+ complete: false,
+ };
+ //Add the new Object to the array
+ honeydoObjList.push(honeydoObject);
+
+ //add check mark to complete an item
+ //create an element for the check mark
+ completedButton = document.createElement('button');
+ //add the check icon to the element
+ completedButton.innerHTML = ' ';
+ //give the check icon a class of complete_btn
+ completedButton.classList.add('complete_btn')
+ //place the new check mark elememnt inside the honeydoDiv
+ honeydoDiv.appendChild(completedButton);
+
+ //add delete to the todoDiv
+ //create an element for the trashcan
+ trashcan = document.createElement('button');
+ //add the trashcan icon to the element
+ trashcan.innerHTML = ' ';
+ //give the trash icon a class of trash_btn
+ trashcan.classList.add('trash_btn')
+ //place the new delete icon element with the trash_btn class in the honeydoDiv
+ honeydoDiv.appendChild(trashcan);
+ //Take the entire todoDiv and add it to the honeydoList
+ honeydoList.appendChild(honeydoDiv);
+ //Clear input value
+ document.getElementById("enterTask").value = "";
+ console.log(honeydoList)
+}
+
+//Build function to check the item class to delete or complete
+function trashOrComplete(ele) {
+ //Get the target of an event and store as a variable item
+ item = ele.target;
+
+ //if the class of the target variable is trash_btn then continue with if statement
+ if (item.classList[0] === "trash_btn") {
+ //set a new variable to capture the parent element of the item
+ honeydo = item.parentElement;
+ //remove that item
+ honeydo.remove()
+ }
+
+ //if the class of the target variable was complete_btn then continue with if statement
+ if (item.classList[0] === "complete_btn") {
+ //set a new variable to capture the parent element of the item
+ honeydo = item.parentElement;
+ //use the toggle method to easily turn the completedItem class on and off
+ honeydo.classList.toggle("completedItem")
+ console.log(honeydo.classList);
+ if(honeydo.classList.contains("completedItem")) {
+ completedList.appendChild(honeydo);
+ } else {
+ honeydoList.appendChild(honeydo);
+ }
+ }
+}
+
diff --git a/Code/Philip/Javascript/Lab04_Todo_List/static/index.css b/Code/Philip/Javascript/Lab04_Todo_List/static/index.css
new file mode 100644
index 00000000..56b7e340
--- /dev/null
+++ b/Code/Philip/Javascript/Lab04_Todo_List/static/index.css
@@ -0,0 +1,93 @@
+@import url('https://fonts.googleapis.com/css2?family=Ubuntu:ital@1&display=swap');
+
+body{
+ background-image: linear-gradient(90deg, #3c30e6, #d36dd3);
+ color: white;
+ font-family: 'Ubuntu', sans-serif;
+}
+
+header {
+ background: slategray;
+ padding: 30px 40px;
+ color: white;
+ text-align: center;
+}
+
+h1 {
+ margin-bottom: 15px;;
+}
+
+.honeydo_container{
+ display: flex;
+ justify-content: center;
+ align-items: center;
+}
+
+.input-align {
+ justify-content: center ;
+}
+
+
+.honeydo_list{
+ list-style: none;
+}
+
+.honeydo-title {
+ text-align: center;
+}
+
+.honeydo{
+ align-items: center;
+ margin: 20px auto;
+ background-color: slateblue;
+ border-radius: 20px;
+ border-color: white;
+ border-style: solid;
+ border-width: .1em;
+ display: flex;
+ padding: 0.5rem;
+ justify-content: space-between;
+
+}
+
+.honeydo li {
+ flex: 1;
+}
+
+.complete {
+ text-align: center;
+ font-size: xx-large;
+}
+
+.complete_btn,
+.trash_btn{
+ padding: 3%;
+ border: none;
+ border-radius:50%;
+ margin-left: 10px;
+ cursor: pointer;
+}
+
+.complete_btn{
+ border-radius: 50%;
+}
+
+.fa-trash,
+.fa-check{
+ pointer-events: none;
+}
+
+.completedItem{
+ opacity: 0.7;
+ list-style: none;
+ text-decoration: line-through;
+ font-size:medium;
+ text-align: left;
+}
+
+
+
+
+.input-align {
+ justify-content: center ;
+}
\ No newline at end of file
diff --git a/Code/Philip/Javascript/Lab05_Random_Quote/index.html b/Code/Philip/Javascript/Lab05_Random_Quote/index.html
new file mode 100644
index 00000000..8336155a
--- /dev/null
+++ b/Code/Philip/Javascript/Lab05_Random_Quote/index.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+ Random Quote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Get Quotes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Philip/Javascript/Lab05_Random_Quote/static/index.css b/Code/Philip/Javascript/Lab05_Random_Quote/static/index.css
new file mode 100644
index 00000000..65eb3357
--- /dev/null
+++ b/Code/Philip/Javascript/Lab05_Random_Quote/static/index.css
@@ -0,0 +1,26 @@
+.button-center {
+ justify-content: center;
+}
+
+.author {
+ padding:0px;
+ margin:0px;
+}
+
+.quote {
+ background-color: rgba(40, 20, 15, 0.507);
+ border-radius: 30px;
+ border-color: rgb(70, 54, 30);
+ border-width: 5px;
+ border-style: solid;
+ padding:3%;
+ margin:3%;
+ text-align: center;
+ color: white;
+ font-style: italic;
+}
+
+.change-page {
+ margin-top:10%;
+ justify-content:center;
+}
\ No newline at end of file
diff --git a/Code/Philip/Javascript/Lab05_Random_Quote/static/index.js b/Code/Philip/Javascript/Lab05_Random_Quote/static/index.js
new file mode 100644
index 00000000..e9a87169
--- /dev/null
+++ b/Code/Philip/Javascript/Lab05_Random_Quote/static/index.js
@@ -0,0 +1,80 @@
+/*
+JavaScript Lab 05 Quote API
+By Philip Bartoo
+12/27/2021
+PDX Code Guild
+
+Directions:
+Use the favqs.com api to show a random quote. To start, use https://favqs.com/api/qotd to GET a quote, then display it on the page.
+
+{
+ "id": 4,
+ "author": "Albert Einstein",
+ "body": "Make everything as simple as possible, but not simpler.",
+ ...
+}
+Version 2
+
+The API also supports browsing quotes.
+
+You will need to sign up for an account, visit the API link at the very bottom of the page and generate an API key.
+The key will act like a username/password and authorize your API request when searching for quotes.
+
+*/
+
+//Variable for the button
+let button = document.querySelector('#button');
+//Variable for the token
+let token = 'Your Token Here';
+//Variable for the API URL
+let url = 'https://favqs.com/api/quotes?page='
+//Variable for the page number
+let pageNumber
+//Event listner for Get Quotes click
+button.addEventListener('click', ()=>{
+ //function to get a quote with initial page number
+ function fetchQuote(pageNumber = 1) {
+ //Using axios, submit the API request
+ axios
+ .get(url, {
+ //Include headers witht he token
+ headers: {
+ Authorization: `Token token=${token}`,
+ Accept: 'application/json'
+ },
+ //Include parameters for the page number
+ params: pageNumber
+ })
+ //If successfull, grab the quotes data
+ .then(data=>{
+ //Establish variable for each quote
+ let html = data.data.quotes.map(quotes => {
+ //Grab the page number
+ page = data.data.page
+ //Return the quote body and author in a div
+ return`
+
+
${quotes.body}
+
-${quotes.author}
+
`
+ })
+ .join("");
+ //Insert each quote div into html
+ document.querySelector('#app').innerHTML=html;
+ });
+ }
+ //Call the function
+ fetchQuote();
+//Event listener for next page button click and logic to increment the page number by 1
+let nextPageButton=document.querySelector('#next');
+ nextPageButton.addEventListener('click', ()=>{
+ pageNumber++
+ fetchQuote()
+ })
+//Event listener for previous page button click and logic to decrement the page number by 1
+ let previousPageButton=document.querySelector('#previous');
+ previousPageButton.addEventListener('click', ()=>{
+ pageNumber--;
+ fetchQuote()
+})
+})
\ No newline at end of file
diff --git a/Code/Philip/Python/Lab14_ATM.py b/Code/Philip/Python/Lab14_ATM.py
index b2613a2b..ef3bfddb 100644
--- a/Code/Philip/Python/Lab14_ATM.py
+++ b/Code/Philip/Python/Lab14_ATM.py
@@ -1,6 +1,7 @@
'''ATM Lab14
By Philip Bartoo
10/25/21
+Updated 1/16/22
'''
class ATM:
@@ -12,8 +13,11 @@ def check_balance(self):
return self.balance
def deposit(self, amount):
- self.balance += amount
- return self.balance
+ if amount < 0:
+ return print("Not Allowed")
+ else:
+ self.balance += amount
+ return self.balance
def check_withdrawal(self, amount):
if self.balance - amount > 0:
@@ -80,5 +84,4 @@ def calc_interest(self):
break
else:
- print('Command not recognized')
-
+ print('Command not recognized')
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/manage.py b/Code/Richard/django/lab-01/manage.py
new file mode 100644
index 00000000..1d0193af
--- /dev/null
+++ b/Code/Richard/django/lab-01/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', 'todo_project.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/Code/Richard/django/lab-01/todo_app/__init__.py b/Code/Richard/django/lab-01/todo_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Richard/django/lab-01/todo_app/admin.py b/Code/Richard/django/lab-01/todo_app/admin.py
new file mode 100644
index 00000000..cbf0c4b4
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from .models import Priority, TodoItem
+
+# Register your models here.
+
+admin.site.register(Priority),
+admin.site.register(TodoItem)
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/todo_app/apps.py b/Code/Richard/django/lab-01/todo_app/apps.py
new file mode 100644
index 00000000..d8f1498d
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class TodoAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'todo_app'
diff --git a/Code/Richard/django/lab-01/todo_app/migrations/0001_initial.py b/Code/Richard/django/lab-01/todo_app/migrations/0001_initial.py
new file mode 100644
index 00000000..68d6a197
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.0 on 2021-12-31 02:35
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Priority',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TodoItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('todo_item_text', models.CharField(max_length=200)),
+ ('created_date', models.DateTimeField(auto_now_add=True)),
+ ('priority', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='todoitems', to='todo_app.priority')),
+ ],
+ ),
+ ]
diff --git a/Code/Richard/django/lab-01/todo_app/migrations/__init__.py b/Code/Richard/django/lab-01/todo_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Richard/django/lab-01/todo_app/models.py b/Code/Richard/django/lab-01/todo_app/models.py
new file mode 100644
index 00000000..0b981a9e
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/models.py
@@ -0,0 +1,23 @@
+from django.db import models
+from django.db.models.deletion import CASCADE
+from django.db.models.fields import CharField
+from django.db.models.fields.related import ForeignKey
+
+# Create your models here.
+
+
+class Priority(models.Model):
+ name = CharField(max_length=20)
+
+ def __str__(self):
+ return self.name
+
+
+class TodoItem(models.Model):
+ todo_item_text = models.CharField(max_length=200)
+ priority = models.ForeignKey(Priority, on_delete=CASCADE, related_name='todoitems')
+
+ created_date = models.DateTimeField(auto_now_add=True)
+
+ def __str__(self):
+ return f"{self.todo_item_text}/n {self.priority} {self.created_date}"
diff --git a/Code/Richard/django/lab-01/todo_app/static/normalize.css b/Code/Richard/django/lab-01/todo_app/static/normalize.css
new file mode 100644
index 00000000..3c1b6242
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/static/normalize.css
@@ -0,0 +1,431 @@
+/* Document
+ * ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in
+ * IE on Windows Phone and in iOS.
+ */
+
+ html {
+ line-height: 1.15; /* 1 */
+ -ms-text-size-adjust: 100%; /* 2 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ }
+
+ /* Sections
+ * ========================================================================== */
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Edge, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ * ========================================================================== */
+
+ /**
+ * Remove the margin on nested lists in Chrome, Edge, IE, and Safari.
+ */
+
+ dl dl,
+ dl ol,
+ dl ul,
+ ol dl,
+ ul dl {
+ margin: 0;
+ }
+
+ /**
+ * Remove the margin on nested lists in Edge 18- and IE.
+ */
+
+ ol ol,
+ ol ul,
+ ul ol,
+ ul ul {
+ margin: 0;
+ }
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Correct the inheritance of border color in Firefox.
+ * 3. Show the overflow in Edge 18- and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ color: inherit; /* 2 */
+ height: 0; /* 1 */
+ overflow: visible; /* 3 */
+ }
+
+ /**
+ * Add the correct display in IE.
+ */
+
+ main {
+ display: block;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /* Text-level semantics
+ * ========================================================================== */
+
+ /**
+ * Remove the gray background on active links in IE 10.
+ */
+
+ a {
+ background-color: transparent;
+ }
+
+ /**
+ * Add the correct text decoration in Edge 18-, IE, and Safari.
+ */
+
+ abbr[title] {
+ text-decoration: underline;
+ text-decoration: underline dotted;
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /* Embedded content
+ * ========================================================================== */
+
+ /**
+ * Add the correct display in IE 9-.
+ */
+
+ audio,
+ video {
+ display: inline-block;
+ }
+
+ /**
+ * Add the correct display in iOS 4-7.
+ */
+
+ audio:not([controls]) {
+ display: none;
+ height: 0;
+ }
+
+ /**
+ * Remove the border on images within links in IE 10-.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /**
+ * Hide the overflow in IE.
+ */
+
+ svg:not(:root) {
+ overflow: hidden;
+ }
+
+ /* Tabular data
+ * ========================================================================== */
+
+ /**
+ * 1. Correct table border color inheritance in all Chrome, Edge, and Safari.
+ * 2. Remove text indentation from table contents in Chrome, Edge, and Safari.
+ */
+
+ table {
+ border-color: inherit; /* 1 */
+ text-indent: 0; /* 2 */
+ }
+
+ /* Forms
+ * ========================================================================== */
+
+ /**
+ * Remove the margin on controls in Safari.
+ */
+
+ button,
+ input,
+ select {
+ margin: 0;
+ }
+
+ /**
+ * 1. Show the overflow in IE.
+ * 2. Remove the inheritance of text transform in Edge 18-, Firefox, and IE.
+ */
+
+ button {
+ overflow: visible; /* 1 */
+ text-transform: none; /* 2 */
+ }
+
+ /**
+ * Correct the inability to style buttons in iOS and Safari.
+ */
+
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button;
+ }
+
+ /**
+ * Correct the padding in Firefox.
+ */
+
+ fieldset {
+ padding: 0.35em 0.75em 0.625em;
+ }
+
+ /**
+ * Show the overflow in Edge 18- and IE.
+ */
+
+ input {
+ overflow: visible;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge 18- and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * 1. Add the correct display in Edge 18- and IE.
+ * 2. Add the correct vertical alignment in Chrome, Edge, and Firefox.
+ */
+
+ progress {
+ display: inline-block; /* 1 */
+ vertical-align: baseline; /* 2 */
+ }
+
+ /**
+ * Remove the inheritance of text transform in Firefox.
+ */
+
+ select {
+ text-transform: none;
+ }
+
+ /**
+ * 1. Remove the margin in Firefox and Safari.
+ * 2. Remove the default vertical scrollbar in IE.
+ */
+
+ textarea {
+ margin: 0; /* 1 */
+ overflow: auto; /* 2 */
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10-.
+ * 2. Remove the padding in IE 10-.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome, Edge, and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Safari.
+ */
+
+ ::-webkit-inner-spin-button,
+ ::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * Correct the text style of placeholders in Chrome, Edge, and Safari.
+ */
+
+ ::-webkit-input-placeholder {
+ color: inherit;
+ opacity: 0.54;
+ }
+
+ /**
+ * Remove the inner padding in Chrome, Edge, and Safari on macOS.
+ */
+
+ ::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style upload buttons in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /**
+ * Remove the inner border and padding of focus outlines in Firefox.
+ */
+
+ ::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus outline styles unset by the previous rule in Firefox.
+ */
+
+ :-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Remove the additional :invalid styles in Firefox.
+ */
+
+ :-moz-ui-invalid {
+ box-shadow: none;
+ }
+
+ /* Interactive
+ * ========================================================================== */
+
+ /*
+ * Add the correct display in Edge 18- and IE.
+ */
+
+ details {
+ display: block;
+ }
+
+ /*
+ * Add the correct styles in Edge 18-, IE, and Safari.
+ */
+
+ dialog {
+ background-color: white;
+ border: solid;
+ color: black;
+ display: block;
+ height: -moz-fit-content;
+ height: -webkit-fit-content;
+ height: fit-content;
+ left: 0;
+ margin: auto;
+ padding: 1em;
+ position: absolute;
+ right: 0;
+ width: -moz-fit-content;
+ width: -webkit-fit-content;
+ width: fit-content;
+ }
+
+ dialog:not([open]) {
+ display: none;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Scripting
+ * ========================================================================== */
+
+ /**
+ * Add the correct display in IE 9-.
+ */
+
+ canvas {
+ display: inline-block;
+ }
+
+ /**
+ * Add the correct display in IE.
+ */
+
+ template {
+ display: none;
+ }
+
+ /* User interaction
+ * ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10-.
+ */
+
+ [hidden] {
+ display: none;
+ }
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/todo_app/templates/todo_app/home.html b/Code/Richard/django/lab-01/todo_app/templates/todo_app/home.html
new file mode 100644
index 00000000..c0bfe61f
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/templates/todo_app/home.html
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ To Do List App
+
+
+
+
+
+
+
+
+ To Do List:
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/todo_app/tests.py b/Code/Richard/django/lab-01/todo_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Richard/django/lab-01/todo_app/urls.py b/Code/Richard/django/lab-01/todo_app/urls.py
new file mode 100644
index 00000000..c18ede90
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/urls.py
@@ -0,0 +1,8 @@
+from django.urls import path
+from . import views
+
+app_name = 'todo_app'
+urlpatterns = [
+ path('', views.todo_view, name='todo_view'),
+ path('create/', views.create_todo, name='create')
+]
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/todo_app/views.py b/Code/Richard/django/lab-01/todo_app/views.py
new file mode 100644
index 00000000..9ee2c6ba
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_app/views.py
@@ -0,0 +1,33 @@
+from django.shortcuts import render, reverse
+from django.http import HttpResponseRedirect
+from .models import Priority, TodoItem
+
+# Create your views here.
+
+
+def todo_view(request):
+ todo_instances = TodoItem.objects.all()
+ priority_instances = Priority.objects.all()
+
+ context = {
+ 'todo_instances': todo_instances,
+ 'priority_instances': priority_instances
+ }
+ return render(request, 'todo_app/home.html', context)
+
+# everything worked with the quickstart until the below code tried to capture/save the form data.
+
+def create_todo(request):
+ # print(request.POST)
+ todo_item_text = request.POST['todo_item_text']
+ priority_name = request.POST['priority']
+ priority = Priority.objects.get_or_create(name=priority_name)[0]
+ todo_item = TodoItem(todo_item_text=todo_item_text, priority= priority)
+ # priority= Priority.objects.get(name=priority)
+ # print(priority_status)
+ todo_item.save()
+ # priority_status.save()
+ # return HttpResponse('form recieved')
+ return HttpResponseRedirect(reverse('todo_app:todo_view'))
+
+# (reverse('todo_app:todo_view'))
\ No newline at end of file
diff --git a/Code/Richard/django/lab-01/todo_project/__init__.py b/Code/Richard/django/lab-01/todo_project/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Richard/django/lab-01/todo_project/asgi.py b/Code/Richard/django/lab-01/todo_project/asgi.py
new file mode 100644
index 00000000..8c53ccad
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_project/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for todo_project 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_project.settings')
+
+application = get_asgi_application()
diff --git a/Code/Richard/django/lab-01/todo_project/settings.py b/Code/Richard/django/lab-01/todo_project/settings.py
new file mode 100644
index 00000000..13905db7
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_project/settings.py
@@ -0,0 +1,124 @@
+"""
+Django settings for todo_project project.
+
+Generated by 'django-admin startproject' using Django 4.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-p5f90_()u9p58p03m&f$j6m&84@e-7t0#dhvhcmvewa-za(&)n'
+
+# 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',
+ 'todo_app'
+]
+
+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 = 'todo_project.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 = 'todo_project.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'America/Indiana/Knox'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/Code/Richard/django/lab-01/todo_project/urls.py b/Code/Richard/django/lab-01/todo_project/urls.py
new file mode 100644
index 00000000..400e2fcf
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_project/urls.py
@@ -0,0 +1,22 @@
+"""todo_project URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('todo_app.urls'))
+]
diff --git a/Code/Richard/django/lab-01/todo_project/wsgi.py b/Code/Richard/django/lab-01/todo_project/wsgi.py
new file mode 100644
index 00000000..aaa51438
--- /dev/null
+++ b/Code/Richard/django/lab-01/todo_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for todo_project 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todo_project.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Richard/python/lab_17.py b/Code/Richard/python/lab_17.py
new file mode 100644
index 00000000..c53117e3
--- /dev/null
+++ b/Code/Richard/python/lab_17.py
@@ -0,0 +1,133 @@
+import json
+
+class ContactList:
+
+ def __init__(self):
+ self.contacts = []
+ #self.phone_number = phone_number
+ #self.email = email
+
+ def load(self):
+ # 1) open 'contacts.json' with option 'r' for read
+ with open ('contacts.json', 'r') as f:
+ # 2) get the text from the file
+ contacts = f.read()
+
+ # 3) convert the text into a python dictionary (json.loads)
+ contacts = json.loads(contacts) # convert a string containing json to a dictionary
+ # 4) get the list of contacts out of the dictionary
+ contacts=contacts['contacts']
+
+ # 5) assign the list of dictionaries to self.contacts
+ self.contacts = contacts
+ ...
+
+ def count(self):
+ return len(self.contacts)
+
+ # return the length of self.contacts
+ #print(contacts)
+
+ ...
+
+ def save(self):
+ # 1) open 'contacts.json' with open 'w' for write
+ with open ('contacts.json', 'w') as f:
+ # contacts = f.read()
+
+ # 2) put self.contacts in a dictionary with the key 'contacts'
+ dictionary = {"contacts":self.contacts}
+
+ # 3) convert the dictionary to a json string (json.dumps)
+
+ contacts = json.dumps(dictionary, indent=2)
+ # 4) write the json string to the file
+
+ # with open ('C:/Users/Richard Watkins/pdx_code/class_raven/Code/Richard/python/contacts.json', 'w') as f:
+ f.write(contacts)
+ ...
+
+ def print(self):
+ # loop over self.contacts
+ for contact in self.contacts:
+ print(contact)
+ #print('here', self.contacts)
+ # print the information for each contact on a separate line
+ ...
+
+ def add(self, name, phone_number, email):
+ # create a new dictionary using the 3 parameters
+ new_dict={}
+ new_dict['name']=name
+ new_dict['phone_number']=phone_number
+ new_dict['email']=email
+ # add the new dictionary to self.contacts
+ self.contacts.append(new_dict)
+
+ ...
+
+ def remove(self, name):
+ # find the contact in self-contacts with the given name
+ for contact in self.contacts:
+ if name == contact['name']:
+ self.contacts.pop(self.contacts.index(contact))
+
+ # remove the element at that index
+
+ ...
+
+ def update(self, old_name, new_name, new_phone_number, new_email):
+ # find the contact in self.contacts with the given old_name
+ for contact in self.contacts:
+ if old_name == contact['name']:
+ print(contact)
+ # set that contacts' name, phone number, etc to the given values
+
+ contact['name']=new_name
+ contact['phone_number']=new_phone_number
+ contact['email']=new_email
+
+ ...
+
+contact_list = ContactList() # create an instance of our class
+contact_list.load()
+print('Welcome to the Contact List App (CLA)')
+while True:
+ command = input('Enter a command: ')
+ if command == 'load':
+ contact_list.load()
+ print(f'Loaded {contact_list.count()} contacts.')
+ elif command == 'save':
+ contact_list.save()
+ print(f'Saved {contact_list.count()} contacts.')
+ elif command == 'print':
+ contact_list.print()
+ elif command == 'add':
+ print('Enter info of contact to add:')
+ name = input('Name: ')
+ phone_number = input('Phone Number: ')
+ email = input('Email: ')
+ contact_list.add(name, phone_number, email)
+ elif command == 'remove':
+ name = input('Name of contact to remove: ')
+ contact_list.remove(name)
+ elif command == 'update':
+ print('Enter info of contact to add:')
+ old_name = input('Name of contact to update: ')
+ new_name = input('New Name: ')
+ new_phone_number = input('New Phone Number: ')
+ new_email = input('New Email: ')
+ contact_list.update(old_name, new_name, new_phone_number, new_email)
+ elif command == 'help':
+ print('Available commands:')
+ print('load - load all contacts from the file')
+ print('save - save contacts to a file')
+ print('print - print all contacts')
+ print('add - add a new contact')
+ print('remove - remove a contact')
+ print('update - update a contact')
+ print('exit - exit the program')
+ elif command == 'exit':
+ break
+ else:
+ print('Command not recognized')
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/blog_project/__init__.py b/Code/Rodney/Django/Blog/blog_project/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Blog/blog_project/asgi.py b/Code/Rodney/Django/Blog/blog_project/asgi.py
new file mode 100644
index 00000000..f99cd99a
--- /dev/null
+++ b/Code/Rodney/Django/Blog/blog_project/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for blog_project 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_project.settings')
+
+application = get_asgi_application()
diff --git a/Code/Rodney/Django/Blog/blog_project/settings.py b/Code/Rodney/Django/Blog/blog_project/settings.py
new file mode 100644
index 00000000..bd8b3e4b
--- /dev/null
+++ b/Code/Rodney/Django/Blog/blog_project/settings.py
@@ -0,0 +1,134 @@
+"""
+Django settings for blog_project project.
+
+Generated by 'django-admin startproject' using Django 4.0.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-!fgg8653)#d)=9-xuon)z_r-d56dfae0ljy3*k3(-5o_lcqro2'
+
+# 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',
+ 'users_app',
+ 'post_app',
+
+]
+
+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 = 'blog_project.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [str(BASE_DIR.joinpath('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 = 'blog_project.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'America/Detroit'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+STATICFILES_DIRS = [str(BASE_DIR.joinpath('static'))]
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+AUTH_USER_MODEL = 'users_app.User'
+
+## where user goes if not logged in
+
+LOGIN_URL = '/users/login'
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/blog_project/urls.py b/Code/Rodney/Django/Blog/blog_project/urls.py
new file mode 100644
index 00000000..eaa97d7f
--- /dev/null
+++ b/Code/Rodney/Django/Blog/blog_project/urls.py
@@ -0,0 +1,23 @@
+"""blog_project URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('users/', include('users_app.urls')),
+ path('', include('post_app.urls')),
+]
diff --git a/Code/Rodney/Django/Blog/blog_project/wsgi.py b/Code/Rodney/Django/Blog/blog_project/wsgi.py
new file mode 100644
index 00000000..97b2fc7c
--- /dev/null
+++ b/Code/Rodney/Django/Blog/blog_project/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for blog_project 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_project.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Rodney/Django/Blog/manage.py b/Code/Rodney/Django/Blog/manage.py
new file mode 100755
index 00000000..e04dc851
--- /dev/null
+++ b/Code/Rodney/Django/Blog/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', 'blog_project.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/Code/Rodney/Django/Blog/post_app/__init__.py b/Code/Rodney/Django/Blog/post_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Blog/post_app/admin.py b/Code/Rodney/Django/Blog/post_app/admin.py
new file mode 100644
index 00000000..356c101a
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+
+from .models import BlogPost
+
+
+admin.site.register(BlogPost)
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/post_app/apps.py b/Code/Rodney/Django/Blog/post_app/apps.py
new file mode 100644
index 00000000..d4251664
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class PostAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'post_app'
diff --git a/Code/Rodney/Django/Blog/post_app/forms.py b/Code/Rodney/Django/Blog/post_app/forms.py
new file mode 100644
index 00000000..12e54891
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/forms.py
@@ -0,0 +1,24 @@
+from django import forms
+from django.db.models import fields
+from .models import BlogPost, User
+
+
+
+class BlogPostForm(forms.ModelForm):
+
+ class Meta:
+
+ model = BlogPost
+
+ fields = [
+ 'blog_title',
+ 'blog_body',
+ 'public_post'
+ ]
+
+ widgets = {
+ 'blog_title': forms.TextInput(attrs={'class':'form-control'}),
+ 'blog_body': forms.Textarea(attrs={'class':'form-control'}),
+
+ }
+
diff --git a/Code/Rodney/Django/Blog/post_app/migrations/0001_initial.py b/Code/Rodney/Django/Blog/post_app/migrations/0001_initial.py
new file mode 100644
index 00000000..9ddbaa24
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/migrations/0001_initial.py
@@ -0,0 +1,29 @@
+# Generated by Django 4.0.1 on 2022-01-09 17:36
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BlogPost',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('blog_title', models.CharField(max_length=200)),
+ ('blog_body', models.TextField(max_length=5000)),
+ ('public_post', models.BooleanField()),
+ ('created_date', models.DateTimeField(auto_now_add=True)),
+ ('edited_date', models.DateTimeField(auto_now=True)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='blogpost', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/Code/Rodney/Django/Blog/post_app/migrations/__init__.py b/Code/Rodney/Django/Blog/post_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Blog/post_app/models.py b/Code/Rodney/Django/Blog/post_app/models.py
new file mode 100644
index 00000000..604970ee
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/models.py
@@ -0,0 +1,19 @@
+from django.db import models
+
+from django.contrib.auth.models import AbstractUser
+from django.contrib.auth import get_user_model
+from django.db.models.fields import BooleanField, TextField
+
+from users_app.models import User
+
+
+class BlogPost(models.Model):
+ blog_title = models.CharField(max_length=200)
+ blog_body = models.TextField(max_length=5000)
+ user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='blogpost')
+ public_post = models.BooleanField()
+ created_date = models.DateTimeField(auto_now_add=True)
+ edited_date = models.DateTimeField(auto_now=True)
+
+ def __str__(self):
+ return self.user.username
diff --git a/Code/Rodney/Django/Blog/post_app/tests.py b/Code/Rodney/Django/Blog/post_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Rodney/Django/Blog/post_app/urls.py b/Code/Rodney/Django/Blog/post_app/urls.py
new file mode 100644
index 00000000..8feeee98
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/urls.py
@@ -0,0 +1,14 @@
+from django.urls import path
+from django.urls.resolvers import URLPattern
+
+from . import views
+
+
+app_name = 'post_app'
+
+urlpatterns = [
+ path('', views.home, name='home'),
+ path('create/', views.create, name='create'),
+ path('delete/
/', views.delete, name='delete'),
+]
+
diff --git a/Code/Rodney/Django/Blog/post_app/views.py b/Code/Rodney/Django/Blog/post_app/views.py
new file mode 100644
index 00000000..9cd5838c
--- /dev/null
+++ b/Code/Rodney/Django/Blog/post_app/views.py
@@ -0,0 +1,62 @@
+from django.contrib import auth
+from django.shortcuts import get_object_or_404, render, redirect
+from django.urls import reverse
+from django.http import HttpResponse
+
+from django.contrib.auth import (authenticate, get_user_model,
+login as django_login,
+logout as django_logout )
+from django.contrib.auth.decorators import login_required
+from.forms import BlogPostForm
+from .models import BlogPost, User
+
+
+
+def home(request):
+ public_blog_posts = BlogPost.objects.filter(public_post=True).order_by('-created_date')
+
+ context = {
+ 'blogposts': public_blog_posts
+ }
+
+ # for blogpost in public_blog_posts:
+
+ # print(blogpost.blog_title)
+
+ return render(request, 'post/home.html', context)
+
+
+@login_required
+def create(request):
+
+ if request.method == "GET":
+
+ form = BlogPostForm()
+ context = {
+ 'form': form
+ }
+
+ return render(request, 'post/create.html', context)
+
+ elif request.method == "POST":
+
+ form = BlogPostForm(request.POST)
+
+ if form.is_valid():
+
+ new_post = form.save(commit = False)
+
+ ## connect the new post with the user (foreign key)
+ new_post.user = request.user
+
+ new_post.save()
+
+ return redirect(reverse('post_app:home'))
+
+
+@login_required
+def delete(request, pk):
+ deleted_item = get_object_or_404(BlogPost, pk=pk)
+ deleted_item.delete()
+
+ return redirect(reverse('post_app:home'))
diff --git a/Code/Rodney/Django/Blog/static/css/index.css b/Code/Rodney/Django/Blog/static/css/index.css
new file mode 100644
index 00000000..365dd0d1
--- /dev/null
+++ b/Code/Rodney/Django/Blog/static/css/index.css
@@ -0,0 +1,68 @@
+
+* {
+ font-family: Verdana, Geneva, Tahoma, sans-serif;
+ font-size: 1.1rem;
+}
+
+#profile-user {
+
+ font-size: 3rem;
+}
+
+
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+#main-title {
+margin-top: 20px;
+font-size: 1.5rem;
+color: rgb(205, 240, 206)
+}
+
+
+.fas {
+ font-size: 25px;
+}
+
+.far {
+ font-size: 25px;
+}
+
+
+.user-registration {
+ color: white;
+ padding: 30px;
+ margin: 30px;
+ border-radius: 30px;
+ background-color: rgb(25, 135, 84);
+}
+
+#id_username {
+ font-size: 1.2rem;
+ margin-bottom: 20px;
+}
+
+.register-button {
+ margin-top: 20px;
+}
+
+.profile-margin {
+ margin-top: 50px;
+}
+
+.blogbody {
+ border-width: 20px;
+ border: black;
+ border: solid;
+
+
+}
+
+label {
+ color: rgb(205, 240, 206);
+ margin: 5px;
+}
diff --git a/Code/Rodney/Django/Blog/templates/base.html b/Code/Rodney/Django/Blog/templates/base.html
new file mode 100644
index 00000000..7cb1e0c8
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/base.html
@@ -0,0 +1,96 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+ BlogApp
+
+
+
+
+
+
+
+
+
+
+ MyBlogz
+
+
+
+
+
+
+
+ {% if request.user.is_authenticated %}
+
+
+
+
+
+
+
+
+ {% endif %}
+
+
+
+
+
+
+
+
+
+ {% if errors %}
+
+ {% for error in errors %}
+
+
+ {{error}}
+
+
+
+ {% endfor %}
+ {% endif %}
+
+
+
+ {% block content %}
+
+
+
+ {% endblock content %}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/templates/post/_card-titles.html b/Code/Rodney/Django/Blog/templates/post/_card-titles.html
new file mode 100644
index 00000000..5066a812
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/post/_card-titles.html
@@ -0,0 +1,42 @@
+
+
+{% block content %}
+{% load static %}
+
+
+
+
+
+
+
+
+ {{ blogpost.blog_title }} Created by: You
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
+
diff --git a/Code/Rodney/Django/Blog/templates/post/_card.html b/Code/Rodney/Django/Blog/templates/post/_card.html
new file mode 100644
index 00000000..6d8c48ed
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/post/_card.html
@@ -0,0 +1,47 @@
+
+
+{% block content %}
+ {% load static %}
+
+
+
+
+
+
+
+
+ {{ blogpost.blog_title }} Created by: {{ blogpost.user }}
+
+
+
+ {{ blogpost.blog_body }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
+
diff --git a/Code/Rodney/Django/Blog/templates/post/create.html b/Code/Rodney/Django/Blog/templates/post/create.html
new file mode 100644
index 00000000..fff759c2
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/post/create.html
@@ -0,0 +1,32 @@
+{% extends 'base.html' %}
+
+{% load static %}
+
+
+
+{% block content %}
+
+
+ New blog post
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/templates/post/home.html b/Code/Rodney/Django/Blog/templates/post/home.html
new file mode 100644
index 00000000..febb2768
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/post/home.html
@@ -0,0 +1,26 @@
+{% extends 'base.html' %}
+{% load static %}
+
+
+{% block content %}
+
+
+
+
+
+
+ Blog Posts
+
+
+ {% for blogpost in blogposts %}
+
+ {% include 'post/_card.html' with blogposts=blogposts %}
+
+
+ {% endfor %}
+
+
+
+
+
+{% endblock content %}
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/templates/users/login.html b/Code/Rodney/Django/Blog/templates/users/login.html
new file mode 100644
index 00000000..87047ce5
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/users/login.html
@@ -0,0 +1,47 @@
+{% extends 'base.html' %}
+
+{% load static %}
+
+{% block content %}
+
+
+
+
+ MyBlogz Log-in
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
diff --git a/Code/Rodney/Django/Blog/templates/users/register.html b/Code/Rodney/Django/Blog/templates/users/register.html
new file mode 100644
index 00000000..6010a2a1
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/users/register.html
@@ -0,0 +1,39 @@
+{% extends 'base.html' %}
+
+{% load static %}
+
+{% block content %}
+
+
+
+
+ MyBlogz Registration
+
+
+
+
+
+
+
+
+{% endblock content %}
diff --git a/Code/Rodney/Django/Blog/templates/users/userprofile.html b/Code/Rodney/Django/Blog/templates/users/userprofile.html
new file mode 100644
index 00000000..6c9c8009
--- /dev/null
+++ b/Code/Rodney/Django/Blog/templates/users/userprofile.html
@@ -0,0 +1,73 @@
+
+
+{% extends 'base.html' %} {% load static %} {% block content %}
+
+
+
+ Welcome {{user.username}} !
+
+
+
+
+
+
+
+
+
+
+
+ Username:
+ {{user.username}}
+
+
+
+
+
+ Profile created:
+ {{user.date_joined|date}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{user.username}}'s blog posts
+
+
+ {% for blogpost in user.blogpost.all %}
+
+ {% include 'post/_card-titles.html' with blogpost=blogpost %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{% endblock content %}
diff --git a/Code/Rodney/Django/Blog/users_app/__init__.py b/Code/Rodney/Django/Blog/users_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Blog/users_app/admin.py b/Code/Rodney/Django/Blog/users_app/admin.py
new file mode 100644
index 00000000..6d53b53a
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/admin.py
@@ -0,0 +1,6 @@
+from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+
+from .models import User
+
+admin.site.register(User, UserAdmin)
diff --git a/Code/Rodney/Django/Blog/users_app/apps.py b/Code/Rodney/Django/Blog/users_app/apps.py
new file mode 100644
index 00000000..7200dd57
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class UsersAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'users_app'
diff --git a/Code/Rodney/Django/Blog/users_app/forms.py b/Code/Rodney/Django/Blog/users_app/forms.py
new file mode 100644
index 00000000..9d645eb5
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/forms.py
@@ -0,0 +1,33 @@
+from django import forms
+from django.db.models import fields
+from .models import User
+
+class UserForm(forms.ModelForm):
+
+ #meta describes data used to make form, which fields, widgets, database model
+
+ class Meta:
+
+ #this form is for the User model
+ model = User
+
+ fields = [
+ 'first_name',
+ 'last_name',
+ 'user_blog_name',
+ ]
+
+ widgets = {
+ 'first_name': forms.TextInput(attrs={'class':'form-control'}),
+ 'last_name': forms.TextInput(attrs={'class':'form-control'}),
+ 'user_blog_name': forms.TextInput(attrs={'class':'form-control'}),
+ 'username': forms.TextInput(attrs={'class':'form-control'}),
+ 'password': forms.PasswordInput(attrs={'class':'form-control'}),
+ }
+
+
+class UserAuthForm(UserForm):
+ class Meta(UserForm.Meta):
+ fields = ['username', 'password']
+
+
diff --git a/Code/Rodney/Django/Blog/users_app/migrations/0001_initial.py b/Code/Rodney/Django/Blog/users_app/migrations/0001_initial.py
new file mode 100644
index 00000000..8e86fb68
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/migrations/0001_initial.py
@@ -0,0 +1,45 @@
+# Generated by Django 4.0.1 on 2022-01-04 20:11
+
+import django.contrib.auth.models
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ('auth', '0012_alter_user_first_name_max_length'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='User',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('password', models.CharField(max_length=128, verbose_name='password')),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('user_blog_name', models.CharField(max_length=200)),
+ ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
+ ],
+ options={
+ 'verbose_name': 'user',
+ 'verbose_name_plural': 'users',
+ 'abstract': False,
+ },
+ managers=[
+ ('objects', django.contrib.auth.models.UserManager()),
+ ],
+ ),
+ ]
diff --git a/Code/Rodney/Django/Blog/users_app/migrations/0002_blogpost.py b/Code/Rodney/Django/Blog/users_app/migrations/0002_blogpost.py
new file mode 100644
index 00000000..ad6392c8
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/migrations/0002_blogpost.py
@@ -0,0 +1,27 @@
+# Generated by Django 4.0.1 on 2022-01-08 03:45
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users_app', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='BlogPost',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('blog_title', models.CharField(max_length=200)),
+ ('blog_body', models.TextField(max_length=5000)),
+ ('public_post', models.BooleanField()),
+ ('created_date', models.DateTimeField(auto_now_add=True)),
+ ('edited_date', models.DateTimeField(auto_now=True)),
+ ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='blogtitle', to=settings.AUTH_USER_MODEL)),
+ ],
+ ),
+ ]
diff --git a/Code/Rodney/Django/Blog/users_app/migrations/0003_delete_blogpost.py b/Code/Rodney/Django/Blog/users_app/migrations/0003_delete_blogpost.py
new file mode 100644
index 00000000..80a148c1
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/migrations/0003_delete_blogpost.py
@@ -0,0 +1,16 @@
+# Generated by Django 4.0.1 on 2022-01-09 16:22
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('users_app', '0002_blogpost'),
+ ]
+
+ operations = [
+ migrations.DeleteModel(
+ name='BlogPost',
+ ),
+ ]
diff --git a/Code/Rodney/Django/Blog/users_app/migrations/__init__.py b/Code/Rodney/Django/Blog/users_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Blog/users_app/models.py b/Code/Rodney/Django/Blog/users_app/models.py
new file mode 100644
index 00000000..00e2339f
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/models.py
@@ -0,0 +1,14 @@
+from django.db import models
+
+from django.contrib.auth.models import AbstractUser
+from django.contrib.auth import get_user_model
+from django.db.models.fields import BooleanField, TextField
+
+
+class User(AbstractUser):
+
+ user_blog_name = models.CharField(max_length=200)
+
+ def __str__(self):
+ return self.username
+
diff --git a/Code/Rodney/Django/Blog/users_app/tests.py b/Code/Rodney/Django/Blog/users_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Rodney/Django/Blog/users_app/urls.py b/Code/Rodney/Django/Blog/users_app/urls.py
new file mode 100644
index 00000000..8de90b9f
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/urls.py
@@ -0,0 +1,16 @@
+
+from django.urls import path
+from django.urls.resolvers import URLPattern
+
+from . import views
+
+
+app_name = 'users_app'
+
+urlpatterns = [
+ path('register/', views.register, name='register'),
+ path('login/', views.login, name='login'),
+ path('/', views.userprofile, name='userprofile'),
+ path('logout', views.logout, name='logout'),
+
+]
\ No newline at end of file
diff --git a/Code/Rodney/Django/Blog/users_app/views.py b/Code/Rodney/Django/Blog/users_app/views.py
new file mode 100644
index 00000000..a17abc0c
--- /dev/null
+++ b/Code/Rodney/Django/Blog/users_app/views.py
@@ -0,0 +1,115 @@
+from django.contrib import auth
+from django.shortcuts import get_object_or_404, render, redirect
+from django.urls import reverse
+from django.http import HttpResponse
+from .forms import UserAuthForm, UserForm
+from django.contrib.auth import (authenticate, get_user_model,
+login as django_login,
+logout as django_logout )
+from django.contrib.auth.decorators import login_required
+
+
+
+
+
+def register(request):
+ ## this is creating an empty form when user lands on page
+
+ form = UserAuthForm()
+
+ if request.method == 'GET':
+
+ context = {
+ 'form': form
+ }
+
+ return render(request, 'users/register.html', context)
+
+
+ if request.method == 'POST':
+
+ ##creating a UserAuthForm with HTML form data
+
+ form = UserAuthForm(request.POST)
+
+ if form.is_valid():
+ ## commit false creates object, doesn't save it
+ new_user = form.save(commit=False)
+
+ ## after you get form is valid, you get access to cleaned_data dictionary
+ new_user.set_password(form.cleaned_data['password'])
+
+ #without this, you would just have a plain text password which won't allow you to log in ?? (I think)
+
+
+ ## now save the new user object to the database
+ new_user.save()
+
+ ## redirect does same as HTTP Response Redirect, a short cut
+
+ return redirect(reverse('users_app:login'))
+
+ else:
+
+ context = {
+
+ 'form': UserAuthForm(),
+ 'errors': ['User already exists! Please try again']
+ }
+
+ return render (request, 'users/register.html', context)
+
+def login(request):
+
+ if request.method == 'GET':
+
+ form = UserAuthForm()
+
+ context = {
+ 'form': form
+ }
+
+ return render(request, 'users/login.html', context)
+
+ if request.method == 'POST':
+
+ ## get form data from request
+
+ form = request.POST
+
+ username = form['username']
+ password = form['password']
+
+ ## try to authenticate user
+ user = authenticate(request, username=username, password=password)
+
+ ## if credentials not valid, return error
+ if user is None:
+ context = {
+ 'form': UserAuthForm(),
+ 'errors': ['Invalid Username or Password']
+ }
+
+ return render(request, 'users/login.html', context)
+
+ else:
+
+ django_login(request, user)
+
+ # redirect to users profile page
+ return redirect(reverse('users_app:userprofile', kwargs={'username': user.username}))
+
+@login_required
+def userprofile(request, username):
+ # find the user that just logged in
+ user = get_object_or_404(get_user_model(), username=username)
+
+ # print(user.blogpost.all())
+
+ return render(request, 'users/userprofile.html', {'user': user})
+
+def logout(request):
+ django_logout(request)
+
+ return redirect(reverse('users_app:login'))
+
diff --git a/Code/Rodney/Django/Pokedex/fetch_pokemon.py b/Code/Rodney/Django/Pokedex/fetch_pokemon.py
new file mode 100644
index 00000000..066e9f81
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/fetch_pokemon.py
@@ -0,0 +1,46 @@
+
+
+
+import requests
+import json
+import pyperclip
+
+data = {'pokemon':[]}
+num_pokemon = 152
+for i in range(1, num_pokemon):
+ # get the data from the pokemon api
+ response = requests.get('https://pokeapi.co/api/v2/pokemon/' + str(i))
+ pokeapi_data = json.loads(response.text)
+
+ # extract the relevant portions of data
+ number = pokeapi_data['id']
+ name = pokeapi_data['name']
+ height = pokeapi_data['height']
+ weight = pokeapi_data['weight']
+ image_front = pokeapi_data['sprites']['front_default']
+ image_back = pokeapi_data['sprites']['back_default']
+ url = 'https://pokemon.fandom.com/wiki/' + name
+ types = [type['type']['name'] for type in pokeapi_data['types']]
+
+ # put the relevant data into a dictionary
+ pokemon = {
+ 'number': number,
+ 'name': name,
+ 'height': height,
+ 'weight': weight,
+ 'image_front': image_front,
+ 'image_back': image_back,
+ 'types': types,
+ 'url': url
+ }
+
+ # add the pokemon to our list
+ data['pokemon'].append(pokemon)
+
+ # give the user some feedback
+ print(str(round(i/num_pokemon*100,2))+'%')
+
+# copy the resulting json to the clipboard
+pyperclip.copy(json.dumps(data, indent=4))
+
+
diff --git a/Code/Rodney/Django/Pokedex/manage.py b/Code/Rodney/Django/Pokedex/manage.py
new file mode 100755
index 00000000..6adc02e8
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/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', 'pokedex.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/Code/Rodney/Django/Pokedex/pokedex/__init__.py b/Code/Rodney/Django/Pokedex/pokedex/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Pokedex/pokedex/asgi.py b/Code/Rodney/Django/Pokedex/pokedex/asgi.py
new file mode 100644
index 00000000..03bf1b13
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for pokedex 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings')
+
+application = get_asgi_application()
diff --git a/Code/Rodney/Django/Pokedex/pokedex/settings.py b/Code/Rodney/Django/Pokedex/pokedex/settings.py
new file mode 100644
index 00000000..d7a979c9
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex/settings.py
@@ -0,0 +1,126 @@
+"""
+Django settings for pokedex project.
+
+Generated by 'django-admin startproject' using Django 4.0.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-4n%)5(_x(g77&xo#af(t9pkj+^h*1a*(_^nln2*8(yib4nybl8'
+
+# 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',
+ 'pokedex_app',
+]
+
+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 = 'pokedex.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [str(BASE_DIR.joinpath('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 = 'pokedex.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'America/Detroit'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+STATICFILES_DIRS = [str(BASE_DIR.joinpath('static'))]
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/Code/Rodney/Django/Pokedex/pokedex/urls.py b/Code/Rodney/Django/Pokedex/pokedex/urls.py
new file mode 100644
index 00000000..fd715fe9
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex/urls.py
@@ -0,0 +1,23 @@
+"""pokedex URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('pokedex_app.urls')),
+
+]
diff --git a/Code/Rodney/Django/Pokedex/pokedex/wsgi.py b/Code/Rodney/Django/Pokedex/pokedex/wsgi.py
new file mode 100644
index 00000000..8b6d1551
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for pokedex 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'pokedex.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/__init__.py b/Code/Rodney/Django/Pokedex/pokedex_app/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/admin.py b/Code/Rodney/Django/Pokedex/pokedex_app/admin.py
new file mode 100644
index 00000000..81e211fc
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+
+from .models import PokemonType, Pokemon
+
+admin.site.register(PokemonType)
+admin.site.register(Pokemon)
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/apps.py b/Code/Rodney/Django/Pokedex/pokedex_app/apps.py
new file mode 100644
index 00000000..14f7ad62
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class PokedexAppConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'pokedex_app'
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/management/commands/populate_db.py b/Code/Rodney/Django/Pokedex/pokedex_app/management/commands/populate_db.py
new file mode 100644
index 00000000..e29c69f5
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/management/commands/populate_db.py
@@ -0,0 +1,44 @@
+from django.core.management.base import BaseCommand
+import requests
+from pokedex_app.models import Pokemon, PokemonType
+import json
+
+class Command(BaseCommand):
+
+ def handle(self, *args, **options):
+
+ Pokemon.objects.all().delete()
+ PokemonType.objects.all().delete()
+
+ with open('static/pokemon.json') as pokemon_file:
+ pokemons = json.loads(pokemon_file.read())
+ for pokemon in pokemons['pokemon']:
+ number = int(pokemon['number'])
+ name = pokemon['name']
+ height = float(pokemon['height'])
+ weight = float(pokemon['weight'])
+ image_front = pokemon['image_front']
+ image_back = pokemon['image_back']
+ types = pokemon['types']
+ url = pokemon['url']
+
+ pokemon = Pokemon.objects.create(
+ number = number,
+ name = name,
+ height = height,
+ weight = weight,
+ image_front = image_front,
+ image_back = image_back,
+ url = url
+ )
+
+ for type in types:
+ type, created = PokemonType.objects.get_or_create(name=type)
+
+ if type not in pokemon.types.all():
+ pokemon.types.add(type)
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0001_initial.py b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0001_initial.py
new file mode 100644
index 00000000..82cf23e3
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0001_initial.py
@@ -0,0 +1,34 @@
+# Generated by Django 4.0.1 on 2022-01-11 22:15
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='PokemonType',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='Pokemon',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('number', models.IntegerField()),
+ ('name', models.CharField(max_length=100)),
+ ('height', models.FloatField(default=0.0)),
+ ('weight', models.FloatField(default=0.0)),
+ ('image_front', models.CharField(max_length=200)),
+ ('image_back', models.CharField(max_length=200)),
+ ('types', models.ManyToManyField(related_name='pokemontype', to='pokedex_app.PokemonType')),
+ ],
+ ),
+ ]
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0002_alter_pokemon_types.py b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0002_alter_pokemon_types.py
new file mode 100644
index 00000000..82e4857d
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0002_alter_pokemon_types.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0.1 on 2022-01-13 03:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='pokemon',
+ name='types',
+ field=models.ManyToManyField(related_name='pokemon', to='pokedex_app.PokemonType'),
+ ),
+ ]
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0003_pokemon_url.py b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0003_pokemon_url.py
new file mode 100644
index 00000000..6aeac466
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/0003_pokemon_url.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.0.1 on 2022-01-15 02:42
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('pokedex_app', '0002_alter_pokemon_types'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='pokemon',
+ name='url',
+ field=models.CharField(default='www.google.com', max_length=300),
+ preserve_default=False,
+ ),
+ ]
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/migrations/__init__.py b/Code/Rodney/Django/Pokedex/pokedex_app/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/models.py b/Code/Rodney/Django/Pokedex/pokedex_app/models.py
new file mode 100644
index 00000000..e9556df7
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/models.py
@@ -0,0 +1,26 @@
+from django.db import models
+from django.db import models
+from django.contrib.auth import get_user_model
+from django.db.models.fields import TextField, IntegerField, FloatField
+from django.db.models.fields.related import ManyToManyField
+
+
+
+class PokemonType(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __str__(self):
+ return self.name
+
+class Pokemon(models.Model):
+ number = models.IntegerField()
+ name = models.CharField(max_length=100)
+ height = models.FloatField(default=0.0)
+ weight = models.FloatField(default=0.0)
+ image_front = models.CharField(max_length=200)
+ image_back = models.CharField(max_length=200)
+ url = models.CharField(max_length=300)
+ types = ManyToManyField(PokemonType, related_name='pokemon')
+
+ def __str__(self):
+ return self.name
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/pokemonurls.py b/Code/Rodney/Django/Pokedex/pokedex_app/pokemonurls.py
new file mode 100644
index 00000000..df241618
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/pokemonurls.py
@@ -0,0 +1,156 @@
+
+
+
+urls = ['https://pokemon.fandom.com/wiki/bulbasaur',
+'https://pokemon.fandom.com/wiki/ivysaur',
+'https://pokemon.fandom.com/wiki/venusaur',
+'https://pokemon.fandom.com/wiki/charmander',
+'https://pokemon.fandom.com/wiki/charmeleon',
+'https://pokemon.fandom.com/wiki/charizard',
+'https://pokemon.fandom.com/wiki/squirtle',
+'https://pokemon.fandom.com/wiki/wartortle',
+'https://pokemon.fandom.com/wiki/blastoise',
+'https://pokemon.fandom.com/wiki/caterpie',
+'https://pokemon.fandom.com/wiki/metapod',
+'https://pokemon.fandom.com/wiki/butterfree',
+'https://pokemon.fandom.com/wiki/weedle',
+'https://pokemon.fandom.com/wiki/kakuna',
+'https://pokemon.fandom.com/wiki/beedrill',
+'https://pokemon.fandom.com/wiki/pidgey',
+'https://pokemon.fandom.com/wiki/pidgeotto',
+'https://pokemon.fandom.com/wiki/pidgeot',
+'https://pokemon.fandom.com/wiki/rattata',
+'https://pokemon.fandom.com/wiki/raticate',
+'https://pokemon.fandom.com/wiki/spearow',
+'https://pokemon.fandom.com/wiki/fearow',
+'https://pokemon.fandom.com/wiki/ekans',
+'https://pokemon.fandom.com/wiki/arbok',
+'https://pokemon.fandom.com/wiki/pikachu',
+'https://pokemon.fandom.com/wiki/raichu',
+'https://pokemon.fandom.com/wiki/sandshrew',
+'https://pokemon.fandom.com/wiki/sandslash',
+'https://pokemon.fandom.com/wiki/nidoran-f',
+'https://pokemon.fandom.com/wiki/nidorina',
+'https://pokemon.fandom.com/wiki/nidoqueen',
+'https://pokemon.fandom.com/wiki/nidoran-m',
+'https://pokemon.fandom.com/wiki/nidorino',
+'https://pokemon.fandom.com/wiki/nidoking',
+'https://pokemon.fandom.com/wiki/clefairy',
+'https://pokemon.fandom.com/wiki/clefable',
+'https://pokemon.fandom.com/wiki/vulpix',
+'https://pokemon.fandom.com/wiki/ninetales',
+'https://pokemon.fandom.com/wiki/jigglypuff',
+'https://pokemon.fandom.com/wiki/wigglytuff',
+'https://pokemon.fandom.com/wiki/zubat',
+'https://pokemon.fandom.com/wiki/golbat',
+'https://pokemon.fandom.com/wiki/oddish',
+'https://pokemon.fandom.com/wiki/gloom',
+'https://pokemon.fandom.com/wiki/vileplume',
+'https://pokemon.fandom.com/wiki/paras',
+'https://pokemon.fandom.com/wiki/parasect',
+'https://pokemon.fandom.com/wiki/venonat',
+'https://pokemon.fandom.com/wiki/venomoth',
+'https://pokemon.fandom.com/wiki/diglett',
+'https://pokemon.fandom.com/wiki/dugtrio',
+'https://pokemon.fandom.com/wiki/meowth',
+'https://pokemon.fandom.com/wiki/persian',
+'https://pokemon.fandom.com/wiki/psyduck',
+'https://pokemon.fandom.com/wiki/golduck',
+'https://pokemon.fandom.com/wiki/mankey',
+'https://pokemon.fandom.com/wiki/primeape',
+'https://pokemon.fandom.com/wiki/growlithe',
+'https://pokemon.fandom.com/wiki/arcanine',
+'https://pokemon.fandom.com/wiki/poliwag',
+'https://pokemon.fandom.com/wiki/poliwhirl',
+'https://pokemon.fandom.com/wiki/poliwrath',
+'https://pokemon.fandom.com/wiki/abra',
+'https://pokemon.fandom.com/wiki/kadabra',
+'https://pokemon.fandom.com/wiki/alakazam',
+'https://pokemon.fandom.com/wiki/machop',
+'https://pokemon.fandom.com/wiki/machoke',
+'https://pokemon.fandom.com/wiki/machamp',
+'https://pokemon.fandom.com/wiki/bellsprout',
+'https://pokemon.fandom.com/wiki/weepinbell',
+'https://pokemon.fandom.com/wiki/victreebel',
+'https://pokemon.fandom.com/wiki/tentacool',
+'https://pokemon.fandom.com/wiki/tentacruel',
+'https://pokemon.fandom.com/wiki/geodude',
+'https://pokemon.fandom.com/wiki/graveler',
+'https://pokemon.fandom.com/wiki/golem',
+'https://pokemon.fandom.com/wiki/ponyta',
+'https://pokemon.fandom.com/wiki/rapidash',
+'https://pokemon.fandom.com/wiki/slowpoke',
+'https://pokemon.fandom.com/wiki/slowbro',
+'https://pokemon.fandom.com/wiki/magnemite',
+'https://pokemon.fandom.com/wiki/magneton',
+'https://pokemon.fandom.com/wiki/farfetchd',
+'https://pokemon.fandom.com/wiki/doduo',
+'https://pokemon.fandom.com/wiki/dodrio',
+'https://pokemon.fandom.com/wiki/seel',
+'https://pokemon.fandom.com/wiki/dewgong',
+'https://pokemon.fandom.com/wiki/grimer',
+'https://pokemon.fandom.com/wiki/muk',
+'https://pokemon.fandom.com/wiki/shellder',
+'https://pokemon.fandom.com/wiki/cloyster',
+'https://pokemon.fandom.com/wiki/gastly',
+'https://pokemon.fandom.com/wiki/haunter',
+'https://pokemon.fandom.com/wiki/gengar',
+'https://pokemon.fandom.com/wiki/onix',
+'https://pokemon.fandom.com/wiki/drowzee',
+'https://pokemon.fandom.com/wiki/hypno',
+'https://pokemon.fandom.com/wiki/krabby',
+'https://pokemon.fandom.com/wiki/kingler',
+'https://pokemon.fandom.com/wiki/voltorb',
+'https://pokemon.fandom.com/wiki/electrode',
+'https://pokemon.fandom.com/wiki/exeggcute',
+'https://pokemon.fandom.com/wiki/exeggutor',
+'https://pokemon.fandom.com/wiki/cubone',
+'https://pokemon.fandom.com/wiki/marowak',
+'https://pokemon.fandom.com/wiki/hitmonlee',
+'https://pokemon.fandom.com/wiki/hitmonchan',
+'https://pokemon.fandom.com/wiki/lickitung',
+'https://pokemon.fandom.com/wiki/koffing',
+'https://pokemon.fandom.com/wiki/weezing',
+'https://pokemon.fandom.com/wiki/rhyhorn',
+'https://pokemon.fandom.com/wiki/rhydon',
+'https://pokemon.fandom.com/wiki/chansey',
+'https://pokemon.fandom.com/wiki/tangela',
+'https://pokemon.fandom.com/wiki/kangaskhan',
+'https://pokemon.fandom.com/wiki/horsea',
+'https://pokemon.fandom.com/wiki/seadra',
+'https://pokemon.fandom.com/wiki/goldeen',
+'https://pokemon.fandom.com/wiki/seaking',
+'https://pokemon.fandom.com/wiki/staryu',
+'https://pokemon.fandom.com/wiki/starmie',
+'https://pokemon.fandom.com/wiki/mr-mime',
+'https://pokemon.fandom.com/wiki/scyther',
+'https://pokemon.fandom.com/wiki/jynx',
+'https://pokemon.fandom.com/wiki/electabuzz',
+'https://pokemon.fandom.com/wiki/magmar',
+'https://pokemon.fandom.com/wiki/pinsir',
+'https://pokemon.fandom.com/wiki/tauros',
+'https://pokemon.fandom.com/wiki/magikarp',
+'https://pokemon.fandom.com/wiki/gyarados',
+'https://pokemon.fandom.com/wiki/lapras',
+'https://pokemon.fandom.com/wiki/ditto',
+'https://pokemon.fandom.com/wiki/eevee',
+'https://pokemon.fandom.com/wiki/vaporeon',
+'https://pokemon.fandom.com/wiki/jolteon',
+'https://pokemon.fandom.com/wiki/flareon',
+'https://pokemon.fandom.com/wiki/porygon',
+'https://pokemon.fandom.com/wiki/omanyte',
+'https://pokemon.fandom.com/wiki/omastar',
+'https://pokemon.fandom.com/wiki/kabuto',
+'https://pokemon.fandom.com/wiki/kabutops',
+'https://pokemon.fandom.com/wiki/aerodactyl',
+'https://pokemon.fandom.com/wiki/snorlax',
+'https://pokemon.fandom.com/wiki/articuno',
+'https://pokemon.fandom.com/wiki/zapdos',
+'https://pokemon.fandom.com/wiki/moltres',
+'https://pokemon.fandom.com/wiki/dratini',
+'https://pokemon.fandom.com/wiki/dragonair',
+'https://pokemon.fandom.com/wiki/dragonite',
+'https://pokemon.fandom.com/wiki/mewtwo',
+'https://pokemon.fandom.com/wiki/mew']
+
+print(urls[0])
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/tests.py b/Code/Rodney/Django/Pokedex/pokedex_app/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/urls.py b/Code/Rodney/Django/Pokedex/pokedex_app/urls.py
new file mode 100644
index 00000000..ecd507ab
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/urls.py
@@ -0,0 +1,17 @@
+from django.urls import path
+from django.urls.resolvers import URLPattern
+
+from . import views
+
+
+app_name = 'pokedex_app'
+
+urlpatterns = [
+ path('', views.home, name='home'),
+ path('heightup/', views.heightup, name='heightup'),
+ path('heightdown/', views.heightdown, name='heightdown'),
+ path('weightup/', views.weightup, name='weightup'),
+ path('weightdown/', views.weightdown, name='weightdown'),
+
+]
+
diff --git a/Code/Rodney/Django/Pokedex/pokedex_app/views.py b/Code/Rodney/Django/Pokedex/pokedex_app/views.py
new file mode 100644
index 00000000..e92f6fb6
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/pokedex_app/views.py
@@ -0,0 +1,189 @@
+from base64 import urlsafe_b64decode
+import py_compile
+from turtle import title
+from django.contrib import auth
+from django.shortcuts import get_object_or_404, render, redirect
+from django.urls import reverse
+from django.http import HttpResponse
+from django.contrib.auth import authenticate
+from .models import PokemonType, Pokemon
+from django.db.models import Q
+from django.core.paginator import Paginator
+
+
+def home(request, page_num=1, per_page=10):
+
+ form = {
+ 'search_name': request.POST.get('search_name') or '',
+ # 'types': request.POST.getlist('types') or [type.name for type in PokemonType.objects.all()],
+ }
+
+ search_name = form.get('search_name')
+ # search_types = form.get('types')
+
+ pokemons = Pokemon.objects.all()
+
+ # if search_types:
+ # pokemons = Pokemon.objects.filter(types__name__in=search_types)
+
+ if search_name:
+ pokemons = pokemons.filter(name__icontains=search_name)
+
+ for pokemon in pokemons:
+ pokemon.weight = (pokemon.weight/10) * 2.2
+ pokemon.weight = int(pokemon.weight)
+
+ for pokemon in pokemons:
+ pokemon.height = (pokemon.height/10) * 39.37
+ pokemon.height = int(pokemon.height)
+ if pokemon.height > 12:
+ pokemon_feet = pokemon.height//12
+ pokemon_inches = pokemon.height%12
+ pokemon.height = (f'{pokemon_feet} ft. {pokemon_inches} in.')
+ else:
+ pokemon.height = (f'{pokemon.height} in.')
+
+
+ for pokemon in pokemons:
+ pokemon.type = pokemon.types.all()
+
+ page_num = request.GET.get('page_num') or page_num
+ per_page = request.GET.get('per_page') or per_page
+
+ pokemons_page = Paginator(pokemons, per_page).get_page(page_num)
+
+ context = {
+ 'pokemons_page': pokemons_page,
+ }
+
+ return render(request, 'pokedex_home/home.html', context )
+
+
+def heightup(request, page_num=1, per_page=10):
+
+ page_num = request.GET.get('page_num') or page_num
+ per_page = request.GET.get('per_page') or per_page
+
+ pokemons = Pokemon.objects.all().order_by('-height')
+
+ for pokemon in pokemons:
+ pokemon.weight = (pokemon.weight/10) * 2.2
+ pokemon.weight = int(pokemon.weight)
+
+ for pokemon in pokemons:
+ pokemon.height = (pokemon.height/10) * 39.37
+ pokemon.height = int(pokemon.height)
+ if pokemon.height > 12:
+ pokemon_feet = pokemon.height//12
+ pokemon_inches = pokemon.height%12
+ pokemon.height = (f'{pokemon_feet} ft. {pokemon_inches} in.')
+ else:
+ pokemon.height = (f'{pokemon.height} in.')
+
+ for pokemon in pokemons:
+ pokemon.type = pokemon.types.all()
+
+ pokemons_page = Paginator(pokemons, per_page).get_page(page_num)
+
+ print(per_page)
+
+ context = {
+ 'pokemons_page': pokemons_page,
+ }
+ return render(request, 'pokedex_home/home.html', context )
+
+def heightdown(request, page_num=1, per_page=10):
+
+ page_num = request.GET.get('page_num') or page_num
+ per_page = request.GET.get('per_page') or per_page
+
+ pokemons = Pokemon.objects.all().order_by('height')
+
+ for pokemon in pokemons:
+ pokemon.weight = (pokemon.weight/10) * 2.2
+ pokemon.weight = int(pokemon.weight)
+
+ for pokemon in pokemons:
+ pokemon.height = (pokemon.height/10) * 39.37
+ pokemon.height = int(pokemon.height)
+ if pokemon.height > 12:
+ pokemon_feet = pokemon.height//12
+ pokemon_inches = pokemon.height%12
+ pokemon.height = (f'{pokemon_feet} ft. {pokemon_inches} in.')
+ else:
+ pokemon.height = (f'{pokemon.height} in.')
+
+ for pokemon in pokemons:
+ pokemon.type = pokemon.types.all()
+
+ pokemons_page = Paginator(pokemons, per_page).get_page(page_num)
+
+ context = {
+ 'pokemons_page': pokemons_page,
+ }
+ return render(request, 'pokedex_home/home.html', context )
+
+def weightup(request, page_num=1, per_page=10):
+
+ page_num = request.GET.get('page_num') or page_num
+ per_page = request.GET.get('per_page') or per_page
+
+ pokemons = Pokemon.objects.all().order_by('-weight')
+
+ for pokemon in pokemons:
+ pokemon.weight = (pokemon.weight/10) * 2.2
+ pokemon.weight = int(pokemon.weight)
+
+ for pokemon in pokemons:
+ pokemon.height = (pokemon.height/10) * 39.37
+ pokemon.height = int(pokemon.height)
+ if pokemon.height > 12:
+ pokemon_feet = pokemon.height//12
+ pokemon_inches = pokemon.height%12
+ pokemon.height = (f'{pokemon_feet} ft. {pokemon_inches} in.')
+ else:
+ pokemon.height = (f'{pokemon.height} in.')
+
+ for pokemon in pokemons:
+ pokemon.type = pokemon.types.all()
+
+ pokemons_page = Paginator(pokemons, per_page).get_page(page_num)
+
+ context = {
+ 'pokemons_page': pokemons_page,
+ }
+ return render(request, 'pokedex_home/home.html', context )
+
+def weightdown(request, page_num=1, per_page=10):
+
+ page_num = request.GET.get('page_num') or page_num
+ per_page = request.GET.get('per_page') or per_page
+
+ pokemons = Pokemon.objects.all().order_by('weight')
+
+ for pokemon in pokemons:
+ pokemon.weight = (pokemon.weight/10) * 2.2
+ pokemon.weight = int(pokemon.weight)
+
+ for pokemon in pokemons:
+ pokemon.height = (pokemon.height/10) * 39.37
+ pokemon.height = int(pokemon.height)
+ if pokemon.height > 12:
+ pokemon_feet = pokemon.height//12
+ pokemon_inches = pokemon.height%12
+ pokemon.height = (f'{pokemon_feet} ft. {pokemon_inches} in.')
+ else:
+ pokemon.height = (f'{pokemon.height} in.')
+
+ for pokemon in pokemons:
+ pokemon.type = pokemon.types.all()
+
+ pokemons_page = Paginator(pokemons, per_page).get_page(page_num)
+
+ context = {
+ 'pokemons_page': pokemons_page,
+ }
+ return render(request, 'pokedex_home/home.html', context )
+
+
+
diff --git a/Code/Rodney/Django/Pokedex/static/css/index.css b/Code/Rodney/Django/Pokedex/static/css/index.css
new file mode 100644
index 00000000..03ed5ddb
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/static/css/index.css
@@ -0,0 +1,5 @@
+
+* {
+ font-family: Verdana, Geneva, Tahoma, sans-serif;
+ font-size: 1.1rem;
+}
diff --git a/Code/Rodney/Django/Pokedex/static/pokemon.json b/Code/Rodney/Django/Pokedex/static/pokemon.json
new file mode 100644
index 00000000..0e383d62
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/static/pokemon.json
@@ -0,0 +1,1883 @@
+{
+ "pokemon": [
+ {
+ "number": 1,
+ "name": "bulbasaur",
+ "height": 7,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/1.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/1.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bulbasaur"
+ },
+ {
+ "number": 2,
+ "name": "ivysaur",
+ "height": 10,
+ "weight": 130,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/2.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/2.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ivysaur"
+ },
+ {
+ "number": 3,
+ "name": "venusaur",
+ "height": 20,
+ "weight": 1000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/3.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/3.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venusaur"
+ },
+ {
+ "number": 4,
+ "name": "charmander",
+ "height": 6,
+ "weight": 85,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/4.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/4.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmander"
+ },
+ {
+ "number": 5,
+ "name": "charmeleon",
+ "height": 11,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/5.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/5.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charmeleon"
+ },
+ {
+ "number": 6,
+ "name": "charizard",
+ "height": 17,
+ "weight": 905,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/6.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/6.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/charizard"
+ },
+ {
+ "number": 7,
+ "name": "squirtle",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/7.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/7.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/squirtle"
+ },
+ {
+ "number": 8,
+ "name": "wartortle",
+ "height": 10,
+ "weight": 225,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/8.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/8.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wartortle"
+ },
+ {
+ "number": 9,
+ "name": "blastoise",
+ "height": 16,
+ "weight": 855,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/9.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/9.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/blastoise"
+ },
+ {
+ "number": 10,
+ "name": "caterpie",
+ "height": 3,
+ "weight": 29,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/10.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/10.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/caterpie"
+ },
+ {
+ "number": 11,
+ "name": "metapod",
+ "height": 7,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/11.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/11.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/metapod"
+ },
+ {
+ "number": 12,
+ "name": "butterfree",
+ "height": 11,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/12.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/12.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/butterfree"
+ },
+ {
+ "number": 13,
+ "name": "weedle",
+ "height": 3,
+ "weight": 32,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/13.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/13.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weedle"
+ },
+ {
+ "number": 14,
+ "name": "kakuna",
+ "height": 6,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/14.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/14.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kakuna"
+ },
+ {
+ "number": 15,
+ "name": "beedrill",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/15.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/15.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/beedrill"
+ },
+ {
+ "number": 16,
+ "name": "pidgey",
+ "height": 3,
+ "weight": 18,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/16.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/16.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgey"
+ },
+ {
+ "number": 17,
+ "name": "pidgeotto",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/17.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/17.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeotto"
+ },
+ {
+ "number": 18,
+ "name": "pidgeot",
+ "height": 15,
+ "weight": 395,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/18.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/18.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pidgeot"
+ },
+ {
+ "number": 19,
+ "name": "rattata",
+ "height": 3,
+ "weight": 35,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/19.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/19.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rattata"
+ },
+ {
+ "number": 20,
+ "name": "raticate",
+ "height": 7,
+ "weight": 185,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/20.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/20.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raticate"
+ },
+ {
+ "number": 21,
+ "name": "spearow",
+ "height": 3,
+ "weight": 20,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/21.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/21.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/spearow"
+ },
+ {
+ "number": 22,
+ "name": "fearow",
+ "height": 12,
+ "weight": 380,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/22.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/22.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/fearow"
+ },
+ {
+ "number": 23,
+ "name": "ekans",
+ "height": 20,
+ "weight": 69,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/23.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/23.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ekans"
+ },
+ {
+ "number": 24,
+ "name": "arbok",
+ "height": 35,
+ "weight": 650,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/24.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/24.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arbok"
+ },
+ {
+ "number": 25,
+ "name": "pikachu",
+ "height": 4,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/25.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/25.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pikachu"
+ },
+ {
+ "number": 26,
+ "name": "raichu",
+ "height": 8,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/26.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/26.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/raichu"
+ },
+ {
+ "number": 27,
+ "name": "sandshrew",
+ "height": 6,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/27.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/27.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandshrew"
+ },
+ {
+ "number": 28,
+ "name": "sandslash",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/28.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/28.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/sandslash"
+ },
+ {
+ "number": 29,
+ "name": "nidoran-f",
+ "height": 4,
+ "weight": 70,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/29.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/29.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-f"
+ },
+ {
+ "number": 30,
+ "name": "nidorina",
+ "height": 8,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/30.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/30.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorina"
+ },
+ {
+ "number": 31,
+ "name": "nidoqueen",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/31.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/31.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoqueen"
+ },
+ {
+ "number": 32,
+ "name": "nidoran-m",
+ "height": 5,
+ "weight": 90,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/32.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/32.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoran-m"
+ },
+ {
+ "number": 33,
+ "name": "nidorino",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/33.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/33.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidorino"
+ },
+ {
+ "number": 34,
+ "name": "nidoking",
+ "height": 14,
+ "weight": 620,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/34.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/34.png",
+ "types": [
+ "ground",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/nidoking"
+ },
+ {
+ "number": 35,
+ "name": "clefairy",
+ "height": 6,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/35.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/35.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefairy"
+ },
+ {
+ "number": 36,
+ "name": "clefable",
+ "height": 13,
+ "weight": 400,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/36.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/36.png",
+ "types": [
+ "fairy"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/clefable"
+ },
+ {
+ "number": 37,
+ "name": "vulpix",
+ "height": 6,
+ "weight": 99,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/37.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/37.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vulpix"
+ },
+ {
+ "number": 38,
+ "name": "ninetales",
+ "height": 11,
+ "weight": 199,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/38.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/38.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ninetales"
+ },
+ {
+ "number": 39,
+ "name": "jigglypuff",
+ "height": 5,
+ "weight": 55,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/39.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/39.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jigglypuff"
+ },
+ {
+ "number": 40,
+ "name": "wigglytuff",
+ "height": 10,
+ "weight": 120,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/40.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/40.png",
+ "types": [
+ "fairy",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/wigglytuff"
+ },
+ {
+ "number": 41,
+ "name": "zubat",
+ "height": 8,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/41.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/41.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zubat"
+ },
+ {
+ "number": 42,
+ "name": "golbat",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/42.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/42.png",
+ "types": [
+ "flying",
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golbat"
+ },
+ {
+ "number": 43,
+ "name": "oddish",
+ "height": 5,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/43.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/43.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/oddish"
+ },
+ {
+ "number": 44,
+ "name": "gloom",
+ "height": 8,
+ "weight": 86,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/44.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/44.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gloom"
+ },
+ {
+ "number": 45,
+ "name": "vileplume",
+ "height": 12,
+ "weight": 186,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/45.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/45.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vileplume"
+ },
+ {
+ "number": 46,
+ "name": "paras",
+ "height": 3,
+ "weight": 54,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/46.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/46.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/paras"
+ },
+ {
+ "number": 47,
+ "name": "parasect",
+ "height": 10,
+ "weight": 295,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/47.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/47.png",
+ "types": [
+ "grass",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/parasect"
+ },
+ {
+ "number": 48,
+ "name": "venonat",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/48.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/48.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venonat"
+ },
+ {
+ "number": 49,
+ "name": "venomoth",
+ "height": 15,
+ "weight": 125,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/49.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/49.png",
+ "types": [
+ "poison",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/venomoth"
+ },
+ {
+ "number": 50,
+ "name": "diglett",
+ "height": 2,
+ "weight": 8,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/50.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/50.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/diglett"
+ },
+ {
+ "number": 51,
+ "name": "dugtrio",
+ "height": 7,
+ "weight": 333,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/51.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/51.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dugtrio"
+ },
+ {
+ "number": 52,
+ "name": "meowth",
+ "height": 4,
+ "weight": 42,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/52.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/52.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/meowth"
+ },
+ {
+ "number": 53,
+ "name": "persian",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/53.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/53.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/persian"
+ },
+ {
+ "number": 54,
+ "name": "psyduck",
+ "height": 8,
+ "weight": 196,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/54.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/54.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/psyduck"
+ },
+ {
+ "number": 55,
+ "name": "golduck",
+ "height": 17,
+ "weight": 766,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/55.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/55.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golduck"
+ },
+ {
+ "number": 56,
+ "name": "mankey",
+ "height": 5,
+ "weight": 280,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/56.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/56.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mankey"
+ },
+ {
+ "number": 57,
+ "name": "primeape",
+ "height": 10,
+ "weight": 320,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/57.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/57.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/primeape"
+ },
+ {
+ "number": 58,
+ "name": "growlithe",
+ "height": 7,
+ "weight": 190,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/58.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/58.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/growlithe"
+ },
+ {
+ "number": 59,
+ "name": "arcanine",
+ "height": 19,
+ "weight": 1550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/59.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/59.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/arcanine"
+ },
+ {
+ "number": 60,
+ "name": "poliwag",
+ "height": 6,
+ "weight": 124,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/60.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/60.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwag"
+ },
+ {
+ "number": 61,
+ "name": "poliwhirl",
+ "height": 10,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/61.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/61.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwhirl"
+ },
+ {
+ "number": 62,
+ "name": "poliwrath",
+ "height": 13,
+ "weight": 540,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/62.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/62.png",
+ "types": [
+ "fighting",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/poliwrath"
+ },
+ {
+ "number": 63,
+ "name": "abra",
+ "height": 9,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/63.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/63.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/abra"
+ },
+ {
+ "number": 64,
+ "name": "kadabra",
+ "height": 13,
+ "weight": 565,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/64.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/64.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kadabra"
+ },
+ {
+ "number": 65,
+ "name": "alakazam",
+ "height": 15,
+ "weight": 480,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/65.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/65.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/alakazam"
+ },
+ {
+ "number": 66,
+ "name": "machop",
+ "height": 8,
+ "weight": 195,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/66.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/66.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machop"
+ },
+ {
+ "number": 67,
+ "name": "machoke",
+ "height": 15,
+ "weight": 705,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/67.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/67.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machoke"
+ },
+ {
+ "number": 68,
+ "name": "machamp",
+ "height": 16,
+ "weight": 1300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/68.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/68.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/machamp"
+ },
+ {
+ "number": 69,
+ "name": "bellsprout",
+ "height": 7,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/69.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/69.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/bellsprout"
+ },
+ {
+ "number": 70,
+ "name": "weepinbell",
+ "height": 10,
+ "weight": 64,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/70.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/70.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weepinbell"
+ },
+ {
+ "number": 71,
+ "name": "victreebel",
+ "height": 17,
+ "weight": 155,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/71.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/71.png",
+ "types": [
+ "poison",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/victreebel"
+ },
+ {
+ "number": 72,
+ "name": "tentacool",
+ "height": 9,
+ "weight": 455,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/72.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/72.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacool"
+ },
+ {
+ "number": 73,
+ "name": "tentacruel",
+ "height": 16,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/73.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/73.png",
+ "types": [
+ "poison",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tentacruel"
+ },
+ {
+ "number": 74,
+ "name": "geodude",
+ "height": 4,
+ "weight": 200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/74.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/74.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/geodude"
+ },
+ {
+ "number": 75,
+ "name": "graveler",
+ "height": 10,
+ "weight": 1050,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/75.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/75.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/graveler"
+ },
+ {
+ "number": 76,
+ "name": "golem",
+ "height": 14,
+ "weight": 3000,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/76.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/76.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/golem"
+ },
+ {
+ "number": 77,
+ "name": "ponyta",
+ "height": 10,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/77.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/77.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ponyta"
+ },
+ {
+ "number": 78,
+ "name": "rapidash",
+ "height": 17,
+ "weight": 950,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/78.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/78.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rapidash"
+ },
+ {
+ "number": 79,
+ "name": "slowpoke",
+ "height": 12,
+ "weight": 360,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/79.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/79.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowpoke"
+ },
+ {
+ "number": 80,
+ "name": "slowbro",
+ "height": 16,
+ "weight": 785,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/80.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/80.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/slowbro"
+ },
+ {
+ "number": 81,
+ "name": "magnemite",
+ "height": 3,
+ "weight": 60,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/81.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/81.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magnemite"
+ },
+ {
+ "number": 82,
+ "name": "magneton",
+ "height": 10,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/82.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/82.png",
+ "types": [
+ "steel",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magneton"
+ },
+ {
+ "number": 83,
+ "name": "farfetchd",
+ "height": 8,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/83.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/83.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/farfetchd"
+ },
+ {
+ "number": 84,
+ "name": "doduo",
+ "height": 14,
+ "weight": 392,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/84.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/84.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/doduo"
+ },
+ {
+ "number": 85,
+ "name": "dodrio",
+ "height": 18,
+ "weight": 852,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/85.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/85.png",
+ "types": [
+ "flying",
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dodrio"
+ },
+ {
+ "number": 86,
+ "name": "seel",
+ "height": 11,
+ "weight": 900,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/86.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/86.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seel"
+ },
+ {
+ "number": 87,
+ "name": "dewgong",
+ "height": 17,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/87.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/87.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dewgong"
+ },
+ {
+ "number": 88,
+ "name": "grimer",
+ "height": 9,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/88.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/88.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/grimer"
+ },
+ {
+ "number": 89,
+ "name": "muk",
+ "height": 12,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/89.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/89.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/muk"
+ },
+ {
+ "number": 90,
+ "name": "shellder",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/90.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/90.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/shellder"
+ },
+ {
+ "number": 91,
+ "name": "cloyster",
+ "height": 15,
+ "weight": 1325,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/91.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/91.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cloyster"
+ },
+ {
+ "number": 92,
+ "name": "gastly",
+ "height": 13,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/92.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/92.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gastly"
+ },
+ {
+ "number": 93,
+ "name": "haunter",
+ "height": 16,
+ "weight": 1,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/93.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/93.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/haunter"
+ },
+ {
+ "number": 94,
+ "name": "gengar",
+ "height": 15,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/94.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/94.png",
+ "types": [
+ "poison",
+ "ghost"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gengar"
+ },
+ {
+ "number": 95,
+ "name": "onix",
+ "height": 88,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/95.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/95.png",
+ "types": [
+ "ground",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/onix"
+ },
+ {
+ "number": 96,
+ "name": "drowzee",
+ "height": 10,
+ "weight": 324,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/96.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/96.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/drowzee"
+ },
+ {
+ "number": 97,
+ "name": "hypno",
+ "height": 16,
+ "weight": 756,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/97.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/97.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hypno"
+ },
+ {
+ "number": 98,
+ "name": "krabby",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/98.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/98.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/krabby"
+ },
+ {
+ "number": 99,
+ "name": "kingler",
+ "height": 13,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/99.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/99.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kingler"
+ },
+ {
+ "number": 100,
+ "name": "voltorb",
+ "height": 5,
+ "weight": 104,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/100.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/100.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/voltorb"
+ },
+ {
+ "number": 101,
+ "name": "electrode",
+ "height": 12,
+ "weight": 666,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/101.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/101.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electrode"
+ },
+ {
+ "number": 102,
+ "name": "exeggcute",
+ "height": 4,
+ "weight": 25,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/102.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/102.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggcute"
+ },
+ {
+ "number": 103,
+ "name": "exeggutor",
+ "height": 20,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/103.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/103.png",
+ "types": [
+ "psychic",
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/exeggutor"
+ },
+ {
+ "number": 104,
+ "name": "cubone",
+ "height": 4,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/104.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/104.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/cubone"
+ },
+ {
+ "number": 105,
+ "name": "marowak",
+ "height": 10,
+ "weight": 450,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/105.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/105.png",
+ "types": [
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/marowak"
+ },
+ {
+ "number": 106,
+ "name": "hitmonlee",
+ "height": 15,
+ "weight": 498,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/106.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/106.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonlee"
+ },
+ {
+ "number": 107,
+ "name": "hitmonchan",
+ "height": 14,
+ "weight": 502,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/107.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/107.png",
+ "types": [
+ "fighting"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/hitmonchan"
+ },
+ {
+ "number": 108,
+ "name": "lickitung",
+ "height": 12,
+ "weight": 655,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/108.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/108.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lickitung"
+ },
+ {
+ "number": 109,
+ "name": "koffing",
+ "height": 6,
+ "weight": 10,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/109.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/109.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/koffing"
+ },
+ {
+ "number": 110,
+ "name": "weezing",
+ "height": 12,
+ "weight": 95,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/110.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/110.png",
+ "types": [
+ "poison"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/weezing"
+ },
+ {
+ "number": 111,
+ "name": "rhyhorn",
+ "height": 10,
+ "weight": 1150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/111.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/111.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhyhorn"
+ },
+ {
+ "number": 112,
+ "name": "rhydon",
+ "height": 19,
+ "weight": 1200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/112.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/112.png",
+ "types": [
+ "rock",
+ "ground"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/rhydon"
+ },
+ {
+ "number": 113,
+ "name": "chansey",
+ "height": 11,
+ "weight": 346,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/113.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/113.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/chansey"
+ },
+ {
+ "number": 114,
+ "name": "tangela",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/114.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/114.png",
+ "types": [
+ "grass"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tangela"
+ },
+ {
+ "number": 115,
+ "name": "kangaskhan",
+ "height": 22,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/115.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/115.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kangaskhan"
+ },
+ {
+ "number": 116,
+ "name": "horsea",
+ "height": 4,
+ "weight": 80,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/116.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/116.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/horsea"
+ },
+ {
+ "number": 117,
+ "name": "seadra",
+ "height": 12,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/117.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/117.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seadra"
+ },
+ {
+ "number": 118,
+ "name": "goldeen",
+ "height": 6,
+ "weight": 150,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/118.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/118.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/goldeen"
+ },
+ {
+ "number": 119,
+ "name": "seaking",
+ "height": 13,
+ "weight": 390,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/119.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/119.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/seaking"
+ },
+ {
+ "number": 120,
+ "name": "staryu",
+ "height": 8,
+ "weight": 345,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/120.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/120.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/staryu"
+ },
+ {
+ "number": 121,
+ "name": "starmie",
+ "height": 11,
+ "weight": 800,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/121.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/121.png",
+ "types": [
+ "psychic",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/starmie"
+ },
+ {
+ "number": 122,
+ "name": "mr-mime",
+ "height": 13,
+ "weight": 545,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/122.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/122.png",
+ "types": [
+ "fairy",
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mr-mime"
+ },
+ {
+ "number": 123,
+ "name": "scyther",
+ "height": 15,
+ "weight": 560,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/123.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/123.png",
+ "types": [
+ "flying",
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/scyther"
+ },
+ {
+ "number": 124,
+ "name": "jynx",
+ "height": 14,
+ "weight": 406,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/124.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/124.png",
+ "types": [
+ "psychic",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jynx"
+ },
+ {
+ "number": 125,
+ "name": "electabuzz",
+ "height": 11,
+ "weight": 300,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/125.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/125.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/electabuzz"
+ },
+ {
+ "number": 126,
+ "name": "magmar",
+ "height": 13,
+ "weight": 445,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/126.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/126.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magmar"
+ },
+ {
+ "number": 127,
+ "name": "pinsir",
+ "height": 15,
+ "weight": 550,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/127.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/127.png",
+ "types": [
+ "bug"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/pinsir"
+ },
+ {
+ "number": 128,
+ "name": "tauros",
+ "height": 14,
+ "weight": 884,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/128.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/128.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/tauros"
+ },
+ {
+ "number": 129,
+ "name": "magikarp",
+ "height": 9,
+ "weight": 100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/129.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/129.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/magikarp"
+ },
+ {
+ "number": 130,
+ "name": "gyarados",
+ "height": 65,
+ "weight": 2350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/130.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/130.png",
+ "types": [
+ "flying",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/gyarados"
+ },
+ {
+ "number": 131,
+ "name": "lapras",
+ "height": 25,
+ "weight": 2200,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/131.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/131.png",
+ "types": [
+ "ice",
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/lapras"
+ },
+ {
+ "number": 132,
+ "name": "ditto",
+ "height": 3,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/132.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/132.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/ditto"
+ },
+ {
+ "number": 133,
+ "name": "eevee",
+ "height": 3,
+ "weight": 65,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/133.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/133.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/eevee"
+ },
+ {
+ "number": 134,
+ "name": "vaporeon",
+ "height": 10,
+ "weight": 290,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/134.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/134.png",
+ "types": [
+ "water"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/vaporeon"
+ },
+ {
+ "number": 135,
+ "name": "jolteon",
+ "height": 8,
+ "weight": 245,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/135.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/135.png",
+ "types": [
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/jolteon"
+ },
+ {
+ "number": 136,
+ "name": "flareon",
+ "height": 9,
+ "weight": 250,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/136.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/136.png",
+ "types": [
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/flareon"
+ },
+ {
+ "number": 137,
+ "name": "porygon",
+ "height": 8,
+ "weight": 365,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/137.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/137.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/porygon"
+ },
+ {
+ "number": 138,
+ "name": "omanyte",
+ "height": 4,
+ "weight": 75,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/138.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/138.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omanyte"
+ },
+ {
+ "number": 139,
+ "name": "omastar",
+ "height": 10,
+ "weight": 350,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/139.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/139.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/omastar"
+ },
+ {
+ "number": 140,
+ "name": "kabuto",
+ "height": 5,
+ "weight": 115,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/140.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/140.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabuto"
+ },
+ {
+ "number": 141,
+ "name": "kabutops",
+ "height": 13,
+ "weight": 405,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/141.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/141.png",
+ "types": [
+ "water",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/kabutops"
+ },
+ {
+ "number": 142,
+ "name": "aerodactyl",
+ "height": 18,
+ "weight": 590,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/142.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/142.png",
+ "types": [
+ "flying",
+ "rock"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/aerodactyl"
+ },
+ {
+ "number": 143,
+ "name": "snorlax",
+ "height": 21,
+ "weight": 4600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/143.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/143.png",
+ "types": [
+ "normal"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/snorlax"
+ },
+ {
+ "number": 144,
+ "name": "articuno",
+ "height": 17,
+ "weight": 554,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/144.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/144.png",
+ "types": [
+ "flying",
+ "ice"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/articuno"
+ },
+ {
+ "number": 145,
+ "name": "zapdos",
+ "height": 16,
+ "weight": 526,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/145.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/145.png",
+ "types": [
+ "flying",
+ "electric"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/zapdos"
+ },
+ {
+ "number": 146,
+ "name": "moltres",
+ "height": 20,
+ "weight": 600,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/146.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/146.png",
+ "types": [
+ "flying",
+ "fire"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/moltres"
+ },
+ {
+ "number": 147,
+ "name": "dratini",
+ "height": 18,
+ "weight": 33,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/147.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/147.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dratini"
+ },
+ {
+ "number": 148,
+ "name": "dragonair",
+ "height": 40,
+ "weight": 165,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/148.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/148.png",
+ "types": [
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonair"
+ },
+ {
+ "number": 149,
+ "name": "dragonite",
+ "height": 22,
+ "weight": 2100,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/149.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/149.png",
+ "types": [
+ "flying",
+ "dragon"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/dragonite"
+ },
+ {
+ "number": 150,
+ "name": "mewtwo",
+ "height": 20,
+ "weight": 1220,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/150.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/150.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mewtwo"
+ },
+ {
+ "number": 151,
+ "name": "mew",
+ "height": 4,
+ "weight": 40,
+ "image_front": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/151.png",
+ "image_back": "https://raw.githubusercontent.com/PokeAPI/sprites/master/sprites/pokemon/back/151.png",
+ "types": [
+ "psychic"
+ ],
+ "url": "https://pokemon.fandom.com/wiki/mew"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/templates/base.html b/Code/Rodney/Django/Pokedex/templates/base.html
new file mode 100644
index 00000000..77ed908d
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/templates/base.html
@@ -0,0 +1,57 @@
+{% load static %}
+
+
+
+
+
+
+
+
+
+
+
+ PokedexApp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% block content %}
+
+
+
+ {% endblock content %}
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Code/Rodney/Django/Pokedex/templates/pokedex_home/home.html b/Code/Rodney/Django/Pokedex/templates/pokedex_home/home.html
new file mode 100644
index 00000000..14471723
--- /dev/null
+++ b/Code/Rodney/Django/Pokedex/templates/pokedex_home/home.html
@@ -0,0 +1,197 @@
+{% extends 'base.html' %}
+{% load static %}
+
+
+{% block content %}
+
+
+
+ {% if pokemons_page.has_previous %}
+
Previous
+ {% endif %}
+
{{pokemons_page.number}}
+ {% if pokemons_page.has_next %}
+
Next
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {% for pokemon in pokemons_page %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Name: {{pokemon.name|title}}
+
+
+
Danger
+
+ Number: {{pokemon.number}}
+ Height: {{pokemon.height}}
+ Weight: {{pokemon.weight}} pounds
+
+ {% for type in pokemon.type %}
+
+ {% endfor %}
+
+
+
+
+ {% endfor %}
+
+
+
+
+
+
+{% endblock content %}
+
+
diff --git a/Code/Rodney/Django/todoproject/todoproject/manage.py b/Code/Rodney/Django/todoproject/todoproject/manage.py
new file mode 100755
index 00000000..06caf33e
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/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', 'todoproject.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/Code/Rodney/Django/todoproject/todoproject/todoapp/__init__.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/admin.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/admin.py
new file mode 100644
index 00000000..6be0f978
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/admin.py
@@ -0,0 +1,7 @@
+from django.contrib import admin
+
+# Register your models here.
+from .models import TodoItem, Priority
+
+admin.site.register(TodoItem)
+admin.site.register(Priority)
\ No newline at end of file
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/apps.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/apps.py
new file mode 100644
index 00000000..a9808811
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class TodoappConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'todoapp'
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0001_initial.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0001_initial.py
new file mode 100644
index 00000000..c83e8182
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0001_initial.py
@@ -0,0 +1,31 @@
+# Generated by Django 4.0 on 2021-12-28 18:40
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Priority',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('priority_level', models.CharField(choices=[('HIGH', 'High'), ('MEDIUM', 'Medium'), ('LOW', 'Low')], max_length=20)),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TodoItem',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('item_text', models.CharField(max_length=200)),
+ ('created_date', models.DateTimeField(verbose_name='date created')),
+ ('priority', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='todoapp.priority')),
+ ],
+ ),
+ ]
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0002_alter_todoitem_created_date.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0002_alter_todoitem_created_date.py
new file mode 100644
index 00000000..7302f1df
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0002_alter_todoitem_created_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0 on 2021-12-29 03:17
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todoapp', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='todoitem',
+ name='created_date',
+ field=models.DateTimeField(auto_now_add=True),
+ ),
+ ]
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0003_todoitem_completed_date.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0003_todoitem_completed_date.py
new file mode 100644
index 00000000..17fc205f
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/0003_todoitem_completed_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.0 on 2021-12-30 04:25
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('todoapp', '0002_alter_todoitem_created_date'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='todoitem',
+ name='completed_date',
+ field=models.DateTimeField(blank=True, null=True),
+ ),
+ ]
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/__init__.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/migrations/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/models.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/models.py
new file mode 100644
index 00000000..a329a629
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/models.py
@@ -0,0 +1,27 @@
+from django.db import models
+from django.db.models.fields.related import ForeignKey
+
+# Create your models here.
+
+
+PRIORITY_CHOICES = (
+ ("HIGH", "High"),
+ ("MEDIUM", "Medium"),
+ ("LOW", "Low"),
+)
+
+class Priority(models.Model):
+ priority_level = models.CharField(max_length=20, choices=PRIORITY_CHOICES)
+
+ def __str__(self):
+ return self.priority_level
+
+class TodoItem(models.Model):
+ item_text = models.CharField(max_length=200)
+ priority = models.ForeignKey(Priority, on_delete=models.CASCADE)
+ created_date = models.DateTimeField(auto_now_add=True)
+ completed_date = models.DateTimeField(null=True, blank=True)
+
+ def __str__(self):
+ return self.item_text
+
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/static/todoapp/style.css b/Code/Rodney/Django/todoproject/todoproject/todoapp/static/todoapp/style.css
new file mode 100644
index 00000000..952e3802
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/static/todoapp/style.css
@@ -0,0 +1,59 @@
+* {
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ background-color: rgb(226, 166, 144);
+ margin: 10px
+}
+
+.submit-form{
+ font-size: 1.5rem;
+ border: solid 3px black
+}
+
+.submit-button{
+ font-size: 1.5rem;
+ border: solid 3px black
+}
+
+li{
+ margin-top: 30px;
+ font-size: 2rem;
+ font-weight: bolder;
+ background-color: rgb(172, 162, 162);
+ line-height: 50px;
+
+}
+
+.entry-form {
+ font-size: 2rem;
+ font-weight: bolder;
+}
+
+.MEDIUM {
+ color: rgb(9, 58, 104);
+
+}
+.HIGH {
+ color: red;
+}
+.LOW {
+ color: yellow
+}
+
+h3{
+ color: blue;
+}
+
+
+.title1 {
+ text-decoration: underline;
+}
+
+.title {
+ margin-top: 35px;
+}
+
+
+a {
+ font-size: 1rem;
+ margin: 10px;
+}
\ No newline at end of file
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/templates/todoapp/index.html b/Code/Rodney/Django/todoproject/todoproject/todoapp/templates/todoapp/index.html
new file mode 100644
index 00000000..d490366b
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/templates/todoapp/index.html
@@ -0,0 +1,64 @@
+{% load static %}
+
+
+
+To do list
+
+
+
+Active items
+
+{% if to_do_list %}
+
+ {% csrf_token %}
+
+ {% for item in to_do_list %}
+ {{ item.item_text }}
+
+ Completed
+ Delete
+ {% endfor %}
+
+
+{% else %}
+ Looks like you're all caught up!
+
+{% endif %}
+
+
+
+
+Completed items
+
+{% if completed_to_do_list %}
+
+ {% csrf_token %}
+
+ {% for item in completed_to_do_list %}
+
+ {{ item.item_text }}
+
+ Delete
+
+ {% endfor %}
+
+
+
+
+{% endif %}
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/tests.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/tests.py
new file mode 100644
index 00000000..7ce503c2
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/urls.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/urls.py
new file mode 100644
index 00000000..37ab8eee
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/urls.py
@@ -0,0 +1,13 @@
+from django.urls import path
+
+from . import views
+
+app_name = 'todoapp'
+
+urlpatterns = [
+ path('', views.index, name='index'),
+ path('create/', views.create, name='create'),
+ path('delete//', views.delete, name='delete'),
+ path('complete//', views.complete, name='complete'),
+]
+
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoapp/views.py b/Code/Rodney/Django/todoproject/todoproject/todoapp/views.py
new file mode 100644
index 00000000..0120e02c
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoapp/views.py
@@ -0,0 +1,37 @@
+from django.http.response import HttpResponseRedirect
+from django.shortcuts import get_object_or_404, redirect, render
+import datetime
+
+# Create your views here.
+
+from django.http import HttpResponse
+from .models import TodoItem, Priority
+
+
+def index(request):
+ to_do_list = TodoItem.objects.filter(completed_date__isnull=True)
+ completed_to_do_list = TodoItem.objects.filter(completed_date__isnull=False)
+ context = {'to_do_list': to_do_list, 'completed_to_do_list': completed_to_do_list}
+ return render(request, 'todoapp/index.html', context)
+
+def create(request):
+ priority = Priority.objects.get_or_create(priority_level=request.POST['priority_choices'])
+ priority = priority[0]
+ new_to_do_item = request.POST['todotext']
+ new_obj = TodoItem.objects.get_or_create(item_text=new_to_do_item, priority=priority)
+ return HttpResponseRedirect("http://127.0.0.1:8000/todoapp/")
+
+
+def complete(request, pk):
+ completed_item = get_object_or_404(TodoItem, pk=pk)
+ completed_item.delete()
+ priority = completed_item.priority
+ print(priority.todoitem_set.all())
+ completed_date = datetime.datetime.now()
+ new_obj= TodoItem.objects.get_or_create(item_text=completed_item, completed_date=completed_date, priority=priority)
+ return HttpResponseRedirect("http://127.0.0.1:8000/todoapp/")
+
+def delete(request, pk):
+ deleted_item = get_object_or_404(TodoItem, pk=pk)
+ deleted_item.delete()
+ return HttpResponseRedirect("http://127.0.0.1:8000/todoapp/")
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoproject/__init__.py b/Code/Rodney/Django/todoproject/todoproject/todoproject/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoproject/asgi.py b/Code/Rodney/Django/todoproject/todoproject/todoproject/asgi.py
new file mode 100644
index 00000000..39357495
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoproject/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for todoproject 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/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todoproject.settings')
+
+application = get_asgi_application()
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoproject/settings.py b/Code/Rodney/Django/todoproject/todoproject/todoproject/settings.py
new file mode 100644
index 00000000..c036be80
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoproject/settings.py
@@ -0,0 +1,124 @@
+"""
+Django settings for todoproject project.
+
+Generated by 'django-admin startproject' using Django 4.0.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.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/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-w$!8p_$s!+$=f*ig%wb#a%f%amd9h2x3-yt_@6k_92#2#(nd1o'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'todoapp.apps.TodoappConfig',
+ '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 = 'todoproject.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 = 'todoproject.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.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/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoproject/urls.py b/Code/Rodney/Django/todoproject/todoproject/todoproject/urls.py
new file mode 100644
index 00000000..c47d74ed
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoproject/urls.py
@@ -0,0 +1,22 @@
+"""todoproject URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.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('todoapp/', include('todoapp.urls'))
+]
diff --git a/Code/Rodney/Django/todoproject/todoproject/todoproject/wsgi.py b/Code/Rodney/Django/todoproject/todoproject/todoproject/wsgi.py
new file mode 100644
index 00000000..224ef92b
--- /dev/null
+++ b/Code/Rodney/Django/todoproject/todoproject/todoproject/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for todoproject 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/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'todoproject.settings')
+
+application = get_wsgi_application()
diff --git a/Code/Rodney/HTML/Burrito/Burrito1.jpg b/Code/Rodney/HTML/Burrito/Burrito1.jpg
new file mode 100644
index 00000000..42703e1c
Binary files /dev/null and b/Code/Rodney/HTML/Burrito/Burrito1.jpg differ
diff --git a/Code/Rodney/HTML/Burrito/Burrito2.jpg b/Code/Rodney/HTML/Burrito/Burrito2.jpg
new file mode 100644
index 00000000..81671828
Binary files /dev/null and b/Code/Rodney/HTML/Burrito/Burrito2.jpg differ
diff --git a/Code/Rodney/HTML/Burrito/burrito.css b/Code/Rodney/HTML/Burrito/burrito.css
new file mode 100644
index 00000000..61679026
--- /dev/null
+++ b/Code/Rodney/HTML/Burrito/burrito.css
@@ -0,0 +1,127 @@
+* {
+ /*border: .5px red solid;*/
+ background-color:rgb(197, 229, 149);
+}
+
+body {
+background-color:rgb(197, 229, 149);
+}
+h2 {
+display: flex;
+flex-wrap: wrap;
+color: darkgreen;
+padding: 20px;
+}
+
+h3 {
+color: darkgreen;
+border: 2px darkgreen solid;
+padding: 25px;
+border-radius: 50%;
+background-color: rgb(115, 196, 115);
+}
+
+#content-container {
+
+margin-left: 20vw;
+margin-right: 5vw;
+
+}
+
+/*---------------Section 1--------------------------*/
+
+.enter-name{
+margin-right: 15vw;
+margin-bottom: 15px;
+display: flex;
+justify-content: center;
+align-items: center;
+
+}
+
+.container1 {
+display: flex;
+align-items: center;
+justify-content: center;
+height: 25vh;
+flex-wrap: wrap;
+
+}
+
+.box1 {
+margin-right: 150px;
+padding: 10px;
+z-index: 2;
+display: flex;
+align-items: center;
+justify-content: center;
+width:fit-content;
+}
+
+
+img {
+z-index: 2;
+max-width: 200px;
+border: solid darkgreen 3px;
+border-radius: 50%;
+}
+
+/*---------------Section 2--------------------------*/
+
+.tortilla-container {
+z-index: 1;
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+.rice-container {
+z-index: 1;
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+
+/*---------------Section 3--------------------------*/
+.protein-container {
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+.beans-container {
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+.instructions-label{
+margin-bottom: 5px;
+}
+/*---------------Section 4--------------------------*/
+.additional-container {
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+.delivery-container {
+margin: 15px;
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
+
+.submit {
+display: flex;
+align-items: flex-start;
+justify-content: center;
+flex-direction: column;
+}
diff --git a/Code/Rodney/HTML/Burrito/burrito.html b/Code/Rodney/HTML/Burrito/burrito.html
new file mode 100644
index 00000000..167fc6bd
--- /dev/null
+++ b/Code/Rodney/HTML/Burrito/burrito.html
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+ Burrito
+
+
+
+
+
+
+
+
+
+
+
+
+
  
Welcome to Big Burritos!
+
+
+
+
+
+ Enter Name:  
+
+
+
+
+
+
+
+
+
+
Rice
+
+
+
+
+ White Rice
+
+
+
+
+
+ Brown Rice
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submit
+
+
+
+
+
+
+
+
+
diff --git a/Code/Rodney/HTML/Company/amazon.jpg b/Code/Rodney/HTML/Company/amazon.jpg
new file mode 100644
index 00000000..1f3f7c68
Binary files /dev/null and b/Code/Rodney/HTML/Company/amazon.jpg differ
diff --git a/Code/Rodney/HTML/Company/apple.jpg b/Code/Rodney/HTML/Company/apple.jpg
new file mode 100644
index 00000000..02c6436e
Binary files /dev/null and b/Code/Rodney/HTML/Company/apple.jpg differ
diff --git a/Code/Rodney/HTML/Company/company.css b/Code/Rodney/HTML/Company/company.css
new file mode 100644
index 00000000..438cbcbe
--- /dev/null
+++ b/Code/Rodney/HTML/Company/company.css
@@ -0,0 +1,181 @@
+@import url('https://fonts.googleapis.com/css2?family=Open+Sans&family=Oswald:wght@300&display=swap');
+
+
+/*-----------------body styling-------------------------------*/
+body {
+
+ background: url("image1.jpg");
+ background-repeat: no-repeat;
+ background-size: cover;
+ width: 100%;
+ font-family: 'Open Sans', sans-serif;
+
+}
+/*-----------------navbar-------------------------------*/
+.navbar {
+
+ display: flex;
+ border:solid;
+ border-color: rgb(20, 88, 54);
+ border-radius: 1rem;
+ border-width: medium;
+}
+/*-----------------Top section (title and login an main pic)-------------------------------*/
+.container1 {
+display: flex;
+justify-content:center;
+flex-wrap: wrap;
+
+}
+#first-column1 {
+
+width: fit-content;
+height: 175px;
+font-size: xx-large;
+background-color: rgb(31, 153, 92);
+border: solid;
+border-radius: 8rem;
+text-decoration-color: rgb(20, 88, 54);
+text-align: center;
+justify-content: start;
+border-width:thin medium;
+padding: 50px;
+margin-top: 10px;
+margin-right:10%;
+text-shadow:2.5px 2.5px rgb(20, 88, 54);
+font-size: 2.5rem;
+margin-bottom: 2px;
+position: relative;
+bottom: -15px;
+}
+
+
+.login-style {
+float: right;
+border:solid;
+border-color: rgb(20, 88, 54);
+border-radius: 10%;
+padding: .5rem;
+box-shadow: 1px 2.5px;
+margin-top: 20px;
+}
+
+#second-column1 {
+ min-width: 300px;
+ max-width: 300px;
+}
+
+#login-button {
+ margin-top: .51rem;
+ color: rgb(20, 88, 54);
+ height: 30px;
+}
+
+input[type=text], input[type=password] {
+ width:100%;
+ margin: 2px;
+ display: inline-block;
+ border: 1px solid #ccc;
+ box-sizing: border-box;
+}
+
+.picture {
+
+display: flex;
+justify-content: center;
+}
+
+#main-pic {
+ margin-top: 10px;
+ height: 250px;
+ width: 265px;
+ max-width: 265px;
+ border:solid;
+ border-color:rgb(20, 88, 54);
+ border-radius: 10%;
+}
+
+/*-----------------navbar-------------------------------*/
+
+.container2 {
+display: flex;
+flex-wrap: wrap;
+justify-content: center;
+text-align: center;
+font-size: 1.8rem;
+
+}
+
+#second-column2 {
+ margin-top: 20px;
+ font-weight: bolders;
+}
+
+.container2 div {
+ min-width: 300px;
+}
+
+
+.main-container {
+ font-size: xx-large;
+ margin-left: 2rem;
+ margin-right: 2rem;
+ text-align: center;
+ margin-top: 300px;
+ line-height: 1.5;
+}
+
+hr {
+ position: absolute;
+ margin-top: -1.5rem;
+ left:355px;
+ text-align: center;
+ border-bottom: 4px solid rgb(18, 68, 43);
+}
+
+.bold {
+ font-style: italic;
+ font-weight: bolder;
+ background-color: rgb(31, 153, 92);
+
+}
+
+a {
+ color:rgb(20, 88, 54)
+}
+
+h2 {
+ position: absolute;
+ margin-top: -3rem;
+ line-height: 4rem;
+ font-weight: bolder;
+}
+
+
+img {
+ height: 150px;
+ width: 45%;
+ max-width: 350px
+}
+
+
+.clearfix {
+ clear:both
+}
+
+.footer {
+ position:relative;
+ margin-bottom: .25rem;
+ margin-left: .25rem;
+ color:rgb(20, 88, 54) ;
+ background-color: rgb(31, 153, 92);
+ text-align: center;
+ border:solid;
+ border-color:rgb(20, 88, 54);
+ height: 33px;
+ border-radius: 8%;
+ width: fit-content;
+ padding-left: .15rem;
+ padding-right: .15rem;
+
+}
diff --git a/Code/Rodney/HTML/Company/company.html b/Code/Rodney/HTML/Company/company.html
new file mode 100644
index 00000000..9c305b48
--- /dev/null
+++ b/Code/Rodney/HTML/Company/company.html
@@ -0,0 +1,135 @@
+
+
+
+
+
+
+ Company
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Perfection Widgets
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ We are the LARGEST and most DEPENDABLE widget manufacturer in all of North America!
+
+
+
+
+
+
+ Our clients include:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Rodney/HTML/Company/honda.jpg b/Code/Rodney/HTML/Company/honda.jpg
new file mode 100644
index 00000000..8c14f585
Binary files /dev/null and b/Code/Rodney/HTML/Company/honda.jpg differ
diff --git a/Code/Rodney/HTML/Company/image1.jpg b/Code/Rodney/HTML/Company/image1.jpg
new file mode 100644
index 00000000..4abaf1bc
Binary files /dev/null and b/Code/Rodney/HTML/Company/image1.jpg differ
diff --git a/Code/Rodney/HTML/Company/nissan.jpg b/Code/Rodney/HTML/Company/nissan.jpg
new file mode 100644
index 00000000..f2439702
Binary files /dev/null and b/Code/Rodney/HTML/Company/nissan.jpg differ
diff --git a/Code/Rodney/HTML/Company/tesla.jpg b/Code/Rodney/HTML/Company/tesla.jpg
new file mode 100644
index 00000000..d11cd6f9
Binary files /dev/null and b/Code/Rodney/HTML/Company/tesla.jpg differ
diff --git a/Code/Rodney/HTML/Company/widget1.jpg b/Code/Rodney/HTML/Company/widget1.jpg
new file mode 100644
index 00000000..e111d1c5
Binary files /dev/null and b/Code/Rodney/HTML/Company/widget1.jpg differ
diff --git a/Code/Rodney/JavaScript/Lab3/api.html b/Code/Rodney/JavaScript/Lab3/api.html
new file mode 100644
index 00000000..22f45d04
--- /dev/null
+++ b/Code/Rodney/JavaScript/Lab3/api.html
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ API Call
+
+
+
+
+
+
+
+
+
+
+
"Famous Quotes"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Code/Rodney/JavaScript/Lab3/static/JS/aPi.js b/Code/Rodney/JavaScript/Lab3/static/JS/aPi.js
new file mode 100644
index 00000000..fc70b3cc
--- /dev/null
+++ b/Code/Rodney/JavaScript/Lab3/static/JS/aPi.js
@@ -0,0 +1,174 @@
+let submit,
+ clear,
+ ul,
+ errorPage,
+ pageNumber,
+ li,
+ queryString,
+ nextPageButton,
+ previousPageButton,
+ pageDisplay,
+ userInput;
+
+ul = document.querySelector("#quote-result");
+clear = document.querySelector("#clear");
+errorPage = document.querySelector(".container1");
+nextPageButton = document.querySelector("#nextpagebutton");
+previousPageButton = document.querySelector("#previouspagebutton");
+pageDisplay = document.querySelector("#pagenumber");
+submit = document.querySelector("#search");
+userInput = document.querySelector("#userinput");
+
+const headers = {
+ Authorization: `Token token=${FAVQS_API_KEY}`,
+};
+
+// ----------------------------------Submit Button ---------------------------------------
+nextPageButton.disabled = true;
+clear.disabled = true;
+previousPageButton.disabled = true;
+
+submit.addEventListener("click", function () {
+ nextPageButton.disabled = false;
+ clear.disabled = false;
+ previousPageButton.disabled = false;
+ submit.disabled = true;
+ queryString = userInput.value;
+ pageNumber = 1;
+ let url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`;
+ fetch(url, {
+ method: "GET",
+ headers: headers,
+ })
+ .then((response) => response.json())
+
+ .then(function (result) {
+ console.log(result)
+ if (result.last_page === true) {
+ nextPageButton.disabled = true;
+ previousPageButton.disabled = true;
+ }
+
+ result.quotes.forEach((element) => {
+ if (element.body === "No quotes found") {
+ pageDisplay.innerHTML = "";
+ nextPageButton.disabled = true;
+ previousPageButton.disabled = true;
+ li = document.createElement("li");
+
+ li.appendChild(
+ document.createTextNode("Sorry, no results for that search!")
+ );
+ ul.appendChild(li);
+ pageDisplay.innerHTML = "";
+ } else {
+ pageDisplay.innerHTML = `Page: ${pageNumber}`;
+
+ li = document.createElement("li");
+ li.appendChild(
+ document.createTextNode(`${element.author}: ${element.body}`)
+ );
+ ul.appendChild(li);
+ }
+ });
+ });
+});
+
+//----------------------------------Next Button ---------------------------------------
+
+nextPageButton.addEventListener("click", function () {
+ nextPageButton.disabled = true;
+ ul.innerHTML = "";
+ li.innerHTML = "";
+ pageNumber = pageNumber + 1;
+
+ let url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`;
+ fetch(url, {
+ method: "GET",
+ headers: headers,
+ })
+ .then((response) => response.json())
+
+ .then(function (result) {
+ if (result.last_page !== true) {
+ nextPageButton.disabled = false;
+ }
+ })
+ .catch(function (error) {
+ errorPage.style.color = "red";
+ errorPage.style.fontSize = "2rem";
+ errorPage.style.display = "flex";
+ errorPage.style.margin = "100px";
+ errorPage.style.justifyContent = "center";
+ errorPage.innerHTML = "Error - Please try again";
+ });
+
+ pageDisplay.innerHTML = `Page: ${pageNumber}`;
+
+ url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`;
+ fetch(url, {
+ method: "GET",
+ headers: headers,
+ })
+ .then((response) => response.json())
+
+ .then(function (result) {
+ result.quotes.forEach((element) => {
+ li = document.createElement("li");
+ li.appendChild(
+ document.createTextNode(`${element.author}: ${element.body}`)
+ );
+ ul.appendChild(li);
+ });
+ });
+});
+
+// ----------------------------------Previous Button ---------------------------------------
+
+previousPageButton.addEventListener("click", function () {
+ nextPageButton.disabled = false;
+ ul.innerHTML = "";
+ li.innerHTML = "";
+
+ if (pageNumber > 1) {
+ pageNumber = pageNumber - 1;
+ }
+ pageDisplay.innerHTML = `Page: ${pageNumber}`;
+ let url = `https://favqs.com/api/quotes?page=${pageNumber}&filter=${queryString}`;
+ fetch(url, {
+ method: "GET",
+ headers: headers,
+ })
+ .then((response) => response.json())
+ .then(function (result) {
+ result.quotes.forEach((element) => {
+ li = document.createElement("li");
+ li.appendChild(
+ document.createTextNode(`${element.author}: ${element.body}`)
+ );
+ ul.appendChild(li);
+ });
+ })
+ .catch(function (error) {
+ errorPage.style.color = "red";
+ errorPage.style.fontSize = "2rem";
+ errorPage.style.display = "flex";
+ errorPage.style.margin = "100px";
+ errorPage.style.justifyContent = "center";
+ errorPage.innerHTML = "Error - Please try again";
+ });
+});
+
+// ----------------------------------Error Message ---------------------------------------
+
+clear.addEventListener("click", function () {
+ submit.disabled = false;
+ nextPageButton.disabled = true;
+ clear.disabled = true;
+ previousPageButton.disabled = true;
+ ul.innerHTML = "";
+ li.innerHTML = "";
+ userInput.value = "";
+ pageNumber = 1;
+ pageDisplay.innerHTML = "Search cleared! ";
+});
diff --git a/Code/Rodney/JavaScript/Lab3/static/JS/secrets.js b/Code/Rodney/JavaScript/Lab3/static/JS/secrets.js
new file mode 100644
index 00000000..57f3b23f
--- /dev/null
+++ b/Code/Rodney/JavaScript/Lab3/static/JS/secrets.js
@@ -0,0 +1 @@
+const FAVQS_API_KEY = 'a5c32b714493f0c718b8bb08abc60c66'
\ No newline at end of file
diff --git a/Code/Rodney/JavaScript/Lab3/static/css/api.css b/Code/Rodney/JavaScript/Lab3/static/css/api.css
new file mode 100644
index 00000000..2c454e19
--- /dev/null
+++ b/Code/Rodney/JavaScript/Lab3/static/css/api.css
@@ -0,0 +1,71 @@
+* {
+ font-family: sans-serif;
+}
+
+.container1 {
+ margin: 0px;
+ height: 100%;
+ margin: 40px;
+}
+
+h1 {
+ margin: 0px;
+ margin-bottom: 15px;
+}
+
+#userinput {
+ height: 25px;
+ border: 2px rgb(16, 6, 83) solid;
+ border-radius: 5px;
+}
+
+#pagenumber {
+ color: rgb(180, 68, 27);
+ font-size: 1.2rem;
+ font-weight: bold;
+}
+
+button {
+ color: rgb(16, 6, 83);
+ background-color: rgb(240, 236, 234);
+ border-radius: 5%;
+ font-size: 1.1rem;
+ font-weight: bold;
+}
+
+body {
+ background-color: rgb(231, 225, 214);
+}
+
+.title {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ color: rgb(180, 68, 27);
+ font-size: 1.5rem;
+}
+
+.submit {
+ margin: 15px;
+ margin-top: 5px;
+ margin-bottom: 10px;
+}
+
+.input-group {
+ display: flex;
+ justify-content: center;
+ margin: 10px;
+}
+
+.author-quote {
+ margin: 5px;
+ display: flex;
+}
+
+ul {
+ font-size: 1.2rem;
+}
+
+li {
+ padding-bottom: 20px;
+}
diff --git a/Code/Rodney/JavaScript/Lab3/static/css/normalize.css b/Code/Rodney/JavaScript/Lab3/static/css/normalize.css
new file mode 100644
index 00000000..c45a85f8
--- /dev/null
+++ b/Code/Rodney/JavaScript/Lab3/static/css/normalize.css
@@ -0,0 +1,349 @@
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+
+ html {
+ line-height: 1.15; /* 1 */
+ -webkit-text-size-adjust: 100%; /* 2 */
+ }
+
+ /* Sections
+ ========================================================================== */
+
+ /**
+ * Remove the margin in all browsers.
+ */
+
+ body {
+ margin: 0;
+ }
+
+ /**
+ * Render the `main` element consistently in IE.
+ */
+
+ main {
+ display: block;
+ }
+
+ /**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+
+ h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+ }
+
+ /* Grouping content
+ ========================================================================== */
+
+ /**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+
+ hr {
+ box-sizing: content-box; /* 1 */
+ height: 0; /* 1 */
+ overflow: visible; /* 2 */
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ pre {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /* Text-level semantics
+ ========================================================================== */
+
+ /**
+ * Remove the gray background on active links in IE 10.
+ */
+
+ a {
+ background-color: transparent;
+ }
+
+ /**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+
+ abbr[title] {
+ border-bottom: none; /* 1 */
+ text-decoration: underline; /* 2 */
+ text-decoration: underline dotted; /* 2 */
+ }
+
+ /**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+
+ b,
+ strong {
+ font-weight: bolder;
+ }
+
+ /**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+
+ code,
+ kbd,
+ samp {
+ font-family: monospace, monospace; /* 1 */
+ font-size: 1em; /* 2 */
+ }
+
+ /**
+ * Add the correct font size in all browsers.
+ */
+
+ small {
+ font-size: 80%;
+ }
+
+ /**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+
+ sub,
+ sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+ }
+
+ sub {
+ bottom: -0.25em;
+ }
+
+ sup {
+ top: -0.5em;
+ }
+
+ /* Embedded content
+ ========================================================================== */
+
+ /**
+ * Remove the border on images inside links in IE 10.
+ */
+
+ img {
+ border-style: none;
+ }
+
+ /* Forms
+ ========================================================================== */
+
+ /**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+
+ button,
+ input,
+ optgroup,
+ select,
+ textarea {
+ font-family: inherit; /* 1 */
+ font-size: 100%; /* 1 */
+ line-height: 1.15; /* 1 */
+ margin: 0; /* 2 */
+ }
+
+ /**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+
+ button,
+ input { /* 1 */
+ overflow: visible;
+ }
+
+ /**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+
+ button,
+ select { /* 1 */
+ text-transform: none;
+ }
+
+ /**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+
+ button,
+ [type="button"],
+ [type="reset"],
+ [type="submit"] {
+ -webkit-appearance: button;
+ }
+
+ /**
+ * Remove the inner border and padding in Firefox.
+ */
+
+ button::-moz-focus-inner,
+ [type="button"]::-moz-focus-inner,
+ [type="reset"]::-moz-focus-inner,
+ [type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+ }
+
+ /**
+ * Restore the focus styles unset by the previous rule.
+ */
+
+ button:-moz-focusring,
+ [type="button"]:-moz-focusring,
+ [type="reset"]:-moz-focusring,
+ [type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+ }
+
+ /**
+ * Correct the padding in Firefox.
+ */
+
+ fieldset {
+ padding: 0.35em 0.75em 0.625em;
+ }
+
+ /**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+
+ legend {
+ box-sizing: border-box; /* 1 */
+ color: inherit; /* 2 */
+ display: table; /* 1 */
+ max-width: 100%; /* 1 */
+ padding: 0; /* 3 */
+ white-space: normal; /* 1 */
+ }
+
+ /**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+
+ progress {
+ vertical-align: baseline;
+ }
+
+ /**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+
+ textarea {
+ overflow: auto;
+ }
+
+ /**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+
+ [type="checkbox"],
+ [type="radio"] {
+ box-sizing: border-box; /* 1 */
+ padding: 0; /* 2 */
+ }
+
+ /**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+
+ [type="number"]::-webkit-inner-spin-button,
+ [type="number"]::-webkit-outer-spin-button {
+ height: auto;
+ }
+
+ /**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+
+ [type="search"] {
+ -webkit-appearance: textfield; /* 1 */
+ outline-offset: -2px; /* 2 */
+ }
+
+ /**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+
+ [type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+ }
+
+ /**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+
+ ::-webkit-file-upload-button {
+ -webkit-appearance: button; /* 1 */
+ font: inherit; /* 2 */
+ }
+
+ /* Interactive
+ ========================================================================== */
+
+ /*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+
+ details {
+ display: block;
+ }
+
+ /*
+ * Add the correct display in all browsers.
+ */
+
+ summary {
+ display: list-item;
+ }
+
+ /* Misc
+ ========================================================================== */
+
+ /**
+ * Add the correct display in IE 10+.
+ */
+
+ template {
+ display: none;
+ }
+
+ /**
+ * Add the correct display in IE 10.
+ */
+
+ [hidden] {
+ display: none;
+ }
\ No newline at end of file
diff --git a/README.md b/README.md
index 835e2ffe..9489115c 100644
--- a/README.md
+++ b/README.md
@@ -6,11 +6,11 @@ Weeks 1, 2, 3, 4, 5: Python
Weeks 6, 7, 8, 9: HTML/CSS/Flask
-**Weeks 10, 11: Javascript**
+Weeks 10, 11: Javascript
Weeks 12, 13, 14, 15: Django
-Weeks 16, 17, 18: Capstone project
+**Weeks 16, 17, 18: Capstone project**
### Scheduled Holidays (no class)
- **Nov 11** - Veterans Day
@@ -67,7 +67,7 @@ Weeks 16, 17, 18: Capstone project
-
+
Javascript
Lab 01-03 - JS Redo
@@ -76,6 +76,17 @@ Weeks 16, 17, 18: Capstone project
+
+ Django
+
+ Lab 01 - To Do List
+ Lab 02 - Blog
+ Lab 03 - Pokedex
+
+
+
+### Capstone proposals due Friday, 2022-01-21
+
## Submitting your work
Make sure all labs are located within `Class_Raven/Code/`
@@ -183,6 +194,28 @@ Corrections will be made only to that particular branch.
## Additional Resources
+
+ Django
+
+
+
+
+ SQL
+
+
+
HTML/CSS/JS Online IDEs
@@ -197,6 +230,7 @@ Corrections will be made only to that particular branch.
Useful VS Code Extensions
+ Jinja2 Snippet Kit Jinja2 snippets for cool attractive people to use in your HTML templates.
Bracket Pair Colorizer 2 Makes code blocks and nested expressions easier to read
Thunder Client GUI to make and manage HTTP requests
Markdown All-In-One Quickly create markdown tables of contents and other useful markdown features
diff --git a/post-bootcamp-project-ideas.md b/post-bootcamp-project-ideas.md
new file mode 100644
index 00000000..18fa5049
--- /dev/null
+++ b/post-bootcamp-project-ideas.md
@@ -0,0 +1,10 @@
+# Post-Bootcamp Project Ideas
+
+## Content Management System (CMS)
+## Library
+## Twitter clone
+## Craigslist clone
+## REST API using Django REST Framework (Javascript front-end)
+## HTML Form Generator
+## CSV to JSON converter
+