diff --git a/README.md b/README.md index 69fd277..c7fc31a 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ - + [![First Timers Only](https://img.shields.io/badge/first--timers--only-friendly-blue.svg)](https://www.firsttimersonly.com/) @@ -22,9 +22,9 @@ -# ShopCube +# shopcube -ShopCube is an e-commerce solution for shops. Complete with +shopcube is an e-commerce solution for shops. Complete with - [x] 🛒 cart - [x] ⭐ wishlist @@ -38,6 +38,63 @@ If you want to contribute, go ahead, we ❤️ it. We follow a 💯 % first-time Powered by [Shopyo](https://github.com/shopyo/shopyo), a Python web framework built on top of Flask. +## ⚡ Quick try + + +``` +$ python -m pip install shopcube +$ shopcube initialise +$ shopcube rundebug +``` + +Go to [http://127.0.0.1:5000](http://127.0.0.1:5000) + +## 🎫 Some explanations + +Shopcube has two modes: + +- package mode if you want to just use the app as is +- control mode if you want to see exactly what's going on + +Package mode has several commands to manage the json settings file + +``` +$ shopcube showjson # show settings +$ shopcube copyjson # copy json file from site-packages in current directory +$ shopcube applyjson # apply json file in current directory +$ shopcube restorejson # restore original json file in site-packages +$ shopcube create # create new project named shopcube in current directory +$ shopcube packageinfo # path of project +``` + +Control mode allows you to use Shopyo commands as you would in any project + +``` +$ shopcube create +$ ls shopcube/ +├── app.py +├── config.example.json +├── config.json +├── config.py +├── conftest.py +├── file.log +├── __init__.py +├── init.py +├── instance +├── __main__.py +├── modules +├── __pycache__ +├── pyproject.toml +├── requirements.txt +├── setup.cfg +├── static +├── tests +├── utils +└── wsgi.py +$ cd shopcube +$ shopyo rundebug +``` + ## 🍼 First time setup - Download and install the [latest version of git](https://git-scm.com/downloads). @@ -51,13 +108,13 @@ Powered by [Shopyo](https://github.com/shopyo/shopyo), a Python web framework bu - Make sure you have a [GitHub account](https://github.com/join). -- Fork ShopCube to your GitHub account by clicking the [Fork](https://github.com/shopyo/ShopCube/fork) button. +- Fork shopcube to your GitHub account by clicking the [Fork](https://github.com/shopyo/shopcube/fork) button. - [Clone](https://docs.github.com/en/github/getting-started-with-github/fork-a-repo#step-2-create-a-local-clone-of-your-fork) the main repository locally (make sure to have your [SSH authentication](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) setup!). Replace `{username}` with your username. ``` - $ git clone git@github.com:{username}/ShopCube.git - $ cd ShopCube + $ git clone git@github.com:{username}/shopcube.git + $ cd shopcube ``` - Create a virtualenv named env and activate the [virtual environment](https://docs.python.org/3/tutorial/venv.html): @@ -82,27 +139,27 @@ Powered by [Shopyo](https://github.com/shopyo/shopyo), a Python web framework bu $ python -m pip install --upgrade pip setuptools ``` -- Install the development dependencies and ShopCube requirements: +- Install the development dependencies and shopcube requirements: ``` - $ pip install -r reqs/app.txt - $ pip install -r reqs/dev.txt + $ python -m pip install -r reqs/dev.txt ``` - Now initialize the app by running: ``` - $ cd shopyo - $ python manage.py initialise + $ python -m pip install -e . + $ cd src/shopcube + $ shopyo initialise ``` -- Run ShopCube: +- Run shopcube: ``` - $ python manage.py rundebug + $ shopyo rundebug ``` -- Go to the link http://127.0.0.1:5000/ and you should see the ShopCube app running. +- Go to the link http://127.0.0.1:5000/ and you should see the shopcube app running. - Login as administrator by clicking on the login icon on the top right hand side of the screen. diff --git a/reqs/app.in b/reqs/app.in index 69931f5..1d2d210 100644 Binary files a/reqs/app.in and b/reqs/app.in differ diff --git a/reqs/app.txt b/reqs/app.txt index d87d932..13f0408 100644 --- a/reqs/app.txt +++ b/reqs/app.txt @@ -11,33 +11,38 @@ click==8.0.1 dnspython==2.1.0 # via email-validator email-validator==1.1.3 - # via -r reqs/app.in -flask==2.0.2 # via # -r reqs/app.in + # shopyo +flask==2.2.0 + # via + # -r reqs/app.in + # flask-admin # flask-login # flask-mailman # flask-marshmallow # flask-migrate - # flask-reuploaded # flask-sqlalchemy # flask-wtf -flask-login==0.5.0 - # via -r reqs/app.in + # shopyo +flask-admin==1.6.0 + # via shopyo +flask-login==0.6.2 + # via + # -r reqs/app.in + # shopyo flask-mailman==0.3.0 - # via -r reqs/app.in + # via shopyo flask-marshmallow==0.14.0 - # via -r reqs/app.in + # via shopyo flask-migrate==3.1.0 - # via -r reqs/app.in -flask-reuploaded==1.2.0 - # via -r reqs/app.in + # via shopyo flask-sqlalchemy==2.5.1 # via - # -r reqs/app.in # flask-migrate + # shopyo flask-wtf==1.0.0 - # via -r reqs/app.in + # via shopyo greenlet==1.1.2 # via sqlalchemy idna==2.10 @@ -50,35 +55,40 @@ jinja2==3.0.1 # via flask mako==1.1.5 # via alembic -markupsafe==2.0.1 +markupsafe==2.1.1 # via # jinja2 # mako + # werkzeug # wtforms marshmallow==3.14.1 # via - # -r reqs/app.in # flask-marshmallow # marshmallow-sqlalchemy + # shopyo marshmallow-sqlalchemy==0.26.1 - # via -r reqs/app.in + # via shopyo mkdocs-material-extensions==1.0.3 # via flask-mailman pymysql==1.0.2 # via -r reqs/app.in +shopyo==4.5.8 + # via -r reqs/app.in six==1.16.0 # via flask-marshmallow sqlalchemy==1.4.27 # via - # -r reqs/app.in # alembic # flask-sqlalchemy # marshmallow-sqlalchemy -werkzeug==2.0.1 - # via flask -wtforms==2.3.3 + # shopyo +werkzeug==2.2.2 # via - # -r reqs/app.in + # flask + # flask-login + # shopyo +wtforms==3.0.1 + # via + # flask-admin # flask-wtf -zipp==3.6.0 - # via -r reqs/app.in + # shopyo diff --git a/setup.py b/setup.py index 6944c70..d080874 100644 --- a/setup.py +++ b/setup.py @@ -29,7 +29,7 @@ long_description = f.read() setup( name="shopcube", # Required - version="3.7.1", # Required + version="4.0.0", # Required description="E-commerce solution", # Optional long_description=long_description, # Optional long_description_content_type="text/markdown", # Optional (see note above) diff --git a/shopyo/__init__.py b/shopyo/__init__.py deleted file mode 100644 index 2cb15c1..0000000 --- a/shopyo/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -version_info = (3, 6, 1) -__version__ = ".".join([str(v) for v in version_info]) diff --git a/shopyo/__main__.py b/shopyo/__main__.py deleted file mode 100644 index 40e5f35..0000000 --- a/shopyo/__main__.py +++ /dev/null @@ -1,49 +0,0 @@ -import os -import subprocess -import sys -from pathlib import Path - -# from .shopyoapi.file import trycopy -from .shopyoapi.file import trycopytree -from .shopyoapi.file import trymkdir -from .shopyoapi.info import printinfo - -dirpath = Path(__file__).parent.absolute() -dirpathparent = Path(__file__).parent.parent.absolute() - - -def is_venv(): - return hasattr(sys, "real_prefix") or ( - hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix - ) - - -def new_project(path, newfoldername): - newfoldername = newfoldername.strip("/").strip("\\") - print("creating new project {}".format(newfoldername)) - - base_path = path + "/" + newfoldername - trymkdir(base_path) - print("created dir {} in {}".format(newfoldername, path)) - - trycopytree(os.path.join(dirpathparent, "shopyo"), base_path + "/shopyo") - - -def main(): - if not is_venv(): - print("Please use Shopyo in a virtual environment") - sys.exit() - args = sys.argv - if len(args) == 1: - printinfo() - print("No arguments supplied") - if args[1] == "new" and len(args) == 4: - printinfo() - new_project(args[2], args[3]) - else: - torun = [sys.executable, "manage.py"] + args[1:] - subprocess.run(torun, stdout=subprocess.PIPE) - - -if __name__ == "__main__": - main() diff --git a/shopyo/app.py b/shopyo/app.py deleted file mode 100644 index ea073ed..0000000 --- a/shopyo/app.py +++ /dev/null @@ -1,228 +0,0 @@ -import importlib -import os -import json -import sys - -from flask import Flask - -# from flask import redirect -from flask import url_for -from flask import send_from_directory - -from flask_login import current_user -from flask_wtf.csrf import CSRFProtect - -sys.path.append(".") - -import jinja2 -from flask_uploads import configure_uploads -from flask_mailman import Mail - -from modules.box__default.settings.helpers import get_setting -from shopyoapi.init import categoryphotos -from shopyoapi.init import db -from shopyoapi.init import login_manager -from shopyoapi.init import ma -from shopyoapi.init import migrate -from shopyoapi.init import productphotos -from shopyoapi.init import subcategoryphotos -from shopyoapi.path import modules_path -from shopyoapi.file import trycopy - - -from config import app_config - -base_path = os.path.dirname(os.path.abspath(__file__)) - -def load_config_from_obj(app, config_name): - - try: - configuration = app_config[config_name] - except KeyError as e: - print( - f"[ ] Invalid config name {e}. Available configurations are: " - f"{list(app_config.keys())}\n" - ) - sys.exit(1) - - app.config.from_object(configuration) - - -def load_config_from_instance(app, config_name): - - if config_name != "testing": - # load the instance config, if it exists, when not testing - app.config.from_pyfile("config.py", silent=True) - - # create empty instance folder and empty config if not present - try: - os.makedirs(app.instance_path) - with open(os.path.join(app.instance_path, "config.py"), "a"): - pass - except OSError: - pass - -def create_app(config_name): - - app = Flask(__name__) - - @app.before_request - def check_init(): - - - load_config_from_obj(app, config_name) - load_config_from_instance(app, config_name) - - migrate.init_app(app, db) - db.init_app(app) - ma.init_app(app) - login_manager.init_app(app) - csrf = CSRFProtect(app) # noqa - mail = Mail() - mail.init_app(app) - - - - configure_uploads(app, categoryphotos) - configure_uploads(app, subcategoryphotos) - configure_uploads(app, productphotos) - - - # - # dev static - # - - @app.route("/devstatic//f/") - def devstatic(boxormodule, filename): - if app.config["DEBUG"]: - module_static = os.path.join(modules_path, boxormodule, "static") - return send_from_directory(module_static, filename=filename) - - available_everywhere_entities = {} - - # - # load blueprints - # - for folder in os.listdir(os.path.join(base_path, "modules")): - if folder.startswith("__"): # ignore __pycache__ - continue - - if folder.startswith("box__"): - # boxes - for sub_folder in os.listdir( - os.path.join(base_path, "modules", folder) - ): - if sub_folder.startswith("__"): # ignore __pycache__ - continue - elif sub_folder.endswith(".json"): # box_info.json - continue - sys_mod = importlib.import_module( - "modules.{}.{}.view".format(folder, sub_folder) - ) - try: - mod_global = importlib.import_module( - "modules.{}.{}.global".format(folder, sub_folder) - ) - available_everywhere_entities.update( - mod_global.available_everywhere - ) - except ImportError as e: - # print(e) - pass - app.register_blueprint( - getattr(sys_mod, "{}_blueprint".format(sub_folder)) - ) - else: - # apps - mod = importlib.import_module("modules.{}.view".format(folder)) - try: - mod_global = importlib.import_module( - "modules.{}.global".format(folder) - ) - available_everywhere_entities.update( - mod_global.available_everywhere - ) - except ImportError as e: - # print(e) - pass - app.register_blueprint(getattr(mod, "{}_blueprint".format(folder))) - - # - # custom templates folder - # - with app.app_context(): - front_theme_dir = os.path.join( - app.config["BASE_DIR"], "static", "themes", "front" - ) - back_theme_dir = os.path.join( - app.config["BASE_DIR"], "static", "themes", "back" - ) - my_loader = jinja2.ChoiceLoader( - [ - app.jinja_loader, - jinja2.FileSystemLoader([front_theme_dir, back_theme_dir]), - ] - ) - app.jinja_loader = my_loader - - # - # global vars - # - @app.context_processor - def inject_global_vars(): - # theme_dir = os.path.join( - # app.config["BASE_DIR"], "themes", get_setting("ACTIVE_FRONT_THEME") - # ) - # info_path = os.path.join(theme_dir, "info.json") - # with open(info_path) as f: - # info_data = json.load(f) - - APP_NAME = get_setting("APP_NAME") - SECTION_NAME = get_setting("SECTION_NAME") - SECTION_ITEMS = get_setting("SECTION_ITEMS") - # ACTIVE_FRONT_THEME = get_setting("ACTIVE_FRONT_THEME") - # ACTIVE_FRONT_THEME_VERSION = info_data["version"] - # ACTIVE_FRONT_THEME_STYLES_URL = url_for( - # "resource.active_theme_css", - # active_theme=ACTIVE_FRONT_THEME, - # v=ACTIVE_FRONT_THEME_VERSION, - # ) - - base_context = { - "APP_NAME": APP_NAME, - "SECTION_NAME": SECTION_NAME, - "SECTION_ITEMS": SECTION_ITEMS, - # "ACTIVE_FRONT_THEME": ACTIVE_FRONT_THEME, - # "ACTIVE_FRONT_THEME_VERSION": ACTIVE_FRONT_THEME_VERSION, - # "ACTIVE_FRONT_THEME_STYLES_URL": ACTIVE_FRONT_THEME_STYLES_URL, - "len": len, - "current_user": current_user, - } - base_context.update(available_everywhere_entities) - - # print('\nav everywhere entities\n', available_everywhere_entities) - - return base_context - - # end of func - return app - - # app.jinja_env.globals.update(x=x) - # if app.config["DEBUG"]: - # @app.after_request - # def after_request(response): - # response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate, public, max-age=0" - # response.headers["Expires"] = 0 - # response.headers["Pragma"] = "no-cache" - # return response - - -with open(os.path.join(base_path, 'config.json')) as f: - config_json = json.load(f) -environment = config_json['environment'] -app = create_app(environment) - - -if __name__ == "__main__": - - app.run(debug=False, host="0.0.0.0") diff --git a/shopyo/config.py b/shopyo/config.py deleted file mode 100644 index 1744514..0000000 --- a/shopyo/config.py +++ /dev/null @@ -1,63 +0,0 @@ -import os - -base_path = os.path.dirname(os.path.abspath(__file__)) - - -class Config: - """Parent configuration class.""" - - DEBUG = False - SQLALCHEMY_TRACK_MODIFICATIONS = False - SECRET_KEY = os.urandom(24) - BASE_DIR = base_path - STATIC = os.path.join(BASE_DIR, "static") - UPLOADED_PATH_IMAGE = os.path.join(STATIC, "uploads", "images") - UPLOADED_PATH_THUM = os.path.join(STATIC, "uploads", "thumbs") - - UPLOADED_PRODUCTPHOTOS_DEST = os.path.join(STATIC, "uploads", "products") - UPLOADED_CATEGORYPHOTOS_DEST = os.path.join(STATIC, "uploads", "category") - UPLOADED_SUBCATEGORYPHOTOS_DEST = os.path.join( - STATIC, "uploads", "subcategory" - ) - PASSWORD_SALT = "abcdefghi" - - SQLALCHEMY_DATABASE_URI = "sqlite:///shopcube.db" - - -class DevelopmentConfig(Config): - """Configurations for development""" - - ENV = "development" - DEBUG = True - # EXPLAIN_TEMPLATE_LOADING = True - LOGIN_DISABLED = True - # control email confirmation for user registration - EMAIL_CONFIRMATION_DISABLED = False - # flask-mailman configs - MAIL_SERVER = 'localhost' - MAIL_PORT = 1025 - MAIL_USE_TLS = False - MAIL_USE_SSL = False - MAIL_USERNAME = '' # os.environ.get("MAIL_USERNAME") - MAIL_PASSWORD = '' # os.environ.get("MAIL_PASSWORD") - MAIL_DEFAULT_SENDER = 'ma@mail.com' # os.environ.get("MAIL_DEFAULT_SENDER") - - -class TestingConfig(Config): - """Configurations for testsing""" - - SQLALCHEMY_DATABASE_URI = "sqlite:///testing.db" - DEBUG = True - LIVESERVER_PORT = 8943 - LIVESERVER_TIMEOUT = 10 - SERVER_NAME = "localhost.com" - BCRYPT_LOG_ROUNDS = 4 - TESTING = True - WTF_CSRF_ENABLED = False - - -app_config = { - "development": DevelopmentConfig, - "production": Config, - "testing": TestingConfig, -} diff --git a/shopyo/conftest.py b/shopyo/conftest.py deleted file mode 100644 index 9fec54d..0000000 --- a/shopyo/conftest.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -File conftest.py contains pytest fixtures that are used in numerous -test functions. Refer to https://docs.pytest.org/en/stable/fixture.html -for more details on pytest -""" -import json -import os -import pytest -from flask import url_for - -from app import create_app -from shopyoapi.init import db as _db -from modules.box__default.admin.models import User -from modules.box__default.settings.models import Settings - -# run in shopyo/shopyo -# python -m pytest . or python -m pytest -v - -if os.path.exists("testing.db"): - os.remove("testing.db") - - -@pytest.fixture(scope="session") -def new_user(): - """ - A pytest fixture that returns a user model object - """ - user = User(email="newuser@domain.com", password="pass") - user.first_name = "New" - user.last_name = "User" - return user - - -@pytest.fixture(scope="session") -def non_admin_user(): - """ - A pytest fixture that returns a non admin user - """ - user = User(email="admin1@domain.com", password="pass") - return user - - -@pytest.fixture(scope="session") -def admin_user(): - """ - A pytest fixture that returns an admin user - """ - user = User(email="admin2@domain.com", is_admin=True, password="pass") - return user - - -@pytest.fixture(scope="session") -def flask_app(): - flask_app = create_app("testing") - return flask_app - - -@pytest.fixture(scope="session") -def test_client(flask_app): - """ - setups up and returns the flask testing app - """ - # Create a test client using the Flask application configured for testing - with flask_app.test_client() as testing_client: - # Establish an application context - with flask_app.app_context(): - yield testing_client # this is where the testing happens! - - -@pytest.fixture(scope="session") -def db(test_client, non_admin_user, admin_user): - """ - creates and returns the initial testing database - """ - # Create the database and the database table - _db.app = test_client - _db.create_all() - - # Insert admin and non admin users - _db.session.add(non_admin_user) - _db.session.add(admin_user) - - # add the default settings - with open("config.json", "r") as config: - config = json.load(config) - for name, value in config["settings"].items(): - s = Settings(setting=name, value=value) - _db.session.add(s) - - # Commit the changes for the users - _db.session.commit() - - yield _db # this is where the testing happens! - - _db.drop_all() - - -@pytest.fixture(scope="function", autouse=True) -def db_session(db): - """ - Creates a new database session for a test. Note you must use this fixture - if your test connects to db. Autouse is set to true which implies - that the fixture will be setup before each test - - Here we not only support commit calls but also rollback calls in tests. - """ - connection = db.engine.connect() - transaction = connection.begin() - options = dict(bind=connection, binds={}) - session = db.create_scoped_session(options=options) - db.session = session - - yield session - - transaction.rollback() - connection.close() - session.remove() - - -@pytest.fixture -def login_admin_user(auth, admin_user): - """Login with admin and logout during teadown""" - auth.login(admin_user) - yield - auth.logout() - - -@pytest.fixture -def login_non_admin_user(auth, non_admin_user): - """Login with non-admin and logout during teadown""" - auth.login(non_admin_user) - yield - auth.logout() - - -@pytest.fixture -def auth(test_client): - return AuthActions(test_client) - - -class AuthActions: - def __init__(self, client): - self._client = client - - def login(self, user, password="pass"): - return self._client.post( - url_for("auth.login"), - data=dict(email=user.email, password=password), - follow_redirects=True, - ) - - def logout(self): - return self._client.get(url_for("auth.logout"), follow_redirects=True) - - -# Want TO USE THE BELOW 2 FIXTURES TO DYNAMICALLY -# GET THE ROUTES FOR A GIVEN MODULE BUT UNABLE TO -# PARAMETERIZE THE LIST OF ROUTES RETURNED FROM THE FIXTURE -# CURRENTLY THIS NOT POSSIBLE WITH FIXTURES IN PYTEST @rehmanis - -# @pytest.fixture(scope="module") -# def get_module_routes(request, get_routes): -# module_prefix = getattr(request.module, "module_prefix", "/") -# return get_routes[module_prefix] - - -# @pytest.fixture(scope="session") -# def get_routes(flask_app): - -# routes_dict = {} -# relative_path = "/" -# prefix = "/" - -# for route in flask_app.url_map.iter_rules(): -# split_route = list(filter(None, str(route).split("/", 2))) - -# if len(split_route) == 0: -# prefix = "/" -# relative_path = "" -# elif len(split_route) == 1: -# prefix = "/" + split_route[0] -# relative_path = "/" -# else: -# prefix = "/" + split_route[0] -# relative_path = split_route[1] - -# if prefix in routes_dict: -# routes_dict[prefix].append(relative_path) -# else: -# routes_dict[prefix] = [relative_path] - -# return routes_dict diff --git a/shopyo/manage.py b/shopyo/manage.py deleted file mode 100644 index 1d5e41e..0000000 --- a/shopyo/manage.py +++ /dev/null @@ -1,69 +0,0 @@ -import subprocess -import click - -from app import app -from shopyoapi.cmd import clean -from shopyoapi.cmd import create_box -from shopyoapi.cmd import create_module -from shopyoapi.cmd import create_module_in_box -from shopyoapi.cmd import initialise -from shopyoapi.cmd import collectstatic -from shopyoapi.database import autoload_models -from shopyoapi.info import printinfo - - -def runserver(): - app.run(host="0.0.0.0", debug=False) - - -@click.command() -@click.argument("args", nargs=-1) -def process(args): - printinfo() - if args[0] == "initialise" or args[0] == "initialize": - clean(app) - autoload_models() - initialise() - elif args[0] == "clean": - clean(app) - elif args[0] == "runserver": - runserver() - elif args[0] == "rundebug": - app.run(debug=True, host="0.0.0.0") - try: - if args[1]: - app.run(debug=True, host="0.0.0.0", port=int(args[1])) - except IndexError as e: - raise e - elif args[0] == "collectstatic": - if len(args) == 1: - collectstatic() - elif len(args) == 2: - collectstatic(target_module=args[1]) - elif args[0] == "test": - print("test ok") - elif args[0] == "startapp" and args[1]: - create_module(args[1]) - elif args[0] == "startbox" and args[1]: - create_box(args[1]) - elif args[0] == "startsubapp" and args[1] and args[3]: - if args[2].lower() == "in": - create_module_in_box(args[1], args[3]) - elif args[0] == "db": - try: - autoload_models() - if args[1] == "migrate": - subprocess.run(["flask", "db", "migrate"]) - elif args[1] == "upgrade": - subprocess.run(["flask", "db", "upgrade"]) - elif args[1] == "init": - subprocess.run(["flask", "db", "init"]) - except IndexError as e: - print("db requires more options") - raise e - else: - print("Command not recognised") - - -if __name__ == "__main__": - process() diff --git a/shopyo/modules/box__bizhelp/announce/forms.py b/shopyo/modules/box__bizhelp/announce/forms.py deleted file mode 100644 index 93a4af5..0000000 --- a/shopyo/modules/box__bizhelp/announce/forms.py +++ /dev/null @@ -1,25 +0,0 @@ -from flask_wtf import FlaskForm - -# from wtforms.validators import Length -# from wtforms.fields.html5 import EmailField -from wtforms import StringField -from wtforms import TextAreaField -from wtforms.validators import DataRequired - - -class AnnounceForm(FlaskForm): - title = StringField( - "Title", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - - content = TextAreaField( - "Content", - [], - render_kw={ - "class": "form-control", - "rows": "20", - "autocomplete": "off", - }, - ) diff --git a/shopyo/modules/box__bizhelp/announce/global.py b/shopyo/modules/box__bizhelp/announce/global.py deleted file mode 100644 index 6a46a74..0000000 --- a/shopyo/modules/box__bizhelp/announce/global.py +++ /dev/null @@ -1,8 +0,0 @@ -from .models import Announcement - - -def get_announcements(): - return Announcement.query.all() - - -available_everywhere = {"get_announcements": get_announcements} diff --git a/shopyo/modules/box__bizhelp/announce/info.json b/shopyo/modules/box__bizhelp/announce/info.json deleted file mode 100644 index 4ac7364..0000000 --- a/shopyo/modules/box__bizhelp/announce/info.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "display_string": "Announce", - "module_name":"announce", - "type": "show", - "fa-icon": "fa fa-bullhorn", - "url_prefix": "/announce", - "dashboard": "/dashboard", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/announce/models.py b/shopyo/modules/box__bizhelp/announce/models.py deleted file mode 100644 index 9344ea5..0000000 --- a/shopyo/modules/box__bizhelp/announce/models.py +++ /dev/null @@ -1,12 +0,0 @@ -from datetime import datetime - -from shopyoapi.init import db -from shopyoapi.models import PkModel - - -class Announcement(PkModel): - - __tablename__ = "announcements" - created_date = db.Column(db.DateTime, default=datetime.now()) - title = db.Column(db.String(100)) - content = db.Column(db.String(1024)) diff --git a/shopyo/modules/box__bizhelp/announce/templates/announce/blocks/sidebar.html b/shopyo/modules/box__bizhelp/announce/templates/announce/blocks/sidebar.html deleted file mode 100644 index 4fb4778..0000000 --- a/shopyo/modules/box__bizhelp/announce/templates/announce/blocks/sidebar.html +++ /dev/null @@ -1,15 +0,0 @@ -{{ -sidebar_item( -'Home', -icon=info['fa-icon'], -url=url_for('{}.dashboard'.format(info['module_name'])) -) -}} - -{{ -sidebar_item( -'View', -icon='fa fa-list', -url=url_for('{}.list'.format(info['module_name'])) -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/announce/templates/announce/dashboard.html b/shopyo/modules/box__bizhelp/announce/templates/announce/dashboard.html deleted file mode 100644 index e5af9fb..0000000 --- a/shopyo/modules/box__bizhelp/announce/templates/announce/dashboard.html +++ /dev/null @@ -1,67 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

New Announcement

-
- {{ form.title.label }} -
-
- -
- {{ form.title }} - -
-
- {{ form.content.label }}
-
- {{ form.content }} -
-
- - -
-
-
-
- - - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/announce/templates/announce/edit.html b/shopyo/modules/box__bizhelp/announce/templates/announce/edit.html deleted file mode 100644 index a80a481..0000000 --- a/shopyo/modules/box__bizhelp/announce/templates/announce/edit.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
-
- {%for field in form%} - {%if field.id not in ['csrf_token']%} - {{field.label}} - {%endif%} - {{field}} - {%endfor%} -
- -
- -
-
- - - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/announce/templates/announce/list.html b/shopyo/modules/box__bizhelp/announce/templates/announce/list.html deleted file mode 100644 index e26f8bd..0000000 --- a/shopyo/modules/box__bizhelp/announce/templates/announce/list.html +++ /dev/null @@ -1,64 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
-
- {%for announce in announcements%} -
-
-
- {{announce.title}} | {{announce.created_date.strftime("%m/%d/%Y, %H:%M:%S")}} -
-
-
- {{announce.content | safe}} -
-
- -
-
- {%endfor%} -
- -
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/announce/tests/test_announce.py b/shopyo/modules/box__bizhelp/announce/tests/test_announce.py deleted file mode 100644 index ee9e176..0000000 --- a/shopyo/modules/box__bizhelp/announce/tests/test_announce.py +++ /dev/null @@ -1,106 +0,0 @@ -""" -This file (test_contact.py) contains the functional tests for the -`contact` blueprint. - -These tests use GETs and POSTs to different endpoints to check for -the proper behavior of the `contact` blueprint. -""" -import json -import os - -from flask import request -from flask import url_for - -from modules.box__bizhelp.announce.models import Announcement - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_path = os.path.dirname(dirpath) - -module_info = None - -with open(os.path.join(module_path, "info.json")) as f: - module_info = json.load(f) - - -def test_announce_dashboard(test_client): - """""" - response = test_client.get(url_for("auth.logout"), follow_redirects=True) - print(request.path) - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - # check request to contact correctly redirects to login page - response = test_client.get( - module_info["url_prefix"] + "/dashboard", follow_redirects=True - ) - assert request.path == url_for("auth.login") - - # Login and try to access the contact dashboard. It should return OK - response = test_client.post( - url_for("auth.login"), - data=dict(email="admin1@domain.com", password="pass"), - follow_redirects=True, - ) - - # check if successfully logged in - assert response.status_code == 200 - - # check response is valid - response = test_client.get( - url_for(module_info["module_name"] + ".dashboard") - ) - assert response.status_code == 200 - assert b"New Announcement" in response.data - assert b"Title" in response.data - assert b"Content" in response.data - - -def test_announce_add_check(test_client): - """""" - response = test_client.post( - url_for(module_info["module_name"] + ".add_check"), - data=dict(title="abc", content="def"), - follow_redirects=True, - ) - assert response.status_code == 200 - - # check if message was added successfully - response = test_client.get(url_for(module_info["module_name"] + ".list")) - assert response.status_code == 200 - assert b"abc" in response.data - assert b"def" in response.data - - -def test_announce_add_check_wrong(test_client): - """""" - response = test_client.post( - url_for(module_info["module_name"] + ".add_check"), - data=dict(title="", content="abc_wrong"), - follow_redirects=True, - ) - - announcement = Announcement.query.filter( - Announcement.content == "abc_wrong" - ).first() - assert announcement is None - - -def test_announce_edit_check(test_client): - """""" - announcement = Announcement(title="abcx", content="def") - announcement.save() - - assert Announcement.query.get(1).title == "abcx" - - response = test_client.post( - url_for(module_info["module_name"] + ".edit_check", announce_id=1), - data=dict(title="abcxd", content="def"), - follow_redirects=True, - ) - assert response.status_code == 200 - - # check if message was added successfully - response = test_client.get(url_for(module_info["module_name"] + ".list")) - assert response.status_code == 200 - assert b"abcxd" in response.data - assert b"def" in response.data diff --git a/shopyo/modules/box__bizhelp/announce/view.py b/shopyo/modules/box__bizhelp/announce/view.py deleted file mode 100644 index 1c5824b..0000000 --- a/shopyo/modules/box__bizhelp/announce/view.py +++ /dev/null @@ -1,102 +0,0 @@ -# from flask import render_template -from flask import flash -from flask import request - -from flask_login import login_required - -from shopyoapi.forms import flash_errors -from shopyoapi.html import notify_success -from shopyoapi.module import ModuleHelp - -from .forms import AnnounceForm -from .models import Announcement - -mhelp = ModuleHelp(__file__, __name__) -globals()[mhelp.blueprint_str] = mhelp.blueprint -module_blueprint = globals()[mhelp.blueprint_str] - - -@module_blueprint.route("/") -def index(): - return mhelp.info["display_string"] - - -# TODO add pagination -@module_blueprint.route("/dashboard", methods=["GET"]) -@login_required -def dashboard(): - - context = mhelp.context() - form = AnnounceForm() - context.update({"form": form}) - return mhelp.render("dashboard.html", **context) - - -@module_blueprint.route("/add/check", methods=["GET", "POST"]) -@login_required -def add_check(): - if request.method == "POST": - form = AnnounceForm() - if not form.validate_on_submit(): - flash_errors(form) - return mhelp.redirect_url( - "{}.dashboard".format(mhelp.info["module_name"]) - ) - toadd_announce = Announcement( - content=form.content.data, - title=form.title.data, - ) - toadd_announce.save() - return mhelp.redirect_url("{}.dashboard".format(mhelp.info["module_name"])) - - -@module_blueprint.route("/list", methods=["GET"]) -@login_required -def list(): - context = mhelp.context() - announcements = Announcement.query.all() - context.update({"announcements": announcements}) - return mhelp.render("list.html", **context) - - -@module_blueprint.route("//delete/check", methods=["GET"]) -@login_required -def delete_check(announce_id): - announcement = Announcement.query.get(announce_id) - if announcement is None: - flash(notify_warning("Wrong announcement id")) - return mhelp.redirect_url(mhelp.method("list")) - announcement.delete() - return mhelp.redirect_url(mhelp.method("list")) - - -@module_blueprint.route("//edit", methods=["GET"]) -@login_required -def edit(announce_id): - context = mhelp.context() - announcement = Announcement.query.get(announce_id) - if announcement is None: - flash(notify_warning("Cannot find announcement id")) - return mhelp.redirect_url(mhelp.method("list")) - form = AnnounceForm(obj=announcement) - - context.update({"announcement": announcement, "form": form}) - return mhelp.render("edit.html", **context) - - -@module_blueprint.route("//edit/check", methods=["GET", "POST"]) -@login_required -def edit_check(announce_id): - - if request.method == "POST": - announcement = Announcement.query.get(announce_id) - form = AnnounceForm(obj=announcement) - if not form.validate_on_submit(): - flash_errors(form) - return mhelp.redirect_url( - mhelp.method("edit"), announce_id=announce_id - ) - form.populate_obj(announcement) - announcement.update() - flash(notify_success("Announcement updated!")) - return mhelp.redirect_url(mhelp.method("list")) diff --git a/shopyo/modules/box__bizhelp/appointment/info.json b/shopyo/modules/box__bizhelp/appointment/info.json deleted file mode 100644 index 5555668..0000000 --- a/shopyo/modules/box__bizhelp/appointment/info.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "display_string": "Appointments", - "type": "show", - "fa-icon": "fas fa-clock", - "url_prefix": "/appointment", - "author": { - "name":"Abdur-Rahmaan Janhangeer", - "website":"https://www.pythonkitchen.com/about-me/", - "mail":"arj.python@gmail.com" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/models.py b/shopyo/modules/box__bizhelp/appointment/models.py deleted file mode 100644 index ef3f16a..0000000 --- a/shopyo/modules/box__bizhelp/appointment/models.py +++ /dev/null @@ -1,10 +0,0 @@ -from shopyoapi.init import db - - -class Appointments(db.Model): - __tablename__ = "appointments" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100)) - date = db.Column(db.String(20)) - time = db.Column(db.String(20)) - active = db.Column(db.String(20)) diff --git a/shopyo/modules/box__bizhelp/appointment/templates/appointment/add.html b/shopyo/modules/box__bizhelp/appointment/templates/appointment/add.html deleted file mode 100644 index 5999bba..0000000 --- a/shopyo/modules/box__bizhelp/appointment/templates/appointment/add.html +++ /dev/null @@ -1,52 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "appointments" %} -{% block pagehead %} -add appointment -{% endblock %} -{% block sidebar %} -{%include 'appointment/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

Add Appointment

-
- -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
- -
- -
- -
- -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/templates/appointment/blocks/sidebar.html b/shopyo/modules/box__bizhelp/appointment/templates/appointment/blocks/sidebar.html deleted file mode 100644 index ecc2bc5..0000000 --- a/shopyo/modules/box__bizhelp/appointment/templates/appointment/blocks/sidebar.html +++ /dev/null @@ -1,23 +0,0 @@ -{{ -sidebar_item( -'Home', -icon='fas fa-clock', -url=url_for('appointment.index') -) -}} - -{{ -sidebar_item( -'Add', -icon='fas fa-plus-circle', -url=url_for('appointment.add') -) -}} - -{{ -sidebar_item( -'Search', -icon='fas fa-search', -url=url_for('appointment.lookup') -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/templates/appointment/edit.html b/shopyo/modules/box__bizhelp/appointment/templates/appointment/edit.html deleted file mode 100644 index a40a854..0000000 --- a/shopyo/modules/box__bizhelp/appointment/templates/appointment/edit.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "appointments" %} -{% block pagehead %} -edit -{% endblock %} -{% block sidebar %} -{%include 'appointment/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-

Edit Appointment

-
- -
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- - -
- -
- -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/templates/appointment/index.html b/shopyo/modules/box__bizhelp/appointment/templates/appointment/index.html deleted file mode 100644 index 983694a..0000000 --- a/shopyo/modules/box__bizhelp/appointment/templates/appointment/index.html +++ /dev/null @@ -1,100 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "appointments" %} -{% block pagehead %} -Settings - -{% endblock %} -{% block sidebar %} -{%include 'appointment/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
- - - - - - - - - - - {% for appointment in appointments %} - - - - - - - - {% endfor %} - -
Meeting NameDateTime -
{{ appointment.name }}{{ appointment.date }}{{ appointment.time }} - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/templates/appointment/lookup.html b/shopyo/modules/box__bizhelp/appointment/templates/appointment/lookup.html deleted file mode 100644 index b4fd505..0000000 --- a/shopyo/modules/box__bizhelp/appointment/templates/appointment/lookup.html +++ /dev/null @@ -1,140 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "appointments" %} -{% block pagehead %} -add appointment - -{% endblock %} -{% block sidebar %} -{%include 'appointment/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
- -
-
- -
- -
-
-
-

- - - - - - - - - - - - {% for appointment in appointments %} - - - - - - - - {% endfor %} - -
Meeting NameDateTimeActive
{{ appointment.name }}{{ appointment.date }}{{ appointment.time }} - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/appointment/view.py b/shopyo/modules/box__bizhelp/appointment/view.py deleted file mode 100644 index a03593c..0000000 --- a/shopyo/modules/box__bizhelp/appointment/view.py +++ /dev/null @@ -1,143 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import jsonify -from flask import redirect -from flask import render_template -from flask import request - -from flask_login import login_required - -from shopyoapi.init import db -from shopyoapi.init import ma - -from modules.box__bizhelp.appointment.models import Appointments - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -appointment_blueprint = Blueprint( - "appointment", - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -class AppointmentSchema(ma.Schema): - class Meta: - # Fields to expose - fields = ("id", "name", "date", "time", "active") - - -appointment_schema = AppointmentSchema() -appointment_schema = AppointmentSchema(many=True) - - -@appointment_blueprint.route("/") -@login_required -def index(): - context = {} - - context["appointments"] = Appointments.query.all() - return render_template("appointment/index.html", **context) - - -@appointment_blueprint.route("/add", methods=["GET", "POST"]) -@login_required -def add(): - context = {} - - if request.method == "POST": - name = request.form["name"] - date = request.form["date"] - active = request.form["active"] - time = request.form["time"] - m = Appointments(name=name, date=date, time=time, active=active) - db.session.add(m) - db.session.commit() - return redirect("/appointment/add") - return render_template("appointment/add.html", **context) - - -@appointment_blueprint.route("/delete/", methods=["GET", "POST"]) -@login_required -def appointment_delete(ids): - Appointments.query.filter(Appointments.id == ids).delete() - db.session.commit() - return redirect("/appointment") - - -@appointment_blueprint.route("/edit/", methods=["GET", "POST"]) -@login_required -def appointment_edit(ids): - context = {} - - a = Appointments.query.get(ids) - context["id"] = a.id - context["name"] = a.name - context["date"] = a.date - context["time"] = a.time - context["active"] = a.active - return render_template("appointment/edit.html", **context) - - -@appointment_blueprint.route("/update", methods=["GET", "POST"]) -@login_required -def appointment_update(): - appointment_name = request.form["appointment_name"] - appointment_date = request.form["appointment_date"] - appointment_time = request.form["appointment_time"] - appointment_id = request.form["appointment_id"] - appointment_active = request.form["appointment_active"] - s = Appointments.query.get(appointment_id) - s.name = appointment_name - s.date = appointment_date - s.time = appointment_time - s.active = appointment_active - db.session.commit() - return redirect("/appointment") - - -@appointment_blueprint.route("/active/", methods=["GET", "POST"]) -@login_required -def active(ids): - s = Appointments.query.get(ids) - s.active = "active" - db.session.commit() - return redirect("/appointment") - - -@appointment_blueprint.route("/inactive/", methods=["GET", "POST"]) -@login_required -def deactive(ids): - s = Appointments.query.get(ids) - s.active = "inactive" - db.session.commit() - return redirect("/appointment") - - -@appointment_blueprint.route("/lookup", methods=["GET", "POST"]) -@login_required -def lookup(): - context = {} - context["appointments"] = Appointments.query.all() - return render_template("appointment/lookup.html", **context) - - -# api -@appointment_blueprint.route("/search/name/", methods=["GET", "POST"]) -@login_required -def search_name(name): - if name == "searchValueIsEmpty": - all_a = Appointments.query.all() - else: - all_a = Appointments.query.filter( - Appointments.name.like("%" + name + "%") - ).all() - result = appointment_schema.dump(all_a) - return jsonify(result) diff --git a/shopyo/modules/box__bizhelp/box_info.json b/shopyo/modules/box__bizhelp/box_info.json deleted file mode 100644 index b7f9669..0000000 --- a/shopyo/modules/box__bizhelp/box_info.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "display_string": "Bizhelp", - "box_name":"bizhelp", - "author": { - "name":"", - "website":"", - "mail":"" - } - } \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/contact/forms.py b/shopyo/modules/box__bizhelp/contact/forms.py deleted file mode 100644 index 495dfd3..0000000 --- a/shopyo/modules/box__bizhelp/contact/forms.py +++ /dev/null @@ -1,29 +0,0 @@ -from flask_wtf import FlaskForm - -# from wtforms.validators import Length -from wtforms import StringField -from wtforms import TextAreaField -from wtforms.fields.html5 import EmailField -from wtforms.validators import DataRequired - - -class ContactForm(FlaskForm): - name = StringField( - "Name", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - email = EmailField( - "Email", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - message = TextAreaField( - "Message", - [DataRequired()], - render_kw={ - "class": "form-control", - "rows": "20", - "autocomplete": "off", - }, - ) diff --git a/shopyo/modules/box__bizhelp/contact/global.py b/shopyo/modules/box__bizhelp/contact/global.py deleted file mode 100644 index f512c5e..0000000 --- a/shopyo/modules/box__bizhelp/contact/global.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import url_for - - -def get_contact_url(): - return url_for("contact.index") - - -available_everywhere = {"get_contact_url": get_contact_url} diff --git a/shopyo/modules/box__bizhelp/contact/info.json b/shopyo/modules/box__bizhelp/contact/info.json deleted file mode 100644 index 33d9d8f..0000000 --- a/shopyo/modules/box__bizhelp/contact/info.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "display_string": "Contact", - "type": "show", - "fa-icon": "fa fa-envelope", - "url_prefix": "/contact", - "dashboard": "/dashboard" -} diff --git a/shopyo/modules/box__bizhelp/contact/models.py b/shopyo/modules/box__bizhelp/contact/models.py deleted file mode 100644 index ce38b60..0000000 --- a/shopyo/modules/box__bizhelp/contact/models.py +++ /dev/null @@ -1,24 +0,0 @@ -from datetime import datetime - -from shopyoapi.init import db - - -class ContactMessage(db.Model): - - __tablename__ = "contact" - id = db.Column(db.Integer, primary_key=True) - created_date = db.Column(db.DateTime, default=datetime.now()) - name = db.Column(db.String(100)) - email = db.Column(db.String(100)) - message = db.Column(db.String(1024)) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__bizhelp/contact/templates/contact/blocks/sidebar.html b/shopyo/modules/box__bizhelp/contact/templates/contact/blocks/sidebar.html deleted file mode 100644 index aee0325..0000000 --- a/shopyo/modules/box__bizhelp/contact/templates/contact/blocks/sidebar.html +++ /dev/null @@ -1,13 +0,0 @@ -{{ -sidebar_item('Home', -icon='fa fa-envelope', -url=url_for('contact.dashboard') -) -}} - -{{ -sidebar_item('Contact Page', -icon='fa fa-globe', -url=url_for('contact.index') -) -}} diff --git a/shopyo/modules/box__bizhelp/contact/templates/contact/contact_form.html b/shopyo/modules/box__bizhelp/contact/templates/contact/contact_form.html deleted file mode 100644 index 84bda3f..0000000 --- a/shopyo/modules/box__bizhelp/contact/templates/contact/contact_form.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - {% include get_active_front_theme()+'/sections/resources.html'%} - {% include 'base/blocks/flashed_messages.html'%} - - - {% include get_active_front_theme()+'/sections/nav.html'%} - -
-
- -
- {{ form.name.label }}
-
-
- -
- {{ form.name }} -
-
- -
- {{ form.email.label }}
-
-
- -
- {{ form.email }} -
-
- -
- {{ form.message.label }}
-
-
- -
- {{ form.message }} -
-
-
- - -
-
- - - {% include get_active_front_theme()+'/sections/footer.html'%} - - - - - - - - - - - - diff --git a/shopyo/modules/box__bizhelp/contact/templates/contact/dashboard.html b/shopyo/modules/box__bizhelp/contact/templates/contact/dashboard.html deleted file mode 100644 index 2de2c94..0000000 --- a/shopyo/modules/box__bizhelp/contact/templates/contact/dashboard.html +++ /dev/null @@ -1,60 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='contact dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{%include 'contact/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
- - - - - - - - - {%for message in messages.items%} - - - - - - - - - - {%endfor%} - -
NameMailDateInfo
{{message.name}}{{message.email}}{{message.created_date}} - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/contact/tests/test_contact.py b/shopyo/modules/box__bizhelp/contact/tests/test_contact.py deleted file mode 100644 index 69a4894..0000000 --- a/shopyo/modules/box__bizhelp/contact/tests/test_contact.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -This file (test_contact.py) contains the functional tests for the -`contact` blueprint. - -These tests use GETs and POSTs to different endpoints to check for -the proper behavior of the `contact` blueprint. -""" -from flask import request -from flask import url_for - - -def test_contact_page(test_client): - """ - GIVEN a Flask application configured for testing, - WHEN the /contact page is requested (GET) - THEN check that the response is valid - """ - response = test_client.get("/contact/") - assert response.status_code == 200 - assert b"Name" in response.data - assert b"Email" in response.data - assert b"Message" in response.data - assert b"Submit" in response.data - - -def test_contact_dashboard(test_client): - """ - GIVEN a Flask application configured for testing, - WHEN the /contact/dashboard page is requested (GET) - THEN check that the response is valid - """ - # Logout and try to access the contact dashboard. It should redirect - response = test_client.get(url_for("auth.logout"), follow_redirects=True) - print(request.path) - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - # check request to contact correctly redirects to login page - response = test_client.get("/contact/dashboard", follow_redirects=True) - assert request.path == url_for("auth.login") - - # Login and try to access the contact dashboard. It should return OK - response = test_client.post( - url_for("auth.login"), - data=dict(email="admin1@domain.com", password="pass"), - follow_redirects=True, - ) - - # check if successfully logged in - assert response.status_code == 200 - - # check response is valid - response = test_client.get(url_for("contact.dashboard")) - assert response.status_code == 200 - assert b"Contact dashboard" in response.data - assert b"Name" in response.data - assert b"Mail" in response.data - assert b"Date" in response.data - assert b"Info" in response.data - assert b"View message" not in response.data - - -def test_contact_validate_msg(test_client): - """ - GIVEN a Flask application configured for testing, - WHEN POST request is made contact validate page - THEN check that the response is valid and that - the new validated message appears on contact dashboard - """ - # GET request should fail for validate message - # Currently test is uncommented since no return statement for - # validate_message for GET - # UNCOMMENT BELOW CODE AFTER FIXING validate_message - # response = test_client.get(url_for("contact.validate_message")) - # assert response.status_code != 200 - - # add a message - response = test_client.post( - url_for("contact.validate_message"), - data=dict( - name="User1", email="user1@gmail.com", message="User1 Message" - ), - follow_redirects=True, - ) - assert response.status_code == 200 - - # check if message was added successfully - response = test_client.get(url_for("contact.dashboard", page=1)) - assert response.status_code == 200 - assert b"Contact dashboard" in response.data - assert b"User1" in response.data - assert b"user1@gmail.com" in response.data - assert b"User1 Message" in response.data - assert b"View message" in response.data - - # change contact page and make sure the message is not there - response = test_client.get(url_for("contact.dashboard", page=2)) - assert response.status_code == 200 - assert b"User1" not in response.data - assert b"user1@gmail.com" not in response.data - assert b"User1 Message" not in response.data - assert b"View message" not in response.data diff --git a/shopyo/modules/box__bizhelp/contact/view.py b/shopyo/modules/box__bizhelp/contact/view.py deleted file mode 100644 index 91fedf9..0000000 --- a/shopyo/modules/box__bizhelp/contact/view.py +++ /dev/null @@ -1,62 +0,0 @@ -from flask import Blueprint -from flask import flash -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for - -from flask_login import login_required - -from shopyoapi.html import notify_success - -from .forms import ContactForm -from .models import ContactMessage - -contact_blueprint = Blueprint( - "contact", - __name__, - url_prefix="/contact", - template_folder="templates", -) - - -@contact_blueprint.route("/") -def index(): - context = {} - form = ContactForm() - - context.update({"form": form}) - return render_template("contact/contact_form.html", **context) - - -@contact_blueprint.route("/validate_message", methods=["GET", "POST"]) -@login_required -def validate_message(): - if request.method == "POST": - form = ContactForm() - if not form.validate_on_submit(): - flash_errors(form) - return redirect(url_for("contact.index")) - - name = form.name.data - email = form.email.data - message = form.message.data - - contact_message = ContactMessage( - name=name, email=email, message=message - ) - contact_message.insert() - flash(notify_success("Message submitted!")) - return redirect(url_for("contact.index")) - - -@contact_blueprint.route("/dashboard", methods=["GET"], defaults={"page": 1}) -@contact_blueprint.route("/dashboard/", methods=["GET"]) -@login_required -def dashboard(page): - context = {} - - per_page = 10 - messages = ContactMessage.query.paginate(page, per_page, error_out=False) - context.update({"messages": messages}) - return render_template("contact/dashboard.html", **context) diff --git a/shopyo/modules/box__bizhelp/page/forms.py b/shopyo/modules/box__bizhelp/page/forms.py deleted file mode 100644 index b9929e0..0000000 --- a/shopyo/modules/box__bizhelp/page/forms.py +++ /dev/null @@ -1,32 +0,0 @@ -from flask_wtf import FlaskForm - -# from wtforms.validators import Length -# from wtforms.fields.html5 import EmailField -from wtforms import StringField -from wtforms import TextAreaField -from wtforms.validators import DataRequired - -from shopyoapi.validators import verify_slug - - -class PageForm(FlaskForm): - - content = TextAreaField( - "Content", - [], - render_kw={ - "class": "form-control", - "rows": "20", - "autocomplete": "off", - }, - ) - slug = StringField( - "Slug", - [DataRequired(), verify_slug], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - title = StringField( - "Title", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) diff --git a/shopyo/modules/box__bizhelp/page/info.json b/shopyo/modules/box__bizhelp/page/info.json deleted file mode 100644 index 9d1f568..0000000 --- a/shopyo/modules/box__bizhelp/page/info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "display_string": "Page", - "module_name":"page", - "type": "show", - "fa-icon": "fa fa-edit", - "url_prefix": "/page", - "dashboard": "/dashboard" -} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/page/models.py b/shopyo/modules/box__bizhelp/page/models.py deleted file mode 100644 index 7a70290..0000000 --- a/shopyo/modules/box__bizhelp/page/models.py +++ /dev/null @@ -1,24 +0,0 @@ -from datetime import datetime - -from shopyoapi.init import db - - -class Page(db.Model): - - __tablename__ = "pages" - id = db.Column(db.Integer, primary_key=True) - created_date = db.Column(db.DateTime, default=datetime.now()) - title = db.Column(db.String(100)) - slug = db.Column(db.String(100)) - content = db.Column(db.String(1024)) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__bizhelp/page/templates/page/all_pages.html b/shopyo/modules/box__bizhelp/page/templates/page/all_pages.html deleted file mode 100644 index 2dfa3ed..0000000 --- a/shopyo/modules/box__bizhelp/page/templates/page/all_pages.html +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='page' %} - -{% block pagehead %} -{{active_page.capitalize()}} - - -{% endblock %} - -{% block content %} - -
- {%for page in pages%} - - -
- {{page.title}} -
- -
- - {%endfor%} -
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/page/templates/page/blocks/sidebar.html b/shopyo/modules/box__bizhelp/page/templates/page/blocks/sidebar.html deleted file mode 100644 index 7e1dbfa..0000000 --- a/shopyo/modules/box__bizhelp/page/templates/page/blocks/sidebar.html +++ /dev/null @@ -1,8 +0,0 @@ - -{{ -sidebar_item('Home', -icon='fa fa-pen', -url=url_for('page.dashboard') -)}} - -{{sidebar_item('All Pages', icon='fa fa-globe', url=url_for('page.index'))}} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/page/templates/page/dashboard.html b/shopyo/modules/box__bizhelp/page/templates/page/dashboard.html deleted file mode 100644 index eafaa0d..0000000 --- a/shopyo/modules/box__bizhelp/page/templates/page/dashboard.html +++ /dev/null @@ -1,90 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='page' %} -{% block pagehead %} -{{active_page.capitalize()}} - -{% endblock %} -{% block sidebar %} -{%include 'page/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-
-

New page

-
- {{ form.title.label }} -
-
- -
- {{ form.title }} - -
- {{ form.slug.label }} -
-
- -
- {{ form.slug }} - -
-
- {{ form.content.label }}
-
- {{ form.content }} -
-
- - -
-
-
-
- - - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/page/templates/page/view_page.html b/shopyo/modules/box__bizhelp/page/templates/page/view_page.html deleted file mode 100644 index a5b6dc3..0000000 --- a/shopyo/modules/box__bizhelp/page/templates/page/view_page.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='page' %} - -{% block pagehead %} -{{active_page.capitalize()}} - - -{% endblock %} - -{% block content %} - -
-
-
-

{{page.title}}

-
-
- {{page.content | safe}} -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/page/view.py b/shopyo/modules/box__bizhelp/page/view.py deleted file mode 100644 index a32b1e3..0000000 --- a/shopyo/modules/box__bizhelp/page/view.py +++ /dev/null @@ -1,83 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for - -from flask_login import login_required - -from shopyoapi.forms import flash_errors - -from .forms import PageForm -from .models import Page - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - -module_name = module_info["module_name"] - -sidebar = [{"text": "sample", "icon": "fa fa-table", "url": ""}] - -module_settings = {"sidebar": sidebar} - - -@module_blueprint.route("/") -def index(): - context = {} - pages = Page.query.all() - - context.update({"pages": pages}) - return render_template("page/all_pages.html", **context) - - -@module_blueprint.route("//") -def view_page(page_id, slug): - context = {} - page = Page.query.get(page_id) - - context.update({"page": page}) - return render_template("page/view_page.html", **context) - - -@module_blueprint.route(module_info["dashboard"]) -@login_required -def dashboard(): - context = {} - form = PageForm() - - context.update({"form": form, "module_name": module_name}) - context.update(module_settings) - return render_template("page/dashboard.html", **context) - - -@module_blueprint.route("/check_pagecontent", methods=["GET", "POST"]) -@login_required -def check_pagecontent(): - if request.method == "POST": - form = PageForm() - if not form.validate_on_submit(): - flash_errors(form) - return redirect(url_for("{}.dashboard".format(module_name))) - toaddpage = Page( - slug=form.slug.data, - content=form.content.data, - title=form.title.data, - ) - toaddpage.insert() - return redirect(url_for("{}.dashboard".format(module_name))) diff --git a/shopyo/modules/box__bizhelp/people/__init__.py b/shopyo/modules/box__bizhelp/people/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__bizhelp/people/info.json b/shopyo/modules/box__bizhelp/people/info.json deleted file mode 100644 index b8f70df..0000000 --- a/shopyo/modules/box__bizhelp/people/info.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "display_string": "People", - "type": "show", - "fa-icon": "fa fa-users", - "url_prefix": "/people", - "author": { - "name": "Abdur-Rahmaan Janhangeer", - "website": "https://www.pythonkitchen.com/about-me/", - "mail": "arj.python@gmail.com" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/models.py b/shopyo/modules/box__bizhelp/people/models.py deleted file mode 100644 index 5b9dd86..0000000 --- a/shopyo/modules/box__bizhelp/people/models.py +++ /dev/null @@ -1,20 +0,0 @@ -from shopyoapi.init import db - - -class People(db.Model): - __tablename__ = "people" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100)) - phone = db.Column(db.Integer) - mobile = db.Column(db.Integer) - email = db.Column(db.String(100)) - facebook = db.Column(db.String(128)) - twitter = db.Column(db.String(128)) - linkedin = db.Column(db.String(128)) - age = db.Column(db.Integer) - birthday = db.Column(db.String(100)) - notes = db.Column(db.String(100)) - is_manufacturer = db.Column(db.Boolean) - manufacturer_name = db.Column(db.String(100)) - manufacturer_phone = db.Column(db.Integer) - manufacturer_address = db.Column(db.String(200)) diff --git a/shopyo/modules/box__bizhelp/people/templates/people/add.html b/shopyo/modules/box__bizhelp/people/templates/people/add.html deleted file mode 100644 index 47e465b..0000000 --- a/shopyo/modules/box__bizhelp/people/templates/people/add.html +++ /dev/null @@ -1,141 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='people' %} -{% block pagehead %} -add people -{% endblock %} -{% block sidebar %} -{%include 'people/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
-
-

Add People

-
-
-
- -
- - {{message}} -
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
- -
-
- - -
-
- - -
- - -
-
- -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/templates/people/blocks/sidebar.html b/shopyo/modules/box__bizhelp/people/templates/people/blocks/sidebar.html deleted file mode 100644 index edbebab..0000000 --- a/shopyo/modules/box__bizhelp/people/templates/people/blocks/sidebar.html +++ /dev/null @@ -1,24 +0,0 @@ - -{{ -sidebar_item( -'Home', -icon='fas fa-users', -url=url_for('people.index') -) -}} - -{{ -sidebar_item( -'Add', -icon='fas fa-plus-circle', -url=url_for('people.people_add') -) -}} - -{{ -sidebar_item( -'Search', -icon='fas fa-search', -url=url_for('people.lookup') -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/templates/people/edit.html b/shopyo/modules/box__bizhelp/people/templates/people/edit.html deleted file mode 100644 index f8206cf..0000000 --- a/shopyo/modules/box__bizhelp/people/templates/people/edit.html +++ /dev/null @@ -1,143 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='people' %} -{% block pagehead %} -edit -{% endblock %} -{% block sidebar %} -{%include 'people/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
- back -
-
- -
-
-
- -
- -
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- - -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- - -
-
- -
- -
- -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/templates/people/index.html b/shopyo/modules/box__bizhelp/people/templates/people/index.html deleted file mode 100644 index f264d86..0000000 --- a/shopyo/modules/box__bizhelp/people/templates/people/index.html +++ /dev/null @@ -1,107 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='people' %} -{% block pagehead %} -People - -{% endblock %} -{% block sidebar %} -{%include 'people/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
-
- - - - - - - - - - - - {%for person in people%} - - - - - - - - - - - {%endfor%} - -
NamePhoneEmailNote
{{person.name}}{{person.phone}}{{person.email}}{{person.notes}} - - - - - - - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/templates/people/lookup.html b/shopyo/modules/box__bizhelp/people/templates/people/lookup.html deleted file mode 100644 index 292f16e..0000000 --- a/shopyo/modules/box__bizhelp/people/templates/people/lookup.html +++ /dev/null @@ -1,127 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "people" %} -{% block pagehead %} -add people - -{% endblock %} -{% block sidebar %} -{%include 'people/blocks/sidebar.html'%} -{%endblock%} -{% block content %} - -
-
-
-
-
- -
- -
-
-
-

- - - - - - - - - - - - {% for person in people %} - - - - - - - - {% endfor %} - -
NamePhoneEmailNote
{{ person.name }}{{ person.phone }}{{ person.email }}{{ person.notes }} - - - - - - - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__bizhelp/people/view.py b/shopyo/modules/box__bizhelp/people/view.py deleted file mode 100644 index fea1657..0000000 --- a/shopyo/modules/box__bizhelp/people/view.py +++ /dev/null @@ -1,226 +0,0 @@ -import datetime -import json -import os - -from flask import Blueprint -from flask import jsonify -from flask import redirect -from flask import render_template -from flask import request - -from flask_login import login_required - -from shopyoapi.init import db -from shopyoapi.init import ma - -from modules.box__bizhelp.people.models import People - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -people_blueprint = Blueprint( - "people", - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -class PeopleSchema(ma.Schema): - class Meta: - # Fields to expose - fields = ( - "id", - "name", - "phone", - "mobile", - "email", - "facebook", - "twitter", - "linkedin", - "age", - "birthday", - "notes", - "is_manufacturer", - "manufacturer_name", - "manufacturer_phone", - "manufacturer_address", - ) - - -people_schema = PeopleSchema() -people_schema = PeopleSchema(many=True) - - -@people_blueprint.route("/") -@login_required -def index(): - context = {} - - context["people"] = People.query.all() - return render_template("people/index.html", **context) - - -@people_blueprint.route("/add", methods=["GET", "POST"]) -@login_required -def people_add(): - context = {} - - if request.method == "POST": - name = request.form["name"] - phone = request.form["phone"] - mobile = request.form["mobile"] - email = request.form["email"] - linkedin = request.form["linkedin"] - facebook = request.form["facebook"] - twitter = request.form["twitter"] - birthday = request.form["birthday"] - notes = request.form["notes"] - is_manufacturer = request.form.get("is_manufacturer", False) - manufacturer_name = request.form.get("manufacturer_name", "") - manufacturer_phone = request.form.get("manufacturer_phone", None) - manufacturer_address = request.form.get("manufacturer_address", "") - - # check if is_manufacturer is true - if is_manufacturer == "on": - is_manufacturer = True - - # calculate age - today_date = datetime.date.today() - date_format = "%Y-%m-%d" - b_day = datetime.datetime.strptime(birthday, date_format) - age = ( - today_date.year - - b_day.year - - ((today_date.month, today_date.day) < (b_day.month, b_day.day)) - ) - - # insert data into DB - person = People( - name=name, - phone=phone, - mobile=mobile, - email=email, - linkedin=linkedin, - facebook=facebook, - twitter=twitter, - age=age, - birthday=birthday, - notes=notes, - is_manufacturer=is_manufacturer, - manufacturer_name=manufacturer_name, - manufacturer_phone=manufacturer_phone, - manufacturer_address=manufacturer_address, - ) - db.session.add(person) - db.session.commit() - return redirect("/people/add") - context["message"] = "" - return render_template("people/add.html", **context) - - -@people_blueprint.route("/delete/", methods=["GET", "POST"]) -@login_required -def people_delete(id): - People.query.filter(People.id == id).delete() - db.session.commit() - return redirect("/people") - - -@people_blueprint.route("/edit/", methods=["GET", "POST"]) -@login_required -def people_edit(id): - context = {} - - a = People.query.get(id) - - context["id"] = a.id - context["name"] = a.name - context["phone"] = a.phone - context["mobile"] = a.mobile - context["email"] = a.email - context["linkedin"] = a.linkedin - context["facebook"] = a.facebook - context["twitter"] = a.twitter - context["age"] = a.age - context["birthday"] = a.birthday - context["notes"] = a.notes - context["is_manufacturer"] = a.is_manufacturer - context["manufacturer_name"] = a.manufacturer_name - context["manufacturer_phone"] = a.manufacturer_phone - context["manufacturer_address"] = a.manufacturer_address - return render_template("people/edit.html", **context) - - -@people_blueprint.route("/update", methods=["GET", "POST"]) -@login_required -def people_update(): - if request.method == "POST": - people_id = request.form["id"] - people_name = request.form["name"] - people_phone = request.form["phone"] - people_mobile = request.form["mobile"] - people_email = request.form["email"] - people_linkedin = request.form["linkedin"] - people_facebook = request.form["facebook"] - people_twitter = request.form["twitter"] - people_birthday = request.form["birthday"] - people_notes = request.form["notes"] - people_is_manufacturer = request.form.get("is_manufacturer", False) - people_manufacturer_name = request.form.get("manufacturer_name", "") - people_manufacturer_phone = request.form.get - ("manufacturer_phone", None) - people_manufacturer_address = request.form.get - ("manufacturer_address", "") - - # check if is_manufacturer is true - if people_is_manufacturer == "on": - people_is_manufacturer = True - - # calculate age - today_date = datetime.datetime.now() - time_format = "%Y-%m-%d" - b_day = datetime.datetime.strptime(people_birthday, time_format) - people_age = str(today_date - b_day) - # retrive record from db with id - s = People.query.get(people_id) - s.name = people_name - s.phone = people_phone - s.mobile = people_mobile - s.email = people_email - s.facebook = people_facebook - s.linkedin = people_linkedin - s.twitter = people_twitter - s.birthday = people_birthday - s.notes = people_notes - s.age = people_age - s.is_manufacturer = people_is_manufacturer - s.manufacturer_name = people_manufacturer_name - s.manufacturer_phone = people_manufacturer_phone - s.manufacturer_address = people_manufacturer_address - db.session.commit() - - return redirect("/people") - - -@people_blueprint.route("/lookup", methods=["GET", "POST"]) -@login_required -def lookup(): - context = {} - context["people"] = People.query.all() - return render_template("people/lookup.html", **context) - - -# api -@people_blueprint.route("/search/name/", methods=["GET", "POST"]) -@login_required -def search_name(name): - if name == "searchValueIsEmpty": - all_a = People.query.all() - else: - all_a = People.query.filter(People.name.like("%" + name + "%")).all() - result = people_schema.dump(all_a) - return jsonify(result) diff --git a/shopyo/modules/box__default/admin/__init__.py b/shopyo/modules/box__default/admin/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__default/admin/admin.py b/shopyo/modules/box__default/admin/admin.py deleted file mode 100644 index ea7b807..0000000 --- a/shopyo/modules/box__default/admin/admin.py +++ /dev/null @@ -1,32 +0,0 @@ -from functools import wraps - -from flask import flash -from flask import redirect -from flask import url_for - -from flask_login import current_user - -from shopyoapi.init import login_manager -from shopyoapi.html import notify_warning - -from modules.box__default.admin.models import User - -login_manager.login_view = "auth.login" -login_manager.login_message = notify_warning("Please login for access") - - -@login_manager.user_loader -def load_user(id): - return User.query.get(id) - - -def admin_required(f): - @wraps(f) - def wrap(*args, **kwargs): - if current_user.is_anonymous or current_user.is_admin: - return f(*args, **kwargs) - else: - flash(notify_warning("You need to be an admin to view this page.")) - return redirect(url_for("dashboard.index")) - - return wrap diff --git a/shopyo/modules/box__default/admin/info.json b/shopyo/modules/box__default/admin/info.json deleted file mode 100644 index eeeca49..0000000 --- a/shopyo/modules/box__default/admin/info.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "display_string": "Admin", - "type": "show", - "fa-icon": "fas fa-user-lock", - "url_prefix": "/admin", - "author": { - "name":"Abdur-Rahmaan Janhangeer", - "website":"https://www.pythonkitchen.com/about-me/", - "mail":"arj.python@gmail.com" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/models.py b/shopyo/modules/box__default/admin/models.py deleted file mode 100644 index c931b30..0000000 --- a/shopyo/modules/box__default/admin/models.py +++ /dev/null @@ -1,115 +0,0 @@ -""" -.. module:: AdminModels - :synopsis: Contains model of a user Record - -""" -import datetime -from sqlalchemy.ext.hybrid import hybrid_property -from flask_login import AnonymousUserMixin -from flask_login import UserMixin -from flask_login import login_manager -from itsdangerous import URLSafeTimedSerializer -from werkzeug.security import check_password_hash -from werkzeug.security import generate_password_hash - -from shopyoapi.init import db -from shopyoapi.models import PkModel - -role_user_link = db.Table( - "role_user_link", - db.Column( - "user_id", - db.Integer, - db.ForeignKey("users.id", ondelete="CASCADE"), - primary_key=True, - ), - db.Column( - "role_id", - db.Integer, - db.ForeignKey("roles.id", ondelete="CASCADE"), - primary_key=True, - ), -) - - -class AnonymousUser(AnonymousUserMixin): - def set_password(self, password): - return False - - def check_password(self, password): - return False - - def avatar(self, size): - return False - - @property - def is_admin(self): - return False - - # def get_reset_password_token(self, expires_in=current_app.config['FORGOT_PASSWORD_TOKEN_EXPIRE']): - # return False - - -login_manager.anonymous_user = AnonymousUser - - -class User(UserMixin, PkModel): - """The user of the app""" - - __tablename__ = "users" - - username = db.Column(db.String(100), unique=True) - _password = db.Column(db.String(128), nullable=False) - first_name = db.Column(db.String(128)) - last_name = db.Column(db.String(128)) - is_admin = db.Column(db.Boolean, default=False) - email = db.Column(db.String(120), unique=True, nullable=False) - date_registered = db.Column( - db.DateTime, nullable=False, default=datetime.datetime.now() - ) - is_email_confirmed = db.Column(db.Boolean(), nullable=False, default=False) - email_confirm_date = db.Column(db.DateTime) - is_customer = db.Column(db.Boolean, default=False) - - # A user can have many roles and a role can have many users - roles = db.relationship( - "Role", - secondary=role_user_link, - backref="users", - ) - - @hybrid_property - def password(self): - return self._password - - @password.setter - def password(self, plaintext): - self._password = generate_password_hash(plaintext, method="sha256") - - def check_hash(self, password): - return check_password_hash(self._password, password) - - def generate_confirmation_token(self, email): - serializer = URLSafeTimedSerializer(app.config["SECRET_KEY"]) - return serializer.dumps(email, salt=app.config["PASSWORD_SALT"]) - - @staticmethod - def confirm_mail_token(self, token, expiration=3600): - serializer = URLSafeTimedSerializer(app.config["SECRET_KEY"]) - try: - email = serializer.loads( - token, salt=app.config["PASSWORD_SALT"], max_age=expiration - ) - except: - return False - return email - - def __repr__(self): - return "User: {}".format(self.email) - - -class Role(PkModel): - """A role for a user.""" - - __tablename__ = "roles" - name = db.Column(db.String(100), nullable=False) diff --git a/shopyo/modules/box__default/admin/templates/admin/add.html b/shopyo/modules/box__default/admin/templates/admin/add.html deleted file mode 100644 index 142d088..0000000 --- a/shopyo/modules/box__default/admin/templates/admin/add.html +++ /dev/null @@ -1,86 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "admin" %} -{% block pagehead %} -{{active_page.capitalize()}} - -{% endblock %} -{% block sidebar %} -{%include 'admin/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-
-
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- -
- -
-
-
- - -
-
- - - {%for role in roles%} - - - - - {%endfor%} - -
{{role.name}}
- - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/templates/admin/blocks/sidebar.html b/shopyo/modules/box__default/admin/templates/admin/blocks/sidebar.html deleted file mode 100644 index 56a4b41..0000000 --- a/shopyo/modules/box__default/admin/templates/admin/blocks/sidebar.html +++ /dev/null @@ -1,25 +0,0 @@ -{{ -sidebar_item( -'Home', -icon='fas fa-user-lock', -url=url_for('admin.user_list') -) -}} - - -{{ -sidebar_item( -'Add', -icon='fas fa-plus-circle', -url=url_for('admin.user_add') -) -}} - - -{{ -sidebar_item( -'Roles', -icon='fa fa-shield-alt', -url=url_for('admin.roles') -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/templates/admin/edit.html b/shopyo/modules/box__default/admin/templates/admin/edit.html deleted file mode 100644 index c10a88a..0000000 --- a/shopyo/modules/box__default/admin/templates/admin/edit.html +++ /dev/null @@ -1,69 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "admin" %} -{% block pagehead %} -edit -{% endblock %} -{% block sidebar %} -{%include 'admin/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

Edit User

-
- -
-
-
-
- -
- -
-
-
- -
- -
-
-
- - -
-
-
-
- -
- -
-
-
- -
- -
- -
- Roles
- - - {%for role in roles%} - - - - - {%endfor%} - -
{{role.name}}
-
-
- - -
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/templates/admin/index.html b/shopyo/modules/box__default/admin/templates/admin/index.html deleted file mode 100644 index 57dedc5..0000000 --- a/shopyo/modules/box__default/admin/templates/admin/index.html +++ /dev/null @@ -1,81 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='admin' %} -{% block pagehead %} -{{active_page.capitalize()}} - -{% endblock %} -{% block sidebar %} -{%include 'admin/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
-
-

{{active_page.capitalize()}}

- - - - - - - - - - - - - {% for user in users %} - - - - - - - - - {% endfor %} - -
IDEmailPasswordAdminRoles
{{user.id}}{{user.email}}*******{{user.is_admin}} - {%for role in user.roles%} -
- {{role.name}} -
- {%endfor%} -
-
- - - -   - - - -
-
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/templates/admin/roles.html b/shopyo/modules/box__default/admin/templates/admin/roles.html deleted file mode 100644 index 562e0bb..0000000 --- a/shopyo/modules/box__default/admin/templates/admin/roles.html +++ /dev/null @@ -1,40 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = "admin" %} -{% block pagehead %} -{% endblock %} -{% block sidebar %} -{%include 'admin/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

Roles

-
-
-
- -
- -
-
- - - {%for role in roles%} - - - - - - - - - - {%endfor%} - -
- delete
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/admin/tests/test_admin.py b/shopyo/modules/box__default/admin/tests/test_admin.py deleted file mode 100644 index 9e3c8fe..0000000 --- a/shopyo/modules/box__default/admin/tests/test_admin.py +++ /dev/null @@ -1,365 +0,0 @@ -""" -This file (test_admin.py) contains the functional tests for -the `admin` blueprint. - -These tests use GETs and POSTs to different endpoints to check -for the proper behavior of the `admin` blueprint. -""" -import os -import json -import pytest -from flask import request -from flask import url_for -from modules.box__default.admin.models import Role -from modules.box__default.admin.models import User -from modules.box__default.admin.models import role_user_link - - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_path = os.path.dirname(dirpath) - -module_info = None - -with open(os.path.join(module_path, "info.json")) as f: - module_info = json.load(f) - - -class TestAdminInvalidAuth: - """ - Test all admin routes for correct user authentication - """ - - routes_get = [ - "/", - "/add", - "/delete/", - "/edit/", - "/roles", - "/roles//delete", - ] - - routes_post = ["/update", "/roles/update", "/roles/add", "/add"] - - @pytest.mark.parametrize("route", routes_get) - def test_redirect_if_not_logged_in_get(self, test_client, route, auth): - auth.logout() - response = test_client.get( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - @pytest.mark.parametrize("route", routes_post) - def test_redirect_if_not_logged_in_post(self, test_client, route, auth): - auth.logout() - response = test_client.post( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - @pytest.mark.usefixtures("login_non_admin_user") - @pytest.mark.parametrize("route", routes_get) - def test_no_admin_access_if_not_admin_get(self, test_client, route): - response = test_client.get( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("dashboard.index") - assert b"You need to be an admin to view this page" in response.data - - @pytest.mark.usefixtures("login_non_admin_user") - @pytest.mark.parametrize("route", routes_post) - def test_no_admin_access_if_not_admin_post(self, test_client, route): - response = test_client.post( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("dashboard.index") - assert b"You need to be an admin to view this page" in response.data - - -@pytest.mark.usefixtures("login_admin_user") -class TestAdminAPI: - """ - Test all admin api post and get requests - """ - - def test_admin_user_list_get(self, test_client): - response = test_client.get(f"{module_info['url_prefix']}/") - - assert response.status_code == 200 - assert b"Admin" in response.data - assert b"id" in response.data - assert b"Email" in response.data - assert b"Password" in response.data - assert b"Roles" in response.data - - def test_admin_add_get(self, test_client): - response = test_client.get(f"{module_info['url_prefix']}/add") - - assert response.status_code == 200 - assert b"Email" in response.data - assert b"Password" in response.data - assert b"First Name" in response.data - assert b"Last Name" in response.data - assert b"Admin User" in response.data - - def test_admin_add_unique_user_post(self, test_client): - role1 = Role.create(name="test1-role") - role2 = Role.create(name="test2-role") - data = { - "email": "test@gmail.com", - "password": "pass", - "first_name": "Test", - "last_name": "User", - "is_admin": "", - f"role_{role1.id}": "", - f"role_{role2.id}": "", - } - - test_client.post( - f"{module_info['url_prefix']}/add", - data=data, - follow_redirects=True, - ) - test_user = User.query.filter(User.email == "test@gmail.com").scalar() - - assert test_user is not None - assert test_user.first_name == "Test" - assert test_user.last_name == "User" - assert test_user.is_admin is False - assert test_user.roles is not None - assert len(test_user.roles) == 2 - assert role1.users[0].email == "test@gmail.com" - assert role2.users[0].email == "test@gmail.com" - - def test_admin_add_existing_user_post(self, test_client): - User.create(email="test@gmail.com", password="pass") - data = { - "email": "test@gmail.com", - "password": "pass", - "first_name": "Test", - "last_name": "User", - "is_admin": "", - } - - response = test_client.post( - f"{module_info['url_prefix']}/add", - data=data, - follow_redirects=True, - ) - test_users = User.query.filter(User.email == "test@gmail.com").count() - - assert response.status_code == 200 - assert b"User with same email already exists" in response.data - assert test_users == 1 - - def test_admin_delete_existing_user_get(self, test_client): - user = User(email="test@gmail.com", password="pass") - role1 = Role(name="test1-role") - role2 = Role(name="test2-role") - user.roles = [role1, role2] - user.save() - - response = test_client.get( - f"{module_info['url_prefix']}/delete/{user.id}", - follow_redirects=True, - ) - test_user = User.query.filter(User.email == user.email).scalar() - test_roles = Role.query.count() - user_role = ( - User.query.join(role_user_link) - .join(Role) - .filter(User.id == user.id) - .scalar() - ) - - assert response.status_code == 200 - assert test_user is None - assert user_role is None - assert test_roles == 2 - - def test_admin_delete_nonexisting_user_get(self, test_client): - response = test_client.get( - f"{module_info['url_prefix']}/delete/some_id", - follow_redirects=True, - ) - - assert response.status_code == 200 - assert b"Unable to delete. Invalid user id" in response.data - - def test_admin_edit_existing_user_get(self, test_client): - user = User.create(email="test@gmail.com", password="pass") - - response = test_client.get( - f"{module_info['url_prefix']}/edit/{user.id}", - ) - - assert response.status_code == 200 - assert b"test@gmail.com" in response.data - assert b"Edit User" in response.data - - def test_admin_edit_nonexisting_user_get(self, test_client): - response = test_client.get( - f"{module_info['url_prefix']}/edit/some-id", follow_redirects=True - ) - - assert response.status_code == 200 - assert b"Invalid user id" in response.data - assert request.path == f"{module_info['url_prefix']}/" - - def test_admin_update_user_adding_new_roles_to_user(self, test_client): - user = User.create(email="foo@gmail.com", password="pass") - role1 = Role.create(name="test1-role") - role2 = Role.create(name="test2-role") - data = { - "id": str(user.id), - "email": "bar@gmail.com", - "password": "newpass", - "first_name": "Test", - "last_name": "User", - "is_admin": "", - f"role_{role1.id}": "", - f"role_{role2.id}": "", - } - - response = test_client.post( - f"{module_info['url_prefix']}/update", - data=data, - follow_redirects=True, - ) - - assert response.status_code == 200 - assert user.email == "bar@gmail.com" - assert user.check_hash("newpass") - assert user.first_name == "Test" - assert user.last_name == "User" - assert len(user.roles) == 2 - assert role1.users[0].email == "bar@gmail.com" - assert role2.users[0].email == "bar@gmail.com" - - def test_admin_update_user_remove_old_roles_from_user(self, test_client): - user = User(email="foo@gmail.com", password="pass", is_admin=True) - user.is_admin = True - role1 = Role(name="test1-role") - role2 = Role(name="test2-role") - user.roles = [role1, role2] - user.save() - data = { - "id": str(user.id), - "email": "bar@gmail.com", - "first_name": "Test", - "last_name": "User", - "password": " ", - "is_admin": None, - } - - response = test_client.post( - f"{module_info['url_prefix']}/update", - data=data, - follow_redirects=True, - ) - - assert response.status_code == 200 - assert user.email == "bar@gmail.com" - assert user.check_hash("pass") - assert len(user.roles) == 0 - assert len(role1.users) == 0 - assert len(role2.users) == 0 - - def test_admin_roles_get(self, test_client): - response = test_client.get(f"{module_info['url_prefix']}/roles") - - assert response.status_code == 200 - assert b"Roles" in response.data - - def test_admin_roles_add_nonexisting_role_post(self, test_client): - response = test_client.post( - f"{module_info['url_prefix']}/roles/add", - data=dict(name="new-role"), - follow_redirects=True, - ) - - role = Role.query.filter(Role.name == "new-role").scalar() - role_count = Role.query.count() - - assert response.status_code == 200 - assert role is not None - assert role_count == 1 - - def test_admin_roles_add_existing_role_post(self, test_client): - Role.create(name="new-role") - - response = test_client.post( - f"{module_info['url_prefix']}/roles/add", - data=dict(name="new-role"), - follow_redirects=True, - ) - role_count = Role.query.count() - role = Role.query.filter(Role.name == "new-role").scalar() - - assert response.status_code == 200 - assert b"Role already exists" in response.data - assert role is not None - assert role_count == 1 - - def test_admin_roles_delete_nonexisting_role_get(self, test_client): - response = test_client.get( - f"{module_info['url_prefix']}/roles/some-id/delete", - follow_redirects=True, - ) - - assert response.status_code == 200 - assert request.path == f"{module_info['url_prefix']}/roles" - assert b"Unable to delete. Invalid role id" in response.data - - def test_admin_roles_delete_existing_role_get(self, test_client): - role1 = Role.create(name="new-role1") - role2 = Role.create(name="new-role2") - - response = test_client.get( - f"{module_info['url_prefix']}/roles/{role1.id}/delete", - follow_redirects=True, - ) - roles = Role.query.all() - - assert response.status_code == 200 - assert request.path == f"{module_info['url_prefix']}/roles" - assert b"Role successfully deleted" in response.data - assert roles is not None - assert roles[0].name == role2.name - assert len(roles) == 1 - - def test_admin_roles_update_nonexisting_role_post(self, test_client): - response = test_client.post( - f"{module_info['url_prefix']}/roles/update", - data=dict(role_id="some-id"), - follow_redirects=True, - ) - roles = Role.query.count() - - assert response.status_code == 200 - assert request.path == f"{module_info['url_prefix']}/roles" - assert b"Unable to update. Role does not exist" in response.data - assert roles == 0 - - def test_admin_roles_update_existing_role_post(self, test_client): - new_role = Role.create(name="new-role1") - - response = test_client.post( - f"{module_info['url_prefix']}/roles/update", - data=dict(role_id=new_role.id, role_name="update-role"), - follow_redirects=True, - ) - role = Role.query.scalar() - - assert response.status_code == 200 - assert request.path == f"{module_info['url_prefix']}/roles" - assert b"Role successfully updated" in response.data - assert role is not None - assert role.name == "update-role" diff --git a/shopyo/modules/box__default/admin/tests/test_models.py b/shopyo/modules/box__default/admin/tests/test_models.py deleted file mode 100644 index 05b4326..0000000 --- a/shopyo/modules/box__default/admin/tests/test_models.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -This file (test_model.py) contains the units tests for -the `admin` models. -""" - - -def test_new_user(new_user): - """ - GIVEN a User model - WHEN a new User is created - THEN check the email, password, admin privilege - """ - assert new_user.email == "newuser@domain.com" - assert new_user.password != "pass" - assert not new_user.is_admin diff --git a/shopyo/modules/box__default/admin/upload.py b/shopyo/modules/box__default/admin/upload.py deleted file mode 100644 index abfb38f..0000000 --- a/shopyo/modules/box__default/admin/upload.py +++ /dev/null @@ -1,25 +0,0 @@ -import json -import datetime -from app import app -from modules.box__default.admin.models import User - - -def add_admin(email, password): - with app.app_context(): - user = User() - user.email = email - user.password = password - user.is_admin = True - user.email_confirmed = True - user.email_confirm_date = datetime.datetime.now() - user.save() - - -def upload(): - with open("config.json", "r") as config: - config = json.load(config) - print("Initialising User") - print("Adding Admin ...") - add_admin( - config["admin_user"]["email"], config["admin_user"]["password"] - ) diff --git a/shopyo/modules/box__default/admin/view.py b/shopyo/modules/box__default/admin/view.py deleted file mode 100644 index 024221f..0000000 --- a/shopyo/modules/box__default/admin/view.py +++ /dev/null @@ -1,251 +0,0 @@ -""" -.. module:: AdminViews - :synopsis: All endpoints of the admin views are defined here. - -""" -import json -import os - -from flask import Blueprint -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for -from flask import flash - -from flask_login import login_required -from sqlalchemy import exists - -# from config import Config - -from shopyoapi.init import db - -from modules.box__default.admin.admin import admin_required -from modules.box__default.admin.models import Role -from modules.box__default.admin.models import User -from shopyoapi.html import notify_warning -from shopyoapi.html import notify_success - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -admin_blueprint = Blueprint( - "admin", - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -@admin_blueprint.route("/") -@login_required -@admin_required -def user_list(): - """ - **Get The List of User** - - Lists all users in the database. - - """ - context = {} - context["users"] = User.query.all() - return render_template("admin/index.html", **context) - - -@admin_blueprint.route("/add", methods=["GET", "POST"]) -@login_required -@admin_required -def user_add(): - """ - **Adds a User** - - adds a user to database. - - """ - context = {} - if request.method == "POST": - email = request.form["email"] - password = request.form["password"] - first_name = request.form["first_name"] - last_name = request.form["last_name"] - admin_user = request.form.get("is_admin") - if admin_user == "True": - is_admin = True - else: - is_admin = False - - has_user = db.session.query( - exists().where(User.email == email) - ).scalar() - - if not has_user: - new_user = User() - new_user.email = email - new_user.is_admin = is_admin - new_user.first_name = first_name - new_user.last_name = last_name - new_user.password = password - - for key in request.form: - if key.startswith("role_"): - role_id = key.split("_")[1] - role = Role.get_by_id(role_id) - new_user.roles.append(role) - new_user.save() - return redirect(url_for("admin.user_add")) - - flash(notify_warning("User with same email already exists")) - - context["roles"] = Role.query.all() - return render_template("admin/add.html", **context) - - -@admin_blueprint.route("/delete/", methods=["GET"]) -@login_required -@admin_required -def admin_delete(id): - """ - **Delete a User** - - :param id: id of the user - :type id: int - - """ - user = User.query.get(id) - - if user is None: - flash(notify_warning("Unable to delete. Invalid user id")) - return redirect("/admin") - - user.delete() - flash(notify_success("User successfully deleted")) - return redirect("/admin") - - -@admin_blueprint.route("/edit/", methods=["GET"]) -@login_required -@admin_required -def admin_edit(id): - """ - **Update information for a User** - - :param id: id of the user - :type id: int - - """ - context = {} - user = User.query.get(id) - - if user is None: - flash(notify_warning("Unable to edit. Invalid user id")) - return redirect("/admin") - - context["user"] = user - context["user_roles"] = [r.name for r in user.roles] - context["roles"] = Role.query.all() - return render_template("admin/edit.html", **context) - - -@admin_blueprint.route("/update", methods=["POST"]) -@login_required -@admin_required -def admin_update(): - """ - **Update a User record** - - """ - id = request.form["id"] - password = request.form["password"] - email = request.form["email"] - first_name = request.form["first_name"] - last_name = request.form["last_name"] - is_admin = request.form.get("is_admin") - - if is_admin: - is_admin = True - else: - is_admin = False - - user = User.query.get(id) - - if user is None: - flash(notify_warning("Unable to update. User does not exist.")) - return redirect("/admin") - - user.is_admin = is_admin - user.email = email - user.first_name = first_name - user.last_name = last_name - user.roles[:] = [] - - if password.strip(): - user.password = password - - for key in request.form: - if key.startswith("role_"): - role_id = key.split("_")[1] - role = Role.get_by_id(role_id) - user.roles.append(role) - - user.update() - flash(notify_success("User successfully updated")) - return redirect("/admin") - - -@admin_blueprint.route("/roles") -@login_required -@admin_required -def roles(): - context = {} - context["roles"] = Role.query.all() - return render_template("admin/roles.html", **context) - - -@admin_blueprint.route("/roles/add", methods=["POST"]) -@login_required -@admin_required -def roles_add(): - if request.method == "POST": - if not Role.query.filter(Role.name == request.form["name"]).first(): - role = Role(name=request.form["name"]) - role.save() - flash(notify_success("Role successfully added")) - return redirect(url_for("admin.roles")) - flash(notify_warning("Role already exists")) - return redirect(url_for("admin.roles")) - - -@admin_blueprint.route("/roles//delete", methods=["GET"]) -@login_required -@admin_required -def roles_delete(role_id): - role = Role.get_by_id(role_id) - - if role is None: - flash(notify_warning("Unable to delete. Invalid role id")) - return redirect(url_for("admin.roles")) - - role.delete() - flash(notify_success("Role successfully deleted")) - return redirect(url_for("admin.roles")) - - -@admin_blueprint.route("/roles/update", methods=["POST"]) -@login_required -@admin_required -def roles_update(): - if request.method == "POST": - role = Role.get_by_id(request.form["role_id"]) - - if role is None: - flash(notify_warning("Unable to update. Role does not exist")) - return redirect(url_for("admin.roles")) - - role.name = request.form["role_name"] - role.update() - flash(notify_success("Role successfully updated")) - - return redirect(url_for("admin.roles")) diff --git a/shopyo/modules/box__default/auth/email.py b/shopyo/modules/box__default/auth/email.py deleted file mode 100644 index 33400a6..0000000 --- a/shopyo/modules/box__default/auth/email.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -This file email.py contains functions for sending -text and html rendered emails asynchronously -""" -from threading import Thread - -from flask import current_app -from flask import render_template -from flask_mailman import EmailMultiAlternatives - - -def _send_email_helper(app, msg): - """ - Helper function used for sending email message - Args: - app (Flask): The flask app object - msg (flask-mailman email object): any email/messsage object - defined for flask-mailman. Example EmailMessage - """ - with app.app_context(): - if ( - "MAIL_USERNAME" not in current_app.config - or "MAIL_PASSWORD" not in current_app.config - or current_app.config["MAIL_USERNAME"] is None - or current_app.config["MAIL_PASSWORD"] is None - ): - print( - "\nShopyo Error: MAIL_USERNAME, and/or MAIL_PASSWORD" - " not configured\n" - ) - return - - msg.send() - - -def send_async_email(to, subject, template, from_email=None, **kwargs): - """ - Sends email anachronously i.e the function is non blocking. - Assume email template is valid i.e it can be rendered using - flask' render_template function and both .html and .txt - email template files exits - Args: - to (String): recipient of the email - subject (String): subject of the email - template (String): template file path to be used in email body - from_email (String, optional): sender of the email. If not set - MAIL_DEFAULT_SENDER is used from config. - """ - - if from_email is None: - if ( - "MAIL_DEFAULT_SENDER" not in current_app.config - or current_app.config["MAIL_DEFAULT_SENDER"] is None - ): - print("\nShopyo Error: MAIL_DEFAULT_SENDER not configured\n") - return - - from_email = current_app.config["MAIL_DEFAULT_SENDER"] - - app = current_app._get_current_object() - template_txt = render_template(f"{template}.txt", **kwargs) - template_html = render_template(f"{template}.html", **kwargs) - - msg = EmailMultiAlternatives( - subject=subject, - body=template_txt, - from_email=from_email, - to=[to], - ) - msg.attach_alternative(template_html, "text/html") - - thr = Thread(target=_send_email_helper, args=[app, msg]) - thr.start() - return thr \ No newline at end of file diff --git a/shopyo/modules/box__default/auth/forms.py b/shopyo/modules/box__default/auth/forms.py deleted file mode 100644 index b6497be..0000000 --- a/shopyo/modules/box__default/auth/forms.py +++ /dev/null @@ -1,85 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import PasswordField -from wtforms.fields.html5 import EmailField -from wtforms.validators import DataRequired -from wtforms.validators import Email -from wtforms.validators import InputRequired -from wtforms.validators import Length -from wtforms.validators import EqualTo -from wtforms.validators import ValidationError -from modules.box__default.admin.models import User - - -class LoginForm(FlaskForm): - email = EmailField( - "email", - [DataRequired(), Email(message=("Not a valid email address."))], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - password = PasswordField( - "Password", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - - -class RegistrationForm(FlaskForm): - """ Registration Form """ - - email = EmailField( - "email_label", - [DataRequired(), Email(message=("Not a valid email address."))], - ) - - password = PasswordField( - "New Password", - validators=[ - InputRequired("Password is required"), - Length( - min=6, - max=25, - message="Password must be between 6 and 25 characters", - ), - EqualTo("confirm", message="Passwords must match"), - ], - ) - confirm = PasswordField( - "Repeat Password", - ) - - def validate_email(self, field): - """ - Inline validator for email. Checks to see if a user object with - entered email already present in the database - - Args: - field : The form field that contains email data. - - Raises: - ValidationError: if the username entered in the field is already - in the database - """ - user = User.query.filter_by(email=field.data).scalar() - - if user is not None: - raise ValidationError(f"email '{field.data}' is already in use.") - - - - -class RegisterCustomerForm(FlaskForm): - email = EmailField( - "Email", - [DataRequired(), Email(message=("Not a valid email address."))], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - password = PasswordField( - "Password", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - reconfirm_password = PasswordField( - "Password", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) diff --git a/shopyo/modules/box__default/auth/global.py b/shopyo/modules/box__default/auth/global.py deleted file mode 100644 index 34fa971..0000000 --- a/shopyo/modules/box__default/auth/global.py +++ /dev/null @@ -1,15 +0,0 @@ -from modules.box__default.auth.forms import LoginForm -from modules.box__default.auth.forms import RegisterCustomerForm - - -def get_auth_login_form(): - return LoginForm() - -def get_auth_register_customer_form(): - return RegisterCustomerForm() - - -available_everywhere = { - "get_auth_login_form": get_auth_login_form, - "get_auth_register_customer_form": get_auth_register_customer_form -} diff --git a/shopyo/modules/box__default/auth/info.json b/shopyo/modules/box__default/auth/info.json deleted file mode 100644 index d79347a..0000000 --- a/shopyo/modules/box__default/auth/info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "display_string": "Login", - "type": "hidden", - "fa-icon": "fas fa-clock", - "url_prefix": "/auth" -} \ No newline at end of file diff --git a/shopyo/modules/box__default/auth/templates/auth/blocks/login_form.html b/shopyo/modules/box__default/auth/templates/auth/blocks/login_form.html deleted file mode 100644 index bcfa60f..0000000 --- a/shopyo/modules/box__default/auth/templates/auth/blocks/login_form.html +++ /dev/null @@ -1,30 +0,0 @@ - -

Login

-
-
- -
- {{ form.email() }} - {% if form.email.errors %} -
    - {% for error in form.user_id.errors %} -
  • {{ error }}
  • - {% endfor %} -
- {% endif %} -
-
-
- -
- {{ form.password() }} - {% if form.password.errors %} -
    - {% for error in form.password.errors %} -
  • {{ error }}
  • - {% endfor %} -
- {% endif %} -
- - diff --git a/shopyo/modules/box__default/auth/templates/auth/blocks/register_form.html b/shopyo/modules/box__default/auth/templates/auth/blocks/register_form.html deleted file mode 100644 index 6d53b9c..0000000 --- a/shopyo/modules/box__default/auth/templates/auth/blocks/register_form.html +++ /dev/null @@ -1,44 +0,0 @@ -

Register

- -
-
-
- -
- {{ form.email(class_="form-control", placeholder="Email", autocomplete="off", autofocus=true) }} -
-
    - {% for error in form.email.errors %} -
  • {{ error }}
  • - {% endfor %} -
-
-
-
-
- -
- {{ form.password(class_="form-control", placeholder="Password") }} -
-
    - {% for error in form.password.errors %} -
  • {{ error }}
  • - {% endfor %} -
-
-
-
-
- -
- {{ form.confirm(class_="form-control", placeholder="Confirm Password") }} -
-
    - {% for error in form.confirm.errors %} -
  • {{ error }}
  • - {% endfor %} -
-
- - - diff --git a/shopyo/modules/box__default/auth/templates/auth/login.html b/shopyo/modules/box__default/auth/templates/auth/login.html deleted file mode 100644 index d1e87c1..0000000 --- a/shopyo/modules/box__default/auth/templates/auth/login.html +++ /dev/null @@ -1,47 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page = "login" %} -{% block pagehead %} - {{active_page.capitalize()}} - - -{% endblock %} -{% block content %} - -
- -
-
- -
- {%include 'auth/blocks/login_form.html'%} -
-
-
- - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/auth/templates/auth/register.html b/shopyo/modules/box__default/auth/templates/auth/register.html deleted file mode 100644 index 1cf3678..0000000 --- a/shopyo/modules/box__default/auth/templates/auth/register.html +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page = "register" %} - -{% block pagehead %} - - {{ active_page.capitalize() }} -{% endblock %} - -{% block content %} -
-
-
- -
- {%include 'auth/blocks/register_form.html'%} -
-
- - Have already registered? - Sign in here - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/auth/templates/auth/shop_login.html b/shopyo/modules/box__default/auth/templates/auth/shop_login.html deleted file mode 100644 index 2813f17..0000000 --- a/shopyo/modules/box__default/auth/templates/auth/shop_login.html +++ /dev/null @@ -1,19 +0,0 @@ -{%set active_page = 'shop.html'%} -{% extends "shop/base.html" %} -{% block pagehead %} - -{% endblock %} -{% block content %} -
-
-
-
-
-
- {%include 'auth/blocks/login_form.html'%} -
-
-
- -
- {% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/auth/tests/test_login.py b/shopyo/modules/box__default/auth/tests/test_login.py deleted file mode 100644 index 1ed0484..0000000 --- a/shopyo/modules/box__default/auth/tests/test_login.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -This file (test_login.py) contains the functional tests for -the `login` blueprint. - -These tests use GETs and POSTs to different endpoints to check -for the proper behavior of the `login` blueprint. -""" -from flask import url_for -from flask import request - - -def test_valid_login_logout(test_client): - """ - GIVEN a Flask application configured for testing, - WHEN the logging in and loggoing out from the app - THEN check that the response is valid for each case - """ - # Login to the app - response = test_client.post( - url_for("auth.login"), - data=dict(email="admin1@domain.com", password="pass"), - follow_redirects=True, - ) - - # Check if login was successful - assert response.status_code == 200 - assert b"Control panel" in response.data - assert b"Notif test" in response.data - - # Check response is redirect to login page - response = test_client.get(url_for("auth.logout"), follow_redirects=True) - assert response.status_code == 200 - assert request.path == url_for("auth.login") - assert b"Successfully logged out" in response.data diff --git a/shopyo/modules/box__default/auth/view.py b/shopyo/modules/box__default/auth/view.py deleted file mode 100644 index 8a17d7e..0000000 --- a/shopyo/modules/box__default/auth/view.py +++ /dev/null @@ -1,108 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import flash -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for - -from flask_login import login_required -from flask_login import login_user -from flask_login import logout_user - -from shopyoapi.html import notify_danger -from shopyoapi.html import notify_success - -from modules.box__default.admin.models import User -from modules.box__default.auth.forms import LoginForm, RegistrationForm - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -auth_blueprint = Blueprint( - "auth", - __name__, - url_prefix=module_info["url_prefix"], - template_folder="templates", -) - - -@auth_blueprint.route("/register", methods=["GET", "POST"]) -def register(): - - context = {} - reg_form = RegistrationForm() - context["form"] = reg_form - - if request.method == "POST": - - if reg_form.validate_on_submit(): - - email = reg_form.email.data - password = reg_form.password.data - - # add the user to the db - User.create(email=email, password=password) - - flash(notify_success("Registered successfully! Please Log In")) - return redirect(url_for("auth.login")) - - return render_template("auth/register.html", **context) - - -@auth_blueprint.route("/login", methods=["GET", "POST"]) -def login(): - context = {} - login_form = LoginForm() - context["form"] = login_form - if request.method == 'POST': - if login_form.validate_on_submit(): - email = login_form.email.data - password = login_form.password.data - user = User.query.filter(User.email==email).first() - print(email, password, user) - if user is None or not user.check_hash(password): - flash('') - flash(notify_danger("please check your user id and password")) - return redirect(url_for("www.index")) - login_user(user) - if user.is_admin: - flash(notify_success('Successfully logged in!')) - return redirect(url_for("dashboard.index")) - elif user.is_customer: - flash(notify_success('Successfully logged in!')) - return redirect(url_for("shop.homepage")) - - return render_template("auth/login.html", **context) - - -@auth_blueprint.route("/shop", methods=["GET", "POST"]) -def shop_login(): - context = {} - login_form = LoginForm() - context["form"] = login_form - if request.method == "POST": - if login_form.validate_on_submit(): - email = login_form.email.data - password = login_form.password.data - user = User.query.filter_by(email=email).first() - if user is None or not user.check_hash(password): - flash(notify_danger("please check your user id and password")) - return redirect(url_for("shop.checkout")) - login_user(user) - return redirect(url_for("shop.checkout")) - return render_template("auth/shop_login.html", **context) - - -@auth_blueprint.route("/logout") -@login_required -def logout(): - logout_user() - flash(notify_success("Successfully logged out")) - return redirect(url_for('www.index')) - # return redirect(url_for("auth.login")) diff --git a/shopyo/modules/box__default/base/info.json b/shopyo/modules/box__default/base/info.json deleted file mode 100644 index 5a427fa..0000000 --- a/shopyo/modules/box__default/base/info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "display_string": "Base", - "type": "hidden", - "fa-icon": "fas fa-clock", - "url_prefix": "/base" -} \ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/blocks/default_styles.html b/shopyo/modules/box__default/base/templates/base/blocks/default_styles.html deleted file mode 100644 index 14af652..0000000 --- a/shopyo/modules/box__default/base/templates/base/blocks/default_styles.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/blocks/flashed_messages.html b/shopyo/modules/box__default/base/templates/base/blocks/flashed_messages.html deleted file mode 100644 index 4a662aa..0000000 --- a/shopyo/modules/box__default/base/templates/base/blocks/flashed_messages.html +++ /dev/null @@ -1,9 +0,0 @@ -
- {% with messages = get_flashed_messages() %} - {% if messages %} - {% for message in messages %} - {{ message | safe}} - {% endfor %} - {% endif %} - {% endwith %} -
\ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/blocks/footer.html b/shopyo/modules/box__default/base/templates/base/blocks/footer.html deleted file mode 100644 index 615570f..0000000 --- a/shopyo/modules/box__default/base/templates/base/blocks/footer.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
- - - © {{APP_NAME}}. Powered by Shopyo. - - -
- -
-
- -
\ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/blocks/macros.html b/shopyo/modules/box__default/base/templates/base/blocks/macros.html deleted file mode 100644 index 073f60a..0000000 --- a/shopyo/modules/box__default/base/templates/base/blocks/macros.html +++ /dev/null @@ -1,5 +0,0 @@ -{% macro sidebar_item(text, icon='fa fa-table', url='') -%} - -     {{text}} - -{%- endmacro %} \ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/blocks/resources.html b/shopyo/modules/box__default/base/templates/base/blocks/resources.html deleted file mode 100644 index 6e1e0ec..0000000 --- a/shopyo/modules/box__default/base/templates/base/blocks/resources.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/shopyo/modules/box__default/base/templates/base/main_base.html b/shopyo/modules/box__default/base/templates/base/main_base.html deleted file mode 100644 index 317f2f2..0000000 --- a/shopyo/modules/box__default/base/templates/base/main_base.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - {% include 'base/blocks/resources.html'%} - {% include 'base/blocks/default_styles.html'%} - {% block pagehead %}{% endblock %} - - - {% include "base/nav_base.html" %} - {% include 'base/blocks/flashed_messages.html'%} - -
- -
- {% block content %}{% endblock %} -
- - - diff --git a/shopyo/modules/box__default/base/templates/base/module_base.html b/shopyo/modules/box__default/base/templates/base/module_base.html deleted file mode 100644 index c5029f8..0000000 --- a/shopyo/modules/box__default/base/templates/base/module_base.html +++ /dev/null @@ -1,92 +0,0 @@ - - -{% from "base/blocks/macros.html" import sidebar_item with context %} - - - - - {% include 'base/blocks/default_styles.html'%} - {% block pagehead %}{% endblock %} - - - {% include 'base/blocks/resources.html'%} - - - {% if not _hide_nav%} - {% include 'base/nav_base.html'%} - {% endif %} - - {% include 'base/blocks/flashed_messages.html'%} - -
- - - - - - -
- - -
- - {% block content %}{% endblock %} - -
-
- - -
- - - - - - - {% include 'base/blocks/footer.html'%} - - - diff --git a/shopyo/modules/box__default/base/templates/base/nav_base.html b/shopyo/modules/box__default/base/templates/base/nav_base.html deleted file mode 100644 index 5f27241..0000000 --- a/shopyo/modules/box__default/base/templates/base/nav_base.html +++ /dev/null @@ -1,34 +0,0 @@ -{% set active_page = active_page|default('none') %} - - diff --git a/shopyo/modules/box__default/base/view.py b/shopyo/modules/box__default/base/view.py deleted file mode 100644 index 2f896ee..0000000 --- a/shopyo/modules/box__default/base/view.py +++ /dev/null @@ -1,17 +0,0 @@ -import json -import os - -from flask import Blueprint - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -base_blueprint = Blueprint( - "base", - __name__, - url_prefix=module_info["url_prefix"], - template_folder="templates", -) diff --git a/shopyo/modules/box__default/box_info.json b/shopyo/modules/box__default/box_info.json deleted file mode 100644 index eaedef5..0000000 --- a/shopyo/modules/box__default/box_info.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "display_string": "Default", - "box_name":"default", - "author": { - "name":"", - "website":"", - "mail":"" - } - } \ No newline at end of file diff --git a/shopyo/modules/box__default/dashboard/templates/dashboard/index.html b/shopyo/modules/box__default/dashboard/templates/dashboard/index.html deleted file mode 100644 index ed1abb8..0000000 --- a/shopyo/modules/box__default/dashboard/templates/dashboard/index.html +++ /dev/null @@ -1,36 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='control panel' %} - -{% block pagehead %} - - - -{% endblock %} - -{% block content %} - {% include 'dashboard/nav.html' %} - -
- - {% for info in all_info %} - {% if all_info[info]['type'] == 'show'%} - {%if 'dashboard' in all_info[info]%} - - {%else%} - - {%endif%} -
-
- -
- -
-
- {% endif %} - {% endfor %} - {% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/dashboard/templates/dashboard/nav.html b/shopyo/modules/box__default/dashboard/templates/dashboard/nav.html deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__default/dashboard/tests/test_dashboard.py b/shopyo/modules/box__default/dashboard/tests/test_dashboard.py deleted file mode 100644 index 6234619..0000000 --- a/shopyo/modules/box__default/dashboard/tests/test_dashboard.py +++ /dev/null @@ -1,3 +0,0 @@ -def test_dashboard(test_client): - response = test_client.get("/dashboard/", follow_redirects=True) - assert response.status_code == 200 diff --git a/shopyo/modules/box__default/dashboard/view.py b/shopyo/modules/box__default/dashboard/view.py deleted file mode 100644 index a943582..0000000 --- a/shopyo/modules/box__default/dashboard/view.py +++ /dev/null @@ -1,69 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import current_app -from flask import flash -from flask import render_template - -from flask_login import login_required - -from shopyoapi.html import notify_success - -dashboard_blueprint = Blueprint( - "dashboard", - __name__, - template_folder="templates", - url_prefix="/dashboard", -) -all_info = {} - - -@dashboard_blueprint.route("/") -@login_required -def index(): - context = {} - - for folder in os.listdir( - os.path.join(current_app.config["BASE_DIR"], "modules") - ): - if folder.startswith("__"): - continue - elif folder.startswith("box__"): - for sub_folder in os.listdir( - os.path.join(current_app.config["BASE_DIR"], "modules", folder) - ): - if sub_folder in ["dashboard"]: - continue - if sub_folder.startswith("__"): # ignore __pycache__ - continue - elif sub_folder.endswith(".json"): # box_info.json - continue - with open( - os.path.join( - current_app.config["BASE_DIR"], - "modules", - folder, - sub_folder, - "info.json", - ) - ) as f: - module_info = json.load(f) - all_info[sub_folder] = module_info - else: - - if folder not in ["dashboard"]: - with open( - os.path.join( - current_app.config["BASE_DIR"], - "modules", - folder, - "info.json", - ) - ) as f: - module_info = json.load(f) - all_info[folder] = module_info - - context["all_info"] = all_info - flash(notify_success("Notif test")) - return render_template("dashboard/index.html", **context) diff --git a/shopyo/modules/box__default/settings/__init__.py b/shopyo/modules/box__default/settings/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__default/settings/helpers.py b/shopyo/modules/box__default/settings/helpers.py deleted file mode 100644 index f7f80d3..0000000 --- a/shopyo/modules/box__default/settings/helpers.py +++ /dev/null @@ -1,19 +0,0 @@ -from modules.box__default.settings.models import Settings - - -def get_setting(name): - """ - Used as key-value lookup from Settings table - - Parameters - ---------- - name: str - name of key - - Returns - ------- - str - value of key - """ - s = Settings.query.get(name) - return s.value diff --git a/shopyo/modules/box__default/settings/info.json b/shopyo/modules/box__default/settings/info.json deleted file mode 100644 index 3233666..0000000 --- a/shopyo/modules/box__default/settings/info.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "display_string": "Settings", - "type": "show", - "fa-icon": "fa fa-cog", - "url_prefix": "/settings" -} \ No newline at end of file diff --git a/shopyo/modules/box__default/settings/models.py b/shopyo/modules/box__default/settings/models.py deleted file mode 100644 index 57c6728..0000000 --- a/shopyo/modules/box__default/settings/models.py +++ /dev/null @@ -1,21 +0,0 @@ -from shopyoapi.init import db - - -class Settings(db.Model): - __tablename__ = "settings" - setting = db.Column(db.String(100), primary_key=True) - value = db.Column(db.String(100)) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__default/settings/templates/settings/edit.html b/shopyo/modules/box__default/settings/templates/settings/edit.html deleted file mode 100644 index 18724ea..0000000 --- a/shopyo/modules/box__default/settings/templates/settings/edit.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='settings' %} - -{% block pagehead %} -edit -{% endblock %} - -{% block content %} - -
- -
-
- -
- - -
- -
- - -
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/settings/templates/settings/index.html b/shopyo/modules/box__default/settings/templates/settings/index.html deleted file mode 100644 index e25623e..0000000 --- a/shopyo/modules/box__default/settings/templates/settings/index.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='settings' %} - -{% block pagehead %} -Settings - -{% endblock %} - -{% block content %} - - - - - - - - - - - -{% for setting in settings %} - - - - - -{%endfor%} - -
SettingsValue
{{setting.setting}}{{setting.value}}
- -{% endblock %} diff --git a/shopyo/modules/box__default/settings/templates/settings/nav.html b/shopyo/modules/box__default/settings/templates/settings/nav.html deleted file mode 100644 index 741fc26..0000000 --- a/shopyo/modules/box__default/settings/templates/settings/nav.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/shopyo/modules/box__default/settings/tests/test_settings.py b/shopyo/modules/box__default/settings/tests/test_settings.py deleted file mode 100644 index ebfdd94..0000000 --- a/shopyo/modules/box__default/settings/tests/test_settings.py +++ /dev/null @@ -1,100 +0,0 @@ -""" -This file (test_settings.py) contains the functional tests for -the `settings` blueprint. - -These tests use GETs and POSTs to different endpoints to check -for the proper behavior of the `settings` blueprint. -""" - -import os -import json -from flask import request -from flask import url_for -import pytest -from modules.box__default.settings.models import Settings - - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_path = os.path.dirname(dirpath) - -module_info = None - -with open(os.path.join(module_path, "info.json")) as f: - module_info = json.load(f) - - -class TestSettingsInvalidAuth: - """ - Test all settings routes - """ - - routes_get = ["/", "/edit/", "/update"] - - routes_post = ["/edit/", "/update"] - - @pytest.mark.parametrize("route", routes_get) - def test_redirect_if_not_logged_in_get(self, test_client, route, auth): - auth.logout() - response = test_client.get( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - @pytest.mark.parametrize("route", routes_post) - def test_redirect_if_not_logged_in_post(self, test_client, route, auth): - auth.logout() - response = test_client.post( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - -@pytest.mark.usefixtures("login_admin_user") -class TestSettingsAPI: - def test_settings_main(self, test_client): - - response = test_client.get(f"{module_info['url_prefix']}/") - assert response.status_code == 200 - assert b"APP_NAME" in response.data - assert b"SECTION_NAME" in response.data - assert b"ACTIVE_FRONT_THEME" in response.data - assert b"SECTION_ITEMS" in response.data - assert b"CURRENCY" in response.data - - @pytest.mark.parametrize( - "setting", - [ - "APP_NAME", - "SECTION_NAME", - "SECTION_ITEMS", - "ACTIVE_FRONT_THEME", - "SECTION_ITEMS", - "CURRENCY", - ], - ) - def test_settings_edit(self, test_client, setting): - - response = test_client.get( - f"{module_info['url_prefix']}/edit/{setting}" - ) - assert response.status_code == 200 - - def test_settings_update(self, test_client): - - response = test_client.post( - f"{module_info['url_prefix']}/update", - data=dict( - settings_name="APP_NAME", - settings_value="TEST-APP-NAME", - follow_redirects=True, - ), - ) - - setting = Settings.query.get("APP_NAME") - assert response.status_code == 200 - assert setting is not None - assert setting.value == "TEST-APP-NAME" diff --git a/shopyo/modules/box__default/settings/upload.py b/shopyo/modules/box__default/settings/upload.py deleted file mode 100644 index b2d0aa0..0000000 --- a/shopyo/modules/box__default/settings/upload.py +++ /dev/null @@ -1,25 +0,0 @@ -import json -from app import app -from shopyoapi.init import db -from modules.box__default.settings.models import Settings - - -def add_setting(name, value): - with app.app_context(): - if Settings.query.filter_by(setting=name).first(): - s = Settings.query.get(name) - s.value = value - db.session.commit() - else: - s = Settings(setting=name, value=value) - db.session.add(s) - db.session.commit() - - -def upload(): - with open("config.json", "r") as config: - config = json.load(config) - print("Initialising Settings") - print("Adding Settings ...") - for name, value in config["settings"].items(): - add_setting(name, value) diff --git a/shopyo/modules/box__default/settings/view.py b/shopyo/modules/box__default/settings/view.py deleted file mode 100644 index 45a4b2f..0000000 --- a/shopyo/modules/box__default/settings/view.py +++ /dev/null @@ -1,65 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import render_template -from flask import request - -from flask_login import login_required - -from shopyoapi.init import db - -from modules.box__default.settings.models import Settings - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -settings_blueprint = Blueprint( - "settings", - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -@settings_blueprint.route("/") -@login_required -def settings_main(): - context = {} - - settings = Settings.query.all() - - context["settings"] = settings - return render_template("settings/index.html", **context) - - -@settings_blueprint.route("/edit/", methods=["GET", "POST"]) -@login_required -def settings_edit(settings_name): - context = {} - - s = Settings.query.get(settings_name) - - context["settings_name"] = settings_name - context["current_value"] = s.value - - return render_template("settings/edit.html", **context) - - -@settings_blueprint.route("/update", methods=["GET", "POST"]) -@login_required -def settings_update(): - context = {} - - settings_name = request.form["settings_name"] - settings_value = request.form["settings_value"] - s = Settings.query.get(settings_name) - s.value = settings_value - db.session.commit() - settings = Settings.query.all() - - context["settings"] = settings - return render_template("settings/index.html", **context) diff --git a/shopyo/modules/box__default/theme/forms.py b/shopyo/modules/box__default/theme/forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__default/theme/global.py b/shopyo/modules/box__default/theme/global.py deleted file mode 100644 index b1c4a69..0000000 --- a/shopyo/modules/box__default/theme/global.py +++ /dev/null @@ -1,77 +0,0 @@ -from flask import url_for - -import os -import json - -from shopyoapi.path import themes_path -from modules.box__default.settings.helpers import get_setting - - -def get_front_theme_dir(): - theme_dir = os.path.join( - themes_path, "front", get_setting("ACTIVE_FRONT_THEME") - ) - return theme_dir - - -def get_front_theme_info_data(): - info_path = os.path.join(get_front_theme_dir(), "info.json") - with open(info_path) as f: - info_data = json.load(f) - return info_data - - -def get_active_front_theme(): - return get_setting("ACTIVE_FRONT_THEME") - - -def get_active_front_theme_version(): - return get_front_theme_info_data()["version"] - - -def get_active_front_theme_styles_url(): - return url_for( - "resource.active_front_theme_css", - active_theme=get_active_front_theme(), - v=get_active_front_theme_version(), - ) - - -def get_back_theme_dir(): - theme_dir = os.path.join( - themes_path, "back", get_setting("ACTIVE_BACK_THEME") - ) - return theme_dir - - -def get_back_theme_info_data(): - info_path = os.path.join(get_back_theme_dir(), "info.json") - with open(info_path) as f: - info_data = json.load(f) - return info_data - - -def get_active_back_theme(): - return get_setting("ACTIVE_BACK_THEME") - - -def get_active_back_theme_version(): - return get_back_theme_info_data()["version"] - - -def get_active_back_theme_styles_url(): - return url_for( - "resource.active_back_theme_css", - active_theme=get_active_back_theme(), - v=get_active_back_theme_version(), - ) - - -available_everywhere = { - "get_active_front_theme": get_active_front_theme, - "get_active_front_theme_version": get_active_front_theme_version, - "get_active_front_theme_styles_url": get_active_front_theme_styles_url, - "get_active_back_theme": get_active_back_theme, - "get_active_back_theme_version": get_active_back_theme_version, - "get_active_back_theme_styles_url": get_active_back_theme_styles_url, -} diff --git a/shopyo/modules/box__default/theme/info.json b/shopyo/modules/box__default/theme/info.json deleted file mode 100644 index d6f5610..0000000 --- a/shopyo/modules/box__default/theme/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Theme", - "module_name":"theme", - "type": "show", - "fa-icon": "fa fa-palette", - "url_prefix": "/theme", - "author": { - "name":"", - "website":"https://www.pythonkitchen.com/about-me/", - "mail":"arj.python@gmail.com" - } -} diff --git a/shopyo/modules/box__default/theme/models.py b/shopyo/modules/box__default/theme/models.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__default/theme/templates/theme/blocks/sidebar.html b/shopyo/modules/box__default/theme/templates/theme/blocks/sidebar.html deleted file mode 100644 index 8736d51..0000000 --- a/shopyo/modules/box__default/theme/templates/theme/blocks/sidebar.html +++ /dev/null @@ -1,7 +0,0 @@ -{{ -sidebar_item( -'Home', -icon=module_info['fa-icon'], -url=url_for('{}.index'.format(module_info['module_name'])) -) -}} diff --git a/shopyo/modules/box__default/theme/templates/theme/index.html b/shopyo/modules/box__default/theme/templates/theme/index.html deleted file mode 100644 index c9f2d02..0000000 --- a/shopyo/modules/box__default/theme/templates/theme/index.html +++ /dev/null @@ -1,91 +0,0 @@ -{% extends "base/module_base.html" %} - -{% set active_page ='' %} - -{% block pagehead %} - - -{% endblock %} - - - - -{% block sidebar %} - {%include '{}/blocks/sidebar.html'.format(module_info['module_name'])%} -{%endblock%} - - - - -{% block content %} -
-
-
- Front Theme -
-
- - - - - - - - - - {%for key in all_front_info%} - - - - - - {%endfor%} - -
NameAuthor
{{key}}{{all_front_info[key]['author']}} - {%if active_front_theme != key%} - activate - {%else%} - active - {%endif%} -
-
-
-
-
-
- Back Theme -
-
- - - - - - - - - - {%for key in all_back_info%} - - - - - - {%endfor%} - -
NameAuthor
{{key}}{{all_back_info[key]['author']}} - {%if active_back_theme != key%} - activate - {%else%} - active - {%endif%} -
-
-
-
- -
- -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__default/theme/view.py b/shopyo/modules/box__default/theme/view.py deleted file mode 100644 index 31035de..0000000 --- a/shopyo/modules/box__default/theme/view.py +++ /dev/null @@ -1,111 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import current_app -from flask import redirect -from flask import render_template -from flask import url_for - -from flask_login import login_required - -from modules.box__default.settings.helpers import get_setting -from shopyoapi.enhance import set_setting -from shopyoapi.file import get_folders - -# from flask import flash -# from flask import request -# from shopyoapi.html import notify_success -# from shopyoapi.init import db - -# from modules.box__default.settings.models import Settings - -# from shopyoapi.forms import flash_errors - - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - -module_settings = {"module_info": module_info} - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - - -@module_blueprint.route("/") -@login_required -def index(): - - context = {} - - front_themes_path = os.path.join( - current_app.config["BASE_DIR"], "static", "themes", "front" - ) - all_front_info = {} - front_theme_folders = get_folders(front_themes_path) - for folder in front_theme_folders: - theme_path = os.path.join(front_themes_path, folder) - info_path = os.path.join(theme_path, "info.json") - with open(info_path) as f: - all_front_info[folder] = json.load(f) - - back_themes_path = os.path.join( - current_app.config["BASE_DIR"], "static", "themes", "back" - ) - all_back_info = {} - back_theme_folders = get_folders(back_themes_path) - for folder in back_theme_folders: - theme_path = os.path.join(back_themes_path, folder) - info_path = os.path.join(theme_path, "info.json") - with open(info_path) as f: - all_back_info[folder] = json.load(f) - - active_front_theme = get_setting("ACTIVE_FRONT_THEME") - active_back_theme = get_setting("ACTIVE_BACK_THEME") - - context.update( - { - "all_front_info": all_front_info, - "all_back_info": all_back_info, - "active_front_theme": active_front_theme, - "active_back_theme": active_back_theme, - } - ) - context.update(module_settings) - - return render_template( - "{}/index.html".format(module_info["module_name"]), **context - ) - - -@module_blueprint.route("/activate/front/") -@login_required -def activate_front_theme(theme_name): - set_setting("ACTIVE_FRONT_THEME", theme_name) - - # with app.app_context(): - - # current_app.jinja_loader, - # print(current_app.jinja_loader.list_templates()) - return redirect(url_for("{}.index".format(module_info["module_name"]))) - - -@module_blueprint.route("/activate/back/") -@login_required -def activate_back_theme(theme_name): - set_setting("ACTIVE_BACK_THEME", theme_name) - - # with app.app_context(): - - # current_app.jinja_loader, - # print(current_app.jinja_loader.list_templates()) - return redirect(url_for("{}.index".format(module_info["module_name"]))) diff --git a/shopyo/modules/box__ecommerce/box_info.json b/shopyo/modules/box__ecommerce/box_info.json deleted file mode 100644 index 586e83d..0000000 --- a/shopyo/modules/box__ecommerce/box_info.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "display_string": "Ecommerce", - "box_name":"ecommerce", - "author": { - "name":"", - "website":"", - "mail":"" - } - } \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/__init__.py b/shopyo/modules/box__ecommerce/category/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/category/global.py b/shopyo/modules/box__ecommerce/category/global.py deleted file mode 100644 index 1faee04..0000000 --- a/shopyo/modules/box__ecommerce/category/global.py +++ /dev/null @@ -1,11 +0,0 @@ -from modules.box__ecommerce.category.models import Category - - -def get_categories(): - return Category.query.all() - - -available_everywhere = { - "get_categories": get_categories, - "Category": Category -} diff --git a/shopyo/modules/box__ecommerce/category/info.json b/shopyo/modules/box__ecommerce/category/info.json deleted file mode 100644 index ae91009..0000000 --- a/shopyo/modules/box__ecommerce/category/info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "display_string": "Inventory", - "module_name":"category", - "type": "show", - "fa-icon": "fa fa-boxes", - "url_prefix": "/category", - "dashboard": "/dashboard" -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/models.py b/shopyo/modules/box__ecommerce/category/models.py deleted file mode 100644 index f19c81e..0000000 --- a/shopyo/modules/box__ecommerce/category/models.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -remember: backrefs should be unique -""" - -from sqlalchemy import exists -from sqlalchemy.orm import validates - -from shopyoapi.init import db -from shopyoapi.models import PkModel -from flask import url_for - - -class Category(PkModel): - __tablename__ = "categories" - name = db.Column(db.String(100), unique=True, nullable=False) - subcategories = db.relationship( - "SubCategory", backref="category", lazy=True - ) - resources = db.relationship( - "Resource", - backref="resource_category", - lazy=True, - ) - - def __repr__(self): - return f"Category: {self.name}" - - @classmethod - def category_exists(cls, name): - return db.session.query( - exists().where(cls.name == name.lower()) - ).scalar() - - @validates("name") - def convert_lower(self, key, value): - return value.lower() - - def get_one_image_url(self): - if len(self.resources) == 0: - return url_for('static', filename='default/default_subcategory.jpg') - else: - resource = self.resources[0] - return url_for('static', filename='uploads/products/{}'.format(resource.filename)) - - def get_page_url(self): - return url_for('shop.category', category_name=self.name) - - -class SubCategory(PkModel): - __tablename__ = "subcategories" - name = db.Column(db.String(100), nullable=False) - category_id = db.Column(db.Integer, db.ForeignKey("categories.id")) - products = db.relationship("Product", backref="subcategory", lazy=True) - resources = db.relationship( - "Resource", backref="resource_subcategory", lazy=True - ) - - @classmethod - def category_exists(cls, name): - return db.session.query( - exists().where(cls.name == name.lower()) - ).scalar() - - @validates("name") - def convert_lower(self, key, value): - return value.lower() - - def get_num_products(self): - return len(self.products) - - def get_one_image_url(self): - - if len(self.products) > 0: - product = self.products[0] - if len(product.resources) == 0: - if len(self.resources) == 0: - return url_for('static', filename='default/default_subcategory.jpg') - else: - resource = self.resources[0] - return url_for('static', filename='uploads/subcategory/{}'.format(resource.filename)) - else: - resource = product.resources[0] - return url_for('static', filename='uploads/products/{}'.format(resource.filename)) - else: - if len(self.resources) == 0: - return url_for('static', filename='default/default_subcategory.jpg') - else: - resource = self.resources[0] - return url_for('static', filename='uploads/subcategory/{}'.format(resource.filename)) diff --git a/shopyo/modules/box__ecommerce/category/templates/category/add.html b/shopyo/modules/box__ecommerce/category/templates/category/add.html deleted file mode 100644 index c9f4745..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/add.html +++ /dev/null @@ -1,53 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='category' %} -{% block pagehead %} -add category -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
- {% if has_category == 'True' %} - - {% endif %} -

Add Category

-
- -
-
- -
- - -
- -
-
- -
- -
- -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/blocks/sidebar.html b/shopyo/modules/box__ecommerce/category/templates/category/blocks/sidebar.html deleted file mode 100644 index 45e000f..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/blocks/sidebar.html +++ /dev/null @@ -1,26 +0,0 @@ - -{{ -sidebar_item('Category Home', -icon='fa fa-store', -url=url_for('category.dashboard') -)}} - - - -{%if active_page not in ['manage subcategory', 'subcategory']%} -{{ -sidebar_item('Add Category', -icon='fas fa-plus-circle', -url=url_for('category.add') -) -}} -{%endif%} - -{%if active_page == 'subcategory'%} -{{ -sidebar_item('Manage Subcategory', -icon='fa fa-wrench', -url=url_for('category.manage_sub', category_name=subcategory.category.name) -) -}} -{%endif%} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/choose_sub.html b/shopyo/modules/box__ecommerce/category/templates/category/choose_sub.html deleted file mode 100644 index f5766a4..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/choose_sub.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='' %} -{% block pagehead %} -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -

-
-
-
    - {%if category.subcategories%} - {%for subcategory in category.subcategories%} -
  • - - - {{subcategory.name}} -
  • - {%endfor%} - {%endif%} -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/dashboard.html b/shopyo/modules/box__ecommerce/category/templates/category/dashboard.html deleted file mode 100644 index 419c996..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/dashboard.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='category' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
- {%for category in categorys%} - -
- - - - - -    -
- {%set filename_ = ''%} - {%if category.resources%} - {%set filename_ = category.resources[0].filename%} - {%endif%} - -
-
- -
- {%if category.name != 'uncategorised'%} - - - -   - - - -   - {%endif%} - - - -
-

- {%endfor%} -
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/edit.html b/shopyo/modules/box__ecommerce/category/templates/category/edit.html deleted file mode 100644 index 2b66ac1..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/edit.html +++ /dev/null @@ -1,93 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='category' %} -{% block pagehead %} -edit - -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-
- -
-
- -
- - -
- {%if len(category.resources) == 0%} - -
-
- -
- -
-
- {%else%} - -
- Delete image to be able to add new -
- {%endif%} -
- - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/edit_img_sub.html b/shopyo/modules/box__ecommerce/category/templates/category/edit_img_sub.html deleted file mode 100644 index 1636452..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/edit_img_sub.html +++ /dev/null @@ -1,82 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='subcategory' %} -{% block pagehead %} - -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
- {%if len(subcategory.resources) == 0%} - -
-
- -
- -
-
- {%else%} - -
- Delete image to be able to add new -
- {%endif%} - - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/manage_sub.html b/shopyo/modules/box__ecommerce/category/templates/category/manage_sub.html deleted file mode 100644 index bd100c1..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/manage_sub.html +++ /dev/null @@ -1,73 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='manage subcategory' %} -{% block pagehead %} -{% endblock %} -{% block sidebar %} -{%include 'category/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
- {%if category.name != 'uncategorised'%} -

Add subcategory to {{category.name}}

-
- -
-
- -
- - -
- -
-
- -
- -
- -
- {%endif%} -
-
-

Existing subcategories

- {%for subcategory in category.subcategories%} -
- - - - {%if subcategory.name != 'uncategorised' and subcategory.category.name != 'uncategorised'%} - edit image - delete - {%endif%} - -
- - - -
- {%endfor%} -
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/templates/category/message.html b/shopyo/modules/box__ecommerce/category/templates/category/message.html deleted file mode 100644 index c6e400a..0000000 --- a/shopyo/modules/box__ecommerce/category/templates/category/message.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "base/main_base.html" %} - -{% set active_page ='category' %} - -{% block content %} - {% include 'category/nav.html' %} -
- -
-

{{message}}

- -
- -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/category/tests/test_category.py b/shopyo/modules/box__ecommerce/category/tests/test_category.py deleted file mode 100644 index fe39c7f..0000000 --- a/shopyo/modules/box__ecommerce/category/tests/test_category.py +++ /dev/null @@ -1,314 +0,0 @@ -""" -This file (test_category.py) contains the functional tests -for the `category` blueprint. - -These tests use GETs and POSTs to different URLs to check -for the proper behavior of the `category` blueprint. -""" -import os -import json -import pytest -from flask import url_for, request -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.category.models import SubCategory - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_path = os.path.dirname(dirpath) - -module_info = None - -with open(os.path.join(module_path, "info.json")) as f: - module_info = json.load(f) - - -class TestCategoryInvalidAuth: - """ - Test all category routes for correct user authentication - """ - - routes_get = [ - module_info["dashboard"], - "/add", - "//delete", - "//img//delete", - "/update", - f"{module_info['dashboard']}/edit/", - "/check/", - "/file/", - f"{module_info['dashboard']}//sub/", - f"{module_info['dashboard']}//sub/add", - f"{module_info['dashboard']}/sub//img/edit", - "/sub//name/edit", - "/sub//img/edit", - "/sub//img//delete", - "/sub//delete", - "/sub/file/", - f"/{module_info['dashboard']}/sub", - ] - - routes_post = [ - "/add", - "/update", - f"{module_info['dashboard']}//sub/add", - "/sub//name/edit", - "/sub//img/edit", - ] - - @pytest.mark.parametrize("route", routes_get) - def test_redirect_if_not_logged_in_get(self, test_client, route, auth): - auth.logout() - response = test_client.get( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - @pytest.mark.parametrize("route", routes_post) - def test_redirect_if_not_logged_in_post(self, test_client, route, auth): - auth.logout() - response = test_client.post( - f"{module_info['url_prefix']}{route}", follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("auth.login") - - -@pytest.mark.usefixtures("login_non_admin_user") -class TestCategoryApi: - def test_category_dashboard_page_get(self, test_client): - response = test_client.get(url_for("category.dashboard")) - - assert response.status_code == 200 - assert b"Category" in response.data - - def test_category_add_page_get(self, test_client): - response = test_client.get(url_for("category.add")) - - assert response.status_code == 200 - assert b"name" in response.data - assert b"image" in response.data - - def test_category_add_empty_name_post(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name=" "), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert b"Category name cannot be empty" in response.data - assert request.path == url_for("category.add") - - def test_category_add_uncategorized_as_name_post(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name="uncategorized"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert b"Category cannot be named as uncategorised" in response.data - - def test_category_add_uncategorised_as_name_post(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name=" uncategorised"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert b"Category cannot be named as uncategorised" in response.data - - def test_category_add_existing_category_name_post(self, test_client): - Category.create(name="category") - response = test_client.post( - url_for("category.add"), - data=dict(name="category"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert b'Category "category" already exists' in response.data - assert Category.query.count() == 1 - - def test_category_add_unique_category_name_post(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name="category"), - follow_redirects=True, - ) - added_category = Category.query.filter( - Category.name == "category" - ).all() - - assert response.status_code == 200 - assert b'Category "category" added successfully' in response.data - assert len(added_category) == 1 - - def test_category_add_name_with_lower_and_upper_post(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name="CatEgorY"), - follow_redirects=True, - ) - added_category = Category.query.filter( - Category.name == "category" - ).all() - - assert response.status_code == 200 - assert b'Category "category" added successfully' in response.data - assert len(added_category) == 1 - - def test_category_add_name_with_leading_trailing_space(self, test_client): - response = test_client.post( - url_for("category.add"), - data=dict(name=" category "), - follow_redirects=True, - ) - added_category = Category.query.filter( - Category.name == "category" - ).all() - - assert response.status_code == 200 - assert b'Category "category" added successfully' in response.data - assert len(added_category) == 1 - - def test_category_delete_existing_category_get(self, test_client): - Category.create(name="category") - response = test_client.get( - url_for("category.delete", name="category"), - follow_redirects=True, - ) - query = Category.query.filter(Category.name == "category").scalar() - - assert b'Category "category" successfully deleted' in response.data - assert request.path == url_for("category.dashboard") - assert query is None - - def test_category_delete_nonexisting_category_get(self, test_client): - response = test_client.get( - url_for("category.delete", name="category"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert request.path == url_for("category.dashboard") - assert b'Category "category" does not exist.' in response.data - - def test_category_delete_cat_with_subcategory_get(self, test_client): - # add a category with subcategoires - category = Category(name="category") - subcategory = SubCategory(name="subcategory") - category.subcategories.append(subcategory) - category.save() - - response = test_client.get( - url_for("category.delete", name="category"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert request.path == url_for("category.dashboard") - assert ( - b'Please delete all subcategories for category "category"' - in response.data - ) - - def test_category_delete_cat_named_uncategorised_get(self, test_client): - response = test_client.get( - url_for("category.delete", name="uncategorised"), - follow_redirects=True, - ) - - assert response.status_code == 200 - assert request.path == url_for("category.dashboard") - assert b"Cannot delete category uncategorised" in response.data - - def test_category_delete_cat_name_which_is_empty_get(self, test_client): - response = test_client.get( - url_for("category.delete", name=" "), follow_redirects=True - ) - - assert response.status_code == 200 - assert request.path == url_for("category.dashboard") - assert b"Cannot delete a category with no name" in response.data - - def test_category_add_nonexisting_subcategory_post(self, test_client): - Category.create(name="category") - response = test_client.post( - url_for("category.add_sub", category_name="category"), - data=dict(name="subcategory"), - follow_redirects=True, - ) - subcat = SubCategory.query.filter( - SubCategory.name == "subcategory" - ).scalar() - - assert response.status_code == 200 - assert request.path == url_for( - "category.manage_sub", category_name="category" - ) - assert subcat is not None - assert subcat.category is not None - assert subcat.category.name == "category" - - def test_category_add_existing_subcategory_post(self, test_client): - category = Category(name="category1") - subcategory = SubCategory(name="subcategory1") - category.subcategories.append(subcategory) - category.save() - - response = test_client.post( - url_for("category.add_sub", category_name="category1"), - data=dict(name="subcategory1"), - follow_redirects=True, - ) - subcategories = SubCategory.query.count() - - assert response.status_code == 200 - assert b"Name already exists for category" in response.data - assert subcategories == 1 - - def test_category_add_subcat_name_which_is_empty_get(self, test_client): - Category.create(name="category1") - response = test_client.post( - url_for("category.add_sub", category_name="category1"), - data=dict(name=" "), - follow_redirects=True, - ) - subcategories = SubCategory.query.count() - - assert response.status_code == 200 - assert b"Name cannot be empty" in response.data - assert subcategories == 0 - - def test_category_add_existing_subcat_with_spaces_post(self, test_client): - category = Category(name="category1") - subcategory = SubCategory(name="subcategory1") - category.subcategories.append(subcategory) - category.save() - - response = test_client.post( - url_for("category.add_sub", category_name="category1"), - data=dict(name=" subcategory1 "), - follow_redirects=True, - ) - subcategories = SubCategory.query.count() - - assert response.status_code == 200 - assert b"Name already exists for category" in response.data - assert subcategories == 1 - - def test_category_add_subcat_to_nonexisting_cat_post(self, test_client): - response = test_client.post( - url_for("category.add_sub", category_name="category"), - data=dict(name="subcategory"), - follow_redirects=True, - ) - subcategories = SubCategory.query.count() - - assert response.status_code == 400 - assert b"category does not exist" in response.data - assert subcategories == 0 diff --git a/shopyo/modules/box__ecommerce/category/upload.py b/shopyo/modules/box__ecommerce/category/upload.py deleted file mode 100644 index 26e0752..0000000 --- a/shopyo/modules/box__ecommerce/category/upload.py +++ /dev/null @@ -1,156 +0,0 @@ -import datetime -import uuid - -from app import app - -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.category.models import SubCategory -from modules.box__ecommerce.product.models import Product -from modules.box__ecommerce.product.models import Color -from modules.box__ecommerce.product.models import Size - - -colors = [Color(name='c1')] -sizes = [Size(name='s1')] -def add_uncategorised_category(): - with app.app_context(): - category = Category(name="uncategorised") - subcategory = SubCategory(name="uncategorised") - p1 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Apple", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p1.colors = colors - p1.sizes = sizes - - p2 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Pear", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p2.colors = colors - p2.sizes = sizes - - p3 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Peach", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p3.colors = colors - p3.sizes = sizes - - - subcategory.products.extend([p1, p2, p3]) - category.subcategories.append(subcategory) - category.save() - -def add_men_category(): - with app.app_context(): - category = Category(name="Men") - subcategory1 = SubCategory(name="Sneakers") - subcategory2 = SubCategory(name="Air Jordan") - subcategory3 = SubCategory(name="Slides") - subcategory4 = SubCategory(name="Airmax") - p1 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Demo Shoe 1", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p1.sizes = sizes - p1.colors = colors - - p2 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Demo Shoe 2", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p2.sizes = sizes - p2.colors = colors - - p3 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Demo Shoe 3", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p3.sizes = sizes - p3.colors = colors - - p4 = Product( - barcode=str(uuid.uuid1()), - price=10.0, - name="Demo Shoe 4", - in_stock=50, - selling_price=15.0, - discontinued=False, - description="", - ) - p4.sizes = sizes - p4.colors = colors - - - subcategory2.save(commit=False) - subcategory3.save(commit=False) - subcategory4.save(commit=False) - - - subcategory1.products.extend([p1, p2, p3, p4]) - category.subcategories.extend([ - subcategory1, - subcategory2, - subcategory3, - subcategory4 - ]) - category.save() - -def add_women_category(): - with app.app_context(): - category = Category(name="Women") - subcategory1 = SubCategory(name="Sneakers") - subcategory2 = SubCategory(name="Air Jordan") - subcategory3 = SubCategory(name="Slides") - subcategory4 = SubCategory(name="Airmax") - - subcategory2.save(commit=False) - subcategory3.save(commit=False) - subcategory4.save(commit=False) - subcategory1.save(commit=False) - - category.subcategories.extend([ - subcategory1, - subcategory2, - subcategory3, - subcategory4 - ]) - category.save() - -def upload(): - # print("Adding category and subcategory uncategorised ...") - # add_uncategorised_category() - print('Add category') - add_men_category() - add_women_category() diff --git a/shopyo/modules/box__ecommerce/category/view.py b/shopyo/modules/box__ecommerce/category/view.py deleted file mode 100644 index a3e59d2..0000000 --- a/shopyo/modules/box__ecommerce/category/view.py +++ /dev/null @@ -1,528 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import current_app -from flask import flash -from flask import jsonify -from flask import redirect -from flask import render_template -from flask import request -from flask import send_from_directory -from flask import url_for -from sqlalchemy import and_ - -import flask_uploads -from flask_login import login_required -from flask_sqlalchemy import sqlalchemy - -from shopyoapi.file import delete_file -from shopyoapi.file import unique_sec_filename -from shopyoapi.html import notify_success -from shopyoapi.html import notify_warning -from shopyoapi.init import categoryphotos -from shopyoapi.init import subcategoryphotos -from shopyoapi.init import db -from shopyoapi.validators import is_empty_str - -from modules.box__default.settings.helpers import get_setting -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.category.models import SubCategory -from modules.resource.models import Resource - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - -module_name = module_info["module_name"] - - -@module_blueprint.route(module_info["dashboard"]) -@login_required -def dashboard(): - context = {} - context["categorys"] = Category.query.all() - context["active_page"] = get_setting("SECTION_NAME") - return render_template("category/dashboard.html", **context) - - -@module_blueprint.route("/add", methods=["GET", "POST"]) -@login_required -def add(): - - context = {} - has_category = False - - if request.method == "POST": - # convert name to lower case and remove leading - # and trailing spaces - name = request.form["name"].lower().strip() - - # case 1: do not allow adding empty category name - if is_empty_str(name): - flash(notify_warning("Category name cannot be empty")) - return redirect(url_for("category.add")) - - # case 2: do not allow category name uncategorised - # not sure if this is needed since if we add this - # during initialization then this check will be covered - # by case 3 - if name == "uncategorised" or name == "uncategorized": - flash(notify_warning("Category cannot be named as uncategorised")) - return redirect(url_for("category.add")) - - has_category = Category.category_exists(name) - - # case 3: do not allow adding existing category name - if has_category: - flash(notify_warning(f'Category "{name}" already exists')) - return render_template("category/add.html", **context) - - # case 4: sucessfully add the category - category = Category(name=name) - try: - if "photo" in request.files: - file = request.files["photo"] - - filename = unique_sec_filename(file.filename) - file.filename = filename - categoryphotos.save(file) - category.resources.append( - Resource( - type="image", - filename=filename, - category="category_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - - category.save() - flash(notify_success(f'Category "{name}" added successfully')) - return render_template("category/add.html", **context) - - context["has_category"] = str(has_category) - return render_template("category/add.html", **context) - - -@module_blueprint.route("/delete", methods=["GET"]) -@login_required -def delete(name): - - if is_empty_str(name): - flash(notify_warning("Cannot delete a category with no name")) - return redirect(url_for("category.dashboard")) - - if name != "uncategorised": - - category = Category.query.filter(Category.name == name).first() - - if not category: - flash(notify_warning(f'Category "{name}" does not exist.')) - return redirect(url_for("category.dashboard")) - - if category.subcategories: - flash( - notify_warning( - f'Please delete all subcategories for category "{name}"' - ) - ) - return redirect(url_for("category.dashboard")) - - category.delete() - flash(notify_success(f'Category "{name}" successfully deleted')) - return redirect(url_for("category.dashboard")) - - flash(notify_warning("Cannot delete category uncategorised")) - return redirect(url_for("category.dashboard")) - - -@module_blueprint.route( - "//img//delete", methods=["GET"] -) -@login_required -def category_image_delete(category_name, filename): - resource = Resource.query.filter(Resource.filename == filename).first() - category = Category.query.filter(Category.name == category_name).first() - category.resources.remove(resource) - category.update() - delete_file( - os.path.join( - current_app.config["UPLOADED_CATEGORYPHOTOS_DEST"], filename - ) - ) - - return redirect(url_for("category.dashboard")) - - -@module_blueprint.route("/update", methods=["GET", "POST"]) -@login_required -def update(): - context = {} - - if request.method == "POST": - name = request.form["category_name"] - old_name = request.form["old_category_name"] - try: - category = Category.query.filter_by(name=old_name).first() - - try: - if "photo" in request.files: - file = request.files["photo"] - - filename = unique_sec_filename(file.filename) - file.filename = filename - categoryphotos.save(file) - category.resources.append( - Resource( - type="image", - filename=filename, - category="category_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - - category.name = name - category.update() - except sqlalchemy.exc.IntegrityError: - context[ - "message" - ] = "you cannot modify to an already existing category" - context["redirect_url"] = "/category/" - render_template("category/message.html", **context) - return redirect(url_for("category.dashboard")) - - -@module_blueprint.route( - "{}/edit/".format(module_info["dashboard"]), - methods=["GET"], -) -@login_required -def edit_dashboard(category_name): - context = {} - category = Category.query.filter(Category.name == category_name).first() - - context.update({"len": len, "category": category}) - return render_template("category/edit.html", **context) - - -# api -@module_blueprint.route("/check/", methods=["GET"]) -@login_required -def check(category_name): - has_category = Category.category_exists(category_name) - return jsonify({"exists": has_category}) - - -# -# subcategory -# - - -@module_blueprint.route( - "{}//sub/".format(module_info["dashboard"]), - methods=["GET"], -) -@login_required -def manage_sub(category_name): - context = {} - category = Category.query.filter(Category.name == category_name).first() - - if category is None: - flash(notify_warning("category name does not exist")) - - context.update({"category": category}) - return render_template("category/manage_sub.html", **context) - - -@module_blueprint.route( - "{}//sub/add".format(module_info["dashboard"]), - methods=["GET", "POST"], -) -@login_required -def add_sub(category_name): - if request.method == "POST": - - category = Category.query.filter( - Category.name == category_name - ).scalar() - - # case 1: do not allow adding subcategory to nonexisting - # category - if category is None: - return "category does not exist", 400 - - # convert name to lower case and remove leading - # and trailing spaces - name = request.form["name"].lower().strip() - - # case 2: do not allow adding subcategory with - # empty name - if is_empty_str(name): - flash(notify_warning("Name cannot be empty")) - return redirect( - url_for( - "category.manage_sub", - category_name=category_name, - ) - ) - - existing = ( - SubCategory.query.join(Category) - .filter( - and_(SubCategory.name == name, Category.name == category_name) - ) - .first() - ) - - # case 3: do not allow adding existing subcategory - # inside a given category - if existing: - flash(notify_warning("Name already exists for category")) - return redirect( - url_for( - "category.manage_sub", - category_name=category_name, - ) - ) - - # case 4: successfully add subcategory to desired category - category = Category.query.filter( - Category.name == category_name - ).first() - subcategory = SubCategory(name=name) - - try: - if "photo" in request.files: - file = request.files["photo"] - - filename = unique_sec_filename(file.filename) - file.filename = filename - subcategoryphotos.save(file) - subcategory.resources.append( - Resource( - type="image", - filename=filename, - category="subcategory_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - - category.subcategories.append(subcategory) - category.update() - return redirect( - url_for("category.manage_sub", category_name=category_name) - ) - - -@module_blueprint.route( - "{}/sub//img/edit".format(module_info["dashboard"]), - methods=["GET"], -) -@login_required -def edit_sub_img_dashboard(subcategory_id): - context = {} - subcategory = SubCategory.query.get(subcategory_id) - context.update({"len": len, "subcategory": subcategory}) - return render_template("category/edit_img_sub.html", **context) - - -@module_blueprint.route( - "/sub//name/edit", methods=["GET", "POST"] -) -@login_required -def edit_sub_name(subcategory_id): - if request.method == "POST": - subcategory = SubCategory.query.get(subcategory_id) - name = request.form["name"] - if is_empty_str(name): - flash(notify_warning("Name cannot be empty")) - return redirect( - url_for( - "category.manage_sub", - category_name=subcategory.category.name, - ) - ) - category_name = subcategory.category.name - existing = SubCategory.query.filter( - (SubCategory.name == name) & (Category.name == category_name) - ).first() - if existing: - flash(notify_warning("Name already exists for category")) - return redirect( - url_for( - "category.manage_sub", - category_name=subcategory.category.name, - ) - ) - subcategory.name = name - subcategory.update() - flash(notify_success("Subcategory name updated successfully!")) - return redirect( - url_for( - "category.manage_sub", category_name=subcategory.category.name - ) - ) - - -@module_blueprint.route( - "/sub//img/edit", methods=["GET", "POST"] -) -@login_required -def edit_sub_img(subcategory_id): - if request.method == "POST": - subcategory = SubCategory.query.get(subcategory_id) - try: - if "photo" in request.files: - file = request.files["photo"] - - filename = unique_sec_filename(file.filename) - file.filename = filename - subcategoryphotos.save(file) - subcategory.resources.append( - Resource( - type="image", - filename=filename, - category="subcategory_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - subcategory.update() - return redirect( - url_for( - "category.edit_sub_img_dashboard", - subcategory_id=subcategory.id, - ) - ) - - -@module_blueprint.route( - "/sub//img//delete", methods=["GET"] -) -@login_required -def subcategory_image_delete(subcategory_id, filename): - resource = Resource.query.filter(Resource.filename == filename).first() - subcategory = SubCategory.query.get(subcategory_id) - subcategory.resources.remove(resource) - subcategory.update() - delete_file( - os.path.join( - current_app.config["UPLOADED_SUBCATEGORYPHOTOS_DEST"], filename - ) - ) - - return redirect( - url_for( - "category.edit_sub_img_dashboard", subcategory_id=subcategory_id - ) - ) - - -@module_blueprint.route("/sub//delete", methods=["GET"]) -@login_required -def sub_delete(subcategory_id): - subcategory = SubCategory.query.get(subcategory_id) - category_name = subcategory.category.name - if ( - subcategory.name == "uncategorised" - and subcategory.category.name == "uncategorised" - ): - flash( - notify_warning( - "Cannot delete subcategory uncategorised " - + "of category uncategorised" - ) - ) - return redirect( - url_for("category.manage_sub", category_name=category_name) - ) - - uncategorised_sub = ( - SubCategory.query.join(Category) - .filter( - and_( - SubCategory.name == "uncategorised", - Category.name == "uncategorised", - ) - ) - .first() - ) - - # before removing the subcategory, move the products - # in this subcategory to uncategorised subcategory - for product in subcategory.products: - uncategorised_sub.products.append(product) - - subcategory.products = [] - db.session.delete(subcategory) - db.session.commit() - - # for resource in subcategory.resources: - # filename = resource.filename - # resource.delete() - # delete_file( - # os.path.join( - # current_app.config["UPLOADED_SUBCATEGORYPHOTOS_DEST"], - # filename - # ) - # ) - # subcategory.delete() - - # add for products change - return redirect( - url_for("category.manage_sub", category_name=category_name) - ) - - -@module_blueprint.route( - "/{}/sub".format(module_info["dashboard"]), - methods=["GET"], -) -@login_required -def choose_sub_dashboard(category_id): - context = {} - category = Category.query.get(category_id) - - context.update({"category": category}) - return render_template("category/choose_sub.html", **context) - - -# -# serve files -# - - -@module_blueprint.route("/sub/file/", methods=["GET"]) -@login_required -def subcategory_image(filename): - if filename == "default": - return send_from_directory( - os.path.join(current_app.config["BASE_DIR"], "static", "default"), - "default_subcategory.jpg", - ) - return send_from_directory( - current_app.config["UPLOADED_SUBCATEGORYPHOTOS_DEST"], filename - ) - - -@module_blueprint.route("/file/", methods=["GET"]) -@login_required -def category_image(filename): - - return send_from_directory( - current_app.config["UPLOADED_CATEGORYPHOTOS_DEST"], filename - ) diff --git a/shopyo/modules/box__ecommerce/customer/forms.py b/shopyo/modules/box__ecommerce/customer/forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/customer/global.py b/shopyo/modules/box__ecommerce/customer/global.py deleted file mode 100644 index 516c4fb..0000000 --- a/shopyo/modules/box__ecommerce/customer/global.py +++ /dev/null @@ -1,4 +0,0 @@ - -available_everywhere = { - -} diff --git a/shopyo/modules/box__ecommerce/customer/info.json b/shopyo/modules/box__ecommerce/customer/info.json deleted file mode 100644 index 316d9b6..0000000 --- a/shopyo/modules/box__ecommerce/customer/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Customer", - "module_name":"customer", - "type": "hide", - "fa-icon": "fa fa-store", - "url_prefix": "/customer", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/customer/models.py b/shopyo/modules/box__ecommerce/customer/models.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/customer/templates/customer/blocks/sidebar.html b/shopyo/modules/box__ecommerce/customer/templates/customer/blocks/sidebar.html deleted file mode 100644 index 15322fc..0000000 --- a/shopyo/modules/box__ecommerce/customer/templates/customer/blocks/sidebar.html +++ /dev/null @@ -1,21 +0,0 @@ -{{ -sidebar_item('Shop', -icon='fa fa-home', -url=url_for('shop.index') -) -}} - -{{ -sidebar_item('Dashboard', -icon='fa fa-home', -url=url_for('customer.dashboard') -) -}} - - -{{ -sidebar_item('Orders', -icon='fa fa-home', -url=url_for('customer.orders') -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/customer/templates/customer/dashboard.html b/shopyo/modules/box__ecommerce/customer/templates/customer/dashboard.html deleted file mode 100644 index c7361c4..0000000 --- a/shopyo/modules/box__ecommerce/customer/templates/customer/dashboard.html +++ /dev/null @@ -1,20 +0,0 @@ - -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{% include info['module_name']+'/blocks/sidebar.html' %} -{% endblock %} -{% block content %} -
- -
-
- -
-
-{% endblock %} diff --git a/shopyo/modules/box__ecommerce/customer/templates/customer/order_item_view.html b/shopyo/modules/box__ecommerce/customer/templates/customer/order_item_view.html deleted file mode 100644 index 605e33c..0000000 --- a/shopyo/modules/box__ecommerce/customer/templates/customer/order_item_view.html +++ /dev/null @@ -1,89 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} -Orders - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- - - -

-
-
- - - - - - - - - - - - - - - - - - - - - - - {%for order_item in order.order_items%} - {%set product = order_item.get_product()%} - - - - - - - - {%endfor%} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Time{{order.get_std_formatted_time()}}
Status - {{order.status}} -
Items
Name Barcode Price Quantity Total
{{product.name}}{{product.barcode}}{{product.selling_price}}{{order_item.quantity}}{{product.selling_price * order_item.quantity}}
Total amount{{order.get_total_amount()}}
Customer Name{{order.billing_detail.first_name}} {{order.billing_detail.last_name}}
Street{{order.billing_detail.street}}
Town/City{{order.billing_detail.town_city}}
Phone{{order.billing_detail.phone}}
Email{{order.billing_detail.email}}
-
-
-
- - -{% endblock %} - - diff --git a/shopyo/modules/box__ecommerce/customer/templates/customer/orders.html b/shopyo/modules/box__ecommerce/customer/templates/customer/orders.html deleted file mode 100644 index 2cf387d..0000000 --- a/shopyo/modules/box__ecommerce/customer/templates/customer/orders.html +++ /dev/null @@ -1,115 +0,0 @@ - -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{% include info['module_name']+'/blocks/sidebar.html' %} -{% endblock %} -{% block content %} -
- -
-
-

Orders (Logged In)

- - - - - - - - - - - {%for order in logged_in_orders.items%} - - - - - - - - - {%endfor%} - - {% if prev_url %} - Prev - {% endif %} - {% if next_url %} - Next - {% endif %} -
timestatus
{{order.get_std_formatted_time()}}{{order.status}}view
- -
- - « - - - {% for page_num in logged_in_orders.iter_pages(left_edge=1, right_edge=1, left_current=1, right_current=2) %}{% if page_num %} - - {% if logged_in_orders.page == page_num %} - - {{ page_num }} - - {% else %} - - {{ page_num }} - - {% endif %} - {% else %} - ... - {% endif %} - {% endfor %} - - » - -
-

- Showing page {{ logged_in_orders.page }} of {{ logged_in_orders.pages }} -

-
-
- -
-
-
-

Orders (Not Logged In)

- - - - - - - - - - - - {%for order in not_logged_in_orders%} - {%for order_item in order.order_items%} - - - - - - - - - - {%endfor%} - {%endfor%} - -
customertimestatusproductquantity
{{order_item.item_order.billing_detail.email}}{{order_item.item_order.get_std_formatted_time()}}{{order_item.status}}{{order_item.order_item_product.name}}{{order_item.quantity}}
-
-
-{% endblock %} diff --git a/shopyo/modules/box__ecommerce/customer/tests/test_customer_functional.py b/shopyo/modules/box__ecommerce/customer/tests/test_customer_functional.py deleted file mode 100644 index 8d45236..0000000 --- a/shopyo/modules/box__ecommerce/customer/tests/test_customer_functional.py +++ /dev/null @@ -1 +0,0 @@ -# Please add your functional tests to this file. diff --git a/shopyo/modules/box__ecommerce/customer/tests/test_customer_models.py b/shopyo/modules/box__ecommerce/customer/tests/test_customer_models.py deleted file mode 100644 index c7a836b..0000000 --- a/shopyo/modules/box__ecommerce/customer/tests/test_customer_models.py +++ /dev/null @@ -1 +0,0 @@ -# Please add your models tests to this file. diff --git a/shopyo/modules/box__ecommerce/customer/view.py b/shopyo/modules/box__ecommerce/customer/view.py deleted file mode 100644 index 3a87cfc..0000000 --- a/shopyo/modules/box__ecommerce/customer/view.py +++ /dev/null @@ -1,103 +0,0 @@ - -from shopyoapi.module import ModuleHelp -from modules.box__default.auth.forms import RegisterCustomerForm -from modules.box__default.admin.models import User -from modules.box__ecommerce.shop.models import Order -from modules.box__ecommerce.shop.models import OrderItem -from modules.box__ecommerce.shop.models import BillingDetail - -# from flask import render_template -from flask import url_for -# from flask import redirect -from flask import flash -from flask import request - -from shopyoapi.html import notify_warning -from shopyoapi.html import notify_success -from shopyoapi.forms import flash_errors -from shopyoapi.init import db - -from flask_login import login_required -from flask_login import logout_user -from flask_login import current_user - -mhelp = ModuleHelp(__file__, __name__) -globals()[mhelp.blueprint_str] = mhelp.blueprint -module_blueprint = globals()[mhelp.blueprint_str] - -@module_blueprint.route("/register", methods=['POST']) -@login_required -def register(): - if request.method == 'POST': - form = RegisterCustomerForm() - if not form.validate_on_submit(): - flash_errors(form) - user = User() - if User.query.filter(User.email == form.email.data).first(): - flash(notify_warning("Email exists")) - return mhelp.redirect_url('shop.homepage') - user.email = form.email.data - password1 = form.password.data - password2 = form.reconfirm_password.data - if not password1 == password2: - flash(notify_warning("Passwords don't match")) - return mhelp.redirect_url('shop.homepage') - user.password = password1 - user.is_customer = True - print(user.email, password1) - user.save() - flash(notify_success('Successfully registered, please log in!')) - return mhelp.redirect_url('shop.homepage') - -@module_blueprint.route("/logout", methods=["GET", "POST"]) -def logout(): - logout_user() - return mhelp.redirect_url('shop.homepage') - -@module_blueprint.route("/dashboard", methods=['GET']) -@login_required -def dashboard(): - context = mhelp.context() - context.update({'_hide_nav': True, '_logout_url':url_for('customer.logout')}) - return mhelp.render('dashboard.html', **context) - - -@module_blueprint.route("/orders", methods=['GET']) -@login_required -def orders(): - context = mhelp.context() - NO_OF_ITEMS = 5 - - page = request.args.get('page',1,type=int) - logged_in_orders = Order.query.filter(Order.logged_in_customer_email == current_user.email).paginate(page, NO_OF_ITEMS, False) - - not_logged_in_orders = Order.query.join(BillingDetail).filter( - (BillingDetail.email == current_user.email) & - (Order.logged_in_customer_email == '')).all() - context.update({'logged_in_orders': logged_in_orders, 'not_logged_in_orders': not_logged_in_orders}) - context.update({'_hide_nav': True, '_logout_url':url_for('customer.logout')}) - return mhelp.render('orders.html', **context) - - -@module_blueprint.route("/order//view", methods=["GET", "POST"]) -@login_required -def order_view(order_id): - order = Order.query.get(order_id) - context = mhelp.context() - context.update({'order': order}) - context.update({'_hide_nav': True, '_logout_url':url_for('customer.logout')}) - return mhelp.render("order_item_view.html", **context) - - - -# If "dashboard": "/dashboard" is set in info.json -# -# @module_blueprint.route("/dashboard", methods=["GET"]) -# def dashboard(): - -# context = mhelp.context() - -# context.update({ - -# }) -# return mhelp.render('dashboard.html', **context) diff --git a/shopyo/modules/box__ecommerce/pos/forms.py b/shopyo/modules/box__ecommerce/pos/forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/pos/info.json b/shopyo/modules/box__ecommerce/pos/info.json deleted file mode 100644 index 94367ac..0000000 --- a/shopyo/modules/box__ecommerce/pos/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Pos", - "module_name":"pos", - "type": "show", - "fa-icon": "fa fa-cash-register", - "url_prefix": "/pos", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/pos/models.py b/shopyo/modules/box__ecommerce/pos/models.py deleted file mode 100644 index 245a994..0000000 --- a/shopyo/modules/box__ecommerce/pos/models.py +++ /dev/null @@ -1,28 +0,0 @@ -from datetime import datetime - -from shopyoapi.init import db - - -class Transaction(db.Model): - __tablename__ = "transactions" - - id = db.Column(db.Integer, primary_key=True) - - chashier_id = db.Column(db.Integer) - time = db.Column(db.DateTime, default=datetime.now()) - quantity = db.Column(db.Integer) - price = db.Column(db.Float) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__ecommerce/pos/templates/pos/index.html b/shopyo/modules/box__ecommerce/pos/templates/pos/index.html deleted file mode 100644 index 0cfd345..0000000 --- a/shopyo/modules/box__ecommerce/pos/templates/pos/index.html +++ /dev/null @@ -1,199 +0,0 @@ -{% extends "base/main_base.html" %} -{% set active_page ='pos' %} -{% block pagehead %} - - -{% endblock %} -{% block content %} -
-
-
-
-
-

- Total $0 - 0 -

-
-
-
- - -

Return $---

-

- - -

-
-
-
-
-
- -
- {%for category in categories%} -
- {%for subcategory in category.subcategories%} -

{{subcategory.name}}

- {%for product in subcategory.products%} - {%if product.in_stock > 0%} -

- {{product.name}} - {{product.selling_price}} - {{product.in_stock}} -

- {%endif%} - {%endfor%} - {%endfor%} -
- {%endfor%} -
-
-
-
-
-
-
-
- -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/pos/view.py b/shopyo/modules/box__ecommerce/pos/view.py deleted file mode 100644 index bb39362..0000000 --- a/shopyo/modules/box__ecommerce/pos/view.py +++ /dev/null @@ -1,68 +0,0 @@ -import json -import os - -from flask import Blueprint -from flask import jsonify -from flask import render_template -from flask import request - -from flask_login import current_user -from flask_login import login_required - -# from flask import url_for -# from flask import redirect -# from flask import flash -# from shopyoapi.html import notify_success - -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.pos.models import Transaction -from modules.box__ecommerce.product.models import Product - -# from shopyoapi.forms import flash_errors - - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - - -@module_blueprint.route("/") -@login_required -def index(): - context = {} - categories = Category.query.all() - context.update({"categories": categories}) - return render_template("pos/index.html", **context) - - -@module_blueprint.route("/transaction", methods=["GET", "POST"]) -@login_required -def transaction(): - if request.method == "POST": - json = request.get_json() - for key in json: - prod_id = key - number_items = json[key]["count"] - product = Product.query.get(prod_id) - product.in_stock -= number_items - - product.update() - - transaction = Transaction() - transaction.chashier_id = current_user.id - transaction.products = [Product.query.get(key) for key in json] - transaction.insert() - - return jsonify({"message": "ok"}) diff --git a/shopyo/modules/box__ecommerce/product/__init__.py b/shopyo/modules/box__ecommerce/product/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/product/global.py b/shopyo/modules/box__ecommerce/product/global.py deleted file mode 100644 index 0da7b67..0000000 --- a/shopyo/modules/box__ecommerce/product/global.py +++ /dev/null @@ -1,10 +0,0 @@ -from modules.box__ecommerce.product.models import Product - - -def get_products(): - return Product.query.all() - - -available_everywhere = { - "get_products": get_products, -} diff --git a/shopyo/modules/box__ecommerce/product/info.json b/shopyo/modules/box__ecommerce/product/info.json deleted file mode 100644 index c6ffaaf..0000000 --- a/shopyo/modules/box__ecommerce/product/info.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "display_string": "Products", - "module_name":"product", - "type": "hidden", - "fa-icon": "", - "url_prefix": "/product", - "dashboard": "/dashboard" -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/models.py b/shopyo/modules/box__ecommerce/product/models.py deleted file mode 100644 index e4e51ed..0000000 --- a/shopyo/modules/box__ecommerce/product/models.py +++ /dev/null @@ -1,94 +0,0 @@ -from shopyoapi.init import db -from shopyoapi.models import PkModel -from flask import url_for - -# from modules.box__ecommerce.pos.models import Transaction - -transaction_helpers = db.Table( - "transaction_helpers", - db.Column("product_barcode", db.Integer, db.ForeignKey("product.id")), - db.Column("transaction_id", db.Integer, db.ForeignKey("transactions.id")), -) - - -class Product(PkModel): - __tablename__ = "product" - - barcode = db.Column(db.String(100)) - price = db.Column(db.Float) - name = db.Column(db.String(100)) - description = db.Column(db.String(300)) - date = db.Column(db.String(100)) - in_stock = db.Column(db.Integer) - discontinued = db.Column(db.Boolean) - selling_price = db.Column(db.Float) - - is_onsale = db.Column(db.Boolean, default=False) - is_featured = db.Column(db.Boolean, default=False) - subcategory_name = db.relationship("SubCategory", backref=db.backref("subcategory", uselist=False)) - transactions = db.relationship( - "Transaction", - secondary=transaction_helpers, - backref="products", - cascade="all, delete", - ) - resources = db.relationship( - "Resource", backref="resources", lazy=True, cascade="all, delete" - ) - colors = db.relationship('Color', backref='color_product', lazy=True, cascade="all, delete, delete-orphan") - sizes = db.relationship('Size', backref='size_product', lazy=True, cascade="all, delete, delete-orphan") - - # - subcategory_id = db.Column(db.Integer, db.ForeignKey('subcategories.id'), - nullable=False) - - - def get_color_string(self): - return '\n'.join([c.name for c in self.colors]) - - - def get_size_string(self): - return '\n'.join([s.name for s in self.sizes]) - - def get_one_image_url(self): - if len(self.resources) == 0: - return url_for('static', filename='default/default_product.jpg') - else: - resource = self.resources[0] - return url_for('static', filename='uploads/products/{}'.format(resource.filename)) - - def get_page_url(self): - return url_for('shop.product', product_barcode=self.barcode) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - -class Color(PkModel): - - __tablename__ = "color" - - - name = db.Column(db.String(100)) - - product_id = db.Column(db.Integer, db.ForeignKey('product.id')) - - -class Size(PkModel): - - __tablename__ = "size" - - - name = db.Column(db.String(100)) - - product_id = db.Column(db.Integer, db.ForeignKey('product.id')) \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/templates/product/add.html b/shopyo/modules/box__ecommerce/product/templates/product/add.html deleted file mode 100644 index 1beca5e..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/add.html +++ /dev/null @@ -1,136 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='products' %} -{% block pagehead %} -add product -{% endblock %} -{% block sidebar %} -{%include 'product/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
- {% if has_product == 'True' %} - - {% endif %} -

Add product for - --- - --- -

-
-
- - -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
- - -
- - -
-
- -
-
- -
- -
-
- - - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/templates/product/blocks/sidebar.html b/shopyo/modules/box__ecommerce/product/templates/product/blocks/sidebar.html deleted file mode 100644 index d5e354e..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/blocks/sidebar.html +++ /dev/null @@ -1,35 +0,0 @@ -{{ -sidebar_item( -'Category Home', -icon='fa fa-store', -url=url_for('category.dashboard') -) -}} - - - -{{ -sidebar_item( -'Products Home', -icon='fa fa-shopping-bag', -url=url_for('product.list', subcategory_id=subcategory.id) -) -}} - - -{{ -sidebar_item( -'Add Product', -icon='fas fa-plus-circle', -url=url_for('product.add_dashboard', subcategory_id=subcategory.id) -) -}} - - -{{ -sidebar_item( -'Search', -icon='fas fa-search', -url=url_for('product.lookup', subcategory_id=subcategory.id) -) -}} diff --git a/shopyo/modules/box__ecommerce/product/templates/product/edit.html b/shopyo/modules/box__ecommerce/product/templates/product/edit.html deleted file mode 100644 index 00d12eb..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/edit.html +++ /dev/null @@ -1,184 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='products' %} -{% block pagehead %} -edit - -{% endblock %} -{% block sidebar %} -{%include 'product/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

Edit product for - --- - --- -

-
-
- -
-
- -
- - -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- - -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
-
- -
- -
- -
- - -
- - -
-
- {%if len(product.resources) != 0%} - - {%endif%} -
- -
-
- -
- -
-
- - - - - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/templates/product/list.html b/shopyo/modules/box__ecommerce/product/templates/product/list.html deleted file mode 100644 index 53d9c2d..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/list.html +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ='products' %} -{% block pagehead %} -SpareParts -{% endblock %} -{% block sidebar %} -{%include 'product/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
-

products for - --- - --- -

-
- - - - - - - - - - - - - - - - {%if subcategory.products%} - {%for p in subcategory.products%} - - - - - - - - - - - - {%endfor%} - {%endif%} - -
barcodenamedescriptiondatepriceselling pricediscontinuedin stock
{{p.barcode}}{{p.name}}{{p.description}}{{p.date}}{{p.price}}{{p.selling_price}}{{p.discontinued}}{{p.in_stock}} - - - - - - -
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/templates/product/lookup.html b/shopyo/modules/box__ecommerce/product/templates/product/lookup.html deleted file mode 100644 index 75fedc4..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/lookup.html +++ /dev/null @@ -1,127 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page ="products" %} -{% block pagehead %} -lookup -{% endblock %} -{% block sidebar %} -{%include 'product/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- -
-
- -
-
- -
- -
-
- - -
-
- {%for field in fields%} -
- - -
- {%endfor%} -
-
-
-

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
barcodenamedescriptiondatepriceselling pricein stockdiscontinued
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/templates/product/nav.html b/shopyo/modules/box__ecommerce/product/templates/product/nav.html deleted file mode 100644 index 86399d7..0000000 --- a/shopyo/modules/box__ecommerce/product/templates/product/nav.html +++ /dev/null @@ -1,31 +0,0 @@ - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/product/view.py b/shopyo/modules/box__ecommerce/product/view.py deleted file mode 100644 index df41c40..0000000 --- a/shopyo/modules/box__ecommerce/product/view.py +++ /dev/null @@ -1,354 +0,0 @@ -import json -import os -import uuid - -from flask import Blueprint -from flask import current_app - -# from flask import flash -from flask import jsonify -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for - -import flask_uploads -from flask_login import login_required -from sqlalchemy import exists -from werkzeug.utils import secure_filename - -from shopyoapi.file import delete_file -from shopyoapi.file import unique_filename -from shopyoapi.init import db -from shopyoapi.init import ma -from shopyoapi.init import productphotos - -from modules.box__ecommerce.category.models import SubCategory -from modules.box__ecommerce.product.models import Product -from modules.box__ecommerce.product.models import Size -from modules.box__ecommerce.product.models import Color -from modules.resource.models import Resource - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -class Productchema(ma.Schema): - class Meta: - # Fields to expose - fields = ( - "barcode", - "name", - "description", - "price", - "selling_price", - "in_stock", - "discontinued", - ) - - -product_schema = Productchema() -product_schema = Productchema(many=True) - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - -module_name = module_info["module_name"] - - -@module_blueprint.route("/sub//dashboard") -@login_required -def list(subcategory_id): - context = {} - subcategory = SubCategory.query.get(subcategory_id) - - context.update({"subcategory": subcategory}) - return render_template("product/list.html", **context) - - -@module_blueprint.route( - "/sub//add/dashboard", methods=["GET", "POST"] -) -@login_required -def add_dashboard(subcategory_id): - context = {} - - has_product = False - subcategory = SubCategory.query.get(subcategory_id) - context["subcategory"] = subcategory - context["has_product"] = str(has_product) - context["barcodestr"] = uuid.uuid1() - return render_template("product/add.html", **context) - - -@module_blueprint.route("/sub//add", methods=["GET", "POST"]) -@login_required -def add(subcategory_id): - - if request.method == "POST": - - subcategory = SubCategory.query.get(subcategory_id) - barcode = request.form["barcode"] - name = request.form["name"] - description = request.form["description"] - date = request.form["date"] - price = request.form["price"] - selling_price = request.form["selling_price"] - in_stock = request.form["in_stock"] - colors = request.form["colors"] - sizes = request.form["sizes"] - - if request.form["discontinued"] == "True": - discontinued = True - else: - discontinued = False - - # category = Category.query.filter( - # Category.name == category_name).first() - # print(category, category_name, category.name) - has_product = db.session.query( - exists().where(Product.barcode == barcode) - ).scalar() - - if has_product is False: - p = Product( - barcode=barcode, - name=name, - in_stock=in_stock, - discontinued=discontinued, - ) - if description: - p.description = description.strip() - if date: - p.date = date.strip() - if price: - p.price = price.strip() - elif not price.strip(): - p.price = 0 - if selling_price: - p.selling_price = selling_price.strip() - - sizes = sizes.strip().strip('\n') - sizes = [s.strip('\r') for s in sizes.split('\n') if s.strip()] - sizes = [Size(name=s) for s in sizes] - p.sizes = sizes - - colors = colors.strip().strip('\n') - colors = [c.strip('\r') for c in colors.split('\n') if c.strip()] - colors = [Color(name=c) for c in colors] - p.colors = colors - - # if 'photos[]' not in request.files: - # flash(notify_warning('no file part')) - try: - if "photos[]" in request.files: - files = request.files.getlist("photos[]") - for file in files: - filename = unique_filename( - secure_filename(file.filename) - ) - file.filename = filename - productphotos.save(file) - p.resources.append( - Resource( - type="image", - filename=filename, - category="product_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - - subcategory.products.append(p) - subcategory.update() - return redirect( - url_for("product.add_dashboard", subcategory_id=subcategory_id) - ) - - -@module_blueprint.route("//delete", methods=["GET", "POST"]) -@login_required -def delete(barcode): - product = Product.query.filter(Product.barcode == barcode).first() - subcategory = product.subcategory - for resource in product.resources: - filename = resource.filename - delete_file( - os.path.join( - current_app.config["UPLOADED_PRODUCTPHOTOS_DEST"], filename - ) - ) - product.delete() - db.session.commit() - return redirect(url_for("product.list", subcategory_id=subcategory.id)) - - -@module_blueprint.route("//edit/dashboard", methods=["GET", "POST"]) -@login_required -def edit_dashboard(barcode): - context = {} - - product = Product.query.filter(Product.barcode == barcode).first() - - context.update( - {"len": len, "product": product, "subcategory": product.subcategory} - ) - return render_template("product/edit.html", **context) - - -@module_blueprint.route( - "/sub//update", methods=["GET", "POST"] -) -@login_required -def update(subcategory_id): - # this block is only entered when the form is submitted - if request.method == "POST": - subcategory = SubCategory.query.get(subcategory_id) - barcode = request.form["barcode"] - old_barcode = request.form["old_barcode"] - # category = request.form["category"] - - name = request.form["name"] - description = request.form["description"] - - date = request.form["date"] - price = request.form["price"] - product_id = request.form['product_id'] - if not price.strip(): - price = 0 - selling_price = request.form["selling_price"] - in_stock = request.form["in_stock"] - colors = request.form["colors"] - sizes = request.form["sizes"] - - if request.form["discontinued"] == "True": - discontinued = True - else: - discontinued = False - - p = Product.query.get(product_id) - p.barcode = barcode - p.name = name - p.description = description - p.date = date - p.price = price - p.selling_price = selling_price - p.in_stock = in_stock - p.discontinued = discontinued - - with db.session.no_autoflush: - p.sizes.clear() - sizes = sizes.strip().strip('\n') - sizes = [s.strip('\r') for s in sizes.split('\n') if s.strip()] - sizes = [Size(name=s, product_id=p.id) for s in sizes] - p.sizes.extend(sizes) - with db.session.no_autoflush: - p.colors.clear() - colors = colors.strip().strip('\n') - colors = [c.strip('\r') for c in colors.split('\n') if c.strip()] - colors = [Color(name=c, product_id=p.id) for c in colors] - p.colors.extend(colors) - # p.category = category - try: - if "photos[]" in request.files: - - files = request.files.getlist("photos[]") - for file in files: - filename = unique_filename(secure_filename(file.filename)) - file.filename = filename - productphotos.save(file) - p.resources.append( - Resource( - type="image", - filename=filename, - category="product_image", - ) - ) - except flask_uploads.UploadNotAllowed as e: - pass - db.session.commit() - return redirect(url_for("product.list", subcategory_id=subcategory.id)) - - -@module_blueprint.route("sub//lookup") -@login_required -def lookup(subcategory_id): - context = {} - - subcategory = SubCategory.query.get(subcategory_id) - context["subcategory"] = subcategory - context["fields"] = [ - key.replace("_", " ") - for key in Product.__table__.columns.keys() - if key not in ["category_name"] - ] - - return render_template("product/lookup.html", **context) - - -# api -@module_blueprint.route( - "sub//search/", methods=["GET"] -) -@login_required -def search(subcategory_id, user_input): - if request.method == "GET": - subcategory = SubCategory.query.get(subcategory_id) - print(request.args["field"], request.args["global_search"]) - field = request.args["field"] - global_search = request.args["global_search"] - if global_search == "True": - subcategory_name = subcategory.name - all_p = Product.query.filter( - (getattr(Product, field).like("%" + user_input + "%")) - & (Product.subcategory_name == subcategory_name) - ).all() - result = product_schema.dump(all_p) - else: - all_p = Product.query.filter( - getattr(Product, field).like("%" + user_input + "%") - ).all() - result = product_schema.dump(all_p) - return jsonify(result) - - -# api -@module_blueprint.route("/check/", methods=["GET"]) -@login_required -def check(barcode): - has_product = db.session.query( - exists().where(Product.barcode == barcode) - ).scalar() - return jsonify({"exists": has_product}) - - -# -# files -# - - -@module_blueprint.route( - "//product//delete", methods=["GET"] -) -def image_delete(filename, barcode): - resource = Resource.query.filter(Resource.filename == filename).first() - product = Product.query.filter(Product.barcode == barcode).first() - product.resources.remove(resource) - product.update() - delete_file( - os.path.join( - current_app.config["UPLOADED_PRODUCTPHOTOS_DEST"], filename - ) - ) - - return redirect(url_for("product.edit_dashboard", barcode=barcode)) diff --git a/shopyo/modules/box__ecommerce/shop/forms.py b/shopyo/modules/box__ecommerce/shop/forms.py deleted file mode 100644 index d5e1d88..0000000 --- a/shopyo/modules/box__ecommerce/shop/forms.py +++ /dev/null @@ -1,140 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import PasswordField -from wtforms import StringField -from wtforms import TextAreaField -from wtforms.fields import BooleanField -from wtforms.fields import SelectField -from wtforms.fields.html5 import EmailField - -# from wtforms.fields.html5 import IntegerField -# from wtforms.validators import DataRequired -# from wtforms.validators import Email -from wtforms.validators import Optional - -from shopyoapi.validators import require_if_apply_coupon -from shopyoapi.validators import require_if_create_account -from shopyoapi.validators import require_if_default_address -from shopyoapi.validators import require_if_diff_address - - -class CheckoutForm(FlaskForm): - - diffAddress = BooleanField( - "Ship to a different address than the default one?", - render_kw={ - "class": "form-check-input", - "value": "diffAddress", - "id": "diffAddress", - }, - ) - applyCoupon = BooleanField( - "Apply Coupon", - render_kw={ - "class": "form-check-input", - "value": "applyCoupon", - "id": "applyCoupon", - }, - ) - createAccount = BooleanField( - "Create Account?", - render_kw={ - "class": "form-check-input", - "value": "createAccount", - "id": "createAccount", - }, - ) - - default_first_name = StringField( - "First Name", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_last_name = StringField( - "Last Name", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_country = SelectField( - "Country", - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_street = StringField( - "Street", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_town_city = StringField( - "Town / City", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_phone = StringField( - "Phone", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_email = EmailField( - "Email", - [require_if_default_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - default_order_notes = TextAreaField( - "Order Notes (optional)", - [Optional()], - render_kw={"rows": 10, "class": "form-control", "autocomplete": "off"}, - ) - - diff_first_name = StringField( - "First Name", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_last_name = StringField( - "Last Name", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_country = SelectField( - "Country", - render_kw={ - "class": "form-control", - "autocomplete": "off", - }, - ) - diff_street = StringField( - "Street", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_town_city = StringField( - "Town / City", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_phone = StringField( - "Phone", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_email = EmailField( - "Email", - [require_if_diff_address], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - diff_order_notes = TextAreaField( - "Order Notes (optional)", - [Optional()], - render_kw={"rows": 10, "class": "form-control", "autocomplete": "off"}, - ) - - coupon = StringField( - "Coupon", - [require_if_apply_coupon], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - - password = PasswordField( - "Coupon", - [require_if_create_account], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) diff --git a/shopyo/modules/box__ecommerce/shop/global.py b/shopyo/modules/box__ecommerce/shop/global.py deleted file mode 100644 index 5d95e9d..0000000 --- a/shopyo/modules/box__ecommerce/shop/global.py +++ /dev/null @@ -1,21 +0,0 @@ -from modules.box__ecommerce.shop.helpers import get_currency_symbol -from modules.box__ecommerce.shop.helpers import get_cart_data -from modules.box__ecommerce.shop.helpers import get_min_max_subcateg - -from flask import session -from shopyoapi.session import Cart - -def get_wishlist_data(): - if 'wishlist' not in session: - session['wishlist'] = [] - return session['wishlist'] - - return session['wishlist'] - -available_everywhere = { - "get_currency_symbol": get_currency_symbol, - 'get_min_max_subcateg': get_min_max_subcateg, - 'get_wishlist_data': get_wishlist_data, - 'get_cart_data': get_cart_data, - 'Cart': Cart -} diff --git a/shopyo/modules/box__ecommerce/shop/helpers.py b/shopyo/modules/box__ecommerce/shop/helpers.py deleted file mode 100644 index ec94970..0000000 --- a/shopyo/modules/box__ecommerce/shop/helpers.py +++ /dev/null @@ -1,47 +0,0 @@ -import json -import os -from flask import session -from modules.box__ecommerce.product.models import Product -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.category.models import SubCategory -from modules.box__default.settings.helpers import get_setting -from shopyoapi.session import Cart - -dirpath = os.path.dirname(os.path.abspath(__file__)) -box_path = os.path.dirname(dirpath) - - -def get_currency_symbol(): - curr_code = get_setting("CURRENCY") - with open( - os.path.join( - box_path, - "shopman", - "data", - "currency.json", - ) - ) as f: - currencies = json.load(f) - for curr in currencies: - if curr["cc"] == curr_code: - return curr["symbol"] - - -def get_cart_data(): - cart_data = Cart.data() - return { - 'cart_items': cart_data['num_items'], - 'cart_total_price': cart_data['total_price'], - 'cart_data': cart_data['items'] - } - - -def get_min_max_subcateg(subcategory_name): - subcateg = SubCategory.query.filter(SubCategory.name == subcategory_name).first() - if len(subcateg.products) > 0: - min_price = min((p.selling_price for p in subcateg.products)) - max_price = max((p.selling_price for p in subcateg.products)) - else: - min_price = 0 - max_price = 2000 - return [min_price, max_price] \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/info.json b/shopyo/modules/box__ecommerce/shop/info.json deleted file mode 100644 index fbbfdb7..0000000 --- a/shopyo/modules/box__ecommerce/shop/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Shop", - "module_name":"shop", - "type": "hide", - "fa-icon": "fa fa-store", - "url_prefix": "/shop", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/models.py b/shopyo/modules/box__ecommerce/shop/models.py deleted file mode 100644 index 7555a7a..0000000 --- a/shopyo/modules/box__ecommerce/shop/models.py +++ /dev/null @@ -1,144 +0,0 @@ -from datetime import datetime - -from shopyoapi.init import db -from shopyoapi.models import PkModel -from modules.box__ecommerce.product.models import Product - -class Order(db.Model): - __tablename__ = "orders" - - id = db.Column(db.Integer, primary_key=True) - time = db.Column(db.DateTime, default=datetime.now()) - - logged_in_customer_email = db.Column(db.String(120), default="") - - coupon = db.relationship( - "Coupon", backref="coupon_order", lazy=True, uselist=False - ) - - order_items = db.relationship( - "OrderItem", - backref="item_order", - lazy=True, - cascade="all, delete, delete-orphan", - ) - billing_detail = db.relationship( - "BillingDetail", - uselist=False, - backref="billing_detail_order", - cascade="all, delete, delete-orphan", - ) - - status = db.Column( - db.String(120), default="pending" - ) # pending, confirmed, shipped, cancelled, refunded - - payment_option_name = db.Column(db.String(120)) - payment_option_text = db.Column(db.String(120)) - - shipment_option = db.relationship( - "DeliveryOption", - backref="shipment_option_order", - lazy=True, - uselist=False, - ) - - payment_option = db.relationship( - "PaymentOption", - backref="payment_option_order", - lazy=True, - uselist=False, - ) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - - def get_std_formatted_time(self): - return self.time.strftime("%b %d %Y, %H:%M") - - def get_ref(self): - return '{}#{}'.format(int(self.id)*19, self.get_std_formatted_time()) - - def get_total_amount(self): - prices = [] - for item in self.order_items: - product = item.get_product() - price = product.selling_price * item.quantity - prices.append(price) - total_prices = sum(prices) - return total_prices - - -class OrderItem(PkModel): - __tablename__ = "order_items" - - - time = db.Column(db.DateTime, default=datetime.now()) - quantity = db.Column(db.Integer) - color = db.Column(db.String(100)) - size = db.Column(db.String(100)) - status = db.Column( - db.String(120), default="pending" - ) - barcode = db.Column(db.String(100), nullable=False) - order_id = db.Column(db.Integer, db.ForeignKey('orders.id'), - nullable=False) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - - def get_product(self): - return Product.query.filter_by(barcode=self.barcode).first() - - -class BillingDetail(db.Model): - __tablename__ = "billing_details" - - id = db.Column(db.Integer, primary_key=True) - - first_name = db.Column(db.String(100)) - last_name = db.Column(db.String(100)) - country = db.Column(db.String(100)) - street = db.Column(db.String(100)) - town_city = db.Column(db.String(100)) - phone = db.Column(db.String(100)) - email = db.Column(db.String(100)) - order_notes = db.Column(db.String(100)) - - order_id = db.Column(db.Integer, db.ForeignKey("orders.id")) - - def add(self): - db.session.add(self) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/base.html b/shopyo/modules/box__ecommerce/shop/templates/shop/base.html deleted file mode 100644 index 834922f..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/base.html +++ /dev/null @@ -1,20 +0,0 @@ -{%set active_page = 'shop.html'%} - - - - - - {% include 'shop/blocks/common_styles.html'%} - {% include shop/sections/resources.html'%} - {% block pagehead %}{% endblock %} - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - - {% include 'base/blocks/flashed_messages.html'%} - {% include get_active_front_theme()+'/sections/nav.html'%} - {% block content %}{% endblock %} - {% include get_active_front_theme()+'/sections/footer.html'%} - - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/accordion.html b/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/accordion.html deleted file mode 100644 index 5685ae9..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/accordion.html +++ /dev/null @@ -1,35 +0,0 @@ -
- {%for category in get_categories()%} -
-
-
- {{category.name}} -
-
- - -
-
-
- {%for subcategory in category.subcategories%} - - {%endfor%} -
- -
-
-
- {%endfor%} - -
\ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/common_styles.html b/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/common_styles.html deleted file mode 100644 index 78382c8..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/common_styles.html +++ /dev/null @@ -1,39 +0,0 @@ - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/sidebar.html b/shopyo/modules/box__ecommerce/shop/templates/shop/blocks/sidebar.html deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/category.html b/shopyo/modules/box__ecommerce/shop/templates/shop/category.html deleted file mode 100644 index 52b3a35..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/category.html +++ /dev/null @@ -1,101 +0,0 @@ -{%set active_page = 'shop.html'%} - - - - - - - {% include get_active_front_theme()+'/sections/resources.html'%} - - {% include 'shop/blocks/common_styles.html'%} - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - - {% include get_active_front_theme()+'/sections/nav.html'%} -
-
- -
-
-
- {%include 'shop/blocks/accordion.html'%} -
-
-
- {%for subcategory in current_category.subcategories%} -
- -
- -
- -
- -
-
- -
{{ subcategory.name }}
- -

{{subcategory.get_num_products()}} products

- -
-
- -
- -
- - {%endfor%} -
-
-
-
- {% include get_active_front_theme()+'/sections/footer.html'%} - - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/checkout.html b/shopyo/modules/box__ecommerce/shop/templates/shop/checkout.html deleted file mode 100644 index 8d7a8cc..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/checkout.html +++ /dev/null @@ -1,330 +0,0 @@ -{%set active_page = 'shop.html'%} -{% extends "shop/base.html" %} -{% block pagehead %} - -{% endblock %} -{% block content %} -
-
- -
-
-
- {{ form.hidden_tag() }} -
-
-
-
- {%if not current_user.is_authenticated%} -
- {%endif%} -
-
-
-
- {{ form.default_first_name(value=checkout_data['default_first_name']) }} -
-
-
- {{ form.default_last_name(value=checkout_data['default_last_name']) }} -
-
-
-
-
- {{ form.default_country() }} -
-
-
-
-
- {{ form.default_street(value=checkout_data['default_street']) }} -
-
-
-
-
- {{ form.default_town_city(value=checkout_data['default_town_city']) }} -
-
-
-
-
- {{ form.default_phone(value=checkout_data['default_phone']) }} -
-
-
- {{ form.default_email(value=checkout_data['default_email']) }} -
-
-
-
-
- {{ form.default_order_notes(value=checkout_data['default_order_notes']) }} -
-
-
-
-
-
- {{ form.diffAddress() }} - {{ form.diffAddress.label }} - -
-
-
- -
-
-
- {{ form.applyCoupon() }} - -
-
-
- -
-
-
- {{ form.createAccount() }} - {{ form.createAccount.label }} -
-
-
- - -
-
-
-
-
-
- - - - - - - - - - - - - {% set count = namespace(value=0) %} - {%for barcode in Cart.data()['items']%} - {%set product = get_product(barcode) %} - {%set items = Cart.data()['items'][barcode] %} - - {% for item in items %} - {% set count.value = count.value + 1 %} - - - - - - - - - - {% endfor %} - {%endfor%} - -
ProductSizeColorQuantityPriceSubtotal
{{ product.name }}{{ item['size'] }}{{ item['color'] }}{{ item['quantity'] }}{{product.selling_price}}{{product.selling_price * item['quantity'] }}
-
- Grand Subtotal: {{get_currency_symbol()}}

-
-
- - - - Shipping - - - - - - - - - {%for option in delivery_options%} - - - - - - {%endfor%} - -
optionprice
{{option.option}}{{option.price}}
-
-
- - - - Payment - - - - {%for option in payment_options%} - - - - - {%endfor%} - -
{{option.name}}
- {{option.text}}
-
-
- Grand total: {{get_currency_symbol()}}

-
-
- -
- -
-
- -
-
-
-
- - {% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.html b/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.html deleted file mode 100644 index 3e36b0e..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.html +++ /dev/null @@ -1,47 +0,0 @@ -Thank you for your order. Here is a summary.
-
-Your order ref is {{ order.get_ref() }}.
-Your order will not be processed until funds get cleared.
-
-
-{% set total_prices = [] %} -Items
-{% for item in order.order_items %} -#{{ loop.index }}
-Name: {{ item.get_product().name }}
-Description: {{ item.get_product().description }}
-Quantity: {{ item.quantity }}
-Color: {{ item.color }}
-Size: {{ item.size }}
-Unit Price: Rs {{ item.get_product().price }}
-{% set item_total = int(item.get_product().selling_price) * int(item.quantity) %} -Total: Rs {{ item_total }}
-
-{{ total_prices.append(item_total) or ''}} -{% endfor %} -
-{% set sum_products = sum(total_prices) %} -Total for products: Rs {{ sum_products }}
-
-Payment Option
-Name: {{ order.payment_option.name }}
-Info: {{ order.payment_option.text }}
-
-Shipping Option:
-Option: {{ order.shipping_option.option }}
-Price: Rs {{ order.shipping_option.price }}
-

-Grand Total: Rs {{ int(sum_products) + int(order.shipping_option.price) }} -

-Billing Details
-First Name: {{ order.billing_detail.first_name }}
-Last Name: {{ order.billing_detail.last_name }}
-Street: {{ order.billing_detail.street }}
-Town/City: {{ order.billing_detail.town_city }}
-Phone: {{ order.billing_detail.phone }}
-Email: {{ order.billing_detail.email }}
-Order Notes:
-{{ order.billing_detail.order_notes }}
-Thanks,
-
-Freaks Boutique \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.txt b/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.txt deleted file mode 100644 index 72af249..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/emails/order_info.txt +++ /dev/null @@ -1,51 +0,0 @@ -Thank you for your order. Here is a summary. - -Your order ref is {{ order.get_ref() }}. -Your order will not be processed until funds get cleared. - - - -{% set total_prices = [] %} -Items -{% for item in order.order_items %} -#{{ loop.index }} -Name: {{ item.get_product().name }} -Description: {{ item.get_product().description }} -Quantity: {{ item.quantity }} -Color: {{ item.color }} -Size: {{ item.size }} -Unit Price: Rs {{ item.get_product().selling_price }} -{% set item_total = int(item.get_product().selling_price) * int(item.quantity) %} -Total: Rs {{ item_total }} - -{{ total_prices.append(item_total) or ''}} -{% endfor %} - -{% set sum_products = sum(total_prices) %} -Total for products: Rs {{ sum_products }} - - -Payment Option -Name: {{ order.payment_option.name }} -Info: {{ order.payment_option.text }} - - -Shipping Option: -Option: {{ order.shipping_option.option }} -Price: Rs {{ order.shipping_option.price }} - - -Billing Details -First Name: {{ order.billing_detail.first_name }} -Last Name: {{ order.billing_detail.last_name }} -Street: {{ order.billing_detail.street }} -Town/City: {{ order.billing_detail.town_city }} -Phone: {{ order.billing_detail.phone }} -Email: {{ order.billing_detail.email }} -Order Notes: -{{ order.billing_detail.order_notes }} - -Thanks, - - -Freaks Boutique \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/order_complete.html b/shopyo/modules/box__ecommerce/shop/templates/shop/order_complete.html deleted file mode 100644 index 033462f..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/order_complete.html +++ /dev/null @@ -1,23 +0,0 @@ -{%set active_page = 'shop.html'%} -{% extends "shop/base.html" %} -{% block pagehead %} - -{% endblock %} -{% block content %} -
-
- -
-
- Order complete! Return to shop -
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/product.html b/shopyo/modules/box__ecommerce/shop/templates/shop/product.html deleted file mode 100644 index 0caa312..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/product.html +++ /dev/null @@ -1,319 +0,0 @@ -{%set active_page = 'shop.html'%} -{% extends "shop/base.html" %} -{% block pagehead %} - - - - - -{% endblock %} -{% block content %} -
-
- -
-
-
-
- - -
-
-
-
- {%set filename_ = ''%} - {%if product.resources%} - {%set filename_ = product.resources[0].filename%} - {%set img_url = url_for('resource.product_image', filename=filename_) %} - {%else%} - {%set img_url = url_for('resource.product_image', filename='default') %} - {%endif%} -
- - -
- {%if product.resources%} - {%for resource in product.resources%} - {%set img_url = url_for('resource.product_image', filename=resource.filename) %} - - - - - {%endfor%} - {%endif%} -
-
-
-
-
-
-
-
-
-
-
-
-

{{product.name}}

-
-
-

{{get_currency_symbol()}} {{ product.selling_price }}


- {{ product.description }} -
-

in stock {{ product.in_stock }}
-

-
- -
- - -
-
-
-
- -
- -
- -
-
-
-
- - - -
-
-
-
-
-
-
-
-
- - - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/shop.html b/shopyo/modules/box__ecommerce/shop/templates/shop/shop.html deleted file mode 100644 index c70a7c0..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/shop.html +++ /dev/null @@ -1,132 +0,0 @@ -{%set active_page = 'shop.html'%} - - - - - - {% include 'shop/blocks/common_styles.html'%} - - {% include get_active_front_theme()+'/sections/resources.html'%} - - - - - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - - {% include get_active_front_theme()+'/sections/nav.html'%} -
-
- -
-
-
- {%include 'shop/blocks/accordion.html'%} -

- - -

-
-
- -
-
- - -
-
-
- - {% include get_active_front_theme()+'/sections/footer.html'%} - - - - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/subcategory.html b/shopyo/modules/box__ecommerce/shop/templates/shop/subcategory.html deleted file mode 100644 index 44e0c36..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/subcategory.html +++ /dev/null @@ -1,153 +0,0 @@ -{%set active_page = 'shop.html'%} - - - - - - - {% include get_active_front_theme()+'/sections/resources.html'%} - - - - {% include 'shop/blocks/common_styles.html'%} - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - - {% include get_active_front_theme()+'/sections/nav.html'%} -
-
- -
-
-
- {%include 'shop/blocks/accordion.html'%} -

- - -

-
-
- -
-
-
-
- - -
-
-
- {% include get_active_front_theme()+'/sections/footer.html'%} - - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/view_cart.html b/shopyo/modules/box__ecommerce/shop/templates/shop/view_cart.html deleted file mode 100644 index 5cf2a51..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/view_cart.html +++ /dev/null @@ -1,244 +0,0 @@ -{%set active_page = 'shop.html'%} -{% extends "shop/base.html" %} -{% block pagehead %} - -{% endblock %} -{% block content %} -
-
- -
-
- -
-
-
-
-
- - <- scroll -> - - - - - - - - - - - - {% set count = namespace(value=0) %} - {%for barcode in Cart.data()['items']%} - {%set product = get_product(barcode) %} - {%set items = Cart.data()['items'][barcode] %} - - {% for item in items %} - {% set count.value = count.value + 1 %} - - - - - - - - - - - {% endfor %} - - {%endfor%} - -
ProductSizeColorQuantityPriceSubtotal
- - - - - {{product.name}} - - - - - - -
-
- -
- -
- -
-
- -
{{product.selling_price}}{{product.selling_price * item['quantity'] }}
- -
-

-
-
-

Cart Totals


-

- Subtotal: {{ get_currency_symbol() }}{{ cart_total_price }} - -

-
- - - - Shipping - - - - - - - - - {%for option in delivery_options%} - - - - - - {%endfor%} - -
optionprice
{{option.option}}{{option.price}}
-
-

- Total: {{ get_currency_symbol() }} - -

-

- CHECKOUT -

-
-
-
-
-
-
- - - - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/templates/shop/wishlist.html b/shopyo/modules/box__ecommerce/shop/templates/shop/wishlist.html deleted file mode 100644 index 8eb130b..0000000 --- a/shopyo/modules/box__ecommerce/shop/templates/shop/wishlist.html +++ /dev/null @@ -1,80 +0,0 @@ -{%set active_page = 'shop.html'%} - - - - - - {% include 'shop/blocks/common_styles.html'%} - - {% include get_active_front_theme()+'/sections/resources.html'%} - - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - - {% include get_active_front_theme()+'/sections/nav.html'%} -
-
- - - - - {% include get_active_front_theme()+'/sections/footer.html'%} - - - - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shop/tests/test_shop.py b/shopyo/modules/box__ecommerce/shop/tests/test_shop.py deleted file mode 100644 index ca0100b..0000000 --- a/shopyo/modules/box__ecommerce/shop/tests/test_shop.py +++ /dev/null @@ -1,20 +0,0 @@ -""" -This file (test_shopy.py) contains the functional tests for -the `shopy` blueprint. - -These tests use GETs and POSTs to different endpoints to check -for the proper behavior of the `shop` blueprint. -""" -import pytest - - -@pytest.mark.order("first") -def test_shop_home_page(test_client): - """ - GIVEN a Flask application configured for testing, - WHEN the '/' page is requested (GET) - THEN check that the response is valid - """ - # '/' redirects to /shop/home - response = test_client.get("/", follow_redirects=True) - assert response.status_code == 200 diff --git a/shopyo/modules/box__ecommerce/shop/view.py b/shopyo/modules/box__ecommerce/shop/view.py deleted file mode 100644 index 9d6552d..0000000 --- a/shopyo/modules/box__ecommerce/shop/view.py +++ /dev/null @@ -1,477 +0,0 @@ -import json -import os -from datetime import datetime - -from flask import current_app -from flask import flash -from flask import jsonify -from flask import redirect -from flask import render_template -from flask import request -from flask import session -from flask import url_for - -from flask_login import current_user - -from shopyoapi.forms import flash_errors -from shopyoapi.html import notify_success -from shopyoapi.html import notify_warning -from shopyoapi.module import ModuleHelp -from shopyoapi.session import Cart -from shopyoapi.security import get_safe_redirect - -from modules.box__default.admin.models import User -from modules.box__default.auth.email import send_async_email -from modules.box__default.settings.helpers import get_setting -from modules.box__ecommerce.category.models import Category -from modules.box__ecommerce.category.models import SubCategory -from modules.box__ecommerce.product.models import Product -from modules.box__ecommerce.shop.forms import CheckoutForm -from modules.box__ecommerce.shop.helpers import get_cart_data -from modules.box__ecommerce.shop.models import BillingDetail -from modules.box__ecommerce.shop.models import Order -from modules.box__ecommerce.shop.models import OrderItem -from modules.box__ecommerce.shopman.models import DeliveryOption -from modules.box__ecommerce.shopman.models import PaymentOption -from modules.box__ecommerce.shopman.models import Coupon -from modules.box__ecommerce.shop.helpers import get_min_max_subcateg - -mhelp = ModuleHelp(__file__, __name__) -globals()[mhelp.blueprint_str] = mhelp.blueprint -module_blueprint = globals()[mhelp.blueprint_str] - - -# mhelp._context.update({"get_currency_symbol": get_currency_symbol}) - - -def get_product(barcode): - return Product.query.filter_by(barcode=barcode).first() - - -@module_blueprint.route("/home") -def homepage(): - # cant be defined above but must be manually set each time - # active_theme_dir = os.path.join( - # dirpath, "..", "..", "themes", get_setting("ACTIVE_FRONT_THEME") - # ) - # module_blueprint.template_folder = active_theme_dir - - # return str(module_blueprint.template_folder) - context = mhelp.context() - cart_info = get_cart_data() - context.update(cart_info) - return render_template( - "ecommerceus/index.html", **context - ) - - -@module_blueprint.route("/page/") -@module_blueprint.route("/") -def index(page=1): - context = mhelp.context() - PAGINATION = 5 - end = page * PAGINATION - start = end - PAGINATION - # total_pages = (data.count_posts(name, data.STATE_PUBLISHED) // PAGINATION) + 1 - total_pages = (len(Product.query.all()) // PAGINATION) + 1 - products = Product.query.all()[::-1][start:end] - - min_price = None - max_price = None - - def_min_price = min((p.selling_price for p in products)) - def_max_price = max((p.selling_price for p in products)) - filter_min_max = [def_min_price, def_max_price] - if request.args.get('min') and request.args.get('max'): - if request.args.get('min').isnumeric() and request.args.get('max').isnumeric(): - min_price = int(request.args.get('min')) - max_price = int(request.args.get('max')) - print(min_price, max_price) - products = list((p for p in products if min_price <= p.selling_price <= max_price)) - products = products[start:end] - filter_min_max = [min_price, max_price] - - cart_info = get_cart_data() - - min_max = [def_min_price, def_max_price] - context.update( - { - "current_category_name": "", - "total_pages": total_pages, - "page": page, - "products": products, - "min_max": min_max, - "filter_min_max": filter_min_max - } - ) - context.update(cart_info) - return mhelp.render("shop.html", **context) - - -@module_blueprint.route("/c/") -def category(category_name): - - context = mhelp.context() - current_category = Category.query.filter( - Category.name == category_name - ).first() - - cart_info = get_cart_data() - - context.update( - { - "current_category": current_category, - "current_category_name": current_category.name, - } - ) - context.update(cart_info) - return mhelp.render("category.html", **context) - - -@module_blueprint.route("/sub//page/") -@module_blueprint.route("/sub/") -def subcategory(sub_id, page=1, methods=['GET']): - context = mhelp.context() - PAGINATION = 5 - end = page * PAGINATION - start = end - PAGINATION - - subcategory = SubCategory.query.get(sub_id) - subcategory_name = subcategory.name - - min_price = None - max_price = None - products = subcategory.products[start:end] - filter_min_max = get_min_max_subcateg(subcategory_name) - if request.args.get('min') and request.args.get('max'): - if request.args.get('min').isnumeric() and request.args.get('max').isnumeric(): - min_price = int(request.args.get('min')) - max_price = int(request.args.get('max')) - print(min_price, max_price) - products = list((p for p in subcategory.products if min_price <= p.selling_price <= max_price)) - products = products[start:end] - filter_min_max = [min_price, max_price] - - total_pages = (len(products) // PAGINATION) + 1 - current_category_name = subcategory.category.name - subcategory_name = subcategory.name - - cart_info = get_cart_data() - - - context.update( - { - "subcategory": subcategory, - "current_category_name": current_category_name, - "total_pages": total_pages, - "page": page, - "products": products, - "subcategory_name": subcategory_name, - "filter_min_max": filter_min_max - } - ) - context.update(cart_info) - return mhelp.render("subcategory.html", **context) - - -@module_blueprint.route("/product/") -def product(product_barcode): - context = mhelp.context() - product = Product.query.filter_by(barcode=product_barcode).first() - - cart_info = get_cart_data() - # 'cart_data': cart_data, - # 'cart_items': cart_items, - # 'cart_total_price': cart_total_price - - context.update({"product": product}) - context.update(cart_info) - return mhelp.render("product.html", **context) - - -@module_blueprint.route("/cart/add/", methods=["GET", "POST"]) -def cart_add(product_barcode): - if request.method == "POST": - flash("") - - barcode = request.form["barcode"] - quantity = int(request.form["quantity"]) - size = request.form['size'] - color = request.form['color'] - - item_info = { - 'quantity': quantity, - 'size': size, - 'color': color - } - - if Cart.add(barcode, item_info): - return mhelp.redirect_url("shop.product", product_barcode=barcode) - else: - flash( - notify_warning( - "Products in cart cannot be greater than product in stock" - ) - ) - return redirect( - url_for("shop.product", product_barcode=barcode) - ) - - - -@module_blueprint.route( - "/cart/remove///", methods=["GET", "POST"] -) -def cart_remove(product_barcode, size, color): - if "cart" in session: - Cart.remove(product_barcode, size, color) - flash(notify_success("Removed!")) - return mhelp.redirect_url("shop.cart") - - else: - return mhelp.redirect_url("shop.cart") - - -@module_blueprint.route("/cart", methods=["GET", "POST"]) -def cart(): - context = mhelp.context() - - cart_info = get_cart_data() - delivery_options = DeliveryOption.query.all() - - context.update( - {"delivery_options": delivery_options, "get_product": get_product} - ) - context.update(cart_info) - return mhelp.render("view_cart.html", **context) - - -@module_blueprint.route("/cart/update", methods=["GET", "POST"]) -def cart_update(): - if request.method == "POST": - Cart.update(request.form) - return mhelp.redirect_url("shop.cart") - - -# @module_blueprint.route("/session", methods=['GET', 'POST']) -# def session_view(): -# return str(session['cart'][0]) -# - - - - -@module_blueprint.route("/checkout", methods=["GET", "POST"]) -def checkout(): - context = mhelp.context() - - delivery_options = DeliveryOption.query.all() - payment_options = PaymentOption.query.all() - with open( - os.path.join( - current_app.config["BASE_DIR"], - "modules", - "box__ecommerce", - "shopman", - "data", - "country.json", - ) - ) as f: - countries = json.load(f) - form = CheckoutForm() - # country_choices = [(c["name"], c["name"]) for c in countries] - country_choices = [('mauritius', 'Mauritius')] - form.default_country.choices = country_choices - form.diff_country.choices = country_choices - - if "checkout_data" not in session: - checkout_data = {} - for key in form._fields: - checkout_data[key] = "" - - session["checkout_data"] = [{}] - session["checkout_data"][0] = [checkout_data] - else: - checkout_data = session["checkout_data"][0] - - context.update( - { - "get_product": get_product, - "delivery_options": delivery_options, - "payment_options": payment_options, - "form": form, - "checkout_data": checkout_data, - } - ) - cart_info = get_cart_data() - context.update(cart_info) - return mhelp.render("checkout.html", **context) - - -@module_blueprint.route("/checkout/process", methods=["GET", "POST"]) -def checkout_process(): - if request.method == "POST": - cart_info = get_cart_data() - if len(cart_info["cart_data"]) == 0: - flash(notify_warning("Cart cannot be empty!")) - return mhelp.redirect_url("shop.checkout") - - form = CheckoutForm() - with open( - os.path.join( - current_app.config["BASE_DIR"], - "modules", - "box__ecommerce", - "shopman", - "data", - "country.json", - ) - ) as f: - countries = json.load(f) - # country_choices = [(c["name"], c["name"]) for c in countries] - # form.default_country.choices = country_choices - # form.diff_country.choices = country_choices - - country_choices = [('mauritius', 'Mauritius')] - form.default_country.choices = country_choices - form.diff_country.choices = country_choices - - # print(dir(form)) - # ordered dict print(form._fields[0][0]) - - # print(form._fields['default_first_name'].data) - - checkout_data = {} - for key in form._fields: - checkout_data[key] = form._fields[key].data - - session["checkout_data"][0] = checkout_data - - print(request.form["paymentoption"]) - if form.validate_on_submit(): - if not form.diffAddress.data: - first_name = form.default_first_name.data - last_name = form.default_last_name.data - country = form.default_country.data - street = form.default_street.data - town_city = form.default_town_city.data - phone = form.default_phone.data - email = form.default_email.data - order_notes = form.default_order_notes.data - - elif form.diffAddress.data: - first_name = form.diff_first_name.data - last_name = form.diff_last_name.data - country = form.diff_country.data - street = form.diff_street.data - town_city = form.diff_town_city.data - phone = form.diff_phone.data - email = form.diff_email.data - order_notes = form.dif_order_notes.data - - billing_detail = BillingDetail() - billing_detail.first_name = first_name - billing_detail.last_name = last_name - billing_detail.country = country - billing_detail.street = street - billing_detail.town_city = town_city - billing_detail.phone = phone - billing_detail.email = email - billing_detail.order_notes = order_notes - - if form.createAccount.data: - if not User.query.filter((User.email == email)).first(): - user = User() - user.first_name = first_name - user.last_name = last_name - user.email = email - user.password = form.passoword.data - user.email_confirmed = True - user.is_customer = True - user.email_confirm_date = datetime.now() - - order = Order() - order.billing_detail = billing_detail - shipping_option = DeliveryOption.query.get( - request.form["deliveryoption"] - ) - order.shipping_option = shipping_option - payment_option = PaymentOption.query.get( - request.form["paymentoption"] - ) - order.payment_option = payment_option - if current_user.is_authenticated: - order.logged_in_customer_email = current_user.email - - if form.applyCoupon.data: - coupon = Coupon.query.filter( - Coupon.string == form.coupon.data - ).first() - if coupon: - order.coupon = coupon - else: - flash(notify_warning("Invalid Coupon")) - - cart_info = get_cart_data() - cart_data = cart_info["cart_data"] - - for barcode in Cart.data()['items']: - for item in Cart.data()['items'][barcode]: - order_item = OrderItem() - product = Product.query.filter_by(barcode=barcode).first() - order_item.barcode = barcode - order_item.quantity = int(item['quantity']) - order_item.size = item['size'] - order_item.color = item['color'] - order.order_items.append(order_item) - - template = "shop/emails/order_info" - subject = "FreaksBoutique - Order Details" - context = {} - context.update({'order': order, 'int': int, 'sum': sum}) - send_async_email(email, subject, template, **context) - - order.insert() - flash(notify_success("Great!")) - context = mhelp.context() - Cart.reset() - return render_template("shop/order_complete.html", **context) - else: - flash_errors(form) - return mhelp.redirect_url("shop.checkout") - - -@module_blueprint.route("/wishlist/toggle/", methods=["GET"]) -def wishlist_toggle(product_barcode): - - # next url hecks - next_url = request.args.get("next") - if next_url is None: - next_url = '/' - next_url = get_safe_redirect(next_url) - - # product checks - product = Product.query.get(product_barcode) - if product is None: - return redirect(next_url) - - if 'wishlist' not in session: - session['wishlist'] = [] - - if product_barcode not in session['wishlist']: - session['wishlist'].append(product_barcode) - session.modified = True - elif product_barcode in session['wishlist']: - session['wishlist'].remove(product_barcode) - session.modified = True - - return redirect(next_url) - - -@module_blueprint.route("/wishlist", methods=["GET"]) -def wishlist(): - context = mhelp.context() - context.update({ - 'Product': Product - }) - return mhelp.render('wishlist.html', **context) \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/data/country.json b/shopyo/modules/box__ecommerce/shopman/data/country.json deleted file mode 100644 index fab4f11..0000000 --- a/shopyo/modules/box__ecommerce/shopman/data/country.json +++ /dev/null @@ -1,245 +0,0 @@ -[ - {"name": "Afghanistan", "code": "AF"}, - {"name": "Åland Islands", "code": "AX"}, - {"name": "Albania", "code": "AL"}, - {"name": "Algeria", "code": "DZ"}, - {"name": "American Samoa", "code": "AS"}, - {"name": "AndorrA", "code": "AD"}, - {"name": "Angola", "code": "AO"}, - {"name": "Anguilla", "code": "AI"}, - {"name": "Antarctica", "code": "AQ"}, - {"name": "Antigua and Barbuda", "code": "AG"}, - {"name": "Argentina", "code": "AR"}, - {"name": "Armenia", "code": "AM"}, - {"name": "Aruba", "code": "AW"}, - {"name": "Australia", "code": "AU"}, - {"name": "Austria", "code": "AT"}, - {"name": "Azerbaijan", "code": "AZ"}, - {"name": "Bahamas", "code": "BS"}, - {"name": "Bahrain", "code": "BH"}, - {"name": "Bangladesh", "code": "BD"}, - {"name": "Barbados", "code": "BB"}, - {"name": "Belarus", "code": "BY"}, - {"name": "Belgium", "code": "BE"}, - {"name": "Belize", "code": "BZ"}, - {"name": "Benin", "code": "BJ"}, - {"name": "Bermuda", "code": "BM"}, - {"name": "Bhutan", "code": "BT"}, - {"name": "Bolivia", "code": "BO"}, - {"name": "Bosnia and Herzegovina", "code": "BA"}, - {"name": "Botswana", "code": "BW"}, - {"name": "Bouvet Island", "code": "BV"}, - {"name": "Brazil", "code": "BR"}, - {"name": "British Indian Ocean Territory", "code": "IO"}, - {"name": "Brunei Darussalam", "code": "BN"}, - {"name": "Bulgaria", "code": "BG"}, - {"name": "Burkina Faso", "code": "BF"}, - {"name": "Burundi", "code": "BI"}, - {"name": "Cambodia", "code": "KH"}, - {"name": "Cameroon", "code": "CM"}, - {"name": "Canada", "code": "CA"}, - {"name": "Cape Verde", "code": "CV"}, - {"name": "Cayman Islands", "code": "KY"}, - {"name": "Central African Republic", "code": "CF"}, - {"name": "Chad", "code": "TD"}, - {"name": "Chile", "code": "CL"}, - {"name": "China", "code": "CN"}, - {"name": "Christmas Island", "code": "CX"}, - {"name": "Cocos (Keeling) Islands", "code": "CC"}, - {"name": "Colombia", "code": "CO"}, - {"name": "Comoros", "code": "KM"}, - {"name": "Congo", "code": "CG"}, - {"name": "Congo, The Democratic Republic of the", "code": "CD"}, - {"name": "Cook Islands", "code": "CK"}, - {"name": "Costa Rica", "code": "CR"}, - {"name": "Cote D\"Ivoire", "code": "CI"}, - {"name": "Croatia", "code": "HR"}, - {"name": "Cuba", "code": "CU"}, - {"name": "Cyprus", "code": "CY"}, - {"name": "Czech Republic", "code": "CZ"}, - {"name": "Denmark", "code": "DK"}, - {"name": "Djibouti", "code": "DJ"}, - {"name": "Dominica", "code": "DM"}, - {"name": "Dominican Republic", "code": "DO"}, - {"name": "Ecuador", "code": "EC"}, - {"name": "Egypt", "code": "EG"}, - {"name": "El Salvador", "code": "SV"}, - {"name": "Equatorial Guinea", "code": "GQ"}, - {"name": "Eritrea", "code": "ER"}, - {"name": "Estonia", "code": "EE"}, - {"name": "Ethiopia", "code": "ET"}, - {"name": "Falkland Islands (Malvinas)", "code": "FK"}, - {"name": "Faroe Islands", "code": "FO"}, - {"name": "Fiji", "code": "FJ"}, - {"name": "Finland", "code": "FI"}, - {"name": "France", "code": "FR"}, - {"name": "French Guiana", "code": "GF"}, - {"name": "French Polynesia", "code": "PF"}, - {"name": "French Southern Territories", "code": "TF"}, - {"name": "Gabon", "code": "GA"}, - {"name": "Gambia", "code": "GM"}, - {"name": "Georgia", "code": "GE"}, - {"name": "Germany", "code": "DE"}, - {"name": "Ghana", "code": "GH"}, - {"name": "Gibraltar", "code": "GI"}, - {"name": "Greece", "code": "GR"}, - {"name": "Greenland", "code": "GL"}, - {"name": "Grenada", "code": "GD"}, - {"name": "Guadeloupe", "code": "GP"}, - {"name": "Guam", "code": "GU"}, - {"name": "Guatemala", "code": "GT"}, - {"name": "Guernsey", "code": "GG"}, - {"name": "Guinea", "code": "GN"}, - {"name": "Guinea-Bissau", "code": "GW"}, - {"name": "Guyana", "code": "GY"}, - {"name": "Haiti", "code": "HT"}, - {"name": "Heard Island and Mcdonald Islands", "code": "HM"}, - {"name": "Holy See (Vatican City State)", "code": "VA"}, - {"name": "Honduras", "code": "HN"}, - {"name": "Hong Kong", "code": "HK"}, - {"name": "Hungary", "code": "HU"}, - {"name": "Iceland", "code": "IS"}, - {"name": "India", "code": "IN"}, - {"name": "Indonesia", "code": "ID"}, - {"name": "Iran, Islamic Republic Of", "code": "IR"}, - {"name": "Iraq", "code": "IQ"}, - {"name": "Ireland", "code": "IE"}, - {"name": "Isle of Man", "code": "IM"}, - {"name": "Israel", "code": "IL"}, - {"name": "Italy", "code": "IT"}, - {"name": "Jamaica", "code": "JM"}, - {"name": "Japan", "code": "JP"}, - {"name": "Jersey", "code": "JE"}, - {"name": "Jordan", "code": "JO"}, - {"name": "Kazakhstan", "code": "KZ"}, - {"name": "Kenya", "code": "KE"}, - {"name": "Kiribati", "code": "KI"}, - {"name": "Korea, Democratic People\"S Republic of", "code": "KP"}, - {"name": "Korea, Republic of", "code": "KR"}, - {"name": "Kuwait", "code": "KW"}, - {"name": "Kyrgyzstan", "code": "KG"}, - {"name": "Lao People\"S Democratic Republic", "code": "LA"}, - {"name": "Latvia", "code": "LV"}, - {"name": "Lebanon", "code": "LB"}, - {"name": "Lesotho", "code": "LS"}, - {"name": "Liberia", "code": "LR"}, - {"name": "Libyan Arab Jamahiriya", "code": "LY"}, - {"name": "Liechtenstein", "code": "LI"}, - {"name": "Lithuania", "code": "LT"}, - {"name": "Luxembourg", "code": "LU"}, - {"name": "Macao", "code": "MO"}, - {"name": "Macedonia, The Former Yugoslav Republic of", "code": "MK"}, - {"name": "Madagascar", "code": "MG"}, - {"name": "Malawi", "code": "MW"}, - {"name": "Malaysia", "code": "MY"}, - {"name": "Maldives", "code": "MV"}, - {"name": "Mali", "code": "ML"}, - {"name": "Malta", "code": "MT"}, - {"name": "Marshall Islands", "code": "MH"}, - {"name": "Martinique", "code": "MQ"}, - {"name": "Mauritania", "code": "MR"}, - {"name": "Mauritius", "code": "MU"}, - {"name": "Mayotte", "code": "YT"}, - {"name": "Mexico", "code": "MX"}, - {"name": "Micronesia, Federated States of", "code": "FM"}, - {"name": "Moldova, Republic of", "code": "MD"}, - {"name": "Monaco", "code": "MC"}, - {"name": "Mongolia", "code": "MN"}, - {"name": "Montserrat", "code": "MS"}, - {"name": "Morocco", "code": "MA"}, - {"name": "Mozambique", "code": "MZ"}, - {"name": "Myanmar", "code": "MM"}, - {"name": "Namibia", "code": "NA"}, - {"name": "Nauru", "code": "NR"}, - {"name": "Nepal", "code": "NP"}, - {"name": "Netherlands", "code": "NL"}, - {"name": "Netherlands Antilles", "code": "AN"}, - {"name": "New Caledonia", "code": "NC"}, - {"name": "New Zealand", "code": "NZ"}, - {"name": "Nicaragua", "code": "NI"}, - {"name": "Niger", "code": "NE"}, - {"name": "Nigeria", "code": "NG"}, - {"name": "Niue", "code": "NU"}, - {"name": "Norfolk Island", "code": "NF"}, - {"name": "Northern Mariana Islands", "code": "MP"}, - {"name": "Norway", "code": "NO"}, - {"name": "Oman", "code": "OM"}, - {"name": "Pakistan", "code": "PK"}, - {"name": "Palau", "code": "PW"}, - {"name": "Palestinian Territory, Occupied", "code": "PS"}, - {"name": "Panama", "code": "PA"}, - {"name": "Papua New Guinea", "code": "PG"}, - {"name": "Paraguay", "code": "PY"}, - {"name": "Peru", "code": "PE"}, - {"name": "Philippines", "code": "PH"}, - {"name": "Pitcairn", "code": "PN"}, - {"name": "Poland", "code": "PL"}, - {"name": "Portugal", "code": "PT"}, - {"name": "Puerto Rico", "code": "PR"}, - {"name": "Qatar", "code": "QA"}, - {"name": "Reunion", "code": "RE"}, - {"name": "Romania", "code": "RO"}, - {"name": "Russian Federation", "code": "RU"}, - {"name": "RWANDA", "code": "RW"}, - {"name": "Saint Helena", "code": "SH"}, - {"name": "Saint Kitts and Nevis", "code": "KN"}, - {"name": "Saint Lucia", "code": "LC"}, - {"name": "Saint Pierre and Miquelon", "code": "PM"}, - {"name": "Saint Vincent and the Grenadines", "code": "VC"}, - {"name": "Samoa", "code": "WS"}, - {"name": "San Marino", "code": "SM"}, - {"name": "Sao Tome and Principe", "code": "ST"}, - {"name": "Saudi Arabia", "code": "SA"}, - {"name": "Senegal", "code": "SN"}, - {"name": "Serbia and Montenegro", "code": "CS"}, - {"name": "Seychelles", "code": "SC"}, - {"name": "Sierra Leone", "code": "SL"}, - {"name": "Singapore", "code": "SG"}, - {"name": "Slovakia", "code": "SK"}, - {"name": "Slovenia", "code": "SI"}, - {"name": "Solomon Islands", "code": "SB"}, - {"name": "Somalia", "code": "SO"}, - {"name": "South Africa", "code": "ZA"}, - {"name": "South Georgia and the South Sandwich Islands", "code": "GS"}, - {"name": "Spain", "code": "ES"}, - {"name": "Sri Lanka", "code": "LK"}, - {"name": "Sudan", "code": "SD"}, - {"name": "Suriname", "code": "SR"}, - {"name": "Svalbard and Jan Mayen", "code": "SJ"}, - {"name": "Swaziland", "code": "SZ"}, - {"name": "Sweden", "code": "SE"}, - {"name": "Switzerland", "code": "CH"}, - {"name": "Syrian Arab Republic", "code": "SY"}, - {"name": "Taiwan, Province of China", "code": "TW"}, - {"name": "Tajikistan", "code": "TJ"}, - {"name": "Tanzania, United Republic of", "code": "TZ"}, - {"name": "Thailand", "code": "TH"}, - {"name": "Timor-Leste", "code": "TL"}, - {"name": "Togo", "code": "TG"}, - {"name": "Tokelau", "code": "TK"}, - {"name": "Tonga", "code": "TO"}, - {"name": "Trinidad and Tobago", "code": "TT"}, - {"name": "Tunisia", "code": "TN"}, - {"name": "Turkey", "code": "TR"}, - {"name": "Turkmenistan", "code": "TM"}, - {"name": "Turks and Caicos Islands", "code": "TC"}, - {"name": "Tuvalu", "code": "TV"}, - {"name": "Uganda", "code": "UG"}, - {"name": "Ukraine", "code": "UA"}, - {"name": "United Arab Emirates", "code": "AE"}, - {"name": "United Kingdom", "code": "GB"}, - {"name": "United States", "code": "US"}, - {"name": "United States Minor Outlying Islands", "code": "UM"}, - {"name": "Uruguay", "code": "UY"}, - {"name": "Uzbekistan", "code": "UZ"}, - {"name": "Vanuatu", "code": "VU"}, - {"name": "Venezuela", "code": "VE"}, - {"name": "Viet Nam", "code": "VN"}, - {"name": "Virgin Islands, British", "code": "VG"}, - {"name": "Virgin Islands, U.S.", "code": "VI"}, - {"name": "Wallis and Futuna", "code": "WF"}, - {"name": "Western Sahara", "code": "EH"}, - {"name": "Yemen", "code": "YE"}, - {"name": "Zambia", "code": "ZM"}, - {"name": "Zimbabwe", "code": "ZW"} -] diff --git a/shopyo/modules/box__ecommerce/shopman/data/currency.json b/shopyo/modules/box__ecommerce/shopman/data/currency.json deleted file mode 100644 index aee370b..0000000 --- a/shopyo/modules/box__ecommerce/shopman/data/currency.json +++ /dev/null @@ -1,158 +0,0 @@ -[ - {"cc":"AED","symbol":"\u062f.\u0625;","name":"UAE dirham"}, - {"cc":"AFN","symbol":"Afs","name":"Afghan afghani"}, - {"cc":"ALL","symbol":"L","name":"Albanian lek"}, - {"cc":"AMD","symbol":"AMD","name":"Armenian dram"}, - {"cc":"ANG","symbol":"NA\u0192","name":"Netherlands Antillean gulden"}, - {"cc":"AOA","symbol":"Kz","name":"Angolan kwanza"}, - {"cc":"ARS","symbol":"$","name":"Argentine peso"}, - {"cc":"AUD","symbol":"$","name":"Australian dollar"}, - {"cc":"AWG","symbol":"\u0192","name":"Aruban florin"}, - {"cc":"AZN","symbol":"AZN","name":"Azerbaijani manat"}, - {"cc":"BAM","symbol":"KM","name":"Bosnia and Herzegovina konvertibilna marka"}, - {"cc":"BBD","symbol":"Bds$","name":"Barbadian dollar"}, - {"cc":"BDT","symbol":"\u09f3","name":"Bangladeshi taka"}, - {"cc":"BGN","symbol":"BGN","name":"Bulgarian lev"}, - {"cc":"BHD","symbol":".\u062f.\u0628","name":"Bahraini dinar"}, - {"cc":"BIF","symbol":"FBu","name":"Burundi franc"}, - {"cc":"BMD","symbol":"BD$","name":"Bermudian dollar"}, - {"cc":"BND","symbol":"B$","name":"Brunei dollar"}, - {"cc":"BOB","symbol":"Bs.","name":"Bolivian boliviano"}, - {"cc":"BRL","symbol":"R$","name":"Brazilian real"}, - {"cc":"BSD","symbol":"B$","name":"Bahamian dollar"}, - {"cc":"BTN","symbol":"Nu.","name":"Bhutanese ngultrum"}, - {"cc":"BWP","symbol":"P","name":"Botswana pula"}, - {"cc":"BYR","symbol":"Br","name":"Belarusian ruble"}, - {"cc":"BZD","symbol":"BZ$","name":"Belize dollar"}, - {"cc":"CAD","symbol":"$","name":"Canadian dollar"}, - {"cc":"CDF","symbol":"F","name":"Congolese franc"}, - {"cc":"CHF","symbol":"Fr.","name":"Swiss franc"}, - {"cc":"CLP","symbol":"$","name":"Chilean peso"}, - {"cc":"CNY","symbol":"\u00a5","name":"Chinese/Yuan renminbi"}, - {"cc":"COP","symbol":"Col$","name":"Colombian peso"}, - {"cc":"CRC","symbol":"\u20a1","name":"Costa Rican colon"}, - {"cc":"CUC","symbol":"$","name":"Cuban peso"}, - {"cc":"CVE","symbol":"Esc","name":"Cape Verdean escudo"}, - {"cc":"CZK","symbol":"K\u010d","name":"Czech koruna"}, - {"cc":"DJF","symbol":"Fdj","name":"Djiboutian franc"}, - {"cc":"DKK","symbol":"Kr","name":"Danish krone"}, - {"cc":"DOP","symbol":"RD$","name":"Dominican peso"}, - {"cc":"DZD","symbol":"\u062f.\u062c","name":"Algerian dinar"}, - {"cc":"EEK","symbol":"KR","name":"Estonian kroon"}, - {"cc":"EGP","symbol":"\u00a3","name":"Egyptian pound"}, - {"cc":"ERN","symbol":"Nfa","name":"Eritrean nakfa"}, - {"cc":"ETB","symbol":"Br","name":"Ethiopian birr"}, - {"cc":"EUR","symbol":"\u20ac","name":"European Euro"}, - {"cc":"FJD","symbol":"FJ$","name":"Fijian dollar"}, - {"cc":"FKP","symbol":"\u00a3","name":"Falkland Islands pound"}, - {"cc":"GBP","symbol":"\u00a3","name":"British pound"}, - {"cc":"GEL","symbol":"GEL","name":"Georgian lari"}, - {"cc":"GHS","symbol":"GH\u20b5","name":"Ghanaian cedi"}, - {"cc":"GIP","symbol":"\u00a3","name":"Gibraltar pound"}, - {"cc":"GMD","symbol":"D","name":"Gambian dalasi"}, - {"cc":"GNF","symbol":"FG","name":"Guinean franc"}, - {"cc":"GQE","symbol":"CFA","name":"Central African CFA franc"}, - {"cc":"GTQ","symbol":"Q","name":"Guatemalan quetzal"}, - {"cc":"GYD","symbol":"GY$","name":"Guyanese dollar"}, - {"cc":"HKD","symbol":"HK$","name":"Hong Kong dollar"}, - {"cc":"HNL","symbol":"L","name":"Honduran lempira"}, - {"cc":"HRK","symbol":"kn","name":"Croatian kuna"}, - {"cc":"HTG","symbol":"G","name":"Haitian gourde"}, - {"cc":"HUF","symbol":"Ft","name":"Hungarian forint"}, - {"cc":"IDR","symbol":"Rp","name":"Indonesian rupiah"}, - {"cc":"ILS","symbol":"\u20aa","name":"Israeli new sheqel"}, - {"cc":"INR","symbol":"\u20B9","name":"Indian rupee"}, - {"cc":"IQD","symbol":"\u062f.\u0639","name":"Iraqi dinar"}, - {"cc":"IRR","symbol":"IRR","name":"Iranian rial"}, - {"cc":"ISK","symbol":"kr","name":"Icelandic kr\u00f3na"}, - {"cc":"JMD","symbol":"J$","name":"Jamaican dollar"}, - {"cc":"JOD","symbol":"JOD","name":"Jordanian dinar"}, - {"cc":"JPY","symbol":"\u00a5","name":"Japanese yen"}, - {"cc":"KES","symbol":"KSh","name":"Kenyan shilling"}, - {"cc":"KGS","symbol":"\u0441\u043e\u043c","name":"Kyrgyzstani som"}, - {"cc":"KHR","symbol":"\u17db","name":"Cambodian riel"}, - {"cc":"KMF","symbol":"KMF","name":"Comorian franc"}, - {"cc":"KPW","symbol":"W","name":"North Korean won"}, - {"cc":"KRW","symbol":"W","name":"South Korean won"}, - {"cc":"KWD","symbol":"KWD","name":"Kuwaiti dinar"}, - {"cc":"KYD","symbol":"KY$","name":"Cayman Islands dollar"}, - {"cc":"KZT","symbol":"T","name":"Kazakhstani tenge"}, - {"cc":"LAK","symbol":"KN","name":"Lao kip"}, - {"cc":"LBP","symbol":"\u00a3","name":"Lebanese lira"}, - {"cc":"LKR","symbol":"Rs","name":"Sri Lankan rupee"}, - {"cc":"LRD","symbol":"L$","name":"Liberian dollar"}, - {"cc":"LSL","symbol":"M","name":"Lesotho loti"}, - {"cc":"LTL","symbol":"Lt","name":"Lithuanian litas"}, - {"cc":"LVL","symbol":"Ls","name":"Latvian lats"}, - {"cc":"LYD","symbol":"LD","name":"Libyan dinar"}, - {"cc":"MAD","symbol":"MAD","name":"Moroccan dirham"}, - {"cc":"MDL","symbol":"MDL","name":"Moldovan leu"}, - {"cc":"MGA","symbol":"FMG","name":"Malagasy ariary"}, - {"cc":"MKD","symbol":"MKD","name":"Macedonian denar"}, - {"cc":"MMK","symbol":"K","name":"Myanma kyat"}, - {"cc":"MNT","symbol":"\u20ae","name":"Mongolian tugrik"}, - {"cc":"MOP","symbol":"P","name":"Macanese pataca"}, - {"cc":"MRO","symbol":"UM","name":"Mauritanian ouguiya"}, - {"cc":"MUR","symbol":"Rs","name":"Mauritian rupee"}, - {"cc":"MVR","symbol":"Rf","name":"Maldivian rufiyaa"}, - {"cc":"MWK","symbol":"MK","name":"Malawian kwacha"}, - {"cc":"MXN","symbol":"$","name":"Mexican peso"}, - {"cc":"MYR","symbol":"RM","name":"Malaysian ringgit"}, - {"cc":"MZM","symbol":"MTn","name":"Mozambican metical"}, - {"cc":"NAD","symbol":"N$","name":"Namibian dollar"}, - {"cc":"NGN","symbol":"\u20a6","name":"Nigerian naira"}, - {"cc":"NIO","symbol":"C$","name":"Nicaraguan c\u00f3rdoba"}, - {"cc":"NOK","symbol":"kr","name":"Norwegian krone"}, - {"cc":"NPR","symbol":"NRs","name":"Nepalese rupee"}, - {"cc":"NZD","symbol":"NZ$","name":"New Zealand dollar"}, - {"cc":"OMR","symbol":"OMR","name":"Omani rial"}, - {"cc":"PAB","symbol":"B./","name":"Panamanian balboa"}, - {"cc":"PEN","symbol":"S/.","name":"Peruvian nuevo sol"}, - {"cc":"PGK","symbol":"K","name":"Papua New Guinean kina"}, - {"cc":"PHP","symbol":"\u20b1","name":"Philippine peso"}, - {"cc":"PKR","symbol":"Rs.","name":"Pakistani rupee"}, - {"cc":"PLN","symbol":"z\u0142","name":"Polish zloty"}, - {"cc":"PYG","symbol":"\u20b2","name":"Paraguayan guarani"}, - {"cc":"QAR","symbol":"QR","name":"Qatari riyal"}, - {"cc":"RON","symbol":"L","name":"Romanian leu"}, - {"cc":"RSD","symbol":"din.","name":"Serbian dinar"}, - {"cc":"RUB","symbol":"R","name":"Russian ruble"}, - {"cc":"SAR","symbol":"SR","name":"Saudi riyal"}, - {"cc":"SBD","symbol":"SI$","name":"Solomon Islands dollar"}, - {"cc":"SCR","symbol":"SR","name":"Seychellois rupee"}, - {"cc":"SDG","symbol":"SDG","name":"Sudanese pound"}, - {"cc":"SEK","symbol":"kr","name":"Swedish krona"}, - {"cc":"SGD","symbol":"S$","name":"Singapore dollar"}, - {"cc":"SHP","symbol":"\u00a3","name":"Saint Helena pound"}, - {"cc":"SLL","symbol":"Le","name":"Sierra Leonean leone"}, - {"cc":"SOS","symbol":"Sh.","name":"Somali shilling"}, - {"cc":"SRD","symbol":"$","name":"Surinamese dollar"}, - {"cc":"SYP","symbol":"LS","name":"Syrian pound"}, - {"cc":"SZL","symbol":"E","name":"Swazi lilangeni"}, - {"cc":"THB","symbol":"\u0e3f","name":"Thai baht"}, - {"cc":"TJS","symbol":"TJS","name":"Tajikistani somoni"}, - {"cc":"TMT","symbol":"m","name":"Turkmen manat"}, - {"cc":"TND","symbol":"DT","name":"Tunisian dinar"}, - {"cc":"TRY","symbol":"TRY","name":"Turkish new lira"}, - {"cc":"TTD","symbol":"TT$","name":"Trinidad and Tobago dollar"}, - {"cc":"TWD","symbol":"NT$","name":"New Taiwan dollar"}, - {"cc":"TZS","symbol":"TZS","name":"Tanzanian shilling"}, - {"cc":"UAH","symbol":"UAH","name":"Ukrainian hryvnia"}, - {"cc":"UGX","symbol":"USh","name":"Ugandan shilling"}, - {"cc":"USD","symbol":"US$","name":"United States dollar"}, - {"cc":"UYU","symbol":"$U","name":"Uruguayan peso"}, - {"cc":"UZS","symbol":"UZS","name":"Uzbekistani som"}, - {"cc":"VEB","symbol":"Bs","name":"Venezuelan bolivar"}, - {"cc":"VND","symbol":"\u20ab","name":"Vietnamese dong"}, - {"cc":"VUV","symbol":"VT","name":"Vanuatu vatu"}, - {"cc":"WST","symbol":"WS$","name":"Samoan tala"}, - {"cc":"XAF","symbol":"CFA","name":"Central African CFA franc"}, - {"cc":"XCD","symbol":"EC$","name":"East Caribbean dollar"}, - {"cc":"XDR","symbol":"SDR","name":"Special Drawing Rights"}, - {"cc":"XOF","symbol":"CFA","name":"West African CFA franc"}, - {"cc":"XPF","symbol":"F","name":"CFP franc"}, - {"cc":"YER","symbol":"YER","name":"Yemeni rial"}, - {"cc":"ZAR","symbol":"R","name":"South African rand"}, - {"cc":"ZMK","symbol":"ZK","name":"Zambian kwacha"}, - {"cc":"ZWR","symbol":"Z$","name":"Zimbabwean dollar"} -] \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/forms.py b/shopyo/modules/box__ecommerce/shopman/forms.py deleted file mode 100644 index 873270e..0000000 --- a/shopyo/modules/box__ecommerce/shopman/forms.py +++ /dev/null @@ -1,64 +0,0 @@ -from flask_wtf import FlaskForm -from wtforms import StringField -from wtforms import TextAreaField -from wtforms.fields import SelectField - -# from wtforms.fields.html5 import EmailField -from wtforms.fields.html5 import IntegerField -from wtforms.validators import DataRequired - -# from wtforms.validators import Email -# from wtforms.validators import Optional - - -class DeliveryOptionForm(FlaskForm): - option = StringField( - "Option", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - price = IntegerField( - "Price", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - - -class PaymentOptionForm(FlaskForm): - name = StringField( - "Option", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - text = TextAreaField( - "Text", - [DataRequired()], - render_kw={"rows": 10, "class": "form-control", "autocomplete": "off"}, - ) - - -class CouponForm(FlaskForm): - string = StringField( - "String", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - type = SelectField( - "Type", - choices=[("percentage", "percentage"), ("value", "value")], - validators=[DataRequired()], - render_kw={"class": "form-control"}, - ) - value = IntegerField( - "Value", - [DataRequired()], - render_kw={"class": "form-control", "autocomplete": "off"}, - ) - - -class CurrencyForm(FlaskForm): - currency = SelectField( - "Currency", - validators=[DataRequired()], - render_kw={"class": "form-control"}, - ) diff --git a/shopyo/modules/box__ecommerce/shopman/info.json b/shopyo/modules/box__ecommerce/shopman/info.json deleted file mode 100644 index 88c9d7f..0000000 --- a/shopyo/modules/box__ecommerce/shopman/info.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "display_string": "Manage Shop", - "module_name":"shopman", - "type": "show", - "fa-icon": "fa fa-store", - "url_prefix": "/shopman", - "dashboard": "/dashboard", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/models.py b/shopyo/modules/box__ecommerce/shopman/models.py deleted file mode 100644 index 4fb2844..0000000 --- a/shopyo/modules/box__ecommerce/shopman/models.py +++ /dev/null @@ -1,65 +0,0 @@ -from shopyoapi.init import db - - -class DeliveryOption(db.Model): - - __tablename__ = "deliveryoptions" - id = db.Column(db.Integer, primary_key=True) - option = db.Column(db.String(300)) - price = db.Column(db.Float) - - order_id = db.Column(db.Integer, db.ForeignKey("orders.id")) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - - -class PaymentOption(db.Model): - - __tablename__ = "paymentoptions" - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(300)) - text = db.Column(db.String(300)) - - order_id = db.Column(db.Integer, db.ForeignKey("orders.id")) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - - -class Coupon(db.Model): - - __tablename__ = "coupons" - id = db.Column(db.Integer, primary_key=True) - string = db.Column(db.String(300)) - type = db.Column(db.String(300)) # percentage, value - value = db.Column(db.String(300)) - - order_id = db.Column(db.Integer, db.ForeignKey("orders.id")) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/blocks/sidebar.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/blocks/sidebar.html deleted file mode 100644 index c79ff27..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/blocks/sidebar.html +++ /dev/null @@ -1,39 +0,0 @@ - {{ -sidebar_item( -'Home', -icon=info['fa-icon'], -url=url_for('shopman.dashboard') -) -}} - -{{ -sidebar_item( -'Delivery', -icon='fa fa-paper-plane', -url=url_for(info['module_name']+'.delivery') -) -}} - -{{ -sidebar_item( -'Payment', -icon='fa fa-money-check-alt', -url=url_for(info['module_name']+'.payment') -) -}} - -{{ -sidebar_item( -'Coupon', -icon='fa fa-candy-cane', -url=url_for(info['module_name']+'.coupon') -) -}} - -{{ -sidebar_item( -'Orders', -icon='fa fa-clipboard-list', -url=url_for(info['module_name']+'.order') -) -}} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/coupon.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/coupon.html deleted file mode 100644 index 73d1cde..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/coupon.html +++ /dev/null @@ -1,92 +0,0 @@ -{% extends "base/module_base.html" %} - -{% set active_page = info['display_string']+' dashboard' %} - -{% block pagehead %} - - -{% endblock %} - - - - -{% block sidebar %} - {%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} - - - - -{% block content %} -
-
-
-
-
-
- - {{ form.string() }} - - {{ form.type() }}
- - {{ form.value() }} -

- - {{ form.csrf_token }} - -
-
-
-
-
-
-
-
- - - - - - - - - - {%for coupon in coupons%} - - - - - - - - - - - {%endfor%} - - -
StringTypeValue
- {{ form.string(value=coupon.string) }} - - {% set z = form.type.process_data(coupon.type) %} - {{ form.type() }} - - {{ form.value(value=coupon.value) }} - -
- - - -
-
-
-
-
-
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/dashboard.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/dashboard.html deleted file mode 100644 index 36e17ec..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/dashboard.html +++ /dev/null @@ -1,43 +0,0 @@ -{% extends "base/module_base.html" %} - -{% set active_page = info['display_string']+' dashboard' %} - -{% block pagehead %} - - -{% endblock %} - - - - -{% block sidebar %} - {%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} - - - - -{% block content %} -
-
-
-
-
-
- - {% set z = form.currency.process_data(current_currency) %} - {{ form.currency() }} - -

- - {{ form.csrf_token }} - -
-
-
-
- - -{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/delivery.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/delivery.html deleted file mode 100644 index b2b3ba2..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/delivery.html +++ /dev/null @@ -1,86 +0,0 @@ -{% extends "base/module_base.html" %} - -{% set active_page = info['display_string']+' dashboard' %} - -{% block pagehead %} - - -{% endblock %} - - - - -{% block sidebar %} - {%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} - - - - -{% block content %} -
- -
-
-
-
- - {{ form.option() }} - - {{ form.price() }} -

- - {{ form.csrf_token }} - -
-
- -
- -
- -
-
- - - - - - - - - {%for option in options%} - - - - - - - - - - {%endfor%} - - -
OptionPrice
- - - - -
- - - -
-
-
-
- -
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/email_status_change.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/email_status_change.html deleted file mode 100644 index 77c3ce5..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/email_status_change.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - Document - - -

Hi {{order.billing_detail.first_name}},

-

Just dropping you an email to notify you that your order with reference {{order.get_ref()}} - has changed status from {{previous_status}} to {{order.status}}.
- If you have any queries please do not hesistate to contact us.
- Regards,
- Your Team -

- - - \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/order.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/order.html deleted file mode 100644 index f3e3d2b..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/order.html +++ /dev/null @@ -1,46 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} -Orders - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
-
-
- - - - - - - - - - - {%for order in orders%} - - - - - - - - - - - {%endfor%} - -
reftimestatuscustomer namecustomer email
{{order.get_ref()}}{{order.get_std_formatted_time()}}{{order.status}}{{order.billing_detail.first_name}} {{order.billing_detail.last_name}}{{order.billing_detail.email}}view
-
-
-
- - -{% endblock %} - - diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/order_view.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/order_view.html deleted file mode 100644 index 013bb11..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/order_view.html +++ /dev/null @@ -1,109 +0,0 @@ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} -Orders - -{% endblock %} -{% block sidebar %} -{%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} -{% block content %} -
- - - -

-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - {%for order_item in order.order_items%} - {%set product = order_item.get_product()%} - - - - - - - - - - {%endfor%} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Ref{{order.get_ref()}}
Time{{order.get_std_formatted_time()}}
Status - {{order.status}}
-
- - - - -
-
Items
Name Barcode Size Color Price Quantity Total
{{product.name}}{{product.barcode}}{{order_item.size}}{{order_item.color}}{{product.selling_price}}{{order_item.quantity}}{{product.selling_price * order_item.quantity}}
Total amount{{order.get_total_amount()}}
Customer Name{{order.billing_detail.first_name}} {{order.billing_detail.last_name}}
Street{{order.billing_detail.street}}
Town/City{{order.billing_detail.town_city}}
Phone{{order.billing_detail.phone}}
Email{{order.billing_detail.email}}
-
-
-
- - -{% endblock %} - - diff --git a/shopyo/modules/box__ecommerce/shopman/templates/shopman/payment.html b/shopyo/modules/box__ecommerce/shopman/templates/shopman/payment.html deleted file mode 100644 index 9d3ed5b..0000000 --- a/shopyo/modules/box__ecommerce/shopman/templates/shopman/payment.html +++ /dev/null @@ -1,86 +0,0 @@ -{% extends "base/module_base.html" %} - -{% set active_page = info['display_string']+' dashboard' %} - -{% block pagehead %} - - -{% endblock %} - - - - -{% block sidebar %} - {%include info['module_name']+'/blocks/sidebar.html'%} -{%endblock%} - - - - -{% block content %} -
- -
-
-
-
- - {{ form.name() }} - - {{ form.text() }} -

- - {{ form.csrf_token }} - -
-
- -
- -
- -
-
- - - - - - - - - {%for option in options%} - - - - - - - - - - {%endfor%} - - -
Option NameText
- - - - -
- - - -
-
-
-
- -
-{% endblock %} \ No newline at end of file diff --git a/shopyo/modules/box__ecommerce/shopman/upload.py b/shopyo/modules/box__ecommerce/shopman/upload.py deleted file mode 100644 index 2f8ea31..0000000 --- a/shopyo/modules/box__ecommerce/shopman/upload.py +++ /dev/null @@ -1,23 +0,0 @@ -from app import app - -from modules.box__ecommerce.shopman.models import DeliveryOption -from modules.box__ecommerce.shopman.models import PaymentOption - -def upload_options(): - with app.app_context(): - d1 = DeliveryOption( - option='home delivery', - price='100' - ) - d1.insert() - - p1 = PaymentOption( - name='Cash', - text='paid on delivery' - ) - p1.insert() - - -def upload(): - print('Uploading delivery and payment data ...') - upload_options() diff --git a/shopyo/modules/box__ecommerce/shopman/view.py b/shopyo/modules/box__ecommerce/shopman/view.py deleted file mode 100644 index 39ad673..0000000 --- a/shopyo/modules/box__ecommerce/shopman/view.py +++ /dev/null @@ -1,304 +0,0 @@ -# from flask import render_template -# from flask import url_for -# from flask import redirect - -import json -import os - -from flask import flash -from flask import request - -from flask_login import login_required -from flask_mailman import EmailMultiAlternatives - -from modules.box__default.settings.helpers import get_setting -from shopyoapi.enhance import set_setting -from shopyoapi.forms import flash_errors - -# # -from shopyoapi.html import notify_success -from shopyoapi.module import ModuleHelp - -from modules.box__ecommerce.product.models import Product -from modules.box__ecommerce.shop.models import Order -from modules.box__ecommerce.shopman.forms import CouponForm -from modules.box__ecommerce.shopman.forms import CurrencyForm -from modules.box__ecommerce.shopman.forms import DeliveryOptionForm -from modules.box__ecommerce.shopman.forms import PaymentOptionForm -from modules.box__default.auth.email import send_async_email - -from .models import Coupon -from .models import DeliveryOption -from .models import PaymentOption - - -mhelp = ModuleHelp(__file__, __name__) - -globals()[mhelp.blueprint_str] = mhelp.blueprint - -module_blueprint = globals()[mhelp.blueprint_str] - - -def get_product(barcode): - return Product.query.get(barcode) - - -@module_blueprint.route(mhelp.info["dashboard"]) -@login_required -def dashboard(): - context = mhelp.context() - form = CurrencyForm() - with open( - os.path.join( - mhelp.dirpath, - "data", - "currency.json", - ) - ) as f: - currencies = json.load(f) - currency_choices = [(c["cc"], c["name"]) for c in currencies] - form.currency.choices = currency_choices - - context.update({"form": form, "current_currency": get_setting("CURRENCY")}) - return mhelp.render("dashboard.html", **context) - - -@module_blueprint.route("currency/set", methods=["GET", "POST"]) -@login_required -def set_currency(): - if request.method == "POST": - form = CurrencyForm() - set_setting("CURRENCY", form.currency.data) - return mhelp.redirect_url("shopman.dashboard") - - -@module_blueprint.route("/delivery" + mhelp.info["dashboard"]) -@login_required -def delivery(): - context = mhelp.context() - form = DeliveryOptionForm() - options = DeliveryOption.query.all() - - context.update({"form": form, "options": options}) - return mhelp.render("delivery.html", **context) - - -@module_blueprint.route("/delivery/option/add", methods=["GET", "POST"]) -@login_required -def delivery_add_option(): - if request.method == "POST": - form = DeliveryOptionForm() - if form.validate_on_submit(): - toadd = DeliveryOption() - toadd.option = form.option.data - toadd.price = float(form.price.data) - toadd.insert() - flash(notify_success("Option Added!")) - return mhelp.redirect_url("shopman.delivery") - else: - flash_errors(form) - return mhelp.redirect_url("shopman.delivery") - - -@module_blueprint.route("/delivery/option/update", methods=["GET", "POST"]) -@login_required -def delivery_option_update(): - if request.method == "POST": - - opt_id = request.form["id"] - option_data = request.form["option"] - price_data = request.form["price"] - - option = DeliveryOption.query.get(opt_id) - option.option = option_data - option.price = price_data - option.update() - - flash(notify_success("Option updated!")) - return mhelp.redirect_url("shopman.delivery") - - -@module_blueprint.route("/delivery/option//delete", methods=["GET"]) -@login_required -def delivery_option_delete(option_id): - option = DeliveryOption.query.get(option_id) - option.delete() - - flash(notify_success("Option Deleted!")) - return mhelp.redirect_url("shopman.delivery") - - -@module_blueprint.route("/payment/dashboard", methods=["GET", "POST"]) -@login_required -def payment(): - context = mhelp.context() - form = PaymentOptionForm() - options = PaymentOption.query.all() - - context.update({"form": form, "options": options}) - return mhelp.render("payment.html", **context) - - -@module_blueprint.route("/payment/option/add", methods=["GET", "POST"]) -@login_required -def payment_add_option(): - if request.method == "POST": - form = PaymentOptionForm() - if form.validate_on_submit(): - toadd = PaymentOption() - toadd.name = form.name.data - toadd.text = form.text.data - toadd.insert() - flash(notify_success("Option Added!")) - return mhelp.redirect_url("shopman.payment") - else: - flash_errors(form) - return mhelp.redirect_url("shopman.payment") - - -@module_blueprint.route("/payment/option/update", methods=["GET", "POST"]) -@login_required -def payment_option_update(): - if request.method == "POST": - - opt_id = request.form["id"] - option_data = request.form["name"] - text_data = request.form["text"] - - option = PaymentOption.query.get(opt_id) - option.name = option_data - option.text = text_data - option.update() - - flash(notify_success("Option updated!")) - return mhelp.redirect_url("shopman.payment") - - -@module_blueprint.route("/payment/option//delete", methods=["GET"]) -@login_required -def payment_option_delete(option_id): - option = PaymentOption.query.get(option_id) - option.delete() - - flash(notify_success("Option Deleted!")) - return mhelp.redirect_url("shopman.payment") - - -@module_blueprint.route("/coupon/dashboard", methods=["GET", "POST"]) -@login_required -def coupon(): - form = CouponForm() - coupons = Coupon.query.all() - context = mhelp.context() - context.update({"form": form, "coupons": coupons}) - return mhelp.render("coupon.html", **context) - - -@module_blueprint.route("/coupon/add", methods=["GET", "POST"]) -@login_required -def coupon_add(): - if request.method == "POST": - form = CouponForm() - if form.validate_on_submit(): - toadd = Coupon() - toadd.string = form.string.data - toadd.type = form.type.data - toadd.value = form.value.data - toadd.insert() - flash(notify_success("Coupon Added!")) - return mhelp.redirect_url("shopman.coupon") - else: - flash_errors(form) - return mhelp.redirect_url("shopman.coupon") - - -@module_blueprint.route("/coupon//delete", methods=["GET"]) -@login_required -def coupon_delete(coupon_id): - coupon = Coupon.query.get(coupon_id) - coupon.delete() - - flash(notify_success("Coupon Deleted!")) - return mhelp.redirect_url("shopman.coupon") - - -@module_blueprint.route("/coupon/update", methods=["GET", "POST"]) -@login_required -def coupon_update(): - if request.method == "POST": - form = CouponForm() - if form.validate_on_submit: - coupon_id = request.form["id"] - coupon = Coupon.query.get(coupon_id) - coupon.string = form.string.data - coupon.type = form.type.data - coupon.value = form.value.data - coupon.update() - - flash(notify_success("Coupon updated!")) - return mhelp.redirect_url("shopman.coupon") - else: - flash_errors(form) - return mhelp.redirect_url("shopman.coupon") - - -@module_blueprint.route("/order/dashboard", methods=["GET", "POST"]) -@login_required -def order(): - orders = Order.query.all() - context = mhelp.context() - context.update({"dir": dir, "orders": orders, "get_product": get_product}) - return mhelp.render("order.html", **context) - - -@module_blueprint.route("/order//delete", methods=["GET", "POST"]) -@login_required -def order_delete(order_id): - order = Order.query.get(order_id) - order.delete() - return mhelp.redirect_url("shopman.order") - - -@module_blueprint.route("/order//view/dashboard", methods=["GET", "POST"]) -@login_required -def order_view(order_id): - order = Order.query.get(order_id) - context = mhelp.context() - context.update({ - "dir": dir, - "order": order - }) - return mhelp.render("order_view.html", **context) - - -@module_blueprint.route("/order//status", methods=["POST"]) -@login_required -def order_status_change(order_id): - if request.method == 'POST': - order_status = request.form['order_status'] - order = Order.query.get(order_id) - valid_status = ['pending', 'processing', 'shipped', 'cancelled', 'refunded'] - if order_status not in valid_status: - return 'unknown order status' - previous_status = order.status - - order.status = order_status - order.update() - - context = mhelp.context() - context.update({ - "previous_status": previous_status, - "order": order - }) - new_line = '\n' - subject, from_email, to = 'Title', 'from@example.com', f'{order.billing_detail.email}' - text_content = f'Hi {order.billing_detail.first_name},{new_line}Just dropping you '\ - f'an email to notify you that your order with reference {order.get_ref()} has changed '\ - f'status from {previous_status} to {order.status}.{new_line}If you have any queries '\ - f'please do not hesistate to contact us.{new_line}Regards,{new_line}Your Team' - html_content = mhelp.render("email_status_change.html", **context) - msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) - msg.attach_alternative(html_content, "text/html") - msg.send() - flash(notify_success('Order Updated')) - return mhelp.redirect_url('shopman.order_view', order_id=order_id) \ No newline at end of file diff --git a/shopyo/modules/resource/forms.py b/shopyo/modules/resource/forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/resource/info.json b/shopyo/modules/resource/info.json deleted file mode 100644 index 82f51f4..0000000 --- a/shopyo/modules/resource/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Files", - "module_name":"resource", - "type": "hide", - "fa-icon": "fa fa-store", - "url_prefix": "/resource", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/resource/models.py b/shopyo/modules/resource/models.py deleted file mode 100644 index 3bd9e65..0000000 --- a/shopyo/modules/resource/models.py +++ /dev/null @@ -1,61 +0,0 @@ -import datetime - -from shopyoapi.init import db - - -class Image(db.Model): - __tablename__ = "images" - id = db.Column(db.Integer, primary_key=True) - filename = db.Column(db.String(50), nullable=False) - thumbnail = db.Column(db.String(50), nullable=False) - file_size = db.Column(db.Integer, nullable=False) - file_width = db.Column(db.Integer, nullable=False) - file_height = db.Column(db.Integer, nullable=False) - create_date = db.Column( - db.DateTime, default=datetime.datetime.now(), nullable=False - ) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() - - # def getImage(image_id): - # return Images.query.filter_by(id=image_id).first() - - -class Resource(db.Model): - __tablename__ = "resources" - id = db.Column(db.Integer, primary_key=True) - filename = db.Column(db.String(50), nullable=False) - type = db.Column(db.String(50), nullable=False) - category = db.Column(db.String(50), nullable=False) - - created_date = db.Column( - db.DateTime, default=datetime.datetime.now(), nullable=False - ) - - # - product_id = db.Column(db.Integer, db.ForeignKey('product.id'), - nullable=True) - category_id = db.Column(db.Integer, db.ForeignKey('categories.id'), - nullable=False) - subcategory_id = db.Column(db.Integer, db.ForeignKey('subcategories.id'), - nullable=True) - - def insert(self): - db.session.add(self) - db.session.commit() - - def update(self): - db.session.commit() - - def delete(self): - db.session.delete(self) - db.session.commit() diff --git a/shopyo/modules/resource/templates/resource/blocks/sidebar.html b/shopyo/modules/resource/templates/resource/blocks/sidebar.html deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/resource/view.py b/shopyo/modules/resource/view.py deleted file mode 100644 index 60865ea..0000000 --- a/shopyo/modules/resource/view.py +++ /dev/null @@ -1,155 +0,0 @@ -import json -import os - -# from flask import render_template -from flask import Blueprint -from flask import current_app - -# from flask import redirect -from flask import send_from_directory - -# from flask import url_for - -from flask_login import login_required -from PIL import Image as PILimage - -# from shopyoapi.enhance import get_setting -# from shopyoapi.file import delete_file - -# from modules.box__ecommerce.product.models import Product -from modules.resource.models import Image - -# from modules.resource.models import Resource - -# from flask import flash -# from flask import request# -# from shopyoapi.html import notify_success -# from shopyoapi.forms import flash_errors - - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="templates", - url_prefix=module_info["url_prefix"], -) - - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - - -@module_blueprint.route("/") -def index(): - return module_info["display_string"] - - -@module_blueprint.route( - "/theme/front//styles.css", methods=["GET"] -) -def active_front_theme_css(active_theme): - theme_dir = os.path.join( - current_app.config["BASE_DIR"], - "static", - "themes", - "front", - active_theme, - ) - # return theme_dir - return send_from_directory(theme_dir, "styles.css") - - -@module_blueprint.route( - "/theme/back//styles.css", methods=["GET"] -) -def active_back_theme_css(active_theme): - theme_dir = os.path.join( - current_app.config["BASE_DIR"], - "static", - "themes", - "back", - active_theme, - ) - # return theme_dir - return send_from_directory(theme_dir, "styles.css") - - -@module_blueprint.route("/product/", methods=["GET"]) -def product_image(filename): - - # return theme_dir - if filename == "default": - return send_from_directory( - os.path.join(current_app.config["BASE_DIR"], "static", "default"), - "default_product.jpg", - ) - return send_from_directory( - current_app.config["UPLOADED_PRODUCTPHOTOS_DEST"], filename - ) - - -# Handles javascript image uploads from tinyMCE -@module_blueprint.route("/upload/tinymce/image", methods=["POST"]) -@login_required -def upload_tinymce_image(): - # Kevin Foong - file = request.files.get("file") - if file: - filename = file.filename.lower() - fn, ext = filename.split(".") - # truncate filename (excluding extension) to 30 characters - fn = fn[:30] - filename = fn + "." + ext - if ext in ["jpg", "gif", "png", "jpeg"]: - try: - # everything looks good, save file - img_fullpath = os.path.join( - current_app.config["UPLOADED_PATH_IMAGE"], filename - ) - file.save(img_fullpath) - # get the file size to save to db - file_size = os.stat(img_fullpath).st_size - size = 160, 160 - # read image into pillow - im = PILimage.open(img_fullpath) - # get image dimension to save to db - file_width, file_height = im.size - # convert to thumbnail - im.thumbnail(size) - thumbnail = fn + "-thumb.jpg" - tmb_fullpath = os.path.join( - current_app.config["UPLOADED_PATH_THUMB"], thumbnail - ) - # PNG is index while JPG needs RGB - if not im.mode == "RGB": - im = im.convert("RGB") - # save thumbnail - im.save(tmb_fullpath, "JPEG") - - # save to db - img = Image( - filename=filename, - thumbnail=thumbnail, - file_size=file_size, - file_width=file_width, - file_height=file_height, - ) - db.session.add(img) - db.session.commit() - except IOError: - output = make_response(404) - output.headers["Error"] = ( - "Cannot create thumbnail for " + filename - ) - return output - return jsonify({"location": filename}) - - # fail, image did not upload - output = make_response(404) - output.headers["Error"] = "Filename needs to be JPG, JPEG, GIF or PNG" - return output diff --git a/shopyo/modules/www/forms.py b/shopyo/modules/www/forms.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/www/info.json b/shopyo/modules/www/info.json deleted file mode 100644 index 7b694be..0000000 --- a/shopyo/modules/www/info.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "display_string": "Www", - "module_name":"www", - "type": "show", - "fa-icon": "fa fa-globe-asia", - "url_prefix": "/", - "author": { - "name":"", - "website":"", - "mail":"" - } -} \ No newline at end of file diff --git a/shopyo/modules/www/models.py b/shopyo/modules/www/models.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/www/templates/www/blocks/sidebar.html b/shopyo/modules/www/templates/www/blocks/sidebar.html deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/modules/www/view.py b/shopyo/modules/www/view.py deleted file mode 100644 index 2c165a6..0000000 --- a/shopyo/modules/www/view.py +++ /dev/null @@ -1,48 +0,0 @@ -import json -import os - -# from flask import url_for -# from flask import redirect -# from flask import flash -# from flask import request -from flask import Blueprint -from flask import redirect -from flask import url_for - -# -# from shopyoapi.html import notify_success -# from shopyoapi.forms import flash_errors -# from shopyoapi.enhance import get_active_theme_dir -# from shopyoapi.enhance import get_setting - -# from modules.box__ecommerce.shop.helpers import get_cart_data - -dirpath = os.path.dirname(os.path.abspath(__file__)) -module_info = {} - -with open(dirpath + "/info.json") as f: - module_info = json.load(f) - - -globals()["{}_blueprint".format(module_info["module_name"])] = Blueprint( - "{}".format(module_info["module_name"]), - __name__, - template_folder="", - url_prefix=module_info["url_prefix"], -) - - -module_blueprint = globals()["{}_blueprint".format(module_info["module_name"])] - - -@module_blueprint.route("/") -def index(): - # cant be defined above but must be manually set each time - # active_theme_dir = os.path.join( - # dirpath, "..", "..", "themes", get_setting("ACTIVE_FRONT_THEME") - # ) - # module_blueprint.template_folder = active_theme_dir - - # return str(module_blueprint.template_folder) - - return redirect(url_for("shop.homepage")) diff --git a/shopyo/pyproject.toml b/shopyo/pyproject.toml deleted file mode 100644 index 0cb8cc4..0000000 --- a/shopyo/pyproject.toml +++ /dev/null @@ -1,22 +0,0 @@ -[tool.black] -line-length = 79 -include = '\.pyi?$' -exclude = ''' - -( - /( - \.eggs # exclude a few common directories in the - | \.git # root of the project - | \.hg - | \.mypy_cache - | \.tox - | \.venv - | _build - | buck-out - | build - | dist - )/ - | foo.py # also separately exclude a file named foo.py in - # the root of the project -) -''' \ No newline at end of file diff --git a/shopyo/requirements.txt b/shopyo/requirements.txt deleted file mode 100644 index 1d609f0..0000000 --- a/shopyo/requirements.txt +++ /dev/null @@ -1,13 +0,0 @@ -Flask==1.1.2 -Flask-SQLAlchemy==2.4.4 -flask-marshmallow==0.14.0 -email-validator==1.1.1 -Flask-Login==0.5.0 -Flask-Migrate==2.5.3 -Flask-Reuploaded==0.3.2 -Flask-WTF==0.14.3 -marshmallow==3.8.0 -marshmallow-sqlalchemy==0.23.1 -requests==2.24.0 -Pillow==8.0.1 -shopyo diff --git a/shopyo/setup.cfg b/shopyo/setup.cfg deleted file mode 100644 index 3163d50..0000000 --- a/shopyo/setup.cfg +++ /dev/null @@ -1,11 +0,0 @@ -[isort] -profile = black -default_section = THIRDPARTY -known_flask = flask -known_shopyoapi = shopyoapi -known_modules = modules -force_single_line = True -sections = FUTURE,STDLIB,FLASK,THIRDPARTY,FIRSTPARTY,SHOPYOAPI,MODULES,LOCALFOLDER - -[flake8] -ignore = E501 \ No newline at end of file diff --git a/shopyo/shopyoapi/__init__.py b/shopyo/shopyoapi/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/shopyoapi/assets.py b/shopyo/shopyoapi/assets.py deleted file mode 100644 index efdcc0d..0000000 --- a/shopyo/shopyoapi/assets.py +++ /dev/null @@ -1,11 +0,0 @@ -from flask import url_for -from flask import current_app - - -def get_static(boxormodule, filename): - if current_app.config["DEBUG"] == True: - return url_for("devstatic", boxormodule=boxormodule, filename=filename) - else: - return url_for( - "static", filename="modules/{}/{}".format(boxormodule, filename) - ) diff --git a/shopyo/shopyoapi/cmd.py b/shopyo/shopyoapi/cmd.py deleted file mode 100644 index 7e9a339..0000000 --- a/shopyo/shopyoapi/cmd.py +++ /dev/null @@ -1,407 +0,0 @@ -""" -commandline utilities functions -""" -import os -import re -import subprocess -import sys -import importlib - -from shopyoapi.init import db -from shopyoapi.cmd_helper import tryrmcache -from shopyoapi.cmd_helper import tryrmfile -from shopyoapi.cmd_helper import tryrmtree -from shopyoapi.path import root_path -from shopyoapi.path import static_path -from shopyoapi.path import modules_path -from shopyoapi.file import trymkdir -from shopyoapi.file import trymkfile -from shopyoapi.file import get_folders -from shopyoapi.file import trycopytree - - -def clean(app): - """ - Deletes shopyo.db and migrations/ if present in current working directory. - Deletes all __pycache__ folders starting from current working directory - all the way to leaf directory. - - Parameters - ---------- - - app: flask app that that need to be cleaned - - Returns - ------- - None - ... - - """ - SEP_CHAR = "#" - SEP_NUM = 23 - - print(SEP_CHAR * SEP_NUM, end="\n\n") - print("Cleaning...") - - # getting app context creates the shopyo.db file even if it is not present - with app.test_request_context(): - db.drop_all() - db.engine.execute("DROP TABLE IF EXISTS alembic_version;") - print("[x] all tables dropped") - - tryrmcache(os.getcwd()) - tryrmfile(os.path.join(os.getcwd(), "shopyo.db")) - tryrmtree(os.path.join(os.getcwd(), "migrations")) - - -def initialise(): - """ - Create db, migrate, adds default users, add settings - - Parameters - ---------- - - - Returns - ------- - None - - - """ - SEP_CHAR = "#" - SEP_NUM = 23 - - print("Creating Db") - print(SEP_CHAR * SEP_NUM, end="\n\n") - subprocess.run( - [sys.executable, "manage.py", "db", "init"], stdout=subprocess.PIPE - ) - - print("Migrating") - print(SEP_CHAR * SEP_NUM, end="\n\n") - subprocess.run( - [sys.executable, "manage.py", "db", "migrate"], stdout=subprocess.PIPE - ) - subprocess.run( - [sys.executable, "manage.py", "db", "upgrade"], stdout=subprocess.PIPE - ) - - print("Collecting static") - print(SEP_CHAR * SEP_NUM, end="\n\n") - subprocess.run( - [sys.executable, "manage.py", "collectstatic"], stdout=subprocess.PIPE - ) - - # Uploads - print("Uploads") - print(SEP_CHAR * SEP_NUM, end="\n\n") - - for folder in os.listdir(os.path.join(root_path, "modules")): - if folder.startswith("__"): # ignore __pycache__ - continue - if folder.startswith("box__"): - # boxes - for sub_folder in os.listdir( - os.path.join(root_path, "modules", folder) - ): - if sub_folder.startswith("__"): # ignore __pycache__ - continue - elif sub_folder.endswith(".json"): # box_info.json - continue - - try: - upload = importlib.import_module( - "modules.{}.{}.upload".format(folder, sub_folder) - ) - upload.upload() - except ImportError as e: - # print(e) - pass - else: - # apps - try: - upload = importlib.import_module( - "modules.{}.upload".format(folder) - ) - upload.upload() - except ImportError as e: - # print(e) - pass - - print("Done!") - - -def create_module(modulename, base_path=None): - """ - creates module with the structure defined in the modules section in docs - - Parameters - ---------- - modulename: str - name of module, in alphanumeric-underscore - - Returns - ------- - None - - - """ - - if bool(re.match(r"^[A-Za-z0-9_]+$", modulename)) is False: - print( - "Error: modulename is not valid, please use alphanumeric\ - and underscore only" - ) - sys.exit() - print(f"creating module: {modulename}") - if not base_path: - base_path = f"modules/{modulename}" - trymkdir(base_path) - trymkdir(f"{base_path}/templates") - trymkdir(f"{base_path}/templates/{modulename}") - trymkdir(f"{base_path}/tests") - trymkdir(f"{base_path}/static") - test_func_content = """ -Please add your functional tests to this file. -""" - test_model_content = """ -Please add your models tests to this file. -""" - trymkfile( - f"{base_path}/tests/test_{modulename}_functional.py", test_func_content - ) - trymkfile( - f"{base_path}/tests/test_{modulename}_models.py", test_model_content - ) - view_content = """ -from shopyoapi.module import ModuleHelp -# from flask import render_template -# from flask import url_for -# from flask import redirect -# from flask import flash -# from flask import request - -# from shopyoapi.html import notify_success -# from shopyoapi.forms import flash_errors - -mhelp = ModuleHelp(__file__, __name__) -globals()[mhelp.blueprint_str] = mhelp.blueprint -module_blueprint = globals()[mhelp.blueprint_str] - -@module_blueprint.route("/") -def index(): - return mhelp.info['display_string'] - -# If "dashboard": "/dashboard" is set in info.json -# -# @module_blueprint.route("/dashboard", methods=["GET"]) -# def dashboard(): - -# context = mhelp.context() - -# context.update({ - -# }) -# return mhelp.render('dashboard.html', **context) -""" - trymkfile(f"{base_path}/view.py", view_content) - trymkfile(f"{base_path}/forms.py", "") - trymkfile(f"{base_path}/models.py", "") - info_json_content = """{{ - "display_string": "{0}", - "module_name":"{1}", - "type": "show", - "fa-icon": "fa fa-store", - "url_prefix": "/{1}", - "author": {{ - "name":"", - "website":"", - "mail":"" - }} -}}""".format( - modulename.capitalize(), modulename - ) - trymkfile(f"{base_path}/info.json", info_json_content) - - trymkdir(f"{base_path}/templates/{modulename}/blocks") - trymkfile(f"{base_path}/templates/{modulename}/blocks/sidebar.html", "") - dashboard_file_content = """ -{% extends "base/module_base.html" %} -{% set active_page = info['display_string']+' dashboard' %} -{% block pagehead %} - - -{% endblock %} -{% block sidebar %} -{% include info['module_name']+'/blocks/sidebar.html' %} -{% endblock %} -{% block content %} -
- -
-
- -
-
-{% endblock %} -""" - trymkfile( - f"{base_path}/templates/{modulename}/dashboard.html", - dashboard_file_content, - ) - global_file_content = """ -available_everywhere = { - -} -""" - trymkfile(f"{base_path}/global.py", global_file_content) - - -def create_box(name): - """ - creates box with box_info.json - - Parameters - ---------- - name: str - name of box, in alphanumeric-underscore - - Returns - ------- - None - - - """ - base_path = f"modules/box__{name}" - if os.path.exists(base_path): - print(f"Box {base_path} exists!") - else: - trymkdir(base_path) - info_json_content = """{{ - "display_string": "{0}", - "box_name":"{1}", - "author": {{ - "name":"", - "website":"", - "mail":"" - }} - }}""".format( - name.capitalize(), name - ) - trymkfile(f"{base_path}/box_info.json", info_json_content) - - -def create_module_in_box(modulename, boxname): - """ - creates module with the structure defined in the modules section in docs in - a box - - Parameters - ---------- - modulename: str - name of module, in alphanumeric-underscore - - boxname: str - name of box, in alphanumeric-underscore - - Returns - ------- - None - - - """ - box_path = os.path.join("modules", boxname) - module_path = os.path.join("modules", boxname, modulename) - - if not boxname.startswith("box__"): - print(f"Invalid box {boxname}. Boxes should start with box__") - - elif not os.path.exists(box_path): - print(f"Box {box_path} does not exists!") - available_boxes = "\n* ".join( - [f for f in os.listdir("modules/") if f.startswith("box__")] - ) - print(f"Available boxes: \n* {available_boxes}") - - elif os.path.exists(module_path): - print(f"Module {module_path} exists") - - else: - print(f"Creating module {module_path}") - create_module(modulename, base_path=module_path) - - -def collectstatic(target_module=None): - """ - Copies module/static into /static/modules/module - in static it becomes like - static/ - modules/ - box_something/ - modulename - modulename2 - - Parameters - ---------- - target_module: str - name of module, in alphanumeric-underscore, - supports module or box__name/module - - Returns - ------- - None - - - """ - modules_path_in_static = os.path.join(static_path, "modules") - - if target_module is None: - # clear modules dir if exists. - tryrmtree(modules_path_in_static) - # look for static folders in all project - for folder in get_folders(modules_path): - if folder.startswith("box__"): - box_path = os.path.join(modules_path, folder) - for subfolder in get_folders(box_path): - module_name = subfolder - module_static_folder = os.path.join( - box_path, subfolder, "static" - ) - if not os.path.exists(module_static_folder): - continue - module_in_static_dir = os.path.join( - modules_path_in_static, folder, module_name - ) - trycopytree(module_static_folder, module_in_static_dir) - else: - module_name = folder - module_static_folder = os.path.join( - modules_path, folder, "static" - ) - if not os.path.exists(module_static_folder): - continue - module_in_static_dir = os.path.join( - modules_path_in_static, module_name - ) - trycopytree(module_static_folder, module_in_static_dir) - else: - # copy only module's static folder - module_static_folder = os.path.join( - modules_path, target_module, "static" - ) - if os.path.exists(module_static_folder): - if target_module.startswith("box__"): - if "/" in target_module: - module_name = target_module.split("/")[1] - else: - print("Could not understand module name") - sys.exit() - else: - module_name = target_module - module_in_static_dir = os.path.join( - modules_path_in_static, module_name - ) - tryrmtree(module_in_static_dir) - trycopytree(module_static_folder, module_in_static_dir) - else: - print("Module does not exist") diff --git a/shopyo/shopyoapi/cmd_helper.py b/shopyo/shopyoapi/cmd_helper.py deleted file mode 100644 index d5c854f..0000000 --- a/shopyo/shopyoapi/cmd_helper.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -Helper utility functions for commandline api -""" -import sys -import os -from shutil import rmtree - - -def tryrmcache(dir_name): - """ - removes all __pycache__ starting from directory dir_name - all the way to leaf directory - - Args: - dir_name(string) : path from where to start removing pycache - """ - directory_list = list() - is_removed = False - for root, dirs, files in os.walk(dir_name, topdown=False): - for name in dirs: - directory_list.append(os.path.join(root, name)) - if name == "__pycache__": - rmtree(os.path.join(root, name)) - is_removed = True - - if is_removed: - print("[x] __pycache__ successfully deleted") - else: - print("[ ] __pycache__ doesn't exist", file=sys.stderr) - - return is_removed - - -def tryrmfile(path): - """ - tries to remove file path and output message to stdin or stderr. - Path must point to a file - - Args: - path (string): path of the file to remove - - Returns: - bool: returns true upon successful removal false otherwise - """ - try: - os.remove(path) - print(f"[x] file '{path}' successfully deleted") - return True - except OSError as e: - print( - "[ ] unable to delete %s: %s." % (e.filename, e.strerror), - file=sys.stderr, - ) - return False - - -def tryrmtree(path): - """ - Tries to removes an entire directory tree. Path must point to - a directory. Outputs message to stdin or stderr - - Args: - path (string): directory path to be removed - - Returns: - bool: returns true upon successful return false otherwise - """ - try: - rmtree(path) - print(f"[x] folder '{path}' successfully deleted") - return True - except OSError as e: - print( - "[ ] unable to delete %s: %s." % (e.filename, e.strerror), - file=sys.stderr, - ) - return False diff --git a/shopyo/shopyoapi/database.py b/shopyo/shopyoapi/database.py deleted file mode 100644 index 0c6a9a2..0000000 --- a/shopyo/shopyoapi/database.py +++ /dev/null @@ -1,38 +0,0 @@ -import importlib -import os - - -def autoload_models(): - """ - Auto imports models from modules/ in desired file. Used so that - flask_migrate does not miss models when migrating - - Returns - ------- - None - """ - print("Auto importing models") - for folder in os.listdir("modules"): - if folder.startswith("__"): - continue - elif folder.startswith("box__"): - for sub_folder in os.listdir(os.path.join("modules", folder)): - if sub_folder.startswith("__"): # ignore __pycache__ - continue - elif sub_folder.endswith(".json"): # box_info.json - continue - try: - to_load_submodel = "modules.{}.{}.models".format( - folder, sub_folder - ) - importlib.import_module(to_load_submodel) - print("[x]", "imported", to_load_submodel) - except Exception as e: - print("[ ]", e) - else: - try: - to_load = "modules.{}.models".format(folder) - importlib.import_module(to_load) - print("[x]", "imported", to_load) - except Exception as e: - print("[ ]", e) diff --git a/shopyo/shopyoapi/email.py b/shopyo/shopyoapi/email.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/shopyoapi/forms.py b/shopyo/shopyoapi/forms.py deleted file mode 100644 index 9de9f9a..0000000 --- a/shopyo/shopyoapi/forms.py +++ /dev/null @@ -1,26 +0,0 @@ -from flask import flash - -from shopyoapi.html import notify_warning - - -def flash_errors(form): - """ - Auto flash errors from WKHtml forms - Reqwires base module or similar notification - mechanism - - Parameters - ---------- - form: WKHtml form - - Returns - ------- - None - """ - for field, errors in form.errors.items(): - for error in errors: - error_msg = u"Error in the %s field - %s" % ( - getattr(form, field).label.text, - error, - ) - flash(notify_warning(error_msg)) diff --git a/shopyo/shopyoapi/html.py b/shopyo/shopyoapi/html.py deleted file mode 100644 index facaf14..0000000 --- a/shopyo/shopyoapi/html.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -Used on flash -flash(notify_success('mail sent!')) -""" - - -def notify(message, alert_type="primary", fading=False): - """ - Used with flash - flash(notify('blabla')) - - Parameters - ---------- - message: str - message to be displayed - - alert_type: str - bootstrap class - - Returns - ------- - None - """ - alert = """ - - """.format( - message=message, alert_type=alert_type - ) - - scriptFade = """ - - """ - - if fading: - return alert + scriptFade - else: - return alert - - -def notify_success(message): - return notify(message, alert_type="success") - - -def notify_danger(message): - return notify(message, alert_type="danger") - - -def notify_warning(message): - return notify(message, alert_type="warning") - - -def notify_info(message): - return notify(message, alert_type="info") diff --git a/shopyo/shopyoapi/init.py b/shopyo/shopyoapi/init.py deleted file mode 100644 index e720f57..0000000 --- a/shopyo/shopyoapi/init.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -All initialisations like db = SQLAlchemy in this file -""" - -from flask_login import LoginManager -from flask_marshmallow import Marshmallow -from flask_migrate import Migrate -from flask_sqlalchemy import SQLAlchemy -from flask_uploads import IMAGES -from flask_uploads import UploadSet - -db = SQLAlchemy() -ma = Marshmallow() -login_manager = LoginManager() -migrate = Migrate() - -productphotos = UploadSet("productphotos", IMAGES) -categoryphotos = UploadSet("categoryphotos", IMAGES) -subcategoryphotos = UploadSet("subcategoryphotos", IMAGES) diff --git a/shopyo/shopyoapi/models.py b/shopyo/shopyoapi/models.py deleted file mode 100644 index 7003904..0000000 --- a/shopyo/shopyoapi/models.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -DB-related helper utilities. Taken from database.py -file at https://github.com/cookiecutter-flask/cookiecutter-flask -""" -from shopyoapi.init import db - - -class CRUDMixin: - """ - Mixin that adds convenience methods for - CRUD (create, read, update, delete) operations. - """ - - @classmethod - def create(cls, **kwargs): - """Create a new record and save it in the database. - - Returns: - DB Class Object: returns the created record - """ - instance = cls(**kwargs) - return instance.save() - - def update(self, commit=True, **kwargs): - """Update specific fields of a record - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the updated record if committed, - None otherwise - """ - for attr, value in kwargs.items(): - setattr(self, attr, value) - if commit: - self.save() - return self - return None - - def save(self, commit=True): - """Save the record. - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the record saved to db session - """ - db.session.add(self) - if commit: - db.session.commit() - return self - - def delete(self, commit=True): - """Remove the record from the database. - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the updated record if committed, - None otherwise - """ - db.session.delete(self) - if commit: - db.session.commit() - return self - return None - - -class YoModel(CRUDMixin, db.Model): - """Base model class that includes CRUD convenience methods.""" - - __abstract__ = True - - -class PkModel(YoModel): - """ - Base model class that includes CRUD convenience methods, - plus adds a 'primary key' column named 'id'. - """ - - __abstract__ = True - id = db.Column(db.Integer, primary_key=True) - - @classmethod - def get_by_id(cls, record_id): - """Get record by ID. - - Args: - record_id (int): ID of record to get - - Returns: - DB Class object: object identified by record_id if any, - None otherwise - """ - if any( - ( - isinstance(record_id, (str, bytes)) and record_id.isdigit(), - isinstance(record_id, (int, float)), - ) - ): - return cls.query.get(int(record_id)) - return None diff --git a/shopyo/shopyoapi/module.py b/shopyo/shopyoapi/module.py deleted file mode 100644 index f506285..0000000 --- a/shopyo/shopyoapi/module.py +++ /dev/null @@ -1,64 +0,0 @@ -import copy -import json -import os - -from flask import Blueprint -from flask import redirect -from flask import render_template -from flask import url_for - -from shopyoapi.assets import get_static - - -class ModuleHelp: - def __init__(self, dunderfile, dundername): - self.dirpath = os.path.dirname(os.path.abspath(dunderfile)) - self.info = {} - self._context = {} - - with open(self.dirpath + "/info.json") as f: - self.info = json.load(f) - - self.blueprint_str = "{}_blueprint".format(self.info["module_name"]) - self.blueprint = Blueprint( - "{}".format(self.info["module_name"]), - dundername, - template_folder="templates", - url_prefix=self.info["url_prefix"], - ) - - self._context.update({"info": self.info}) - - def render(self, filename, **kwargs): - """ - .render('file.html') renders file.html found in module/templates/module/file.html - """ - return render_template( - "{}/{}".format(self.info["module_name"], filename), **kwargs - ) - - def redirect_url(self, url, **kwargs): - return redirect(url_for(url, **kwargs)) - - def context(self): - return copy.deepcopy(self._context) - - def method(self, methodname): - return "{}.{}".format(self.info["module_name"], methodname) - - def get_self_static(self, filename): - module_parent = os.path.dirname(self.dirpath) - module_folder = self.dirpath - - module_parent = os.path.normpath(module_parent) - module_parent = os.path.basename(module_parent) - - module_folder = os.path.normpath(module_folder) - module_folder = os.path.basename(module_folder) - - print(module_parent, module_parent) - if module_parent.startswith('box__'): - boxormodule = '{}/{}'.format(module_parent, module_folder) - else: - boxormodule = module_folder - return get_static(boxormodule=boxormodule, filename=filename) \ No newline at end of file diff --git a/shopyo/shopyoapi/path.py b/shopyo/shopyoapi/path.py deleted file mode 100644 index 0575a4a..0000000 --- a/shopyo/shopyoapi/path.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -shopyoapi_path = os.path.dirname(os.path.abspath(__file__)) -root_path = os.path.dirname(shopyoapi_path) -static_path = os.path.join(root_path, "static") -modules_path = os.path.join(root_path, "modules") -themes_path = os.path.join(static_path, "themes") diff --git a/shopyo/shopyoapi/security.py b/shopyo/shopyoapi/security.py deleted file mode 100644 index 0dddaa8..0000000 --- a/shopyo/shopyoapi/security.py +++ /dev/null @@ -1,24 +0,0 @@ -from flask import request, g, redirect -from urllib.parse import urlparse, urljoin - - -# from https://security.openstack.org/guidelines/dg_avoid-unvalidated-redirects.html -def is_safe_redirect_url(target): - host_url = urlparse(request.host_url) - redirect_url = urlparse(urljoin(request.host_url, target)) - return ( - redirect_url.scheme in ("http", "https") - and host_url.netloc == redirect_url.netloc - ) - - -def get_safe_redirect(url): - - if url and is_safe_redirect_url(url): - return url - - url = request.referrer - if url and is_safe_redirect_url(url): - return url - - return "/" diff --git a/shopyo/shopyoapi/tests/__init__.py b/shopyo/shopyoapi/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/shopyo/static/bootstrap-grid.min.css b/shopyo/static/bootstrap-grid.min.css deleted file mode 100644 index ea073e9..0000000 --- a/shopyo/static/bootstrap-grid.min.css +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap Grid v4.0.0 (https://getbootstrap.com) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */@-ms-viewport{width:device-width}html{box-sizing:border-box;-ms-overflow-style:scrollbar}*,::after,::before{box-sizing:inherit}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}} -/*# sourceMappingURL=bootstrap-grid.min.css.map */ \ No newline at end of file diff --git a/shopyo/static/bootstrap-reboot.min.css b/shopyo/static/bootstrap-reboot.min.css deleted file mode 100644 index ced0468..0000000 --- a/shopyo/static/bootstrap-reboot.min.css +++ /dev/null @@ -1,8 +0,0 @@ -/*! - * Bootstrap Reboot v4.0.0 (https://getbootstrap.com) - * Copyright 2011-2018 The Bootstrap Authors - * Copyright 2011-2018 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) - */*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto;-ms-overflow-style:scrollbar}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important} -/*# sourceMappingURL=bootstrap-reboot.min.css.map */ \ No newline at end of file diff --git a/shopyo/static/bootstrap.bundle.min.js b/shopyo/static/bootstrap.bundle.min.js deleted file mode 100644 index 4320368..0000000 --- a/shopyo/static/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v4.3.1 (https://getbootstrap.com/) - * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],e):e((t=t||self).bootstrap={},t.jQuery)}(this,function(t,p){"use strict";function i(t,e){for(var n=0;nthis._items.length-1||t<0))if(this._isSliding)p(this._element).one(q.SLID,function(){return e.to(t)});else{if(n===t)return this.pause(),void this.cycle();var i=n=i.clientWidth&&n>=i.clientHeight}),h=0l[t]&&!i.escapeWithReference&&(n=Math.min(h[e],l[t]-("right"===t?h.width:h.height))),Kt({},e,n)}};return c.forEach(function(t){var e=-1!==["left","top"].indexOf(t)?"primary":"secondary";h=Qt({},h,u[e](t))}),t.offsets.popper=h,t},priority:["left","right","top","bottom"],padding:5,boundariesElement:"scrollParent"},keepTogether:{order:400,enabled:!0,fn:function(t){var e=t.offsets,n=e.popper,i=e.reference,o=t.placement.split("-")[0],r=Math.floor,s=-1!==["top","bottom"].indexOf(o),a=s?"right":"bottom",l=s?"left":"top",c=s?"width":"height";return n[a]r(i[a])&&(t.offsets.popper[l]=r(i[a])),t}},arrow:{order:500,enabled:!0,fn:function(t,e){var n;if(!fe(t.instance.modifiers,"arrow","keepTogether"))return t;var i=e.element;if("string"==typeof i){if(!(i=t.instance.popper.querySelector(i)))return t}else if(!t.instance.popper.contains(i))return console.warn("WARNING: `arrow.element` must be child of its popper element!"),t;var o=t.placement.split("-")[0],r=t.offsets,s=r.popper,a=r.reference,l=-1!==["left","right"].indexOf(o),c=l?"height":"width",h=l?"Top":"Left",u=h.toLowerCase(),f=l?"left":"top",d=l?"bottom":"right",p=Zt(i)[c];a[d]-ps[d]&&(t.offsets.popper[u]+=a[u]+p-s[d]),t.offsets.popper=Vt(t.offsets.popper);var m=a[u]+a[c]/2-p/2,g=Nt(t.instance.popper),_=parseFloat(g["margin"+h],10),v=parseFloat(g["border"+h+"Width"],10),y=m-t.offsets.popper[u]-_-v;return y=Math.max(Math.min(s[c]-p,y),0),t.arrowElement=i,t.offsets.arrow=(Kt(n={},u,Math.round(y)),Kt(n,f,""),n),t},element:"[x-arrow]"},flip:{order:600,enabled:!0,fn:function(p,m){if(oe(p.instance.modifiers,"inner"))return p;if(p.flipped&&p.placement===p.originalPlacement)return p;var g=Gt(p.instance.popper,p.instance.reference,m.padding,m.boundariesElement,p.positionFixed),_=p.placement.split("-")[0],v=te(_),y=p.placement.split("-")[1]||"",E=[];switch(m.behavior){case ge:E=[_,v];break;case _e:E=me(_);break;case ve:E=me(_,!0);break;default:E=m.behavior}return E.forEach(function(t,e){if(_!==t||E.length===e+1)return p;_=p.placement.split("-")[0],v=te(_);var n,i=p.offsets.popper,o=p.offsets.reference,r=Math.floor,s="left"===_&&r(i.right)>r(o.left)||"right"===_&&r(i.left)r(o.top)||"bottom"===_&&r(i.top)r(g.right),c=r(i.top)r(g.bottom),u="left"===_&&a||"right"===_&&l||"top"===_&&c||"bottom"===_&&h,f=-1!==["top","bottom"].indexOf(_),d=!!m.flipVariations&&(f&&"start"===y&&a||f&&"end"===y&&l||!f&&"start"===y&&c||!f&&"end"===y&&h);(s||u||d)&&(p.flipped=!0,(s||u)&&(_=E[e+1]),d&&(y="end"===(n=y)?"start":"start"===n?"end":n),p.placement=_+(y?"-"+y:""),p.offsets.popper=Qt({},p.offsets.popper,ee(p.instance.popper,p.offsets.reference,p.placement)),p=ie(p.instance.modifiers,p,"flip"))}),p},behavior:"flip",padding:5,boundariesElement:"viewport"},inner:{order:700,enabled:!1,fn:function(t){var e=t.placement,n=e.split("-")[0],i=t.offsets,o=i.popper,r=i.reference,s=-1!==["left","right"].indexOf(n),a=-1===["top","left"].indexOf(n);return o[s?"left":"top"]=r[n]-(a?o[s?"width":"height"]:0),t.placement=te(e),t.offsets.popper=Vt(o),t}},hide:{order:800,enabled:!0,fn:function(t){if(!fe(t.instance.modifiers,"hide","preventOverflow"))return t;var e=t.offsets.reference,n=ne(t.instance.modifiers,function(t){return"preventOverflow"===t.name}).boundaries;if(e.bottomn.right||e.top>n.bottom||e.rightdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},t._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},t._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",sanitize:!0,sanitizeFn:null,whiteList:vn},Ln="show",xn="out",Pn={HIDE:"hide"+Tn,HIDDEN:"hidden"+Tn,SHOW:"show"+Tn,SHOWN:"shown"+Tn,INSERTED:"inserted"+Tn,CLICK:"click"+Tn,FOCUSIN:"focusin"+Tn,FOCUSOUT:"focusout"+Tn,MOUSEENTER:"mouseenter"+Tn,MOUSELEAVE:"mouseleave"+Tn},Hn="fade",jn="show",Rn=".tooltip-inner",Fn=".arrow",Mn="hover",Wn="focus",Un="click",Bn="manual",qn=function(){function i(t,e){if("undefined"==typeof be)throw new TypeError("Bootstrap's tooltips require Popper.js (https://popper.js.org/)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var t=i.prototype;return t.enable=function(){this._isEnabled=!0},t.disable=function(){this._isEnabled=!1},t.toggleEnabled=function(){this._isEnabled=!this._isEnabled},t.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p(this.getTipElement()).hasClass(jn))return void this._leave(null,this);this._enter(null,this)}},t.dispose=function(){clearTimeout(this._timeout),p.removeData(this.element,this.constructor.DATA_KEY),p(this.element).off(this.constructor.EVENT_KEY),p(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&p(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,(this._activeTrigger=null)!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},t.show=function(){var e=this;if("none"===p(this.element).css("display"))throw new Error("Please use show on visible elements");var t=p.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p(this.element).trigger(t);var n=m.findShadowRoot(this.element),i=p.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(t.isDefaultPrevented()||!i)return;var o=this.getTipElement(),r=m.getUID(this.constructor.NAME);o.setAttribute("id",r),this.element.setAttribute("aria-describedby",r),this.setContent(),this.config.animation&&p(o).addClass(Hn);var s="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,a=this._getAttachment(s);this.addAttachmentClass(a);var l=this._getContainer();p(o).data(this.constructor.DATA_KEY,this),p.contains(this.element.ownerDocument.documentElement,this.tip)||p(o).appendTo(l),p(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new be(this.element,o,{placement:a,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:Fn},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}}),p(o).addClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().on("mouseover",null,p.noop);var c=function(){e.config.animation&&e._fixTransition();var t=e._hoverState;e._hoverState=null,p(e.element).trigger(e.constructor.Event.SHOWN),t===xn&&e._leave(null,e)};if(p(this.tip).hasClass(Hn)){var h=m.getTransitionDurationFromElement(this.tip);p(this.tip).one(m.TRANSITION_END,c).emulateTransitionEnd(h)}else c()}},t.hide=function(t){var e=this,n=this.getTipElement(),i=p.Event(this.constructor.Event.HIDE),o=function(){e._hoverState!==Ln&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p(this.element).trigger(i),!i.isDefaultPrevented()){if(p(n).removeClass(jn),"ontouchstart"in document.documentElement&&p(document.body).children().off("mouseover",null,p.noop),this._activeTrigger[Un]=!1,this._activeTrigger[Wn]=!1,this._activeTrigger[Mn]=!1,p(this.tip).hasClass(Hn)){var r=m.getTransitionDurationFromElement(n);p(n).one(m.TRANSITION_END,o).emulateTransitionEnd(r)}else o();this._hoverState=""}},t.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},t.isWithContent=function(){return Boolean(this.getTitle())},t.addAttachmentClass=function(t){p(this.getTipElement()).addClass(Dn+"-"+t)},t.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},t.setContent=function(){var t=this.getTipElement();this.setElementContent(p(t.querySelectorAll(Rn)),this.getTitle()),p(t).removeClass(Hn+" "+jn)},t.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=bn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p(e).parent().is(t)||t.empty().append(e):t.text(p(e).text())},t.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},t._getOffset=function(){var e=this,t={};return"function"==typeof this.config.offset?t.fn=function(t){return t.offsets=l({},t.offsets,e.config.offset(t.offsets,e.element)||{}),t}:t.offset=this.config.offset,t},t._getContainer=function(){return!1===this.config.container?document.body:m.isElement(this.config.container)?p(this.config.container):p(document).find(this.config.container)},t._getAttachment=function(t){return Nn[t.toUpperCase()]},t._setListeners=function(){var i=this;this.config.trigger.split(" ").forEach(function(t){if("click"===t)p(i.element).on(i.constructor.Event.CLICK,i.config.selector,function(t){return i.toggle(t)});else if(t!==Bn){var e=t===Mn?i.constructor.Event.MOUSEENTER:i.constructor.Event.FOCUSIN,n=t===Mn?i.constructor.Event.MOUSELEAVE:i.constructor.Event.FOCUSOUT;p(i.element).on(e,i.config.selector,function(t){return i._enter(t)}).on(n,i.config.selector,function(t){return i._leave(t)})}}),p(this.element).closest(".modal").on("hide.bs.modal",function(){i.element&&i.hide()}),this.config.selector?this.config=l({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},t._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},t._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Wn:Mn]=!0),p(e.getTipElement()).hasClass(jn)||e._hoverState===Ln?e._hoverState=Ln:(clearTimeout(e._timeout),e._hoverState=Ln,e.config.delay&&e.config.delay.show?e._timeout=setTimeout(function(){e._hoverState===Ln&&e.show()},e.config.delay.show):e.show())},t._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Wn:Mn]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=xn,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout(function(){e._hoverState===xn&&e.hide()},e.config.delay.hide):e.hide())},t._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},t._getConfig=function(t){var e=p(this.element).data();return Object.keys(e).forEach(function(t){-1!==An.indexOf(t)&&delete e[t]}),"number"==typeof(t=l({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),m.typeCheckConfig(wn,t,this.constructor.DefaultType),t.sanitize&&(t.template=bn(t.template,t.whiteList,t.sanitizeFn)),t},t._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},t._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(In);null!==e&&e.length&&t.removeClass(e.join(""))},t._handlePopperPlacementChange=function(t){var e=t.instance;this.tip=e.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},t._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p(t).removeClass(Hn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},i._jQueryInterface=function(n){return this.each(function(){var t=p(this).data(Cn),e="object"==typeof n&&n;if((t||!/dispose|hide/.test(n))&&(t||(t=new i(this,e),p(this).data(Cn,t)),"string"==typeof n)){if("undefined"==typeof t[n])throw new TypeError('No method named "'+n+'"');t[n]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.3.1"}},{key:"Default",get:function(){return kn}},{key:"NAME",get:function(){return wn}},{key:"DATA_KEY",get:function(){return Cn}},{key:"Event",get:function(){return Pn}},{key:"EVENT_KEY",get:function(){return Tn}},{key:"DefaultType",get:function(){return On}}]),i}();p.fn[wn]=qn._jQueryInterface,p.fn[wn].Constructor=qn,p.fn[wn].noConflict=function(){return p.fn[wn]=Sn,qn._jQueryInterface};var Kn="popover",Qn="bs.popover",Vn="."+Qn,Yn=p.fn[Kn],zn="bs-popover",Xn=new RegExp("(^|\\s)"+zn+"\\S+","g"),Gn=l({},qn.Default,{placement:"right",trigger:"click",content:"",template:''}),$n=l({},qn.DefaultType,{content:"(string|element|function)"}),Jn="fade",Zn="show",ti=".popover-header",ei=".popover-body",ni={HIDE:"hide"+Vn,HIDDEN:"hidden"+Vn,SHOW:"show"+Vn,SHOWN:"shown"+Vn,INSERTED:"inserted"+Vn,CLICK:"click"+Vn,FOCUSIN:"focusin"+Vn,FOCUSOUT:"focusout"+Vn,MOUSEENTER:"mouseenter"+Vn,MOUSELEAVE:"mouseleave"+Vn},ii=function(t){var e,n;function i(){return t.apply(this,arguments)||this}n=t,(e=i).prototype=Object.create(n.prototype),(e.prototype.constructor=e).__proto__=n;var o=i.prototype;return o.isWithContent=function(){return this.getTitle()||this._getContent()},o.addAttachmentClass=function(t){p(this.getTipElement()).addClass(zn+"-"+t)},o.getTipElement=function(){return this.tip=this.tip||p(this.config.template)[0],this.tip},o.setContent=function(){var t=p(this.getTipElement());this.setElementContent(t.find(ti),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(ei),e),t.removeClass(Jn+" "+Zn)},o._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},o._cleanTipClass=function(){var t=p(this.getTipElement()),e=t.attr("class").match(Xn);null!==e&&0=this._offsets[o]&&("undefined"==typeof this._offsets[o+1]||tcode{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;font-size:87.5%;color:#212529}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-1{margin-left:8.333333%}.offset-2{margin-left:16.666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.333333%}.offset-5{margin-left:41.666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.333333%}.offset-8{margin-left:66.666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.333333%}.offset-11{margin-left:91.666667%}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-sm-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-sm-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-sm-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-sm-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-sm-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-sm-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-sm-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-sm-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-sm-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-sm-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-sm-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-sm-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-sm-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-sm-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.333333%}.offset-sm-2{margin-left:16.666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.333333%}.offset-sm-5{margin-left:41.666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.333333%}.offset-sm-8{margin-left:66.666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.333333%}.offset-sm-11{margin-left:91.666667%}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-md-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-md-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-md-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-md-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-md-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-md-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-md-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-md-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-md-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-md-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-md-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-md-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-md-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-md-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.333333%}.offset-md-2{margin-left:16.666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.333333%}.offset-md-5{margin-left:41.666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.333333%}.offset-md-8{margin-left:66.666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.333333%}.offset-md-11{margin-left:91.666667%}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-lg-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-lg-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-lg-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-lg-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-lg-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-lg-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-lg-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-lg-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-lg-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-lg-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-lg-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-lg-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-lg-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-lg-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.333333%}.offset-lg-2{margin-left:16.666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.333333%}.offset-lg-5{margin-left:41.666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.333333%}.offset-lg-8{margin-left:66.666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.333333%}.offset-lg-11{margin-left:91.666667%}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-webkit-box-flex:0;-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-webkit-box-flex:0;-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-webkit-box-flex:0;-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-webkit-box-flex:0;-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-webkit-box-flex:0;-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-webkit-box-flex:0;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-webkit-box-flex:0;-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-webkit-box-flex:0;-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-webkit-box-flex:0;-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-webkit-box-flex:0;-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-webkit-box-flex:0;-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-webkit-box-flex:0;-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-first{-webkit-box-ordinal-group:0;-ms-flex-order:-1;order:-1}.order-xl-last{-webkit-box-ordinal-group:14;-ms-flex-order:13;order:13}.order-xl-0{-webkit-box-ordinal-group:1;-ms-flex-order:0;order:0}.order-xl-1{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1}.order-xl-2{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2}.order-xl-3{-webkit-box-ordinal-group:4;-ms-flex-order:3;order:3}.order-xl-4{-webkit-box-ordinal-group:5;-ms-flex-order:4;order:4}.order-xl-5{-webkit-box-ordinal-group:6;-ms-flex-order:5;order:5}.order-xl-6{-webkit-box-ordinal-group:7;-ms-flex-order:6;order:6}.order-xl-7{-webkit-box-ordinal-group:8;-ms-flex-order:7;order:7}.order-xl-8{-webkit-box-ordinal-group:9;-ms-flex-order:8;order:8}.order-xl-9{-webkit-box-ordinal-group:10;-ms-flex-order:9;order:9}.order-xl-10{-webkit-box-ordinal-group:11;-ms-flex-order:10;order:10}.order-xl-11{-webkit-box-ordinal-group:12;-ms-flex-order:11;order:11}.order-xl-12{-webkit-box-ordinal-group:13;-ms-flex-order:12;order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.333333%}.offset-xl-2{margin-left:16.666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.333333%}.offset-xl-5{margin-left:41.666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.333333%}.offset-xl-8{margin-left:66.666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.333333%}.offset-xl-11{margin-left:91.666667%}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody{border-top:2px solid #dee2e6}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #dee2e6}.table-bordered td,.table-bordered th{border:1px solid #dee2e6}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#d6d8db}.table-hover .table-secondary:hover{background-color:#c8cbcf}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#c8cbcf}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th{color:#fff;background-color:#212529;border-color:#32383e}.table .thead-light th{color:#495057;background-color:#e9ecef;border-color:#dee2e6}.table-dark{color:#fff;background-color:#212529}.table-dark td,.table-dark th,.table-dark thead th{border-color:#32383e}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-dark.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:575.98px){.table-responsive-sm{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:767.98px){.table-responsive-md{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-md>.table-bordered{border:0}}@media (max-width:991.98px){.table-responsive-lg{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:1199.98px){.table-responsive-xl{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive>.table-bordered{border:0}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.form-control::-webkit-input-placeholder{color:#6c757d;opacity:1}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control:-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::-ms-input-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block;width:100%}.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;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding-top:.375rem;padding-bottom:.375rem;margin-bottom:0;line-height:1.5;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.input-group-append>.form-control-plaintext.btn,.input-group-lg>.input-group-append>.form-control-plaintext.input-group-text,.input-group-lg>.input-group-prepend>.form-control-plaintext.btn,.input-group-lg>.input-group-prepend>.form-control-plaintext.input-group-text,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.input-group-append>.form-control-plaintext.btn,.input-group-sm>.input-group-append>.form-control-plaintext.input-group-text,.input-group-sm>.input-group-prepend>.form-control-plaintext.btn,.input-group-sm>.input-group-prepend>.form-control-plaintext.input-group-text{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-sm>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-append>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-append>select.input-group-text:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.btn:not([size]):not([multiple]),.input-group-lg>.input-group-prepend>select.input-group-text:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.875rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;padding-left:1.25rem}.form-check-input{position:absolute;margin-top:.3rem;margin-left:-1.25rem}.form-check-input:disabled~.form-check-label{color:#6c757d}.form-check-label{margin-bottom:0}.form-check-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#28a745}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(40,167,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{border-color:#28a745;box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.valid-feedback,.custom-select.is-valid~.valid-tooltip,.form-control.is-valid~.valid-feedback,.form-control.is-valid~.valid-tooltip,.was-validated .custom-select:valid~.valid-feedback,.was-validated .custom-select:valid~.valid-tooltip,.was-validated .form-control:valid~.valid-feedback,.was-validated .form-control:valid~.valid-tooltip{display:block}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#28a745}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#28a745}.custom-control-input.is-valid~.custom-control-label::before,.was-validated .custom-control-input:valid~.custom-control-label::before{background-color:#71dd8a}.custom-control-input.is-valid~.valid-feedback,.custom-control-input.is-valid~.valid-tooltip,.was-validated .custom-control-input:valid~.valid-feedback,.was-validated .custom-control-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid:checked~.custom-control-label::before,.was-validated .custom-control-input:valid:checked~.custom-control-label::before{background-color:#34ce57}.custom-control-input.is-valid:focus~.custom-control-label::before,.was-validated .custom-control-input:valid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(40,167,69,.25)}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#28a745}.custom-file-input.is-valid~.custom-file-label::before,.was-validated .custom-file-input:valid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-valid~.valid-feedback,.custom-file-input.is-valid~.valid-tooltip,.was-validated .custom-file-input:valid~.valid-feedback,.was-validated .custom-file-input:valid~.valid-tooltip{display:block}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-label::before,.was-validated .custom-control-input:invalid~.custom-control-label::before{background-color:#efa2a9}.custom-control-input.is-invalid~.invalid-feedback,.custom-control-input.is-invalid~.invalid-tooltip,.was-validated .custom-control-input:invalid~.invalid-feedback,.was-validated .custom-control-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid:checked~.custom-control-label::before,.was-validated .custom-control-input:invalid:checked~.custom-control-label::before{background-color:#e4606d}.custom-control-input.is-invalid:focus~.custom-control-label::before,.was-validated .custom-control-input:invalid:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(220,53,69,.25)}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-label::before,.was-validated .custom-file-input:invalid~.custom-file-label::before{border-color:inherit}.custom-file-input.is-invalid~.invalid-feedback,.custom-file-input.is-invalid~.invalid-tooltip,.was-validated .custom-file-input:invalid~.invalid-feedback,.was-validated .custom-file-input:invalid~.invalid-tooltip{display:block}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-check{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled).active,.btn:not(:disabled):not(.disabled):active{background-image:none}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0062cc;border-color:#005cbf}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5a6268;border-color:#545b62}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#545b62;border-color:#4e555b}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#1e7e34;border-color:#1c7430}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#117a8b;border-color:#10707f}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-warning{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#212529;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{color:#212529;background-color:#d39e00;border-color:#c69500}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#bd2130;border-color:#b21f2d}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-light{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#212529;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{color:#212529;background-color:#dae0e5;border-color:#d3d9df}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1d2124;border-color:#171a1d}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(0,123,255,.5)}.btn-outline-secondary{color:#6c757d;background-color:transparent;background-image:none;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(108,117,125,.5)}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.5)}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(23,162,184,.5)}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{color:#212529;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(255,193,7,.5)}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.5)}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{color:#212529;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(248,249,250,.5)}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(52,58,64,.5)}.btn-link{font-weight:400;color:#007bff;background-color:transparent}.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent;border-color:transparent}.btn-link.focus,.btn-link:focus{text-decoration:underline;border-color:transparent;box-shadow:none}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;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;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 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,.15);border-radius:.25rem}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;width:0;height:0;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}.dropright .dropdown-menu{margin-top:0;margin-left:.125rem}.dropright .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-bottom:.3em solid transparent;border-left:.3em solid}.dropright .dropdown-toggle:empty::after{margin-left:0}.dropright .dropdown-toggle::after{vertical-align:0}.dropleft .dropdown-menu{margin-top:0;margin-right:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;width:0;height:0;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropleft .dropdown-toggle:empty::after{margin-left:0}.dropleft .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#6c757d;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:1}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:1}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group>.custom-file:focus,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control{margin-left:-1px}.input-group>.custom-select:not(:last-child),.input-group>.form-control:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.custom-file{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label::before{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label,.input-group>.custom-file:not(:first-child) .custom-file-label::before{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-append,.input-group-prepend{display:-webkit-box;display:-ms-flexbox;display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-append:not(:last-child)>.btn,.input-group>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-top-right-radius:0;border-bottom-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-top-left-radius:0;border-bottom-left-radius:0}.custom-control{position:relative;display:block;min-height:1.5rem;padding-left:1.5rem}.custom-control-inline{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-label::before{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(0,123,255,.25)}.custom-control-input:active~.custom-control-label::before{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-label{color:#6c757d}.custom-control-input:disabled~.custom-control-label::before{background-color:#e9ecef}.custom-control-label{margin-bottom:0}.custom-control-label::before{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;content:"";-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#dee2e6}.custom-control-label::after{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;content:"";background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{background-color:#007bff}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-radio .custom-control-label::before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label::before{background-color:#007bff}.custom-radio .custom-control-input:checked~.custom-control-label::after{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label::before{background-color:rgba(0,123,255,.5)}.custom-select{display:inline-block;width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid #ced4da;border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 5px rgba(128,189,255,.5)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#6c757d;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-select-lg{height:calc(2.875rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:125%}.custom-file{position:relative;display:inline-block;width:100%;height:calc(2.25rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(2.25rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-control{border-color:#80bdff;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.custom-file-input:focus~.custom-file-control::before{border-color:#80bdff}.custom-file-input:lang(en)~.custom-file-label::after{content:"Browse"}.custom-file-label{position:absolute;top:0;right:0;left:0;z-index:1;height:calc(2.25rem + 2px);padding:.375rem .75rem;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ced4da;border-radius:.25rem}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(calc(2.25rem + 2px) - 1px * 2);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background-color:#e9ecef;border-left:1px solid #ced4da;border-radius:0 .25rem .25rem 0}.nav{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#6c757d}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{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{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;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;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;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}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler:not(:disabled):not(.disabled){cursor:pointer}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .dropup .dropdown-menu{top:auto;bottom:100%}}@media (max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .dropup .dropdown-menu{top:auto;bottom:100%}}.navbar-expand{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row nowrap;flex-flow:row nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .dropup .dropdown-menu{top:auto;bottom:100%}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:first-child .card-header,.card-group>.card:first-child .card-img-top{border-top-right-radius:0}.card-group>.card:first-child .card-footer,.card-group>.card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:last-child .card-header,.card-group>.card:last-child .card-img-top{border-top-left-radius:0}.card-group>.card:last-child .card-footer,.card-group>.card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group>.card:only-child{border-radius:.25rem}.card-group>.card:only-child .card-header,.card-group>.card:only-child .card-img-top{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card-group>.card:only-child .card-footer,.card-group>.card:only-child .card-img-bottom{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-group>.card:not(:first-child):not(:last-child):not(:only-child){border-radius:0}.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-footer,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-header,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-bottom,.card-group>.card:not(:first-child):not(:last-child):not(:only-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;-moz-column-count:3;column-count:3;-webkit-column-gap:1.25rem;-moz-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#6c757d;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#6c757d}.pagination{display:-webkit-box;display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #dee2e6}.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:2;outline:0;box-shadow:0 0 0 .2rem rgba(0,123,255,.25)}.page-link:not(:disabled):not(.disabled){cursor:pointer}.page-item:first-child .page-link{margin-left:0;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}.page-item.active .page-link{z-index:1;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.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;line-height:1.5}.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:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#6c757d}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#545b62}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#212529;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#212529;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#212529;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#212529;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#383d41;background-color:#e2e3e5;border-color:#d6d8db}.alert-secondary hr{border-top-color:#c8cbcf}.alert-secondary .alert-link{color:#202326}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-webkit-box;display:-ms-flexbox;display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.media-body{-webkit-box-flex:1;-ms-flex:1;flex:1}.list-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{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:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{z-index:1;text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#004085;background-color:#9fcdff}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#383d41;background-color:#d6d8db}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#383d41;background-color:#c8cbcf}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#383d41;border-color:#383d41}.list-group-item-success{color:#155724;background-color:#c3e6cb}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#155724;background-color:#b1dfbb}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#0c5460;background-color:#abdde5}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#856404;background-color:#ffe8a1}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#721c24;background-color:#f1b0b7}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#818182;background-color:#ececf6}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#1b1e21;background-color:#b9bbbe}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}.close:not(:disabled):not(.disabled){cursor:pointer}button.close{padding:0;background-color:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-dialog-centered{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;min-height:calc(100% - (.5rem * 2))}.modal-content{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:1rem;border-bottom:1px solid #e9ecef;border-top-left-radius:.3rem;border-top-right-radius:.3rem}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem}.modal-footer{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end;padding:1rem;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-centered{min-height:calc(100% - (1.75rem * 2))}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";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 .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow::before,.bs-tooltip-top .arrow::before{top:0;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=right] .arrow::before,.bs-tooltip-right .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.bs-tooltip-bottom .arrow::before{bottom:0;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[x-placement^=left] .arrow::before,.bs-tooltip-left .arrow::before{left:0;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;z-index:1060;display:block;max-width:276px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";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,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top] .arrow,.bs-popover-top .arrow{bottom:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::after,.bs-popover-top .arrow::before{border-width:.5rem .5rem 0}.bs-popover-auto[x-placement^=top] .arrow::before,.bs-popover-top .arrow::before{bottom:0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=top] .arrow::after,.bs-popover-top .arrow::after{bottom:1px;border-top-color:#fff}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right] .arrow,.bs-popover-right .arrow{left:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::after,.bs-popover-right .arrow::before{border-width:.5rem .5rem .5rem 0}.bs-popover-auto[x-placement^=right] .arrow::before,.bs-popover-right .arrow::before{left:0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=right] .arrow::after,.bs-popover-right .arrow::after{left:1px;border-right-color:#fff}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom] .arrow,.bs-popover-bottom .arrow{top:calc((.5rem + 1px) * -1)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::after,.bs-popover-bottom .arrow::before{border-width:0 .5rem .5rem .5rem}.bs-popover-auto[x-placement^=bottom] .arrow::before,.bs-popover-bottom .arrow::before{top:0;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=bottom] .arrow::after,.bs-popover-bottom .arrow::after{top:1px;border-bottom-color:#fff}.bs-popover-auto[x-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left] .arrow,.bs-popover-left .arrow{right:calc((.5rem + 1px) * -1);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::after,.bs-popover-left .arrow::before{border-width:.5rem 0 .5rem .5rem}.bs-popover-auto[x-placement^=left] .arrow::before,.bs-popover-left .arrow::before{right:0;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[x-placement^=left] .arrow::after,.bs-popover-left .arrow::after{right:1px;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.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}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#6c757d!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#545b62!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #dee2e6!important}.border-top{border-top:1px solid #dee2e6!important}.border-right{border-right:1px solid #dee2e6!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-left{border-left:1px solid #dee2e6!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{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-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%!important}.rounded-0{border-radius:0!important}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!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:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-print-inline-flex{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-webkit-box-orient:horizontal!important;-webkit-box-direction:normal!important;-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-webkit-box-orient:horizontal!important;-webkit-box-direction:reverse!important;-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-webkit-box-orient:vertical!important;-webkit-box-direction:reverse!important;-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-webkit-box-pack:end!important;-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-webkit-box-pack:justify!important;-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-webkit-box-align:start!important;-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-webkit-box-align:end!important;-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-webkit-box-align:baseline!important;-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-webkit-box-align:stretch!important;-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float: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:-webkit-sticky!important;position:sticky!important}.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}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:700!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#6c757d!important}a.text-secondary:focus,a.text-secondary:hover{color:#545b62!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#6c757d!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}body{min-width:992px!important}.container{min-width:992px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/shopyo/static/box.svg b/shopyo/static/box.svg deleted file mode 100644 index 6a01d1d..0000000 --- a/shopyo/static/box.svg +++ /dev/null @@ -1,126 +0,0 @@ - - - -image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/shopyo/static/css/b4vtabs.min.css b/shopyo/static/css/b4vtabs.min.css deleted file mode 100644 index 51e0ea8..0000000 --- a/shopyo/static/css/b4vtabs.min.css +++ /dev/null @@ -1 +0,0 @@ -.left-tabs.sideways-tabs,.right-tabs.sideways-tabs{margin-top:5rem;border:none;position:relative;margin-bottom:0}.left-tabs.nav-tabs,.right-tabs.nav-tabs,.left-tabs.sideways-tabs,.right-tabs.sideways-tabs{height:100%;flex-direction:column}.left-tabs.nav-tabs{border-right:1px solid #dee2e6;border-bottom:none}.left-tabs .nav-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem;border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px;text-align:left}.left-tabs .nav-link:hover{border-right:1px solid transparent}.left-tabs .nav-link.active{border-top:1px solid #dee2e6;border-right:1px solid transparent;border-bottom:1px solid #dee2e6;border-left:1px solid #dee2e6}.right-tabs.nav-tabs{border-left:1px solid #dee2e6;border-bottom:none}.right-tabs .nav-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem;border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px;text-align:right}.right-tabs .nav-link:hover{border-left:1px solid transparent}.right-tabs .nav-link.active{border-top:1px solid #dee2e6;border-right:1px solid #dee2e6;border-bottom:1px solid #dee2e6;border-left:1px solid transparent}.left-tabs.sideways-tabs{border-right:none;left:-3.2rem}.sideways-tabs.left-tabs .nav-item{transform:rotate(-90deg);height:1rem;margin-bottom:calc(8rem - 1rem)}.sideways-tabs.left-tabs .nav-link{width:8rem;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top-right-radius:.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:.25rem;border-bottom:1px solid #dee2e6}.sideways-tabs.left-tabs .nav-link:hover{border-right:1px solid #e9ecef}.sideways-tabs.left-tabs .nav-link.active{border-top:1px solid #dee2e6;border-right:1px solid #dee2e6;border-bottom:1px solid transparent;border-left:1px solid #dee2e6}.right-tabs.sideways-tabs{border-left:none;right:3.2rem}.sideways-tabs.right-tabs .nav-item{transform:rotate(90deg);height:1rem;margin-bottom:calc(8rem - 1rem)}.sideways-tabs.right-tabs .nav-link{width:8rem;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top-right-radius:.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:.25rem;border-bottom:1px solid #dee2e6}.sideways-tabs.right-tabs .nav-link:hover{border-left:1px solid #e9ecef}.sideways-tabs.right-tabs .nav-link.active{border-top:1px solid #dee2e6;border-right:1px solid #dee2e6;border-bottom:1px solid transparent;border-left:1px solid #dee2e6}@media (min-width: 26em) and (max-width: 48em){.left-tabs.nav-tabs{flex-direction:row;border-right:none;border-left:none;min-width:100%;border-bottom:1px solid #dee2e6;left:auto;margin-top:auto}.left-tabs .nav-link{width:8rem;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top-right-radius:.25rem;border-bottom-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:.25rem;margin-right:0;margin-bottom:-1px}.left-tabs .nav-link.nav-link:hover{border-right-color:#dee2e6;border-bottom-color:transparent}.left-tabs .nav-link.active{border-top-color:#dee2e6;border-right-color:#dee2e6;border-bottom-color:transparent;border-left-color:#dee2e6}.sideways-tabs.left-tabs .nav-item,.sideways-tabs.right-tabs .nav-item{transform:none;height:auto;width:auto;margin-bottom:0}.right-tabs.nav-tabs{flex-direction:row;border-right:none;border-left:none;min-width:100%;border-top:1px solid #dee2e6;right:auto;margin-top:auto}.sideways-tabs.right-tabs .nav-link,.right-tabs .nav-link{width:8rem;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-top-right-radius:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem;border-top-left-radius:0;margin-left:0;margin-top:-1px;border-bottom-color:transparent}.right-tabs .nav-link:hover{border-top-color:transparent;border-left-color:#dee2e6;border-bottom-color:#e9ecef}.sideways-tabs.right-tabs .nav-link.active,.right-tabs .nav-link.active{border-top-color:transparent;border-right-color:#dee2e6;border-bottom-color:#dee2e6;border-left-color:#dee2e6}}@media (max-width: 26em){.left-tabs.nav-tabs{flex-direction:row;border-right:none;border-left:none;min-width:100%;border-bottom:1px solid #dee2e6;left:auto;margin-top:auto;padding-bottom:.25rem}.right-tabs.nav-tabs{flex-direction:row;border-right:none;border-left:none;min-width:100%;border-top:1px solid #dee2e6;right:auto;margin-top:auto;padding-top:.25rem}.sideways-tabs.left-tabs .nav-item,.sideways-tabs.right-tabs .nav-item{transform:none;height:auto;width:auto;margin-bottom:0}.sideways-tabs.left-tabs .nav-link,.sideways-tabs.right-tabs .nav-link,.nav-tabs .nav-link{width:8rem;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-radius:.25rem;margin:.25rem;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.sideways-tabs.nav-tabs .nav-link:hover,.nav-tabs .nav-link:hover{border:1px solid #e9ecef;border-top-color:#e9ecef;border-right-color:#e9ecef;border-bottom-color:#e9ecef;border-left-color:#e9ecef}.sideways-tabs.nav-tabs .nav-link.active,.left-tabs .nav-link.active,.right-tabs .nav-link.active{border-top-color:#dee2e6;border-right-color:#dee2e6;border-bottom-color:#dee2e6;border-left-color:#dee2e6}}.tab-content{padding:1rem} diff --git a/shopyo/static/css/simple_sidebar.css b/shopyo/static/css/simple_sidebar.css deleted file mode 100644 index 6d8e9b1..0000000 --- a/shopyo/static/css/simple_sidebar.css +++ /dev/null @@ -1,50 +0,0 @@ -/*! - * Start Bootstrap - Simple Sidebar (https://startbootstrap.com/templates/simple-sidebar) - * Copyright 2013-2020 Start Bootstrap - * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-simple-sidebar/blob/master/LICENSE) - */ - - #wrapper { - overflow-x: hidden; - } - -#sidebar-wrapper { - min-height: 100vh; - margin-left: -15rem; - -webkit-transition: margin .25s ease-out; - -moz-transition: margin .25s ease-out; - -o-transition: margin .25s ease-out; - transition: margin .25s ease-out; -} - -#sidebar-wrapper .sidebar-heading { - padding: 0.875rem 1.25rem; - font-size: 1.2rem; -} - -#sidebar-wrapper .list-group { - width: 15rem; -} - -#page-content-wrapper { - min-width: 100vw; -} - -#wrapper.toggled #sidebar-wrapper { - margin-left: 0; -} - -@media (min-width: 768px) { - #sidebar-wrapper { - margin-left: 0; - } - - #page-content-wrapper { - min-width: 0; - width: 100%; - } - - #wrapper.toggled #sidebar-wrapper { - margin-left: -15rem; - } -} \ No newline at end of file diff --git a/shopyo/static/default/default_product.jpg b/shopyo/static/default/default_product.jpg deleted file mode 100644 index 87867f4..0000000 Binary files a/shopyo/static/default/default_product.jpg and /dev/null differ diff --git a/shopyo/static/default/default_subcategory.jpg b/shopyo/static/default/default_subcategory.jpg deleted file mode 100644 index b39999c..0000000 Binary files a/shopyo/static/default/default_subcategory.jpg and /dev/null differ diff --git a/shopyo/static/favicon.ico b/shopyo/static/favicon.ico deleted file mode 100644 index 3b23c1b..0000000 Binary files a/shopyo/static/favicon.ico and /dev/null differ diff --git a/shopyo/static/fontawesome/LICENSE.txt b/shopyo/static/fontawesome/LICENSE.txt deleted file mode 100644 index f31bef9..0000000 --- a/shopyo/static/fontawesome/LICENSE.txt +++ /dev/null @@ -1,34 +0,0 @@ -Font Awesome Free License -------------------------- - -Font Awesome Free is free, open source, and GPL friendly. You can use it for -commercial projects, open source projects, or really almost whatever you want. -Full Font Awesome Free license: https://fontawesome.com/license/free. - -# Icons: CC BY 4.0 License (https://creativecommons.org/licenses/by/4.0/) -In the Font Awesome Free download, the CC BY 4.0 license applies to all icons -packaged as SVG and JS file types. - -# Fonts: SIL OFL 1.1 License (https://scripts.sil.org/OFL) -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -# Code: MIT License (https://opensource.org/licenses/MIT) -In the Font Awesome Free download, the MIT license applies to all non-font and -non-icon files. - -# Attribution -Attribution is required by MIT, SIL OFL, and CC BY licenses. Downloaded Font -Awesome Free files already contain embedded comments with sufficient -attribution, so you shouldn't need to do anything additional when using these -files normally. - -We've kept attribution comments terse, so we ask that you do not actively work -to remove them from files, especially code. They're a great way for folks to -learn about Font Awesome. - -# Brand Icons -All brand icons are trademarks of their respective owners. The use of these -trademarks does not indicate endorsement of the trademark holder by Font -Awesome, nor vice versa. **Please do not use brand logos for any purpose except -to represent the company, product, or service to which they refer.** diff --git a/shopyo/static/fontawesome/css/all.css b/shopyo/static/fontawesome/css/all.css deleted file mode 100644 index 368962f..0000000 --- a/shopyo/static/fontawesome/css/all.css +++ /dev/null @@ -1,4286 +0,0 @@ -.fa, -.fas, -.far, -.fal, -.fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; } - -.fa-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.fa-xs { - font-size: .75em; } - -.fa-sm { - font-size: .875em; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.fa-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.fa-pull-left { - float: left; } - -.fa-pull-right { - float: right; } - -.fa.fa-pull-left, -.fas.fa-pull-left, -.far.fa-pull-left, -.fal.fa-pull-left, -.fab.fa-pull-left { - margin-right: .3em; } - -.fa.fa-pull-right, -.fas.fa-pull-right, -.far.fa-pull-right, -.fal.fa-pull-right, -.fab.fa-pull-right { - margin-left: .3em; } - -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; } - -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); } - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical, -:root .fa-flip-both { - -webkit-filter: none; - filter: none; } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: #fff; } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.fa-500px:before { - content: "\f26e"; } - -.fa-accessible-icon:before { - content: "\f368"; } - -.fa-accusoft:before { - content: "\f369"; } - -.fa-acquisitions-incorporated:before { - content: "\f6af"; } - -.fa-ad:before { - content: "\f641"; } - -.fa-address-book:before { - content: "\f2b9"; } - -.fa-address-card:before { - content: "\f2bb"; } - -.fa-adjust:before { - content: "\f042"; } - -.fa-adn:before { - content: "\f170"; } - -.fa-adobe:before { - content: "\f778"; } - -.fa-adversal:before { - content: "\f36a"; } - -.fa-affiliatetheme:before { - content: "\f36b"; } - -.fa-air-freshener:before { - content: "\f5d0"; } - -.fa-algolia:before { - content: "\f36c"; } - -.fa-align-center:before { - content: "\f037"; } - -.fa-align-justify:before { - content: "\f039"; } - -.fa-align-left:before { - content: "\f036"; } - -.fa-align-right:before { - content: "\f038"; } - -.fa-alipay:before { - content: "\f642"; } - -.fa-allergies:before { - content: "\f461"; } - -.fa-amazon:before { - content: "\f270"; } - -.fa-amazon-pay:before { - content: "\f42c"; } - -.fa-ambulance:before { - content: "\f0f9"; } - -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; } - -.fa-amilia:before { - content: "\f36d"; } - -.fa-anchor:before { - content: "\f13d"; } - -.fa-android:before { - content: "\f17b"; } - -.fa-angellist:before { - content: "\f209"; } - -.fa-angle-double-down:before { - content: "\f103"; } - -.fa-angle-double-left:before { - content: "\f100"; } - -.fa-angle-double-right:before { - content: "\f101"; } - -.fa-angle-double-up:before { - content: "\f102"; } - -.fa-angle-down:before { - content: "\f107"; } - -.fa-angle-left:before { - content: "\f104"; } - -.fa-angle-right:before { - content: "\f105"; } - -.fa-angle-up:before { - content: "\f106"; } - -.fa-angry:before { - content: "\f556"; } - -.fa-angrycreative:before { - content: "\f36e"; } - -.fa-angular:before { - content: "\f420"; } - -.fa-ankh:before { - content: "\f644"; } - -.fa-app-store:before { - content: "\f36f"; } - -.fa-app-store-ios:before { - content: "\f370"; } - -.fa-apper:before { - content: "\f371"; } - -.fa-apple:before { - content: "\f179"; } - -.fa-apple-alt:before { - content: "\f5d1"; } - -.fa-apple-pay:before { - content: "\f415"; } - -.fa-archive:before { - content: "\f187"; } - -.fa-archway:before { - content: "\f557"; } - -.fa-arrow-alt-circle-down:before { - content: "\f358"; } - -.fa-arrow-alt-circle-left:before { - content: "\f359"; } - -.fa-arrow-alt-circle-right:before { - content: "\f35a"; } - -.fa-arrow-alt-circle-up:before { - content: "\f35b"; } - -.fa-arrow-circle-down:before { - content: "\f0ab"; } - -.fa-arrow-circle-left:before { - content: "\f0a8"; } - -.fa-arrow-circle-right:before { - content: "\f0a9"; } - -.fa-arrow-circle-up:before { - content: "\f0aa"; } - -.fa-arrow-down:before { - content: "\f063"; } - -.fa-arrow-left:before { - content: "\f060"; } - -.fa-arrow-right:before { - content: "\f061"; } - -.fa-arrow-up:before { - content: "\f062"; } - -.fa-arrows-alt:before { - content: "\f0b2"; } - -.fa-arrows-alt-h:before { - content: "\f337"; } - -.fa-arrows-alt-v:before { - content: "\f338"; } - -.fa-artstation:before { - content: "\f77a"; } - -.fa-assistive-listening-systems:before { - content: "\f2a2"; } - -.fa-asterisk:before { - content: "\f069"; } - -.fa-asymmetrik:before { - content: "\f372"; } - -.fa-at:before { - content: "\f1fa"; } - -.fa-atlas:before { - content: "\f558"; } - -.fa-atlassian:before { - content: "\f77b"; } - -.fa-atom:before { - content: "\f5d2"; } - -.fa-audible:before { - content: "\f373"; } - -.fa-audio-description:before { - content: "\f29e"; } - -.fa-autoprefixer:before { - content: "\f41c"; } - -.fa-avianex:before { - content: "\f374"; } - -.fa-aviato:before { - content: "\f421"; } - -.fa-award:before { - content: "\f559"; } - -.fa-aws:before { - content: "\f375"; } - -.fa-baby:before { - content: "\f77c"; } - -.fa-baby-carriage:before { - content: "\f77d"; } - -.fa-backspace:before { - content: "\f55a"; } - -.fa-backward:before { - content: "\f04a"; } - -.fa-bacon:before { - content: "\f7e5"; } - -.fa-balance-scale:before { - content: "\f24e"; } - -.fa-ban:before { - content: "\f05e"; } - -.fa-band-aid:before { - content: "\f462"; } - -.fa-bandcamp:before { - content: "\f2d5"; } - -.fa-barcode:before { - content: "\f02a"; } - -.fa-bars:before { - content: "\f0c9"; } - -.fa-baseball-ball:before { - content: "\f433"; } - -.fa-basketball-ball:before { - content: "\f434"; } - -.fa-bath:before { - content: "\f2cd"; } - -.fa-battery-empty:before { - content: "\f244"; } - -.fa-battery-full:before { - content: "\f240"; } - -.fa-battery-half:before { - content: "\f242"; } - -.fa-battery-quarter:before { - content: "\f243"; } - -.fa-battery-three-quarters:before { - content: "\f241"; } - -.fa-bed:before { - content: "\f236"; } - -.fa-beer:before { - content: "\f0fc"; } - -.fa-behance:before { - content: "\f1b4"; } - -.fa-behance-square:before { - content: "\f1b5"; } - -.fa-bell:before { - content: "\f0f3"; } - -.fa-bell-slash:before { - content: "\f1f6"; } - -.fa-bezier-curve:before { - content: "\f55b"; } - -.fa-bible:before { - content: "\f647"; } - -.fa-bicycle:before { - content: "\f206"; } - -.fa-bimobject:before { - content: "\f378"; } - -.fa-binoculars:before { - content: "\f1e5"; } - -.fa-biohazard:before { - content: "\f780"; } - -.fa-birthday-cake:before { - content: "\f1fd"; } - -.fa-bitbucket:before { - content: "\f171"; } - -.fa-bitcoin:before { - content: "\f379"; } - -.fa-bity:before { - content: "\f37a"; } - -.fa-black-tie:before { - content: "\f27e"; } - -.fa-blackberry:before { - content: "\f37b"; } - -.fa-blender:before { - content: "\f517"; } - -.fa-blender-phone:before { - content: "\f6b6"; } - -.fa-blind:before { - content: "\f29d"; } - -.fa-blog:before { - content: "\f781"; } - -.fa-blogger:before { - content: "\f37c"; } - -.fa-blogger-b:before { - content: "\f37d"; } - -.fa-bluetooth:before { - content: "\f293"; } - -.fa-bluetooth-b:before { - content: "\f294"; } - -.fa-bold:before { - content: "\f032"; } - -.fa-bolt:before { - content: "\f0e7"; } - -.fa-bomb:before { - content: "\f1e2"; } - -.fa-bone:before { - content: "\f5d7"; } - -.fa-bong:before { - content: "\f55c"; } - -.fa-book:before { - content: "\f02d"; } - -.fa-book-dead:before { - content: "\f6b7"; } - -.fa-book-medical:before { - content: "\f7e6"; } - -.fa-book-open:before { - content: "\f518"; } - -.fa-book-reader:before { - content: "\f5da"; } - -.fa-bookmark:before { - content: "\f02e"; } - -.fa-bowling-ball:before { - content: "\f436"; } - -.fa-box:before { - content: "\f466"; } - -.fa-box-open:before { - content: "\f49e"; } - -.fa-boxes:before { - content: "\f468"; } - -.fa-braille:before { - content: "\f2a1"; } - -.fa-brain:before { - content: "\f5dc"; } - -.fa-bread-slice:before { - content: "\f7ec"; } - -.fa-briefcase:before { - content: "\f0b1"; } - -.fa-briefcase-medical:before { - content: "\f469"; } - -.fa-broadcast-tower:before { - content: "\f519"; } - -.fa-broom:before { - content: "\f51a"; } - -.fa-brush:before { - content: "\f55d"; } - -.fa-btc:before { - content: "\f15a"; } - -.fa-bug:before { - content: "\f188"; } - -.fa-building:before { - content: "\f1ad"; } - -.fa-bullhorn:before { - content: "\f0a1"; } - -.fa-bullseye:before { - content: "\f140"; } - -.fa-burn:before { - content: "\f46a"; } - -.fa-buromobelexperte:before { - content: "\f37f"; } - -.fa-bus:before { - content: "\f207"; } - -.fa-bus-alt:before { - content: "\f55e"; } - -.fa-business-time:before { - content: "\f64a"; } - -.fa-buysellads:before { - content: "\f20d"; } - -.fa-calculator:before { - content: "\f1ec"; } - -.fa-calendar:before { - content: "\f133"; } - -.fa-calendar-alt:before { - content: "\f073"; } - -.fa-calendar-check:before { - content: "\f274"; } - -.fa-calendar-day:before { - content: "\f783"; } - -.fa-calendar-minus:before { - content: "\f272"; } - -.fa-calendar-plus:before { - content: "\f271"; } - -.fa-calendar-times:before { - content: "\f273"; } - -.fa-calendar-week:before { - content: "\f784"; } - -.fa-camera:before { - content: "\f030"; } - -.fa-camera-retro:before { - content: "\f083"; } - -.fa-campground:before { - content: "\f6bb"; } - -.fa-canadian-maple-leaf:before { - content: "\f785"; } - -.fa-candy-cane:before { - content: "\f786"; } - -.fa-cannabis:before { - content: "\f55f"; } - -.fa-capsules:before { - content: "\f46b"; } - -.fa-car:before { - content: "\f1b9"; } - -.fa-car-alt:before { - content: "\f5de"; } - -.fa-car-battery:before { - content: "\f5df"; } - -.fa-car-crash:before { - content: "\f5e1"; } - -.fa-car-side:before { - content: "\f5e4"; } - -.fa-caret-down:before { - content: "\f0d7"; } - -.fa-caret-left:before { - content: "\f0d9"; } - -.fa-caret-right:before { - content: "\f0da"; } - -.fa-caret-square-down:before { - content: "\f150"; } - -.fa-caret-square-left:before { - content: "\f191"; } - -.fa-caret-square-right:before { - content: "\f152"; } - -.fa-caret-square-up:before { - content: "\f151"; } - -.fa-caret-up:before { - content: "\f0d8"; } - -.fa-carrot:before { - content: "\f787"; } - -.fa-cart-arrow-down:before { - content: "\f218"; } - -.fa-cart-plus:before { - content: "\f217"; } - -.fa-cash-register:before { - content: "\f788"; } - -.fa-cat:before { - content: "\f6be"; } - -.fa-cc-amazon-pay:before { - content: "\f42d"; } - -.fa-cc-amex:before { - content: "\f1f3"; } - -.fa-cc-apple-pay:before { - content: "\f416"; } - -.fa-cc-diners-club:before { - content: "\f24c"; } - -.fa-cc-discover:before { - content: "\f1f2"; } - -.fa-cc-jcb:before { - content: "\f24b"; } - -.fa-cc-mastercard:before { - content: "\f1f1"; } - -.fa-cc-paypal:before { - content: "\f1f4"; } - -.fa-cc-stripe:before { - content: "\f1f5"; } - -.fa-cc-visa:before { - content: "\f1f0"; } - -.fa-centercode:before { - content: "\f380"; } - -.fa-centos:before { - content: "\f789"; } - -.fa-certificate:before { - content: "\f0a3"; } - -.fa-chair:before { - content: "\f6c0"; } - -.fa-chalkboard:before { - content: "\f51b"; } - -.fa-chalkboard-teacher:before { - content: "\f51c"; } - -.fa-charging-station:before { - content: "\f5e7"; } - -.fa-chart-area:before { - content: "\f1fe"; } - -.fa-chart-bar:before { - content: "\f080"; } - -.fa-chart-line:before { - content: "\f201"; } - -.fa-chart-pie:before { - content: "\f200"; } - -.fa-check:before { - content: "\f00c"; } - -.fa-check-circle:before { - content: "\f058"; } - -.fa-check-double:before { - content: "\f560"; } - -.fa-check-square:before { - content: "\f14a"; } - -.fa-cheese:before { - content: "\f7ef"; } - -.fa-chess:before { - content: "\f439"; } - -.fa-chess-bishop:before { - content: "\f43a"; } - -.fa-chess-board:before { - content: "\f43c"; } - -.fa-chess-king:before { - content: "\f43f"; } - -.fa-chess-knight:before { - content: "\f441"; } - -.fa-chess-pawn:before { - content: "\f443"; } - -.fa-chess-queen:before { - content: "\f445"; } - -.fa-chess-rook:before { - content: "\f447"; } - -.fa-chevron-circle-down:before { - content: "\f13a"; } - -.fa-chevron-circle-left:before { - content: "\f137"; } - -.fa-chevron-circle-right:before { - content: "\f138"; } - -.fa-chevron-circle-up:before { - content: "\f139"; } - -.fa-chevron-down:before { - content: "\f078"; } - -.fa-chevron-left:before { - content: "\f053"; } - -.fa-chevron-right:before { - content: "\f054"; } - -.fa-chevron-up:before { - content: "\f077"; } - -.fa-child:before { - content: "\f1ae"; } - -.fa-chrome:before { - content: "\f268"; } - -.fa-church:before { - content: "\f51d"; } - -.fa-circle:before { - content: "\f111"; } - -.fa-circle-notch:before { - content: "\f1ce"; } - -.fa-city:before { - content: "\f64f"; } - -.fa-clinic-medical:before { - content: "\f7f2"; } - -.fa-clipboard:before { - content: "\f328"; } - -.fa-clipboard-check:before { - content: "\f46c"; } - -.fa-clipboard-list:before { - content: "\f46d"; } - -.fa-clock:before { - content: "\f017"; } - -.fa-clone:before { - content: "\f24d"; } - -.fa-closed-captioning:before { - content: "\f20a"; } - -.fa-cloud:before { - content: "\f0c2"; } - -.fa-cloud-download-alt:before { - content: "\f381"; } - -.fa-cloud-meatball:before { - content: "\f73b"; } - -.fa-cloud-moon:before { - content: "\f6c3"; } - -.fa-cloud-moon-rain:before { - content: "\f73c"; } - -.fa-cloud-rain:before { - content: "\f73d"; } - -.fa-cloud-showers-heavy:before { - content: "\f740"; } - -.fa-cloud-sun:before { - content: "\f6c4"; } - -.fa-cloud-sun-rain:before { - content: "\f743"; } - -.fa-cloud-upload-alt:before { - content: "\f382"; } - -.fa-cloudscale:before { - content: "\f383"; } - -.fa-cloudsmith:before { - content: "\f384"; } - -.fa-cloudversify:before { - content: "\f385"; } - -.fa-cocktail:before { - content: "\f561"; } - -.fa-code:before { - content: "\f121"; } - -.fa-code-branch:before { - content: "\f126"; } - -.fa-codepen:before { - content: "\f1cb"; } - -.fa-codiepie:before { - content: "\f284"; } - -.fa-coffee:before { - content: "\f0f4"; } - -.fa-cog:before { - content: "\f013"; } - -.fa-cogs:before { - content: "\f085"; } - -.fa-coins:before { - content: "\f51e"; } - -.fa-columns:before { - content: "\f0db"; } - -.fa-comment:before { - content: "\f075"; } - -.fa-comment-alt:before { - content: "\f27a"; } - -.fa-comment-dollar:before { - content: "\f651"; } - -.fa-comment-dots:before { - content: "\f4ad"; } - -.fa-comment-medical:before { - content: "\f7f5"; } - -.fa-comment-slash:before { - content: "\f4b3"; } - -.fa-comments:before { - content: "\f086"; } - -.fa-comments-dollar:before { - content: "\f653"; } - -.fa-compact-disc:before { - content: "\f51f"; } - -.fa-compass:before { - content: "\f14e"; } - -.fa-compress:before { - content: "\f066"; } - -.fa-compress-arrows-alt:before { - content: "\f78c"; } - -.fa-concierge-bell:before { - content: "\f562"; } - -.fa-confluence:before { - content: "\f78d"; } - -.fa-connectdevelop:before { - content: "\f20e"; } - -.fa-contao:before { - content: "\f26d"; } - -.fa-cookie:before { - content: "\f563"; } - -.fa-cookie-bite:before { - content: "\f564"; } - -.fa-copy:before { - content: "\f0c5"; } - -.fa-copyright:before { - content: "\f1f9"; } - -.fa-couch:before { - content: "\f4b8"; } - -.fa-cpanel:before { - content: "\f388"; } - -.fa-creative-commons:before { - content: "\f25e"; } - -.fa-creative-commons-by:before { - content: "\f4e7"; } - -.fa-creative-commons-nc:before { - content: "\f4e8"; } - -.fa-creative-commons-nc-eu:before { - content: "\f4e9"; } - -.fa-creative-commons-nc-jp:before { - content: "\f4ea"; } - -.fa-creative-commons-nd:before { - content: "\f4eb"; } - -.fa-creative-commons-pd:before { - content: "\f4ec"; } - -.fa-creative-commons-pd-alt:before { - content: "\f4ed"; } - -.fa-creative-commons-remix:before { - content: "\f4ee"; } - -.fa-creative-commons-sa:before { - content: "\f4ef"; } - -.fa-creative-commons-sampling:before { - content: "\f4f0"; } - -.fa-creative-commons-sampling-plus:before { - content: "\f4f1"; } - -.fa-creative-commons-share:before { - content: "\f4f2"; } - -.fa-creative-commons-zero:before { - content: "\f4f3"; } - -.fa-credit-card:before { - content: "\f09d"; } - -.fa-critical-role:before { - content: "\f6c9"; } - -.fa-crop:before { - content: "\f125"; } - -.fa-crop-alt:before { - content: "\f565"; } - -.fa-cross:before { - content: "\f654"; } - -.fa-crosshairs:before { - content: "\f05b"; } - -.fa-crow:before { - content: "\f520"; } - -.fa-crown:before { - content: "\f521"; } - -.fa-crutch:before { - content: "\f7f7"; } - -.fa-css3:before { - content: "\f13c"; } - -.fa-css3-alt:before { - content: "\f38b"; } - -.fa-cube:before { - content: "\f1b2"; } - -.fa-cubes:before { - content: "\f1b3"; } - -.fa-cut:before { - content: "\f0c4"; } - -.fa-cuttlefish:before { - content: "\f38c"; } - -.fa-d-and-d:before { - content: "\f38d"; } - -.fa-d-and-d-beyond:before { - content: "\f6ca"; } - -.fa-dashcube:before { - content: "\f210"; } - -.fa-database:before { - content: "\f1c0"; } - -.fa-deaf:before { - content: "\f2a4"; } - -.fa-delicious:before { - content: "\f1a5"; } - -.fa-democrat:before { - content: "\f747"; } - -.fa-deploydog:before { - content: "\f38e"; } - -.fa-deskpro:before { - content: "\f38f"; } - -.fa-desktop:before { - content: "\f108"; } - -.fa-dev:before { - content: "\f6cc"; } - -.fa-deviantart:before { - content: "\f1bd"; } - -.fa-dharmachakra:before { - content: "\f655"; } - -.fa-dhl:before { - content: "\f790"; } - -.fa-diagnoses:before { - content: "\f470"; } - -.fa-diaspora:before { - content: "\f791"; } - -.fa-dice:before { - content: "\f522"; } - -.fa-dice-d20:before { - content: "\f6cf"; } - -.fa-dice-d6:before { - content: "\f6d1"; } - -.fa-dice-five:before { - content: "\f523"; } - -.fa-dice-four:before { - content: "\f524"; } - -.fa-dice-one:before { - content: "\f525"; } - -.fa-dice-six:before { - content: "\f526"; } - -.fa-dice-three:before { - content: "\f527"; } - -.fa-dice-two:before { - content: "\f528"; } - -.fa-digg:before { - content: "\f1a6"; } - -.fa-digital-ocean:before { - content: "\f391"; } - -.fa-digital-tachograph:before { - content: "\f566"; } - -.fa-directions:before { - content: "\f5eb"; } - -.fa-discord:before { - content: "\f392"; } - -.fa-discourse:before { - content: "\f393"; } - -.fa-divide:before { - content: "\f529"; } - -.fa-dizzy:before { - content: "\f567"; } - -.fa-dna:before { - content: "\f471"; } - -.fa-dochub:before { - content: "\f394"; } - -.fa-docker:before { - content: "\f395"; } - -.fa-dog:before { - content: "\f6d3"; } - -.fa-dollar-sign:before { - content: "\f155"; } - -.fa-dolly:before { - content: "\f472"; } - -.fa-dolly-flatbed:before { - content: "\f474"; } - -.fa-donate:before { - content: "\f4b9"; } - -.fa-door-closed:before { - content: "\f52a"; } - -.fa-door-open:before { - content: "\f52b"; } - -.fa-dot-circle:before { - content: "\f192"; } - -.fa-dove:before { - content: "\f4ba"; } - -.fa-download:before { - content: "\f019"; } - -.fa-draft2digital:before { - content: "\f396"; } - -.fa-drafting-compass:before { - content: "\f568"; } - -.fa-dragon:before { - content: "\f6d5"; } - -.fa-draw-polygon:before { - content: "\f5ee"; } - -.fa-dribbble:before { - content: "\f17d"; } - -.fa-dribbble-square:before { - content: "\f397"; } - -.fa-dropbox:before { - content: "\f16b"; } - -.fa-drum:before { - content: "\f569"; } - -.fa-drum-steelpan:before { - content: "\f56a"; } - -.fa-drumstick-bite:before { - content: "\f6d7"; } - -.fa-drupal:before { - content: "\f1a9"; } - -.fa-dumbbell:before { - content: "\f44b"; } - -.fa-dumpster:before { - content: "\f793"; } - -.fa-dumpster-fire:before { - content: "\f794"; } - -.fa-dungeon:before { - content: "\f6d9"; } - -.fa-dyalog:before { - content: "\f399"; } - -.fa-earlybirds:before { - content: "\f39a"; } - -.fa-ebay:before { - content: "\f4f4"; } - -.fa-edge:before { - content: "\f282"; } - -.fa-edit:before { - content: "\f044"; } - -.fa-egg:before { - content: "\f7fb"; } - -.fa-eject:before { - content: "\f052"; } - -.fa-elementor:before { - content: "\f430"; } - -.fa-ellipsis-h:before { - content: "\f141"; } - -.fa-ellipsis-v:before { - content: "\f142"; } - -.fa-ello:before { - content: "\f5f1"; } - -.fa-ember:before { - content: "\f423"; } - -.fa-empire:before { - content: "\f1d1"; } - -.fa-envelope:before { - content: "\f0e0"; } - -.fa-envelope-open:before { - content: "\f2b6"; } - -.fa-envelope-open-text:before { - content: "\f658"; } - -.fa-envelope-square:before { - content: "\f199"; } - -.fa-envira:before { - content: "\f299"; } - -.fa-equals:before { - content: "\f52c"; } - -.fa-eraser:before { - content: "\f12d"; } - -.fa-erlang:before { - content: "\f39d"; } - -.fa-ethereum:before { - content: "\f42e"; } - -.fa-ethernet:before { - content: "\f796"; } - -.fa-etsy:before { - content: "\f2d7"; } - -.fa-euro-sign:before { - content: "\f153"; } - -.fa-exchange-alt:before { - content: "\f362"; } - -.fa-exclamation:before { - content: "\f12a"; } - -.fa-exclamation-circle:before { - content: "\f06a"; } - -.fa-exclamation-triangle:before { - content: "\f071"; } - -.fa-expand:before { - content: "\f065"; } - -.fa-expand-arrows-alt:before { - content: "\f31e"; } - -.fa-expeditedssl:before { - content: "\f23e"; } - -.fa-external-link-alt:before { - content: "\f35d"; } - -.fa-external-link-square-alt:before { - content: "\f360"; } - -.fa-eye:before { - content: "\f06e"; } - -.fa-eye-dropper:before { - content: "\f1fb"; } - -.fa-eye-slash:before { - content: "\f070"; } - -.fa-facebook:before { - content: "\f09a"; } - -.fa-facebook-f:before { - content: "\f39e"; } - -.fa-facebook-messenger:before { - content: "\f39f"; } - -.fa-facebook-square:before { - content: "\f082"; } - -.fa-fantasy-flight-games:before { - content: "\f6dc"; } - -.fa-fast-backward:before { - content: "\f049"; } - -.fa-fast-forward:before { - content: "\f050"; } - -.fa-fax:before { - content: "\f1ac"; } - -.fa-feather:before { - content: "\f52d"; } - -.fa-feather-alt:before { - content: "\f56b"; } - -.fa-fedex:before { - content: "\f797"; } - -.fa-fedora:before { - content: "\f798"; } - -.fa-female:before { - content: "\f182"; } - -.fa-fighter-jet:before { - content: "\f0fb"; } - -.fa-figma:before { - content: "\f799"; } - -.fa-file:before { - content: "\f15b"; } - -.fa-file-alt:before { - content: "\f15c"; } - -.fa-file-archive:before { - content: "\f1c6"; } - -.fa-file-audio:before { - content: "\f1c7"; } - -.fa-file-code:before { - content: "\f1c9"; } - -.fa-file-contract:before { - content: "\f56c"; } - -.fa-file-csv:before { - content: "\f6dd"; } - -.fa-file-download:before { - content: "\f56d"; } - -.fa-file-excel:before { - content: "\f1c3"; } - -.fa-file-export:before { - content: "\f56e"; } - -.fa-file-image:before { - content: "\f1c5"; } - -.fa-file-import:before { - content: "\f56f"; } - -.fa-file-invoice:before { - content: "\f570"; } - -.fa-file-invoice-dollar:before { - content: "\f571"; } - -.fa-file-medical:before { - content: "\f477"; } - -.fa-file-medical-alt:before { - content: "\f478"; } - -.fa-file-pdf:before { - content: "\f1c1"; } - -.fa-file-powerpoint:before { - content: "\f1c4"; } - -.fa-file-prescription:before { - content: "\f572"; } - -.fa-file-signature:before { - content: "\f573"; } - -.fa-file-upload:before { - content: "\f574"; } - -.fa-file-video:before { - content: "\f1c8"; } - -.fa-file-word:before { - content: "\f1c2"; } - -.fa-fill:before { - content: "\f575"; } - -.fa-fill-drip:before { - content: "\f576"; } - -.fa-film:before { - content: "\f008"; } - -.fa-filter:before { - content: "\f0b0"; } - -.fa-fingerprint:before { - content: "\f577"; } - -.fa-fire:before { - content: "\f06d"; } - -.fa-fire-alt:before { - content: "\f7e4"; } - -.fa-fire-extinguisher:before { - content: "\f134"; } - -.fa-firefox:before { - content: "\f269"; } - -.fa-first-aid:before { - content: "\f479"; } - -.fa-first-order:before { - content: "\f2b0"; } - -.fa-first-order-alt:before { - content: "\f50a"; } - -.fa-firstdraft:before { - content: "\f3a1"; } - -.fa-fish:before { - content: "\f578"; } - -.fa-fist-raised:before { - content: "\f6de"; } - -.fa-flag:before { - content: "\f024"; } - -.fa-flag-checkered:before { - content: "\f11e"; } - -.fa-flag-usa:before { - content: "\f74d"; } - -.fa-flask:before { - content: "\f0c3"; } - -.fa-flickr:before { - content: "\f16e"; } - -.fa-flipboard:before { - content: "\f44d"; } - -.fa-flushed:before { - content: "\f579"; } - -.fa-fly:before { - content: "\f417"; } - -.fa-folder:before { - content: "\f07b"; } - -.fa-folder-minus:before { - content: "\f65d"; } - -.fa-folder-open:before { - content: "\f07c"; } - -.fa-folder-plus:before { - content: "\f65e"; } - -.fa-font:before { - content: "\f031"; } - -.fa-font-awesome:before { - content: "\f2b4"; } - -.fa-font-awesome-alt:before { - content: "\f35c"; } - -.fa-font-awesome-flag:before { - content: "\f425"; } - -.fa-font-awesome-logo-full:before { - content: "\f4e6"; } - -.fa-fonticons:before { - content: "\f280"; } - -.fa-fonticons-fi:before { - content: "\f3a2"; } - -.fa-football-ball:before { - content: "\f44e"; } - -.fa-fort-awesome:before { - content: "\f286"; } - -.fa-fort-awesome-alt:before { - content: "\f3a3"; } - -.fa-forumbee:before { - content: "\f211"; } - -.fa-forward:before { - content: "\f04e"; } - -.fa-foursquare:before { - content: "\f180"; } - -.fa-free-code-camp:before { - content: "\f2c5"; } - -.fa-freebsd:before { - content: "\f3a4"; } - -.fa-frog:before { - content: "\f52e"; } - -.fa-frown:before { - content: "\f119"; } - -.fa-frown-open:before { - content: "\f57a"; } - -.fa-fulcrum:before { - content: "\f50b"; } - -.fa-funnel-dollar:before { - content: "\f662"; } - -.fa-futbol:before { - content: "\f1e3"; } - -.fa-galactic-republic:before { - content: "\f50c"; } - -.fa-galactic-senate:before { - content: "\f50d"; } - -.fa-gamepad:before { - content: "\f11b"; } - -.fa-gas-pump:before { - content: "\f52f"; } - -.fa-gavel:before { - content: "\f0e3"; } - -.fa-gem:before { - content: "\f3a5"; } - -.fa-genderless:before { - content: "\f22d"; } - -.fa-get-pocket:before { - content: "\f265"; } - -.fa-gg:before { - content: "\f260"; } - -.fa-gg-circle:before { - content: "\f261"; } - -.fa-ghost:before { - content: "\f6e2"; } - -.fa-gift:before { - content: "\f06b"; } - -.fa-gifts:before { - content: "\f79c"; } - -.fa-git:before { - content: "\f1d3"; } - -.fa-git-square:before { - content: "\f1d2"; } - -.fa-github:before { - content: "\f09b"; } - -.fa-github-alt:before { - content: "\f113"; } - -.fa-github-square:before { - content: "\f092"; } - -.fa-gitkraken:before { - content: "\f3a6"; } - -.fa-gitlab:before { - content: "\f296"; } - -.fa-gitter:before { - content: "\f426"; } - -.fa-glass-cheers:before { - content: "\f79f"; } - -.fa-glass-martini:before { - content: "\f000"; } - -.fa-glass-martini-alt:before { - content: "\f57b"; } - -.fa-glass-whiskey:before { - content: "\f7a0"; } - -.fa-glasses:before { - content: "\f530"; } - -.fa-glide:before { - content: "\f2a5"; } - -.fa-glide-g:before { - content: "\f2a6"; } - -.fa-globe:before { - content: "\f0ac"; } - -.fa-globe-africa:before { - content: "\f57c"; } - -.fa-globe-americas:before { - content: "\f57d"; } - -.fa-globe-asia:before { - content: "\f57e"; } - -.fa-globe-europe:before { - content: "\f7a2"; } - -.fa-gofore:before { - content: "\f3a7"; } - -.fa-golf-ball:before { - content: "\f450"; } - -.fa-goodreads:before { - content: "\f3a8"; } - -.fa-goodreads-g:before { - content: "\f3a9"; } - -.fa-google:before { - content: "\f1a0"; } - -.fa-google-drive:before { - content: "\f3aa"; } - -.fa-google-play:before { - content: "\f3ab"; } - -.fa-google-plus:before { - content: "\f2b3"; } - -.fa-google-plus-g:before { - content: "\f0d5"; } - -.fa-google-plus-square:before { - content: "\f0d4"; } - -.fa-google-wallet:before { - content: "\f1ee"; } - -.fa-gopuram:before { - content: "\f664"; } - -.fa-graduation-cap:before { - content: "\f19d"; } - -.fa-gratipay:before { - content: "\f184"; } - -.fa-grav:before { - content: "\f2d6"; } - -.fa-greater-than:before { - content: "\f531"; } - -.fa-greater-than-equal:before { - content: "\f532"; } - -.fa-grimace:before { - content: "\f57f"; } - -.fa-grin:before { - content: "\f580"; } - -.fa-grin-alt:before { - content: "\f581"; } - -.fa-grin-beam:before { - content: "\f582"; } - -.fa-grin-beam-sweat:before { - content: "\f583"; } - -.fa-grin-hearts:before { - content: "\f584"; } - -.fa-grin-squint:before { - content: "\f585"; } - -.fa-grin-squint-tears:before { - content: "\f586"; } - -.fa-grin-stars:before { - content: "\f587"; } - -.fa-grin-tears:before { - content: "\f588"; } - -.fa-grin-tongue:before { - content: "\f589"; } - -.fa-grin-tongue-squint:before { - content: "\f58a"; } - -.fa-grin-tongue-wink:before { - content: "\f58b"; } - -.fa-grin-wink:before { - content: "\f58c"; } - -.fa-grip-horizontal:before { - content: "\f58d"; } - -.fa-grip-lines:before { - content: "\f7a4"; } - -.fa-grip-lines-vertical:before { - content: "\f7a5"; } - -.fa-grip-vertical:before { - content: "\f58e"; } - -.fa-gripfire:before { - content: "\f3ac"; } - -.fa-grunt:before { - content: "\f3ad"; } - -.fa-guitar:before { - content: "\f7a6"; } - -.fa-gulp:before { - content: "\f3ae"; } - -.fa-h-square:before { - content: "\f0fd"; } - -.fa-hacker-news:before { - content: "\f1d4"; } - -.fa-hacker-news-square:before { - content: "\f3af"; } - -.fa-hackerrank:before { - content: "\f5f7"; } - -.fa-hamburger:before { - content: "\f805"; } - -.fa-hammer:before { - content: "\f6e3"; } - -.fa-hamsa:before { - content: "\f665"; } - -.fa-hand-holding:before { - content: "\f4bd"; } - -.fa-hand-holding-heart:before { - content: "\f4be"; } - -.fa-hand-holding-usd:before { - content: "\f4c0"; } - -.fa-hand-lizard:before { - content: "\f258"; } - -.fa-hand-middle-finger:before { - content: "\f806"; } - -.fa-hand-paper:before { - content: "\f256"; } - -.fa-hand-peace:before { - content: "\f25b"; } - -.fa-hand-point-down:before { - content: "\f0a7"; } - -.fa-hand-point-left:before { - content: "\f0a5"; } - -.fa-hand-point-right:before { - content: "\f0a4"; } - -.fa-hand-point-up:before { - content: "\f0a6"; } - -.fa-hand-pointer:before { - content: "\f25a"; } - -.fa-hand-rock:before { - content: "\f255"; } - -.fa-hand-scissors:before { - content: "\f257"; } - -.fa-hand-spock:before { - content: "\f259"; } - -.fa-hands:before { - content: "\f4c2"; } - -.fa-hands-helping:before { - content: "\f4c4"; } - -.fa-handshake:before { - content: "\f2b5"; } - -.fa-hanukiah:before { - content: "\f6e6"; } - -.fa-hard-hat:before { - content: "\f807"; } - -.fa-hashtag:before { - content: "\f292"; } - -.fa-hat-wizard:before { - content: "\f6e8"; } - -.fa-haykal:before { - content: "\f666"; } - -.fa-hdd:before { - content: "\f0a0"; } - -.fa-heading:before { - content: "\f1dc"; } - -.fa-headphones:before { - content: "\f025"; } - -.fa-headphones-alt:before { - content: "\f58f"; } - -.fa-headset:before { - content: "\f590"; } - -.fa-heart:before { - content: "\f004"; } - -.fa-heart-broken:before { - content: "\f7a9"; } - -.fa-heartbeat:before { - content: "\f21e"; } - -.fa-helicopter:before { - content: "\f533"; } - -.fa-highlighter:before { - content: "\f591"; } - -.fa-hiking:before { - content: "\f6ec"; } - -.fa-hippo:before { - content: "\f6ed"; } - -.fa-hips:before { - content: "\f452"; } - -.fa-hire-a-helper:before { - content: "\f3b0"; } - -.fa-history:before { - content: "\f1da"; } - -.fa-hockey-puck:before { - content: "\f453"; } - -.fa-holly-berry:before { - content: "\f7aa"; } - -.fa-home:before { - content: "\f015"; } - -.fa-hooli:before { - content: "\f427"; } - -.fa-hornbill:before { - content: "\f592"; } - -.fa-horse:before { - content: "\f6f0"; } - -.fa-horse-head:before { - content: "\f7ab"; } - -.fa-hospital:before { - content: "\f0f8"; } - -.fa-hospital-alt:before { - content: "\f47d"; } - -.fa-hospital-symbol:before { - content: "\f47e"; } - -.fa-hot-tub:before { - content: "\f593"; } - -.fa-hotdog:before { - content: "\f80f"; } - -.fa-hotel:before { - content: "\f594"; } - -.fa-hotjar:before { - content: "\f3b1"; } - -.fa-hourglass:before { - content: "\f254"; } - -.fa-hourglass-end:before { - content: "\f253"; } - -.fa-hourglass-half:before { - content: "\f252"; } - -.fa-hourglass-start:before { - content: "\f251"; } - -.fa-house-damage:before { - content: "\f6f1"; } - -.fa-houzz:before { - content: "\f27c"; } - -.fa-hryvnia:before { - content: "\f6f2"; } - -.fa-html5:before { - content: "\f13b"; } - -.fa-hubspot:before { - content: "\f3b2"; } - -.fa-i-cursor:before { - content: "\f246"; } - -.fa-ice-cream:before { - content: "\f810"; } - -.fa-icicles:before { - content: "\f7ad"; } - -.fa-id-badge:before { - content: "\f2c1"; } - -.fa-id-card:before { - content: "\f2c2"; } - -.fa-id-card-alt:before { - content: "\f47f"; } - -.fa-igloo:before { - content: "\f7ae"; } - -.fa-image:before { - content: "\f03e"; } - -.fa-images:before { - content: "\f302"; } - -.fa-imdb:before { - content: "\f2d8"; } - -.fa-inbox:before { - content: "\f01c"; } - -.fa-indent:before { - content: "\f03c"; } - -.fa-industry:before { - content: "\f275"; } - -.fa-infinity:before { - content: "\f534"; } - -.fa-info:before { - content: "\f129"; } - -.fa-info-circle:before { - content: "\f05a"; } - -.fa-instagram:before { - content: "\f16d"; } - -.fa-intercom:before { - content: "\f7af"; } - -.fa-internet-explorer:before { - content: "\f26b"; } - -.fa-invision:before { - content: "\f7b0"; } - -.fa-ioxhost:before { - content: "\f208"; } - -.fa-italic:before { - content: "\f033"; } - -.fa-itunes:before { - content: "\f3b4"; } - -.fa-itunes-note:before { - content: "\f3b5"; } - -.fa-java:before { - content: "\f4e4"; } - -.fa-jedi:before { - content: "\f669"; } - -.fa-jedi-order:before { - content: "\f50e"; } - -.fa-jenkins:before { - content: "\f3b6"; } - -.fa-jira:before { - content: "\f7b1"; } - -.fa-joget:before { - content: "\f3b7"; } - -.fa-joint:before { - content: "\f595"; } - -.fa-joomla:before { - content: "\f1aa"; } - -.fa-journal-whills:before { - content: "\f66a"; } - -.fa-js:before { - content: "\f3b8"; } - -.fa-js-square:before { - content: "\f3b9"; } - -.fa-jsfiddle:before { - content: "\f1cc"; } - -.fa-kaaba:before { - content: "\f66b"; } - -.fa-kaggle:before { - content: "\f5fa"; } - -.fa-key:before { - content: "\f084"; } - -.fa-keybase:before { - content: "\f4f5"; } - -.fa-keyboard:before { - content: "\f11c"; } - -.fa-keycdn:before { - content: "\f3ba"; } - -.fa-khanda:before { - content: "\f66d"; } - -.fa-kickstarter:before { - content: "\f3bb"; } - -.fa-kickstarter-k:before { - content: "\f3bc"; } - -.fa-kiss:before { - content: "\f596"; } - -.fa-kiss-beam:before { - content: "\f597"; } - -.fa-kiss-wink-heart:before { - content: "\f598"; } - -.fa-kiwi-bird:before { - content: "\f535"; } - -.fa-korvue:before { - content: "\f42f"; } - -.fa-landmark:before { - content: "\f66f"; } - -.fa-language:before { - content: "\f1ab"; } - -.fa-laptop:before { - content: "\f109"; } - -.fa-laptop-code:before { - content: "\f5fc"; } - -.fa-laptop-medical:before { - content: "\f812"; } - -.fa-laravel:before { - content: "\f3bd"; } - -.fa-lastfm:before { - content: "\f202"; } - -.fa-lastfm-square:before { - content: "\f203"; } - -.fa-laugh:before { - content: "\f599"; } - -.fa-laugh-beam:before { - content: "\f59a"; } - -.fa-laugh-squint:before { - content: "\f59b"; } - -.fa-laugh-wink:before { - content: "\f59c"; } - -.fa-layer-group:before { - content: "\f5fd"; } - -.fa-leaf:before { - content: "\f06c"; } - -.fa-leanpub:before { - content: "\f212"; } - -.fa-lemon:before { - content: "\f094"; } - -.fa-less:before { - content: "\f41d"; } - -.fa-less-than:before { - content: "\f536"; } - -.fa-less-than-equal:before { - content: "\f537"; } - -.fa-level-down-alt:before { - content: "\f3be"; } - -.fa-level-up-alt:before { - content: "\f3bf"; } - -.fa-life-ring:before { - content: "\f1cd"; } - -.fa-lightbulb:before { - content: "\f0eb"; } - -.fa-line:before { - content: "\f3c0"; } - -.fa-link:before { - content: "\f0c1"; } - -.fa-linkedin:before { - content: "\f08c"; } - -.fa-linkedin-in:before { - content: "\f0e1"; } - -.fa-linode:before { - content: "\f2b8"; } - -.fa-linux:before { - content: "\f17c"; } - -.fa-lira-sign:before { - content: "\f195"; } - -.fa-list:before { - content: "\f03a"; } - -.fa-list-alt:before { - content: "\f022"; } - -.fa-list-ol:before { - content: "\f0cb"; } - -.fa-list-ul:before { - content: "\f0ca"; } - -.fa-location-arrow:before { - content: "\f124"; } - -.fa-lock:before { - content: "\f023"; } - -.fa-lock-open:before { - content: "\f3c1"; } - -.fa-long-arrow-alt-down:before { - content: "\f309"; } - -.fa-long-arrow-alt-left:before { - content: "\f30a"; } - -.fa-long-arrow-alt-right:before { - content: "\f30b"; } - -.fa-long-arrow-alt-up:before { - content: "\f30c"; } - -.fa-low-vision:before { - content: "\f2a8"; } - -.fa-luggage-cart:before { - content: "\f59d"; } - -.fa-lyft:before { - content: "\f3c3"; } - -.fa-magento:before { - content: "\f3c4"; } - -.fa-magic:before { - content: "\f0d0"; } - -.fa-magnet:before { - content: "\f076"; } - -.fa-mail-bulk:before { - content: "\f674"; } - -.fa-mailchimp:before { - content: "\f59e"; } - -.fa-male:before { - content: "\f183"; } - -.fa-mandalorian:before { - content: "\f50f"; } - -.fa-map:before { - content: "\f279"; } - -.fa-map-marked:before { - content: "\f59f"; } - -.fa-map-marked-alt:before { - content: "\f5a0"; } - -.fa-map-marker:before { - content: "\f041"; } - -.fa-map-marker-alt:before { - content: "\f3c5"; } - -.fa-map-pin:before { - content: "\f276"; } - -.fa-map-signs:before { - content: "\f277"; } - -.fa-markdown:before { - content: "\f60f"; } - -.fa-marker:before { - content: "\f5a1"; } - -.fa-mars:before { - content: "\f222"; } - -.fa-mars-double:before { - content: "\f227"; } - -.fa-mars-stroke:before { - content: "\f229"; } - -.fa-mars-stroke-h:before { - content: "\f22b"; } - -.fa-mars-stroke-v:before { - content: "\f22a"; } - -.fa-mask:before { - content: "\f6fa"; } - -.fa-mastodon:before { - content: "\f4f6"; } - -.fa-maxcdn:before { - content: "\f136"; } - -.fa-medal:before { - content: "\f5a2"; } - -.fa-medapps:before { - content: "\f3c6"; } - -.fa-medium:before { - content: "\f23a"; } - -.fa-medium-m:before { - content: "\f3c7"; } - -.fa-medkit:before { - content: "\f0fa"; } - -.fa-medrt:before { - content: "\f3c8"; } - -.fa-meetup:before { - content: "\f2e0"; } - -.fa-megaport:before { - content: "\f5a3"; } - -.fa-meh:before { - content: "\f11a"; } - -.fa-meh-blank:before { - content: "\f5a4"; } - -.fa-meh-rolling-eyes:before { - content: "\f5a5"; } - -.fa-memory:before { - content: "\f538"; } - -.fa-mendeley:before { - content: "\f7b3"; } - -.fa-menorah:before { - content: "\f676"; } - -.fa-mercury:before { - content: "\f223"; } - -.fa-meteor:before { - content: "\f753"; } - -.fa-microchip:before { - content: "\f2db"; } - -.fa-microphone:before { - content: "\f130"; } - -.fa-microphone-alt:before { - content: "\f3c9"; } - -.fa-microphone-alt-slash:before { - content: "\f539"; } - -.fa-microphone-slash:before { - content: "\f131"; } - -.fa-microscope:before { - content: "\f610"; } - -.fa-microsoft:before { - content: "\f3ca"; } - -.fa-minus:before { - content: "\f068"; } - -.fa-minus-circle:before { - content: "\f056"; } - -.fa-minus-square:before { - content: "\f146"; } - -.fa-mitten:before { - content: "\f7b5"; } - -.fa-mix:before { - content: "\f3cb"; } - -.fa-mixcloud:before { - content: "\f289"; } - -.fa-mizuni:before { - content: "\f3cc"; } - -.fa-mobile:before { - content: "\f10b"; } - -.fa-mobile-alt:before { - content: "\f3cd"; } - -.fa-modx:before { - content: "\f285"; } - -.fa-monero:before { - content: "\f3d0"; } - -.fa-money-bill:before { - content: "\f0d6"; } - -.fa-money-bill-alt:before { - content: "\f3d1"; } - -.fa-money-bill-wave:before { - content: "\f53a"; } - -.fa-money-bill-wave-alt:before { - content: "\f53b"; } - -.fa-money-check:before { - content: "\f53c"; } - -.fa-money-check-alt:before { - content: "\f53d"; } - -.fa-monument:before { - content: "\f5a6"; } - -.fa-moon:before { - content: "\f186"; } - -.fa-mortar-pestle:before { - content: "\f5a7"; } - -.fa-mosque:before { - content: "\f678"; } - -.fa-motorcycle:before { - content: "\f21c"; } - -.fa-mountain:before { - content: "\f6fc"; } - -.fa-mouse-pointer:before { - content: "\f245"; } - -.fa-mug-hot:before { - content: "\f7b6"; } - -.fa-music:before { - content: "\f001"; } - -.fa-napster:before { - content: "\f3d2"; } - -.fa-neos:before { - content: "\f612"; } - -.fa-network-wired:before { - content: "\f6ff"; } - -.fa-neuter:before { - content: "\f22c"; } - -.fa-newspaper:before { - content: "\f1ea"; } - -.fa-nimblr:before { - content: "\f5a8"; } - -.fa-nintendo-switch:before { - content: "\f418"; } - -.fa-node:before { - content: "\f419"; } - -.fa-node-js:before { - content: "\f3d3"; } - -.fa-not-equal:before { - content: "\f53e"; } - -.fa-notes-medical:before { - content: "\f481"; } - -.fa-npm:before { - content: "\f3d4"; } - -.fa-ns8:before { - content: "\f3d5"; } - -.fa-nutritionix:before { - content: "\f3d6"; } - -.fa-object-group:before { - content: "\f247"; } - -.fa-object-ungroup:before { - content: "\f248"; } - -.fa-odnoklassniki:before { - content: "\f263"; } - -.fa-odnoklassniki-square:before { - content: "\f264"; } - -.fa-oil-can:before { - content: "\f613"; } - -.fa-old-republic:before { - content: "\f510"; } - -.fa-om:before { - content: "\f679"; } - -.fa-opencart:before { - content: "\f23d"; } - -.fa-openid:before { - content: "\f19b"; } - -.fa-opera:before { - content: "\f26a"; } - -.fa-optin-monster:before { - content: "\f23c"; } - -.fa-osi:before { - content: "\f41a"; } - -.fa-otter:before { - content: "\f700"; } - -.fa-outdent:before { - content: "\f03b"; } - -.fa-page4:before { - content: "\f3d7"; } - -.fa-pagelines:before { - content: "\f18c"; } - -.fa-pager:before { - content: "\f815"; } - -.fa-paint-brush:before { - content: "\f1fc"; } - -.fa-paint-roller:before { - content: "\f5aa"; } - -.fa-palette:before { - content: "\f53f"; } - -.fa-palfed:before { - content: "\f3d8"; } - -.fa-pallet:before { - content: "\f482"; } - -.fa-paper-plane:before { - content: "\f1d8"; } - -.fa-paperclip:before { - content: "\f0c6"; } - -.fa-parachute-box:before { - content: "\f4cd"; } - -.fa-paragraph:before { - content: "\f1dd"; } - -.fa-parking:before { - content: "\f540"; } - -.fa-passport:before { - content: "\f5ab"; } - -.fa-pastafarianism:before { - content: "\f67b"; } - -.fa-paste:before { - content: "\f0ea"; } - -.fa-patreon:before { - content: "\f3d9"; } - -.fa-pause:before { - content: "\f04c"; } - -.fa-pause-circle:before { - content: "\f28b"; } - -.fa-paw:before { - content: "\f1b0"; } - -.fa-paypal:before { - content: "\f1ed"; } - -.fa-peace:before { - content: "\f67c"; } - -.fa-pen:before { - content: "\f304"; } - -.fa-pen-alt:before { - content: "\f305"; } - -.fa-pen-fancy:before { - content: "\f5ac"; } - -.fa-pen-nib:before { - content: "\f5ad"; } - -.fa-pen-square:before { - content: "\f14b"; } - -.fa-pencil-alt:before { - content: "\f303"; } - -.fa-pencil-ruler:before { - content: "\f5ae"; } - -.fa-penny-arcade:before { - content: "\f704"; } - -.fa-people-carry:before { - content: "\f4ce"; } - -.fa-pepper-hot:before { - content: "\f816"; } - -.fa-percent:before { - content: "\f295"; } - -.fa-percentage:before { - content: "\f541"; } - -.fa-periscope:before { - content: "\f3da"; } - -.fa-person-booth:before { - content: "\f756"; } - -.fa-phabricator:before { - content: "\f3db"; } - -.fa-phoenix-framework:before { - content: "\f3dc"; } - -.fa-phoenix-squadron:before { - content: "\f511"; } - -.fa-phone:before { - content: "\f095"; } - -.fa-phone-slash:before { - content: "\f3dd"; } - -.fa-phone-square:before { - content: "\f098"; } - -.fa-phone-volume:before { - content: "\f2a0"; } - -.fa-php:before { - content: "\f457"; } - -.fa-pied-piper:before { - content: "\f2ae"; } - -.fa-pied-piper-alt:before { - content: "\f1a8"; } - -.fa-pied-piper-hat:before { - content: "\f4e5"; } - -.fa-pied-piper-pp:before { - content: "\f1a7"; } - -.fa-piggy-bank:before { - content: "\f4d3"; } - -.fa-pills:before { - content: "\f484"; } - -.fa-pinterest:before { - content: "\f0d2"; } - -.fa-pinterest-p:before { - content: "\f231"; } - -.fa-pinterest-square:before { - content: "\f0d3"; } - -.fa-pizza-slice:before { - content: "\f818"; } - -.fa-place-of-worship:before { - content: "\f67f"; } - -.fa-plane:before { - content: "\f072"; } - -.fa-plane-arrival:before { - content: "\f5af"; } - -.fa-plane-departure:before { - content: "\f5b0"; } - -.fa-play:before { - content: "\f04b"; } - -.fa-play-circle:before { - content: "\f144"; } - -.fa-playstation:before { - content: "\f3df"; } - -.fa-plug:before { - content: "\f1e6"; } - -.fa-plus:before { - content: "\f067"; } - -.fa-plus-circle:before { - content: "\f055"; } - -.fa-plus-square:before { - content: "\f0fe"; } - -.fa-podcast:before { - content: "\f2ce"; } - -.fa-poll:before { - content: "\f681"; } - -.fa-poll-h:before { - content: "\f682"; } - -.fa-poo:before { - content: "\f2fe"; } - -.fa-poo-storm:before { - content: "\f75a"; } - -.fa-poop:before { - content: "\f619"; } - -.fa-portrait:before { - content: "\f3e0"; } - -.fa-pound-sign:before { - content: "\f154"; } - -.fa-power-off:before { - content: "\f011"; } - -.fa-pray:before { - content: "\f683"; } - -.fa-praying-hands:before { - content: "\f684"; } - -.fa-prescription:before { - content: "\f5b1"; } - -.fa-prescription-bottle:before { - content: "\f485"; } - -.fa-prescription-bottle-alt:before { - content: "\f486"; } - -.fa-print:before { - content: "\f02f"; } - -.fa-procedures:before { - content: "\f487"; } - -.fa-product-hunt:before { - content: "\f288"; } - -.fa-project-diagram:before { - content: "\f542"; } - -.fa-pushed:before { - content: "\f3e1"; } - -.fa-puzzle-piece:before { - content: "\f12e"; } - -.fa-python:before { - content: "\f3e2"; } - -.fa-qq:before { - content: "\f1d6"; } - -.fa-qrcode:before { - content: "\f029"; } - -.fa-question:before { - content: "\f128"; } - -.fa-question-circle:before { - content: "\f059"; } - -.fa-quidditch:before { - content: "\f458"; } - -.fa-quinscape:before { - content: "\f459"; } - -.fa-quora:before { - content: "\f2c4"; } - -.fa-quote-left:before { - content: "\f10d"; } - -.fa-quote-right:before { - content: "\f10e"; } - -.fa-quran:before { - content: "\f687"; } - -.fa-r-project:before { - content: "\f4f7"; } - -.fa-radiation:before { - content: "\f7b9"; } - -.fa-radiation-alt:before { - content: "\f7ba"; } - -.fa-rainbow:before { - content: "\f75b"; } - -.fa-random:before { - content: "\f074"; } - -.fa-raspberry-pi:before { - content: "\f7bb"; } - -.fa-ravelry:before { - content: "\f2d9"; } - -.fa-react:before { - content: "\f41b"; } - -.fa-reacteurope:before { - content: "\f75d"; } - -.fa-readme:before { - content: "\f4d5"; } - -.fa-rebel:before { - content: "\f1d0"; } - -.fa-receipt:before { - content: "\f543"; } - -.fa-recycle:before { - content: "\f1b8"; } - -.fa-red-river:before { - content: "\f3e3"; } - -.fa-reddit:before { - content: "\f1a1"; } - -.fa-reddit-alien:before { - content: "\f281"; } - -.fa-reddit-square:before { - content: "\f1a2"; } - -.fa-redhat:before { - content: "\f7bc"; } - -.fa-redo:before { - content: "\f01e"; } - -.fa-redo-alt:before { - content: "\f2f9"; } - -.fa-registered:before { - content: "\f25d"; } - -.fa-renren:before { - content: "\f18b"; } - -.fa-reply:before { - content: "\f3e5"; } - -.fa-reply-all:before { - content: "\f122"; } - -.fa-replyd:before { - content: "\f3e6"; } - -.fa-republican:before { - content: "\f75e"; } - -.fa-researchgate:before { - content: "\f4f8"; } - -.fa-resolving:before { - content: "\f3e7"; } - -.fa-restroom:before { - content: "\f7bd"; } - -.fa-retweet:before { - content: "\f079"; } - -.fa-rev:before { - content: "\f5b2"; } - -.fa-ribbon:before { - content: "\f4d6"; } - -.fa-ring:before { - content: "\f70b"; } - -.fa-road:before { - content: "\f018"; } - -.fa-robot:before { - content: "\f544"; } - -.fa-rocket:before { - content: "\f135"; } - -.fa-rocketchat:before { - content: "\f3e8"; } - -.fa-rockrms:before { - content: "\f3e9"; } - -.fa-route:before { - content: "\f4d7"; } - -.fa-rss:before { - content: "\f09e"; } - -.fa-rss-square:before { - content: "\f143"; } - -.fa-ruble-sign:before { - content: "\f158"; } - -.fa-ruler:before { - content: "\f545"; } - -.fa-ruler-combined:before { - content: "\f546"; } - -.fa-ruler-horizontal:before { - content: "\f547"; } - -.fa-ruler-vertical:before { - content: "\f548"; } - -.fa-running:before { - content: "\f70c"; } - -.fa-rupee-sign:before { - content: "\f156"; } - -.fa-sad-cry:before { - content: "\f5b3"; } - -.fa-sad-tear:before { - content: "\f5b4"; } - -.fa-safari:before { - content: "\f267"; } - -.fa-sass:before { - content: "\f41e"; } - -.fa-satellite:before { - content: "\f7bf"; } - -.fa-satellite-dish:before { - content: "\f7c0"; } - -.fa-save:before { - content: "\f0c7"; } - -.fa-schlix:before { - content: "\f3ea"; } - -.fa-school:before { - content: "\f549"; } - -.fa-screwdriver:before { - content: "\f54a"; } - -.fa-scribd:before { - content: "\f28a"; } - -.fa-scroll:before { - content: "\f70e"; } - -.fa-sd-card:before { - content: "\f7c2"; } - -.fa-search:before { - content: "\f002"; } - -.fa-search-dollar:before { - content: "\f688"; } - -.fa-search-location:before { - content: "\f689"; } - -.fa-search-minus:before { - content: "\f010"; } - -.fa-search-plus:before { - content: "\f00e"; } - -.fa-searchengin:before { - content: "\f3eb"; } - -.fa-seedling:before { - content: "\f4d8"; } - -.fa-sellcast:before { - content: "\f2da"; } - -.fa-sellsy:before { - content: "\f213"; } - -.fa-server:before { - content: "\f233"; } - -.fa-servicestack:before { - content: "\f3ec"; } - -.fa-shapes:before { - content: "\f61f"; } - -.fa-share:before { - content: "\f064"; } - -.fa-share-alt:before { - content: "\f1e0"; } - -.fa-share-alt-square:before { - content: "\f1e1"; } - -.fa-share-square:before { - content: "\f14d"; } - -.fa-shekel-sign:before { - content: "\f20b"; } - -.fa-shield-alt:before { - content: "\f3ed"; } - -.fa-ship:before { - content: "\f21a"; } - -.fa-shipping-fast:before { - content: "\f48b"; } - -.fa-shirtsinbulk:before { - content: "\f214"; } - -.fa-shoe-prints:before { - content: "\f54b"; } - -.fa-shopping-bag:before { - content: "\f290"; } - -.fa-shopping-basket:before { - content: "\f291"; } - -.fa-shopping-cart:before { - content: "\f07a"; } - -.fa-shopware:before { - content: "\f5b5"; } - -.fa-shower:before { - content: "\f2cc"; } - -.fa-shuttle-van:before { - content: "\f5b6"; } - -.fa-sign:before { - content: "\f4d9"; } - -.fa-sign-in-alt:before { - content: "\f2f6"; } - -.fa-sign-language:before { - content: "\f2a7"; } - -.fa-sign-out-alt:before { - content: "\f2f5"; } - -.fa-signal:before { - content: "\f012"; } - -.fa-signature:before { - content: "\f5b7"; } - -.fa-sim-card:before { - content: "\f7c4"; } - -.fa-simplybuilt:before { - content: "\f215"; } - -.fa-sistrix:before { - content: "\f3ee"; } - -.fa-sitemap:before { - content: "\f0e8"; } - -.fa-sith:before { - content: "\f512"; } - -.fa-skating:before { - content: "\f7c5"; } - -.fa-sketch:before { - content: "\f7c6"; } - -.fa-skiing:before { - content: "\f7c9"; } - -.fa-skiing-nordic:before { - content: "\f7ca"; } - -.fa-skull:before { - content: "\f54c"; } - -.fa-skull-crossbones:before { - content: "\f714"; } - -.fa-skyatlas:before { - content: "\f216"; } - -.fa-skype:before { - content: "\f17e"; } - -.fa-slack:before { - content: "\f198"; } - -.fa-slack-hash:before { - content: "\f3ef"; } - -.fa-slash:before { - content: "\f715"; } - -.fa-sleigh:before { - content: "\f7cc"; } - -.fa-sliders-h:before { - content: "\f1de"; } - -.fa-slideshare:before { - content: "\f1e7"; } - -.fa-smile:before { - content: "\f118"; } - -.fa-smile-beam:before { - content: "\f5b8"; } - -.fa-smile-wink:before { - content: "\f4da"; } - -.fa-smog:before { - content: "\f75f"; } - -.fa-smoking:before { - content: "\f48d"; } - -.fa-smoking-ban:before { - content: "\f54d"; } - -.fa-sms:before { - content: "\f7cd"; } - -.fa-snapchat:before { - content: "\f2ab"; } - -.fa-snapchat-ghost:before { - content: "\f2ac"; } - -.fa-snapchat-square:before { - content: "\f2ad"; } - -.fa-snowboarding:before { - content: "\f7ce"; } - -.fa-snowflake:before { - content: "\f2dc"; } - -.fa-snowman:before { - content: "\f7d0"; } - -.fa-snowplow:before { - content: "\f7d2"; } - -.fa-socks:before { - content: "\f696"; } - -.fa-solar-panel:before { - content: "\f5ba"; } - -.fa-sort:before { - content: "\f0dc"; } - -.fa-sort-alpha-down:before { - content: "\f15d"; } - -.fa-sort-alpha-up:before { - content: "\f15e"; } - -.fa-sort-amount-down:before { - content: "\f160"; } - -.fa-sort-amount-up:before { - content: "\f161"; } - -.fa-sort-down:before { - content: "\f0dd"; } - -.fa-sort-numeric-down:before { - content: "\f162"; } - -.fa-sort-numeric-up:before { - content: "\f163"; } - -.fa-sort-up:before { - content: "\f0de"; } - -.fa-soundcloud:before { - content: "\f1be"; } - -.fa-sourcetree:before { - content: "\f7d3"; } - -.fa-spa:before { - content: "\f5bb"; } - -.fa-space-shuttle:before { - content: "\f197"; } - -.fa-speakap:before { - content: "\f3f3"; } - -.fa-spider:before { - content: "\f717"; } - -.fa-spinner:before { - content: "\f110"; } - -.fa-splotch:before { - content: "\f5bc"; } - -.fa-spotify:before { - content: "\f1bc"; } - -.fa-spray-can:before { - content: "\f5bd"; } - -.fa-square:before { - content: "\f0c8"; } - -.fa-square-full:before { - content: "\f45c"; } - -.fa-square-root-alt:before { - content: "\f698"; } - -.fa-squarespace:before { - content: "\f5be"; } - -.fa-stack-exchange:before { - content: "\f18d"; } - -.fa-stack-overflow:before { - content: "\f16c"; } - -.fa-stamp:before { - content: "\f5bf"; } - -.fa-star:before { - content: "\f005"; } - -.fa-star-and-crescent:before { - content: "\f699"; } - -.fa-star-half:before { - content: "\f089"; } - -.fa-star-half-alt:before { - content: "\f5c0"; } - -.fa-star-of-david:before { - content: "\f69a"; } - -.fa-star-of-life:before { - content: "\f621"; } - -.fa-staylinked:before { - content: "\f3f5"; } - -.fa-steam:before { - content: "\f1b6"; } - -.fa-steam-square:before { - content: "\f1b7"; } - -.fa-steam-symbol:before { - content: "\f3f6"; } - -.fa-step-backward:before { - content: "\f048"; } - -.fa-step-forward:before { - content: "\f051"; } - -.fa-stethoscope:before { - content: "\f0f1"; } - -.fa-sticker-mule:before { - content: "\f3f7"; } - -.fa-sticky-note:before { - content: "\f249"; } - -.fa-stop:before { - content: "\f04d"; } - -.fa-stop-circle:before { - content: "\f28d"; } - -.fa-stopwatch:before { - content: "\f2f2"; } - -.fa-store:before { - content: "\f54e"; } - -.fa-store-alt:before { - content: "\f54f"; } - -.fa-strava:before { - content: "\f428"; } - -.fa-stream:before { - content: "\f550"; } - -.fa-street-view:before { - content: "\f21d"; } - -.fa-strikethrough:before { - content: "\f0cc"; } - -.fa-stripe:before { - content: "\f429"; } - -.fa-stripe-s:before { - content: "\f42a"; } - -.fa-stroopwafel:before { - content: "\f551"; } - -.fa-studiovinari:before { - content: "\f3f8"; } - -.fa-stumbleupon:before { - content: "\f1a4"; } - -.fa-stumbleupon-circle:before { - content: "\f1a3"; } - -.fa-subscript:before { - content: "\f12c"; } - -.fa-subway:before { - content: "\f239"; } - -.fa-suitcase:before { - content: "\f0f2"; } - -.fa-suitcase-rolling:before { - content: "\f5c1"; } - -.fa-sun:before { - content: "\f185"; } - -.fa-superpowers:before { - content: "\f2dd"; } - -.fa-superscript:before { - content: "\f12b"; } - -.fa-supple:before { - content: "\f3f9"; } - -.fa-surprise:before { - content: "\f5c2"; } - -.fa-suse:before { - content: "\f7d6"; } - -.fa-swatchbook:before { - content: "\f5c3"; } - -.fa-swimmer:before { - content: "\f5c4"; } - -.fa-swimming-pool:before { - content: "\f5c5"; } - -.fa-synagogue:before { - content: "\f69b"; } - -.fa-sync:before { - content: "\f021"; } - -.fa-sync-alt:before { - content: "\f2f1"; } - -.fa-syringe:before { - content: "\f48e"; } - -.fa-table:before { - content: "\f0ce"; } - -.fa-table-tennis:before { - content: "\f45d"; } - -.fa-tablet:before { - content: "\f10a"; } - -.fa-tablet-alt:before { - content: "\f3fa"; } - -.fa-tablets:before { - content: "\f490"; } - -.fa-tachometer-alt:before { - content: "\f3fd"; } - -.fa-tag:before { - content: "\f02b"; } - -.fa-tags:before { - content: "\f02c"; } - -.fa-tape:before { - content: "\f4db"; } - -.fa-tasks:before { - content: "\f0ae"; } - -.fa-taxi:before { - content: "\f1ba"; } - -.fa-teamspeak:before { - content: "\f4f9"; } - -.fa-teeth:before { - content: "\f62e"; } - -.fa-teeth-open:before { - content: "\f62f"; } - -.fa-telegram:before { - content: "\f2c6"; } - -.fa-telegram-plane:before { - content: "\f3fe"; } - -.fa-temperature-high:before { - content: "\f769"; } - -.fa-temperature-low:before { - content: "\f76b"; } - -.fa-tencent-weibo:before { - content: "\f1d5"; } - -.fa-tenge:before { - content: "\f7d7"; } - -.fa-terminal:before { - content: "\f120"; } - -.fa-text-height:before { - content: "\f034"; } - -.fa-text-width:before { - content: "\f035"; } - -.fa-th:before { - content: "\f00a"; } - -.fa-th-large:before { - content: "\f009"; } - -.fa-th-list:before { - content: "\f00b"; } - -.fa-the-red-yeti:before { - content: "\f69d"; } - -.fa-theater-masks:before { - content: "\f630"; } - -.fa-themeco:before { - content: "\f5c6"; } - -.fa-themeisle:before { - content: "\f2b2"; } - -.fa-thermometer:before { - content: "\f491"; } - -.fa-thermometer-empty:before { - content: "\f2cb"; } - -.fa-thermometer-full:before { - content: "\f2c7"; } - -.fa-thermometer-half:before { - content: "\f2c9"; } - -.fa-thermometer-quarter:before { - content: "\f2ca"; } - -.fa-thermometer-three-quarters:before { - content: "\f2c8"; } - -.fa-think-peaks:before { - content: "\f731"; } - -.fa-thumbs-down:before { - content: "\f165"; } - -.fa-thumbs-up:before { - content: "\f164"; } - -.fa-thumbtack:before { - content: "\f08d"; } - -.fa-ticket-alt:before { - content: "\f3ff"; } - -.fa-times:before { - content: "\f00d"; } - -.fa-times-circle:before { - content: "\f057"; } - -.fa-tint:before { - content: "\f043"; } - -.fa-tint-slash:before { - content: "\f5c7"; } - -.fa-tired:before { - content: "\f5c8"; } - -.fa-toggle-off:before { - content: "\f204"; } - -.fa-toggle-on:before { - content: "\f205"; } - -.fa-toilet:before { - content: "\f7d8"; } - -.fa-toilet-paper:before { - content: "\f71e"; } - -.fa-toolbox:before { - content: "\f552"; } - -.fa-tools:before { - content: "\f7d9"; } - -.fa-tooth:before { - content: "\f5c9"; } - -.fa-torah:before { - content: "\f6a0"; } - -.fa-torii-gate:before { - content: "\f6a1"; } - -.fa-tractor:before { - content: "\f722"; } - -.fa-trade-federation:before { - content: "\f513"; } - -.fa-trademark:before { - content: "\f25c"; } - -.fa-traffic-light:before { - content: "\f637"; } - -.fa-train:before { - content: "\f238"; } - -.fa-tram:before { - content: "\f7da"; } - -.fa-transgender:before { - content: "\f224"; } - -.fa-transgender-alt:before { - content: "\f225"; } - -.fa-trash:before { - content: "\f1f8"; } - -.fa-trash-alt:before { - content: "\f2ed"; } - -.fa-trash-restore:before { - content: "\f829"; } - -.fa-trash-restore-alt:before { - content: "\f82a"; } - -.fa-tree:before { - content: "\f1bb"; } - -.fa-trello:before { - content: "\f181"; } - -.fa-tripadvisor:before { - content: "\f262"; } - -.fa-trophy:before { - content: "\f091"; } - -.fa-truck:before { - content: "\f0d1"; } - -.fa-truck-loading:before { - content: "\f4de"; } - -.fa-truck-monster:before { - content: "\f63b"; } - -.fa-truck-moving:before { - content: "\f4df"; } - -.fa-truck-pickup:before { - content: "\f63c"; } - -.fa-tshirt:before { - content: "\f553"; } - -.fa-tty:before { - content: "\f1e4"; } - -.fa-tumblr:before { - content: "\f173"; } - -.fa-tumblr-square:before { - content: "\f174"; } - -.fa-tv:before { - content: "\f26c"; } - -.fa-twitch:before { - content: "\f1e8"; } - -.fa-twitter:before { - content: "\f099"; } - -.fa-twitter-square:before { - content: "\f081"; } - -.fa-typo3:before { - content: "\f42b"; } - -.fa-uber:before { - content: "\f402"; } - -.fa-ubuntu:before { - content: "\f7df"; } - -.fa-uikit:before { - content: "\f403"; } - -.fa-umbrella:before { - content: "\f0e9"; } - -.fa-umbrella-beach:before { - content: "\f5ca"; } - -.fa-underline:before { - content: "\f0cd"; } - -.fa-undo:before { - content: "\f0e2"; } - -.fa-undo-alt:before { - content: "\f2ea"; } - -.fa-uniregistry:before { - content: "\f404"; } - -.fa-universal-access:before { - content: "\f29a"; } - -.fa-university:before { - content: "\f19c"; } - -.fa-unlink:before { - content: "\f127"; } - -.fa-unlock:before { - content: "\f09c"; } - -.fa-unlock-alt:before { - content: "\f13e"; } - -.fa-untappd:before { - content: "\f405"; } - -.fa-upload:before { - content: "\f093"; } - -.fa-ups:before { - content: "\f7e0"; } - -.fa-usb:before { - content: "\f287"; } - -.fa-user:before { - content: "\f007"; } - -.fa-user-alt:before { - content: "\f406"; } - -.fa-user-alt-slash:before { - content: "\f4fa"; } - -.fa-user-astronaut:before { - content: "\f4fb"; } - -.fa-user-check:before { - content: "\f4fc"; } - -.fa-user-circle:before { - content: "\f2bd"; } - -.fa-user-clock:before { - content: "\f4fd"; } - -.fa-user-cog:before { - content: "\f4fe"; } - -.fa-user-edit:before { - content: "\f4ff"; } - -.fa-user-friends:before { - content: "\f500"; } - -.fa-user-graduate:before { - content: "\f501"; } - -.fa-user-injured:before { - content: "\f728"; } - -.fa-user-lock:before { - content: "\f502"; } - -.fa-user-md:before { - content: "\f0f0"; } - -.fa-user-minus:before { - content: "\f503"; } - -.fa-user-ninja:before { - content: "\f504"; } - -.fa-user-nurse:before { - content: "\f82f"; } - -.fa-user-plus:before { - content: "\f234"; } - -.fa-user-secret:before { - content: "\f21b"; } - -.fa-user-shield:before { - content: "\f505"; } - -.fa-user-slash:before { - content: "\f506"; } - -.fa-user-tag:before { - content: "\f507"; } - -.fa-user-tie:before { - content: "\f508"; } - -.fa-user-times:before { - content: "\f235"; } - -.fa-users:before { - content: "\f0c0"; } - -.fa-users-cog:before { - content: "\f509"; } - -.fa-usps:before { - content: "\f7e1"; } - -.fa-ussunnah:before { - content: "\f407"; } - -.fa-utensil-spoon:before { - content: "\f2e5"; } - -.fa-utensils:before { - content: "\f2e7"; } - -.fa-vaadin:before { - content: "\f408"; } - -.fa-vector-square:before { - content: "\f5cb"; } - -.fa-venus:before { - content: "\f221"; } - -.fa-venus-double:before { - content: "\f226"; } - -.fa-venus-mars:before { - content: "\f228"; } - -.fa-viacoin:before { - content: "\f237"; } - -.fa-viadeo:before { - content: "\f2a9"; } - -.fa-viadeo-square:before { - content: "\f2aa"; } - -.fa-vial:before { - content: "\f492"; } - -.fa-vials:before { - content: "\f493"; } - -.fa-viber:before { - content: "\f409"; } - -.fa-video:before { - content: "\f03d"; } - -.fa-video-slash:before { - content: "\f4e2"; } - -.fa-vihara:before { - content: "\f6a7"; } - -.fa-vimeo:before { - content: "\f40a"; } - -.fa-vimeo-square:before { - content: "\f194"; } - -.fa-vimeo-v:before { - content: "\f27d"; } - -.fa-vine:before { - content: "\f1ca"; } - -.fa-vk:before { - content: "\f189"; } - -.fa-vnv:before { - content: "\f40b"; } - -.fa-volleyball-ball:before { - content: "\f45f"; } - -.fa-volume-down:before { - content: "\f027"; } - -.fa-volume-mute:before { - content: "\f6a9"; } - -.fa-volume-off:before { - content: "\f026"; } - -.fa-volume-up:before { - content: "\f028"; } - -.fa-vote-yea:before { - content: "\f772"; } - -.fa-vr-cardboard:before { - content: "\f729"; } - -.fa-vuejs:before { - content: "\f41f"; } - -.fa-walking:before { - content: "\f554"; } - -.fa-wallet:before { - content: "\f555"; } - -.fa-warehouse:before { - content: "\f494"; } - -.fa-water:before { - content: "\f773"; } - -.fa-weebly:before { - content: "\f5cc"; } - -.fa-weibo:before { - content: "\f18a"; } - -.fa-weight:before { - content: "\f496"; } - -.fa-weight-hanging:before { - content: "\f5cd"; } - -.fa-weixin:before { - content: "\f1d7"; } - -.fa-whatsapp:before { - content: "\f232"; } - -.fa-whatsapp-square:before { - content: "\f40c"; } - -.fa-wheelchair:before { - content: "\f193"; } - -.fa-whmcs:before { - content: "\f40d"; } - -.fa-wifi:before { - content: "\f1eb"; } - -.fa-wikipedia-w:before { - content: "\f266"; } - -.fa-wind:before { - content: "\f72e"; } - -.fa-window-close:before { - content: "\f410"; } - -.fa-window-maximize:before { - content: "\f2d0"; } - -.fa-window-minimize:before { - content: "\f2d1"; } - -.fa-window-restore:before { - content: "\f2d2"; } - -.fa-windows:before { - content: "\f17a"; } - -.fa-wine-bottle:before { - content: "\f72f"; } - -.fa-wine-glass:before { - content: "\f4e3"; } - -.fa-wine-glass-alt:before { - content: "\f5ce"; } - -.fa-wix:before { - content: "\f5cf"; } - -.fa-wizards-of-the-coast:before { - content: "\f730"; } - -.fa-wolf-pack-battalion:before { - content: "\f514"; } - -.fa-won-sign:before { - content: "\f159"; } - -.fa-wordpress:before { - content: "\f19a"; } - -.fa-wordpress-simple:before { - content: "\f411"; } - -.fa-wpbeginner:before { - content: "\f297"; } - -.fa-wpexplorer:before { - content: "\f2de"; } - -.fa-wpforms:before { - content: "\f298"; } - -.fa-wpressr:before { - content: "\f3e4"; } - -.fa-wrench:before { - content: "\f0ad"; } - -.fa-x-ray:before { - content: "\f497"; } - -.fa-xbox:before { - content: "\f412"; } - -.fa-xing:before { - content: "\f168"; } - -.fa-xing-square:before { - content: "\f169"; } - -.fa-y-combinator:before { - content: "\f23b"; } - -.fa-yahoo:before { - content: "\f19e"; } - -.fa-yandex:before { - content: "\f413"; } - -.fa-yandex-international:before { - content: "\f414"; } - -.fa-yarn:before { - content: "\f7e3"; } - -.fa-yelp:before { - content: "\f1e9"; } - -.fa-yen-sign:before { - content: "\f157"; } - -.fa-yin-yang:before { - content: "\f6ad"; } - -.fa-yoast:before { - content: "\f2b1"; } - -.fa-youtube:before { - content: "\f167"; } - -.fa-youtube-square:before { - content: "\f431"; } - -.fa-zhihu:before { - content: "\f63f"; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-style: normal; - font-weight: normal; - font-display: auto; - src: url("../webfonts/fa-brands-400.eot"); - src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } - -.fab { - font-family: 'Font Awesome 5 Brands'; } -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 400; - font-display: auto; - src: url("../webfonts/fa-regular-400.eot"); - src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } - -.far { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 900; - font-display: auto; - src: url("../webfonts/fa-solid-900.eot"); - src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; } diff --git a/shopyo/static/fontawesome/css/all.min.css b/shopyo/static/fontawesome/css/all.min.css deleted file mode 100644 index a74835e..0000000 --- a/shopyo/static/fontawesome/css/all.min.css +++ /dev/null @@ -1 +0,0 @@ -.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/brands.css b/shopyo/static/fontawesome/css/brands.css deleted file mode 100644 index 02bab51..0000000 --- a/shopyo/static/fontawesome/css/brands.css +++ /dev/null @@ -1,10 +0,0 @@ -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-style: normal; - font-weight: normal; - font-display: auto; - src: url("../webfonts/fa-brands-400.eot"); - src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); } - -.fab { - font-family: 'Font Awesome 5 Brands'; } diff --git a/shopyo/static/fontawesome/css/brands.min.css b/shopyo/static/fontawesome/css/brands.min.css deleted file mode 100644 index d3dfc46..0000000 --- a/shopyo/static/fontawesome/css/brands.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/fontawesome.css b/shopyo/static/fontawesome/css/fontawesome.css deleted file mode 100644 index 11a2914..0000000 --- a/shopyo/static/fontawesome/css/fontawesome.css +++ /dev/null @@ -1,4253 +0,0 @@ -.fa, -.fas, -.far, -.fal, -.fab { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; } - -.fa-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.fa-xs { - font-size: .75em; } - -.fa-sm { - font-size: .875em; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.fa-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.fa-pull-left { - float: left; } - -.fa-pull-right { - float: right; } - -.fa.fa-pull-left, -.fas.fa-pull-left, -.far.fa-pull-left, -.fal.fa-pull-left, -.fab.fa-pull-left { - margin-right: .3em; } - -.fa.fa-pull-right, -.fas.fa-pull-right, -.far.fa-pull-right, -.fal.fa-pull-right, -.fab.fa-pull-right { - margin-left: .3em; } - -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; } - -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); } - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical, -:root .fa-flip-both { - -webkit-filter: none; - filter: none; } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: #fff; } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ -.fa-500px:before { - content: "\f26e"; } - -.fa-accessible-icon:before { - content: "\f368"; } - -.fa-accusoft:before { - content: "\f369"; } - -.fa-acquisitions-incorporated:before { - content: "\f6af"; } - -.fa-ad:before { - content: "\f641"; } - -.fa-address-book:before { - content: "\f2b9"; } - -.fa-address-card:before { - content: "\f2bb"; } - -.fa-adjust:before { - content: "\f042"; } - -.fa-adn:before { - content: "\f170"; } - -.fa-adobe:before { - content: "\f778"; } - -.fa-adversal:before { - content: "\f36a"; } - -.fa-affiliatetheme:before { - content: "\f36b"; } - -.fa-air-freshener:before { - content: "\f5d0"; } - -.fa-algolia:before { - content: "\f36c"; } - -.fa-align-center:before { - content: "\f037"; } - -.fa-align-justify:before { - content: "\f039"; } - -.fa-align-left:before { - content: "\f036"; } - -.fa-align-right:before { - content: "\f038"; } - -.fa-alipay:before { - content: "\f642"; } - -.fa-allergies:before { - content: "\f461"; } - -.fa-amazon:before { - content: "\f270"; } - -.fa-amazon-pay:before { - content: "\f42c"; } - -.fa-ambulance:before { - content: "\f0f9"; } - -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; } - -.fa-amilia:before { - content: "\f36d"; } - -.fa-anchor:before { - content: "\f13d"; } - -.fa-android:before { - content: "\f17b"; } - -.fa-angellist:before { - content: "\f209"; } - -.fa-angle-double-down:before { - content: "\f103"; } - -.fa-angle-double-left:before { - content: "\f100"; } - -.fa-angle-double-right:before { - content: "\f101"; } - -.fa-angle-double-up:before { - content: "\f102"; } - -.fa-angle-down:before { - content: "\f107"; } - -.fa-angle-left:before { - content: "\f104"; } - -.fa-angle-right:before { - content: "\f105"; } - -.fa-angle-up:before { - content: "\f106"; } - -.fa-angry:before { - content: "\f556"; } - -.fa-angrycreative:before { - content: "\f36e"; } - -.fa-angular:before { - content: "\f420"; } - -.fa-ankh:before { - content: "\f644"; } - -.fa-app-store:before { - content: "\f36f"; } - -.fa-app-store-ios:before { - content: "\f370"; } - -.fa-apper:before { - content: "\f371"; } - -.fa-apple:before { - content: "\f179"; } - -.fa-apple-alt:before { - content: "\f5d1"; } - -.fa-apple-pay:before { - content: "\f415"; } - -.fa-archive:before { - content: "\f187"; } - -.fa-archway:before { - content: "\f557"; } - -.fa-arrow-alt-circle-down:before { - content: "\f358"; } - -.fa-arrow-alt-circle-left:before { - content: "\f359"; } - -.fa-arrow-alt-circle-right:before { - content: "\f35a"; } - -.fa-arrow-alt-circle-up:before { - content: "\f35b"; } - -.fa-arrow-circle-down:before { - content: "\f0ab"; } - -.fa-arrow-circle-left:before { - content: "\f0a8"; } - -.fa-arrow-circle-right:before { - content: "\f0a9"; } - -.fa-arrow-circle-up:before { - content: "\f0aa"; } - -.fa-arrow-down:before { - content: "\f063"; } - -.fa-arrow-left:before { - content: "\f060"; } - -.fa-arrow-right:before { - content: "\f061"; } - -.fa-arrow-up:before { - content: "\f062"; } - -.fa-arrows-alt:before { - content: "\f0b2"; } - -.fa-arrows-alt-h:before { - content: "\f337"; } - -.fa-arrows-alt-v:before { - content: "\f338"; } - -.fa-artstation:before { - content: "\f77a"; } - -.fa-assistive-listening-systems:before { - content: "\f2a2"; } - -.fa-asterisk:before { - content: "\f069"; } - -.fa-asymmetrik:before { - content: "\f372"; } - -.fa-at:before { - content: "\f1fa"; } - -.fa-atlas:before { - content: "\f558"; } - -.fa-atlassian:before { - content: "\f77b"; } - -.fa-atom:before { - content: "\f5d2"; } - -.fa-audible:before { - content: "\f373"; } - -.fa-audio-description:before { - content: "\f29e"; } - -.fa-autoprefixer:before { - content: "\f41c"; } - -.fa-avianex:before { - content: "\f374"; } - -.fa-aviato:before { - content: "\f421"; } - -.fa-award:before { - content: "\f559"; } - -.fa-aws:before { - content: "\f375"; } - -.fa-baby:before { - content: "\f77c"; } - -.fa-baby-carriage:before { - content: "\f77d"; } - -.fa-backspace:before { - content: "\f55a"; } - -.fa-backward:before { - content: "\f04a"; } - -.fa-bacon:before { - content: "\f7e5"; } - -.fa-balance-scale:before { - content: "\f24e"; } - -.fa-ban:before { - content: "\f05e"; } - -.fa-band-aid:before { - content: "\f462"; } - -.fa-bandcamp:before { - content: "\f2d5"; } - -.fa-barcode:before { - content: "\f02a"; } - -.fa-bars:before { - content: "\f0c9"; } - -.fa-baseball-ball:before { - content: "\f433"; } - -.fa-basketball-ball:before { - content: "\f434"; } - -.fa-bath:before { - content: "\f2cd"; } - -.fa-battery-empty:before { - content: "\f244"; } - -.fa-battery-full:before { - content: "\f240"; } - -.fa-battery-half:before { - content: "\f242"; } - -.fa-battery-quarter:before { - content: "\f243"; } - -.fa-battery-three-quarters:before { - content: "\f241"; } - -.fa-bed:before { - content: "\f236"; } - -.fa-beer:before { - content: "\f0fc"; } - -.fa-behance:before { - content: "\f1b4"; } - -.fa-behance-square:before { - content: "\f1b5"; } - -.fa-bell:before { - content: "\f0f3"; } - -.fa-bell-slash:before { - content: "\f1f6"; } - -.fa-bezier-curve:before { - content: "\f55b"; } - -.fa-bible:before { - content: "\f647"; } - -.fa-bicycle:before { - content: "\f206"; } - -.fa-bimobject:before { - content: "\f378"; } - -.fa-binoculars:before { - content: "\f1e5"; } - -.fa-biohazard:before { - content: "\f780"; } - -.fa-birthday-cake:before { - content: "\f1fd"; } - -.fa-bitbucket:before { - content: "\f171"; } - -.fa-bitcoin:before { - content: "\f379"; } - -.fa-bity:before { - content: "\f37a"; } - -.fa-black-tie:before { - content: "\f27e"; } - -.fa-blackberry:before { - content: "\f37b"; } - -.fa-blender:before { - content: "\f517"; } - -.fa-blender-phone:before { - content: "\f6b6"; } - -.fa-blind:before { - content: "\f29d"; } - -.fa-blog:before { - content: "\f781"; } - -.fa-blogger:before { - content: "\f37c"; } - -.fa-blogger-b:before { - content: "\f37d"; } - -.fa-bluetooth:before { - content: "\f293"; } - -.fa-bluetooth-b:before { - content: "\f294"; } - -.fa-bold:before { - content: "\f032"; } - -.fa-bolt:before { - content: "\f0e7"; } - -.fa-bomb:before { - content: "\f1e2"; } - -.fa-bone:before { - content: "\f5d7"; } - -.fa-bong:before { - content: "\f55c"; } - -.fa-book:before { - content: "\f02d"; } - -.fa-book-dead:before { - content: "\f6b7"; } - -.fa-book-medical:before { - content: "\f7e6"; } - -.fa-book-open:before { - content: "\f518"; } - -.fa-book-reader:before { - content: "\f5da"; } - -.fa-bookmark:before { - content: "\f02e"; } - -.fa-bowling-ball:before { - content: "\f436"; } - -.fa-box:before { - content: "\f466"; } - -.fa-box-open:before { - content: "\f49e"; } - -.fa-boxes:before { - content: "\f468"; } - -.fa-braille:before { - content: "\f2a1"; } - -.fa-brain:before { - content: "\f5dc"; } - -.fa-bread-slice:before { - content: "\f7ec"; } - -.fa-briefcase:before { - content: "\f0b1"; } - -.fa-briefcase-medical:before { - content: "\f469"; } - -.fa-broadcast-tower:before { - content: "\f519"; } - -.fa-broom:before { - content: "\f51a"; } - -.fa-brush:before { - content: "\f55d"; } - -.fa-btc:before { - content: "\f15a"; } - -.fa-bug:before { - content: "\f188"; } - -.fa-building:before { - content: "\f1ad"; } - -.fa-bullhorn:before { - content: "\f0a1"; } - -.fa-bullseye:before { - content: "\f140"; } - -.fa-burn:before { - content: "\f46a"; } - -.fa-buromobelexperte:before { - content: "\f37f"; } - -.fa-bus:before { - content: "\f207"; } - -.fa-bus-alt:before { - content: "\f55e"; } - -.fa-business-time:before { - content: "\f64a"; } - -.fa-buysellads:before { - content: "\f20d"; } - -.fa-calculator:before { - content: "\f1ec"; } - -.fa-calendar:before { - content: "\f133"; } - -.fa-calendar-alt:before { - content: "\f073"; } - -.fa-calendar-check:before { - content: "\f274"; } - -.fa-calendar-day:before { - content: "\f783"; } - -.fa-calendar-minus:before { - content: "\f272"; } - -.fa-calendar-plus:before { - content: "\f271"; } - -.fa-calendar-times:before { - content: "\f273"; } - -.fa-calendar-week:before { - content: "\f784"; } - -.fa-camera:before { - content: "\f030"; } - -.fa-camera-retro:before { - content: "\f083"; } - -.fa-campground:before { - content: "\f6bb"; } - -.fa-canadian-maple-leaf:before { - content: "\f785"; } - -.fa-candy-cane:before { - content: "\f786"; } - -.fa-cannabis:before { - content: "\f55f"; } - -.fa-capsules:before { - content: "\f46b"; } - -.fa-car:before { - content: "\f1b9"; } - -.fa-car-alt:before { - content: "\f5de"; } - -.fa-car-battery:before { - content: "\f5df"; } - -.fa-car-crash:before { - content: "\f5e1"; } - -.fa-car-side:before { - content: "\f5e4"; } - -.fa-caret-down:before { - content: "\f0d7"; } - -.fa-caret-left:before { - content: "\f0d9"; } - -.fa-caret-right:before { - content: "\f0da"; } - -.fa-caret-square-down:before { - content: "\f150"; } - -.fa-caret-square-left:before { - content: "\f191"; } - -.fa-caret-square-right:before { - content: "\f152"; } - -.fa-caret-square-up:before { - content: "\f151"; } - -.fa-caret-up:before { - content: "\f0d8"; } - -.fa-carrot:before { - content: "\f787"; } - -.fa-cart-arrow-down:before { - content: "\f218"; } - -.fa-cart-plus:before { - content: "\f217"; } - -.fa-cash-register:before { - content: "\f788"; } - -.fa-cat:before { - content: "\f6be"; } - -.fa-cc-amazon-pay:before { - content: "\f42d"; } - -.fa-cc-amex:before { - content: "\f1f3"; } - -.fa-cc-apple-pay:before { - content: "\f416"; } - -.fa-cc-diners-club:before { - content: "\f24c"; } - -.fa-cc-discover:before { - content: "\f1f2"; } - -.fa-cc-jcb:before { - content: "\f24b"; } - -.fa-cc-mastercard:before { - content: "\f1f1"; } - -.fa-cc-paypal:before { - content: "\f1f4"; } - -.fa-cc-stripe:before { - content: "\f1f5"; } - -.fa-cc-visa:before { - content: "\f1f0"; } - -.fa-centercode:before { - content: "\f380"; } - -.fa-centos:before { - content: "\f789"; } - -.fa-certificate:before { - content: "\f0a3"; } - -.fa-chair:before { - content: "\f6c0"; } - -.fa-chalkboard:before { - content: "\f51b"; } - -.fa-chalkboard-teacher:before { - content: "\f51c"; } - -.fa-charging-station:before { - content: "\f5e7"; } - -.fa-chart-area:before { - content: "\f1fe"; } - -.fa-chart-bar:before { - content: "\f080"; } - -.fa-chart-line:before { - content: "\f201"; } - -.fa-chart-pie:before { - content: "\f200"; } - -.fa-check:before { - content: "\f00c"; } - -.fa-check-circle:before { - content: "\f058"; } - -.fa-check-double:before { - content: "\f560"; } - -.fa-check-square:before { - content: "\f14a"; } - -.fa-cheese:before { - content: "\f7ef"; } - -.fa-chess:before { - content: "\f439"; } - -.fa-chess-bishop:before { - content: "\f43a"; } - -.fa-chess-board:before { - content: "\f43c"; } - -.fa-chess-king:before { - content: "\f43f"; } - -.fa-chess-knight:before { - content: "\f441"; } - -.fa-chess-pawn:before { - content: "\f443"; } - -.fa-chess-queen:before { - content: "\f445"; } - -.fa-chess-rook:before { - content: "\f447"; } - -.fa-chevron-circle-down:before { - content: "\f13a"; } - -.fa-chevron-circle-left:before { - content: "\f137"; } - -.fa-chevron-circle-right:before { - content: "\f138"; } - -.fa-chevron-circle-up:before { - content: "\f139"; } - -.fa-chevron-down:before { - content: "\f078"; } - -.fa-chevron-left:before { - content: "\f053"; } - -.fa-chevron-right:before { - content: "\f054"; } - -.fa-chevron-up:before { - content: "\f077"; } - -.fa-child:before { - content: "\f1ae"; } - -.fa-chrome:before { - content: "\f268"; } - -.fa-church:before { - content: "\f51d"; } - -.fa-circle:before { - content: "\f111"; } - -.fa-circle-notch:before { - content: "\f1ce"; } - -.fa-city:before { - content: "\f64f"; } - -.fa-clinic-medical:before { - content: "\f7f2"; } - -.fa-clipboard:before { - content: "\f328"; } - -.fa-clipboard-check:before { - content: "\f46c"; } - -.fa-clipboard-list:before { - content: "\f46d"; } - -.fa-clock:before { - content: "\f017"; } - -.fa-clone:before { - content: "\f24d"; } - -.fa-closed-captioning:before { - content: "\f20a"; } - -.fa-cloud:before { - content: "\f0c2"; } - -.fa-cloud-download-alt:before { - content: "\f381"; } - -.fa-cloud-meatball:before { - content: "\f73b"; } - -.fa-cloud-moon:before { - content: "\f6c3"; } - -.fa-cloud-moon-rain:before { - content: "\f73c"; } - -.fa-cloud-rain:before { - content: "\f73d"; } - -.fa-cloud-showers-heavy:before { - content: "\f740"; } - -.fa-cloud-sun:before { - content: "\f6c4"; } - -.fa-cloud-sun-rain:before { - content: "\f743"; } - -.fa-cloud-upload-alt:before { - content: "\f382"; } - -.fa-cloudscale:before { - content: "\f383"; } - -.fa-cloudsmith:before { - content: "\f384"; } - -.fa-cloudversify:before { - content: "\f385"; } - -.fa-cocktail:before { - content: "\f561"; } - -.fa-code:before { - content: "\f121"; } - -.fa-code-branch:before { - content: "\f126"; } - -.fa-codepen:before { - content: "\f1cb"; } - -.fa-codiepie:before { - content: "\f284"; } - -.fa-coffee:before { - content: "\f0f4"; } - -.fa-cog:before { - content: "\f013"; } - -.fa-cogs:before { - content: "\f085"; } - -.fa-coins:before { - content: "\f51e"; } - -.fa-columns:before { - content: "\f0db"; } - -.fa-comment:before { - content: "\f075"; } - -.fa-comment-alt:before { - content: "\f27a"; } - -.fa-comment-dollar:before { - content: "\f651"; } - -.fa-comment-dots:before { - content: "\f4ad"; } - -.fa-comment-medical:before { - content: "\f7f5"; } - -.fa-comment-slash:before { - content: "\f4b3"; } - -.fa-comments:before { - content: "\f086"; } - -.fa-comments-dollar:before { - content: "\f653"; } - -.fa-compact-disc:before { - content: "\f51f"; } - -.fa-compass:before { - content: "\f14e"; } - -.fa-compress:before { - content: "\f066"; } - -.fa-compress-arrows-alt:before { - content: "\f78c"; } - -.fa-concierge-bell:before { - content: "\f562"; } - -.fa-confluence:before { - content: "\f78d"; } - -.fa-connectdevelop:before { - content: "\f20e"; } - -.fa-contao:before { - content: "\f26d"; } - -.fa-cookie:before { - content: "\f563"; } - -.fa-cookie-bite:before { - content: "\f564"; } - -.fa-copy:before { - content: "\f0c5"; } - -.fa-copyright:before { - content: "\f1f9"; } - -.fa-couch:before { - content: "\f4b8"; } - -.fa-cpanel:before { - content: "\f388"; } - -.fa-creative-commons:before { - content: "\f25e"; } - -.fa-creative-commons-by:before { - content: "\f4e7"; } - -.fa-creative-commons-nc:before { - content: "\f4e8"; } - -.fa-creative-commons-nc-eu:before { - content: "\f4e9"; } - -.fa-creative-commons-nc-jp:before { - content: "\f4ea"; } - -.fa-creative-commons-nd:before { - content: "\f4eb"; } - -.fa-creative-commons-pd:before { - content: "\f4ec"; } - -.fa-creative-commons-pd-alt:before { - content: "\f4ed"; } - -.fa-creative-commons-remix:before { - content: "\f4ee"; } - -.fa-creative-commons-sa:before { - content: "\f4ef"; } - -.fa-creative-commons-sampling:before { - content: "\f4f0"; } - -.fa-creative-commons-sampling-plus:before { - content: "\f4f1"; } - -.fa-creative-commons-share:before { - content: "\f4f2"; } - -.fa-creative-commons-zero:before { - content: "\f4f3"; } - -.fa-credit-card:before { - content: "\f09d"; } - -.fa-critical-role:before { - content: "\f6c9"; } - -.fa-crop:before { - content: "\f125"; } - -.fa-crop-alt:before { - content: "\f565"; } - -.fa-cross:before { - content: "\f654"; } - -.fa-crosshairs:before { - content: "\f05b"; } - -.fa-crow:before { - content: "\f520"; } - -.fa-crown:before { - content: "\f521"; } - -.fa-crutch:before { - content: "\f7f7"; } - -.fa-css3:before { - content: "\f13c"; } - -.fa-css3-alt:before { - content: "\f38b"; } - -.fa-cube:before { - content: "\f1b2"; } - -.fa-cubes:before { - content: "\f1b3"; } - -.fa-cut:before { - content: "\f0c4"; } - -.fa-cuttlefish:before { - content: "\f38c"; } - -.fa-d-and-d:before { - content: "\f38d"; } - -.fa-d-and-d-beyond:before { - content: "\f6ca"; } - -.fa-dashcube:before { - content: "\f210"; } - -.fa-database:before { - content: "\f1c0"; } - -.fa-deaf:before { - content: "\f2a4"; } - -.fa-delicious:before { - content: "\f1a5"; } - -.fa-democrat:before { - content: "\f747"; } - -.fa-deploydog:before { - content: "\f38e"; } - -.fa-deskpro:before { - content: "\f38f"; } - -.fa-desktop:before { - content: "\f108"; } - -.fa-dev:before { - content: "\f6cc"; } - -.fa-deviantart:before { - content: "\f1bd"; } - -.fa-dharmachakra:before { - content: "\f655"; } - -.fa-dhl:before { - content: "\f790"; } - -.fa-diagnoses:before { - content: "\f470"; } - -.fa-diaspora:before { - content: "\f791"; } - -.fa-dice:before { - content: "\f522"; } - -.fa-dice-d20:before { - content: "\f6cf"; } - -.fa-dice-d6:before { - content: "\f6d1"; } - -.fa-dice-five:before { - content: "\f523"; } - -.fa-dice-four:before { - content: "\f524"; } - -.fa-dice-one:before { - content: "\f525"; } - -.fa-dice-six:before { - content: "\f526"; } - -.fa-dice-three:before { - content: "\f527"; } - -.fa-dice-two:before { - content: "\f528"; } - -.fa-digg:before { - content: "\f1a6"; } - -.fa-digital-ocean:before { - content: "\f391"; } - -.fa-digital-tachograph:before { - content: "\f566"; } - -.fa-directions:before { - content: "\f5eb"; } - -.fa-discord:before { - content: "\f392"; } - -.fa-discourse:before { - content: "\f393"; } - -.fa-divide:before { - content: "\f529"; } - -.fa-dizzy:before { - content: "\f567"; } - -.fa-dna:before { - content: "\f471"; } - -.fa-dochub:before { - content: "\f394"; } - -.fa-docker:before { - content: "\f395"; } - -.fa-dog:before { - content: "\f6d3"; } - -.fa-dollar-sign:before { - content: "\f155"; } - -.fa-dolly:before { - content: "\f472"; } - -.fa-dolly-flatbed:before { - content: "\f474"; } - -.fa-donate:before { - content: "\f4b9"; } - -.fa-door-closed:before { - content: "\f52a"; } - -.fa-door-open:before { - content: "\f52b"; } - -.fa-dot-circle:before { - content: "\f192"; } - -.fa-dove:before { - content: "\f4ba"; } - -.fa-download:before { - content: "\f019"; } - -.fa-draft2digital:before { - content: "\f396"; } - -.fa-drafting-compass:before { - content: "\f568"; } - -.fa-dragon:before { - content: "\f6d5"; } - -.fa-draw-polygon:before { - content: "\f5ee"; } - -.fa-dribbble:before { - content: "\f17d"; } - -.fa-dribbble-square:before { - content: "\f397"; } - -.fa-dropbox:before { - content: "\f16b"; } - -.fa-drum:before { - content: "\f569"; } - -.fa-drum-steelpan:before { - content: "\f56a"; } - -.fa-drumstick-bite:before { - content: "\f6d7"; } - -.fa-drupal:before { - content: "\f1a9"; } - -.fa-dumbbell:before { - content: "\f44b"; } - -.fa-dumpster:before { - content: "\f793"; } - -.fa-dumpster-fire:before { - content: "\f794"; } - -.fa-dungeon:before { - content: "\f6d9"; } - -.fa-dyalog:before { - content: "\f399"; } - -.fa-earlybirds:before { - content: "\f39a"; } - -.fa-ebay:before { - content: "\f4f4"; } - -.fa-edge:before { - content: "\f282"; } - -.fa-edit:before { - content: "\f044"; } - -.fa-egg:before { - content: "\f7fb"; } - -.fa-eject:before { - content: "\f052"; } - -.fa-elementor:before { - content: "\f430"; } - -.fa-ellipsis-h:before { - content: "\f141"; } - -.fa-ellipsis-v:before { - content: "\f142"; } - -.fa-ello:before { - content: "\f5f1"; } - -.fa-ember:before { - content: "\f423"; } - -.fa-empire:before { - content: "\f1d1"; } - -.fa-envelope:before { - content: "\f0e0"; } - -.fa-envelope-open:before { - content: "\f2b6"; } - -.fa-envelope-open-text:before { - content: "\f658"; } - -.fa-envelope-square:before { - content: "\f199"; } - -.fa-envira:before { - content: "\f299"; } - -.fa-equals:before { - content: "\f52c"; } - -.fa-eraser:before { - content: "\f12d"; } - -.fa-erlang:before { - content: "\f39d"; } - -.fa-ethereum:before { - content: "\f42e"; } - -.fa-ethernet:before { - content: "\f796"; } - -.fa-etsy:before { - content: "\f2d7"; } - -.fa-euro-sign:before { - content: "\f153"; } - -.fa-exchange-alt:before { - content: "\f362"; } - -.fa-exclamation:before { - content: "\f12a"; } - -.fa-exclamation-circle:before { - content: "\f06a"; } - -.fa-exclamation-triangle:before { - content: "\f071"; } - -.fa-expand:before { - content: "\f065"; } - -.fa-expand-arrows-alt:before { - content: "\f31e"; } - -.fa-expeditedssl:before { - content: "\f23e"; } - -.fa-external-link-alt:before { - content: "\f35d"; } - -.fa-external-link-square-alt:before { - content: "\f360"; } - -.fa-eye:before { - content: "\f06e"; } - -.fa-eye-dropper:before { - content: "\f1fb"; } - -.fa-eye-slash:before { - content: "\f070"; } - -.fa-facebook:before { - content: "\f09a"; } - -.fa-facebook-f:before { - content: "\f39e"; } - -.fa-facebook-messenger:before { - content: "\f39f"; } - -.fa-facebook-square:before { - content: "\f082"; } - -.fa-fantasy-flight-games:before { - content: "\f6dc"; } - -.fa-fast-backward:before { - content: "\f049"; } - -.fa-fast-forward:before { - content: "\f050"; } - -.fa-fax:before { - content: "\f1ac"; } - -.fa-feather:before { - content: "\f52d"; } - -.fa-feather-alt:before { - content: "\f56b"; } - -.fa-fedex:before { - content: "\f797"; } - -.fa-fedora:before { - content: "\f798"; } - -.fa-female:before { - content: "\f182"; } - -.fa-fighter-jet:before { - content: "\f0fb"; } - -.fa-figma:before { - content: "\f799"; } - -.fa-file:before { - content: "\f15b"; } - -.fa-file-alt:before { - content: "\f15c"; } - -.fa-file-archive:before { - content: "\f1c6"; } - -.fa-file-audio:before { - content: "\f1c7"; } - -.fa-file-code:before { - content: "\f1c9"; } - -.fa-file-contract:before { - content: "\f56c"; } - -.fa-file-csv:before { - content: "\f6dd"; } - -.fa-file-download:before { - content: "\f56d"; } - -.fa-file-excel:before { - content: "\f1c3"; } - -.fa-file-export:before { - content: "\f56e"; } - -.fa-file-image:before { - content: "\f1c5"; } - -.fa-file-import:before { - content: "\f56f"; } - -.fa-file-invoice:before { - content: "\f570"; } - -.fa-file-invoice-dollar:before { - content: "\f571"; } - -.fa-file-medical:before { - content: "\f477"; } - -.fa-file-medical-alt:before { - content: "\f478"; } - -.fa-file-pdf:before { - content: "\f1c1"; } - -.fa-file-powerpoint:before { - content: "\f1c4"; } - -.fa-file-prescription:before { - content: "\f572"; } - -.fa-file-signature:before { - content: "\f573"; } - -.fa-file-upload:before { - content: "\f574"; } - -.fa-file-video:before { - content: "\f1c8"; } - -.fa-file-word:before { - content: "\f1c2"; } - -.fa-fill:before { - content: "\f575"; } - -.fa-fill-drip:before { - content: "\f576"; } - -.fa-film:before { - content: "\f008"; } - -.fa-filter:before { - content: "\f0b0"; } - -.fa-fingerprint:before { - content: "\f577"; } - -.fa-fire:before { - content: "\f06d"; } - -.fa-fire-alt:before { - content: "\f7e4"; } - -.fa-fire-extinguisher:before { - content: "\f134"; } - -.fa-firefox:before { - content: "\f269"; } - -.fa-first-aid:before { - content: "\f479"; } - -.fa-first-order:before { - content: "\f2b0"; } - -.fa-first-order-alt:before { - content: "\f50a"; } - -.fa-firstdraft:before { - content: "\f3a1"; } - -.fa-fish:before { - content: "\f578"; } - -.fa-fist-raised:before { - content: "\f6de"; } - -.fa-flag:before { - content: "\f024"; } - -.fa-flag-checkered:before { - content: "\f11e"; } - -.fa-flag-usa:before { - content: "\f74d"; } - -.fa-flask:before { - content: "\f0c3"; } - -.fa-flickr:before { - content: "\f16e"; } - -.fa-flipboard:before { - content: "\f44d"; } - -.fa-flushed:before { - content: "\f579"; } - -.fa-fly:before { - content: "\f417"; } - -.fa-folder:before { - content: "\f07b"; } - -.fa-folder-minus:before { - content: "\f65d"; } - -.fa-folder-open:before { - content: "\f07c"; } - -.fa-folder-plus:before { - content: "\f65e"; } - -.fa-font:before { - content: "\f031"; } - -.fa-font-awesome:before { - content: "\f2b4"; } - -.fa-font-awesome-alt:before { - content: "\f35c"; } - -.fa-font-awesome-flag:before { - content: "\f425"; } - -.fa-font-awesome-logo-full:before { - content: "\f4e6"; } - -.fa-fonticons:before { - content: "\f280"; } - -.fa-fonticons-fi:before { - content: "\f3a2"; } - -.fa-football-ball:before { - content: "\f44e"; } - -.fa-fort-awesome:before { - content: "\f286"; } - -.fa-fort-awesome-alt:before { - content: "\f3a3"; } - -.fa-forumbee:before { - content: "\f211"; } - -.fa-forward:before { - content: "\f04e"; } - -.fa-foursquare:before { - content: "\f180"; } - -.fa-free-code-camp:before { - content: "\f2c5"; } - -.fa-freebsd:before { - content: "\f3a4"; } - -.fa-frog:before { - content: "\f52e"; } - -.fa-frown:before { - content: "\f119"; } - -.fa-frown-open:before { - content: "\f57a"; } - -.fa-fulcrum:before { - content: "\f50b"; } - -.fa-funnel-dollar:before { - content: "\f662"; } - -.fa-futbol:before { - content: "\f1e3"; } - -.fa-galactic-republic:before { - content: "\f50c"; } - -.fa-galactic-senate:before { - content: "\f50d"; } - -.fa-gamepad:before { - content: "\f11b"; } - -.fa-gas-pump:before { - content: "\f52f"; } - -.fa-gavel:before { - content: "\f0e3"; } - -.fa-gem:before { - content: "\f3a5"; } - -.fa-genderless:before { - content: "\f22d"; } - -.fa-get-pocket:before { - content: "\f265"; } - -.fa-gg:before { - content: "\f260"; } - -.fa-gg-circle:before { - content: "\f261"; } - -.fa-ghost:before { - content: "\f6e2"; } - -.fa-gift:before { - content: "\f06b"; } - -.fa-gifts:before { - content: "\f79c"; } - -.fa-git:before { - content: "\f1d3"; } - -.fa-git-square:before { - content: "\f1d2"; } - -.fa-github:before { - content: "\f09b"; } - -.fa-github-alt:before { - content: "\f113"; } - -.fa-github-square:before { - content: "\f092"; } - -.fa-gitkraken:before { - content: "\f3a6"; } - -.fa-gitlab:before { - content: "\f296"; } - -.fa-gitter:before { - content: "\f426"; } - -.fa-glass-cheers:before { - content: "\f79f"; } - -.fa-glass-martini:before { - content: "\f000"; } - -.fa-glass-martini-alt:before { - content: "\f57b"; } - -.fa-glass-whiskey:before { - content: "\f7a0"; } - -.fa-glasses:before { - content: "\f530"; } - -.fa-glide:before { - content: "\f2a5"; } - -.fa-glide-g:before { - content: "\f2a6"; } - -.fa-globe:before { - content: "\f0ac"; } - -.fa-globe-africa:before { - content: "\f57c"; } - -.fa-globe-americas:before { - content: "\f57d"; } - -.fa-globe-asia:before { - content: "\f57e"; } - -.fa-globe-europe:before { - content: "\f7a2"; } - -.fa-gofore:before { - content: "\f3a7"; } - -.fa-golf-ball:before { - content: "\f450"; } - -.fa-goodreads:before { - content: "\f3a8"; } - -.fa-goodreads-g:before { - content: "\f3a9"; } - -.fa-google:before { - content: "\f1a0"; } - -.fa-google-drive:before { - content: "\f3aa"; } - -.fa-google-play:before { - content: "\f3ab"; } - -.fa-google-plus:before { - content: "\f2b3"; } - -.fa-google-plus-g:before { - content: "\f0d5"; } - -.fa-google-plus-square:before { - content: "\f0d4"; } - -.fa-google-wallet:before { - content: "\f1ee"; } - -.fa-gopuram:before { - content: "\f664"; } - -.fa-graduation-cap:before { - content: "\f19d"; } - -.fa-gratipay:before { - content: "\f184"; } - -.fa-grav:before { - content: "\f2d6"; } - -.fa-greater-than:before { - content: "\f531"; } - -.fa-greater-than-equal:before { - content: "\f532"; } - -.fa-grimace:before { - content: "\f57f"; } - -.fa-grin:before { - content: "\f580"; } - -.fa-grin-alt:before { - content: "\f581"; } - -.fa-grin-beam:before { - content: "\f582"; } - -.fa-grin-beam-sweat:before { - content: "\f583"; } - -.fa-grin-hearts:before { - content: "\f584"; } - -.fa-grin-squint:before { - content: "\f585"; } - -.fa-grin-squint-tears:before { - content: "\f586"; } - -.fa-grin-stars:before { - content: "\f587"; } - -.fa-grin-tears:before { - content: "\f588"; } - -.fa-grin-tongue:before { - content: "\f589"; } - -.fa-grin-tongue-squint:before { - content: "\f58a"; } - -.fa-grin-tongue-wink:before { - content: "\f58b"; } - -.fa-grin-wink:before { - content: "\f58c"; } - -.fa-grip-horizontal:before { - content: "\f58d"; } - -.fa-grip-lines:before { - content: "\f7a4"; } - -.fa-grip-lines-vertical:before { - content: "\f7a5"; } - -.fa-grip-vertical:before { - content: "\f58e"; } - -.fa-gripfire:before { - content: "\f3ac"; } - -.fa-grunt:before { - content: "\f3ad"; } - -.fa-guitar:before { - content: "\f7a6"; } - -.fa-gulp:before { - content: "\f3ae"; } - -.fa-h-square:before { - content: "\f0fd"; } - -.fa-hacker-news:before { - content: "\f1d4"; } - -.fa-hacker-news-square:before { - content: "\f3af"; } - -.fa-hackerrank:before { - content: "\f5f7"; } - -.fa-hamburger:before { - content: "\f805"; } - -.fa-hammer:before { - content: "\f6e3"; } - -.fa-hamsa:before { - content: "\f665"; } - -.fa-hand-holding:before { - content: "\f4bd"; } - -.fa-hand-holding-heart:before { - content: "\f4be"; } - -.fa-hand-holding-usd:before { - content: "\f4c0"; } - -.fa-hand-lizard:before { - content: "\f258"; } - -.fa-hand-middle-finger:before { - content: "\f806"; } - -.fa-hand-paper:before { - content: "\f256"; } - -.fa-hand-peace:before { - content: "\f25b"; } - -.fa-hand-point-down:before { - content: "\f0a7"; } - -.fa-hand-point-left:before { - content: "\f0a5"; } - -.fa-hand-point-right:before { - content: "\f0a4"; } - -.fa-hand-point-up:before { - content: "\f0a6"; } - -.fa-hand-pointer:before { - content: "\f25a"; } - -.fa-hand-rock:before { - content: "\f255"; } - -.fa-hand-scissors:before { - content: "\f257"; } - -.fa-hand-spock:before { - content: "\f259"; } - -.fa-hands:before { - content: "\f4c2"; } - -.fa-hands-helping:before { - content: "\f4c4"; } - -.fa-handshake:before { - content: "\f2b5"; } - -.fa-hanukiah:before { - content: "\f6e6"; } - -.fa-hard-hat:before { - content: "\f807"; } - -.fa-hashtag:before { - content: "\f292"; } - -.fa-hat-wizard:before { - content: "\f6e8"; } - -.fa-haykal:before { - content: "\f666"; } - -.fa-hdd:before { - content: "\f0a0"; } - -.fa-heading:before { - content: "\f1dc"; } - -.fa-headphones:before { - content: "\f025"; } - -.fa-headphones-alt:before { - content: "\f58f"; } - -.fa-headset:before { - content: "\f590"; } - -.fa-heart:before { - content: "\f004"; } - -.fa-heart-broken:before { - content: "\f7a9"; } - -.fa-heartbeat:before { - content: "\f21e"; } - -.fa-helicopter:before { - content: "\f533"; } - -.fa-highlighter:before { - content: "\f591"; } - -.fa-hiking:before { - content: "\f6ec"; } - -.fa-hippo:before { - content: "\f6ed"; } - -.fa-hips:before { - content: "\f452"; } - -.fa-hire-a-helper:before { - content: "\f3b0"; } - -.fa-history:before { - content: "\f1da"; } - -.fa-hockey-puck:before { - content: "\f453"; } - -.fa-holly-berry:before { - content: "\f7aa"; } - -.fa-home:before { - content: "\f015"; } - -.fa-hooli:before { - content: "\f427"; } - -.fa-hornbill:before { - content: "\f592"; } - -.fa-horse:before { - content: "\f6f0"; } - -.fa-horse-head:before { - content: "\f7ab"; } - -.fa-hospital:before { - content: "\f0f8"; } - -.fa-hospital-alt:before { - content: "\f47d"; } - -.fa-hospital-symbol:before { - content: "\f47e"; } - -.fa-hot-tub:before { - content: "\f593"; } - -.fa-hotdog:before { - content: "\f80f"; } - -.fa-hotel:before { - content: "\f594"; } - -.fa-hotjar:before { - content: "\f3b1"; } - -.fa-hourglass:before { - content: "\f254"; } - -.fa-hourglass-end:before { - content: "\f253"; } - -.fa-hourglass-half:before { - content: "\f252"; } - -.fa-hourglass-start:before { - content: "\f251"; } - -.fa-house-damage:before { - content: "\f6f1"; } - -.fa-houzz:before { - content: "\f27c"; } - -.fa-hryvnia:before { - content: "\f6f2"; } - -.fa-html5:before { - content: "\f13b"; } - -.fa-hubspot:before { - content: "\f3b2"; } - -.fa-i-cursor:before { - content: "\f246"; } - -.fa-ice-cream:before { - content: "\f810"; } - -.fa-icicles:before { - content: "\f7ad"; } - -.fa-id-badge:before { - content: "\f2c1"; } - -.fa-id-card:before { - content: "\f2c2"; } - -.fa-id-card-alt:before { - content: "\f47f"; } - -.fa-igloo:before { - content: "\f7ae"; } - -.fa-image:before { - content: "\f03e"; } - -.fa-images:before { - content: "\f302"; } - -.fa-imdb:before { - content: "\f2d8"; } - -.fa-inbox:before { - content: "\f01c"; } - -.fa-indent:before { - content: "\f03c"; } - -.fa-industry:before { - content: "\f275"; } - -.fa-infinity:before { - content: "\f534"; } - -.fa-info:before { - content: "\f129"; } - -.fa-info-circle:before { - content: "\f05a"; } - -.fa-instagram:before { - content: "\f16d"; } - -.fa-intercom:before { - content: "\f7af"; } - -.fa-internet-explorer:before { - content: "\f26b"; } - -.fa-invision:before { - content: "\f7b0"; } - -.fa-ioxhost:before { - content: "\f208"; } - -.fa-italic:before { - content: "\f033"; } - -.fa-itunes:before { - content: "\f3b4"; } - -.fa-itunes-note:before { - content: "\f3b5"; } - -.fa-java:before { - content: "\f4e4"; } - -.fa-jedi:before { - content: "\f669"; } - -.fa-jedi-order:before { - content: "\f50e"; } - -.fa-jenkins:before { - content: "\f3b6"; } - -.fa-jira:before { - content: "\f7b1"; } - -.fa-joget:before { - content: "\f3b7"; } - -.fa-joint:before { - content: "\f595"; } - -.fa-joomla:before { - content: "\f1aa"; } - -.fa-journal-whills:before { - content: "\f66a"; } - -.fa-js:before { - content: "\f3b8"; } - -.fa-js-square:before { - content: "\f3b9"; } - -.fa-jsfiddle:before { - content: "\f1cc"; } - -.fa-kaaba:before { - content: "\f66b"; } - -.fa-kaggle:before { - content: "\f5fa"; } - -.fa-key:before { - content: "\f084"; } - -.fa-keybase:before { - content: "\f4f5"; } - -.fa-keyboard:before { - content: "\f11c"; } - -.fa-keycdn:before { - content: "\f3ba"; } - -.fa-khanda:before { - content: "\f66d"; } - -.fa-kickstarter:before { - content: "\f3bb"; } - -.fa-kickstarter-k:before { - content: "\f3bc"; } - -.fa-kiss:before { - content: "\f596"; } - -.fa-kiss-beam:before { - content: "\f597"; } - -.fa-kiss-wink-heart:before { - content: "\f598"; } - -.fa-kiwi-bird:before { - content: "\f535"; } - -.fa-korvue:before { - content: "\f42f"; } - -.fa-landmark:before { - content: "\f66f"; } - -.fa-language:before { - content: "\f1ab"; } - -.fa-laptop:before { - content: "\f109"; } - -.fa-laptop-code:before { - content: "\f5fc"; } - -.fa-laptop-medical:before { - content: "\f812"; } - -.fa-laravel:before { - content: "\f3bd"; } - -.fa-lastfm:before { - content: "\f202"; } - -.fa-lastfm-square:before { - content: "\f203"; } - -.fa-laugh:before { - content: "\f599"; } - -.fa-laugh-beam:before { - content: "\f59a"; } - -.fa-laugh-squint:before { - content: "\f59b"; } - -.fa-laugh-wink:before { - content: "\f59c"; } - -.fa-layer-group:before { - content: "\f5fd"; } - -.fa-leaf:before { - content: "\f06c"; } - -.fa-leanpub:before { - content: "\f212"; } - -.fa-lemon:before { - content: "\f094"; } - -.fa-less:before { - content: "\f41d"; } - -.fa-less-than:before { - content: "\f536"; } - -.fa-less-than-equal:before { - content: "\f537"; } - -.fa-level-down-alt:before { - content: "\f3be"; } - -.fa-level-up-alt:before { - content: "\f3bf"; } - -.fa-life-ring:before { - content: "\f1cd"; } - -.fa-lightbulb:before { - content: "\f0eb"; } - -.fa-line:before { - content: "\f3c0"; } - -.fa-link:before { - content: "\f0c1"; } - -.fa-linkedin:before { - content: "\f08c"; } - -.fa-linkedin-in:before { - content: "\f0e1"; } - -.fa-linode:before { - content: "\f2b8"; } - -.fa-linux:before { - content: "\f17c"; } - -.fa-lira-sign:before { - content: "\f195"; } - -.fa-list:before { - content: "\f03a"; } - -.fa-list-alt:before { - content: "\f022"; } - -.fa-list-ol:before { - content: "\f0cb"; } - -.fa-list-ul:before { - content: "\f0ca"; } - -.fa-location-arrow:before { - content: "\f124"; } - -.fa-lock:before { - content: "\f023"; } - -.fa-lock-open:before { - content: "\f3c1"; } - -.fa-long-arrow-alt-down:before { - content: "\f309"; } - -.fa-long-arrow-alt-left:before { - content: "\f30a"; } - -.fa-long-arrow-alt-right:before { - content: "\f30b"; } - -.fa-long-arrow-alt-up:before { - content: "\f30c"; } - -.fa-low-vision:before { - content: "\f2a8"; } - -.fa-luggage-cart:before { - content: "\f59d"; } - -.fa-lyft:before { - content: "\f3c3"; } - -.fa-magento:before { - content: "\f3c4"; } - -.fa-magic:before { - content: "\f0d0"; } - -.fa-magnet:before { - content: "\f076"; } - -.fa-mail-bulk:before { - content: "\f674"; } - -.fa-mailchimp:before { - content: "\f59e"; } - -.fa-male:before { - content: "\f183"; } - -.fa-mandalorian:before { - content: "\f50f"; } - -.fa-map:before { - content: "\f279"; } - -.fa-map-marked:before { - content: "\f59f"; } - -.fa-map-marked-alt:before { - content: "\f5a0"; } - -.fa-map-marker:before { - content: "\f041"; } - -.fa-map-marker-alt:before { - content: "\f3c5"; } - -.fa-map-pin:before { - content: "\f276"; } - -.fa-map-signs:before { - content: "\f277"; } - -.fa-markdown:before { - content: "\f60f"; } - -.fa-marker:before { - content: "\f5a1"; } - -.fa-mars:before { - content: "\f222"; } - -.fa-mars-double:before { - content: "\f227"; } - -.fa-mars-stroke:before { - content: "\f229"; } - -.fa-mars-stroke-h:before { - content: "\f22b"; } - -.fa-mars-stroke-v:before { - content: "\f22a"; } - -.fa-mask:before { - content: "\f6fa"; } - -.fa-mastodon:before { - content: "\f4f6"; } - -.fa-maxcdn:before { - content: "\f136"; } - -.fa-medal:before { - content: "\f5a2"; } - -.fa-medapps:before { - content: "\f3c6"; } - -.fa-medium:before { - content: "\f23a"; } - -.fa-medium-m:before { - content: "\f3c7"; } - -.fa-medkit:before { - content: "\f0fa"; } - -.fa-medrt:before { - content: "\f3c8"; } - -.fa-meetup:before { - content: "\f2e0"; } - -.fa-megaport:before { - content: "\f5a3"; } - -.fa-meh:before { - content: "\f11a"; } - -.fa-meh-blank:before { - content: "\f5a4"; } - -.fa-meh-rolling-eyes:before { - content: "\f5a5"; } - -.fa-memory:before { - content: "\f538"; } - -.fa-mendeley:before { - content: "\f7b3"; } - -.fa-menorah:before { - content: "\f676"; } - -.fa-mercury:before { - content: "\f223"; } - -.fa-meteor:before { - content: "\f753"; } - -.fa-microchip:before { - content: "\f2db"; } - -.fa-microphone:before { - content: "\f130"; } - -.fa-microphone-alt:before { - content: "\f3c9"; } - -.fa-microphone-alt-slash:before { - content: "\f539"; } - -.fa-microphone-slash:before { - content: "\f131"; } - -.fa-microscope:before { - content: "\f610"; } - -.fa-microsoft:before { - content: "\f3ca"; } - -.fa-minus:before { - content: "\f068"; } - -.fa-minus-circle:before { - content: "\f056"; } - -.fa-minus-square:before { - content: "\f146"; } - -.fa-mitten:before { - content: "\f7b5"; } - -.fa-mix:before { - content: "\f3cb"; } - -.fa-mixcloud:before { - content: "\f289"; } - -.fa-mizuni:before { - content: "\f3cc"; } - -.fa-mobile:before { - content: "\f10b"; } - -.fa-mobile-alt:before { - content: "\f3cd"; } - -.fa-modx:before { - content: "\f285"; } - -.fa-monero:before { - content: "\f3d0"; } - -.fa-money-bill:before { - content: "\f0d6"; } - -.fa-money-bill-alt:before { - content: "\f3d1"; } - -.fa-money-bill-wave:before { - content: "\f53a"; } - -.fa-money-bill-wave-alt:before { - content: "\f53b"; } - -.fa-money-check:before { - content: "\f53c"; } - -.fa-money-check-alt:before { - content: "\f53d"; } - -.fa-monument:before { - content: "\f5a6"; } - -.fa-moon:before { - content: "\f186"; } - -.fa-mortar-pestle:before { - content: "\f5a7"; } - -.fa-mosque:before { - content: "\f678"; } - -.fa-motorcycle:before { - content: "\f21c"; } - -.fa-mountain:before { - content: "\f6fc"; } - -.fa-mouse-pointer:before { - content: "\f245"; } - -.fa-mug-hot:before { - content: "\f7b6"; } - -.fa-music:before { - content: "\f001"; } - -.fa-napster:before { - content: "\f3d2"; } - -.fa-neos:before { - content: "\f612"; } - -.fa-network-wired:before { - content: "\f6ff"; } - -.fa-neuter:before { - content: "\f22c"; } - -.fa-newspaper:before { - content: "\f1ea"; } - -.fa-nimblr:before { - content: "\f5a8"; } - -.fa-nintendo-switch:before { - content: "\f418"; } - -.fa-node:before { - content: "\f419"; } - -.fa-node-js:before { - content: "\f3d3"; } - -.fa-not-equal:before { - content: "\f53e"; } - -.fa-notes-medical:before { - content: "\f481"; } - -.fa-npm:before { - content: "\f3d4"; } - -.fa-ns8:before { - content: "\f3d5"; } - -.fa-nutritionix:before { - content: "\f3d6"; } - -.fa-object-group:before { - content: "\f247"; } - -.fa-object-ungroup:before { - content: "\f248"; } - -.fa-odnoklassniki:before { - content: "\f263"; } - -.fa-odnoklassniki-square:before { - content: "\f264"; } - -.fa-oil-can:before { - content: "\f613"; } - -.fa-old-republic:before { - content: "\f510"; } - -.fa-om:before { - content: "\f679"; } - -.fa-opencart:before { - content: "\f23d"; } - -.fa-openid:before { - content: "\f19b"; } - -.fa-opera:before { - content: "\f26a"; } - -.fa-optin-monster:before { - content: "\f23c"; } - -.fa-osi:before { - content: "\f41a"; } - -.fa-otter:before { - content: "\f700"; } - -.fa-outdent:before { - content: "\f03b"; } - -.fa-page4:before { - content: "\f3d7"; } - -.fa-pagelines:before { - content: "\f18c"; } - -.fa-pager:before { - content: "\f815"; } - -.fa-paint-brush:before { - content: "\f1fc"; } - -.fa-paint-roller:before { - content: "\f5aa"; } - -.fa-palette:before { - content: "\f53f"; } - -.fa-palfed:before { - content: "\f3d8"; } - -.fa-pallet:before { - content: "\f482"; } - -.fa-paper-plane:before { - content: "\f1d8"; } - -.fa-paperclip:before { - content: "\f0c6"; } - -.fa-parachute-box:before { - content: "\f4cd"; } - -.fa-paragraph:before { - content: "\f1dd"; } - -.fa-parking:before { - content: "\f540"; } - -.fa-passport:before { - content: "\f5ab"; } - -.fa-pastafarianism:before { - content: "\f67b"; } - -.fa-paste:before { - content: "\f0ea"; } - -.fa-patreon:before { - content: "\f3d9"; } - -.fa-pause:before { - content: "\f04c"; } - -.fa-pause-circle:before { - content: "\f28b"; } - -.fa-paw:before { - content: "\f1b0"; } - -.fa-paypal:before { - content: "\f1ed"; } - -.fa-peace:before { - content: "\f67c"; } - -.fa-pen:before { - content: "\f304"; } - -.fa-pen-alt:before { - content: "\f305"; } - -.fa-pen-fancy:before { - content: "\f5ac"; } - -.fa-pen-nib:before { - content: "\f5ad"; } - -.fa-pen-square:before { - content: "\f14b"; } - -.fa-pencil-alt:before { - content: "\f303"; } - -.fa-pencil-ruler:before { - content: "\f5ae"; } - -.fa-penny-arcade:before { - content: "\f704"; } - -.fa-people-carry:before { - content: "\f4ce"; } - -.fa-pepper-hot:before { - content: "\f816"; } - -.fa-percent:before { - content: "\f295"; } - -.fa-percentage:before { - content: "\f541"; } - -.fa-periscope:before { - content: "\f3da"; } - -.fa-person-booth:before { - content: "\f756"; } - -.fa-phabricator:before { - content: "\f3db"; } - -.fa-phoenix-framework:before { - content: "\f3dc"; } - -.fa-phoenix-squadron:before { - content: "\f511"; } - -.fa-phone:before { - content: "\f095"; } - -.fa-phone-slash:before { - content: "\f3dd"; } - -.fa-phone-square:before { - content: "\f098"; } - -.fa-phone-volume:before { - content: "\f2a0"; } - -.fa-php:before { - content: "\f457"; } - -.fa-pied-piper:before { - content: "\f2ae"; } - -.fa-pied-piper-alt:before { - content: "\f1a8"; } - -.fa-pied-piper-hat:before { - content: "\f4e5"; } - -.fa-pied-piper-pp:before { - content: "\f1a7"; } - -.fa-piggy-bank:before { - content: "\f4d3"; } - -.fa-pills:before { - content: "\f484"; } - -.fa-pinterest:before { - content: "\f0d2"; } - -.fa-pinterest-p:before { - content: "\f231"; } - -.fa-pinterest-square:before { - content: "\f0d3"; } - -.fa-pizza-slice:before { - content: "\f818"; } - -.fa-place-of-worship:before { - content: "\f67f"; } - -.fa-plane:before { - content: "\f072"; } - -.fa-plane-arrival:before { - content: "\f5af"; } - -.fa-plane-departure:before { - content: "\f5b0"; } - -.fa-play:before { - content: "\f04b"; } - -.fa-play-circle:before { - content: "\f144"; } - -.fa-playstation:before { - content: "\f3df"; } - -.fa-plug:before { - content: "\f1e6"; } - -.fa-plus:before { - content: "\f067"; } - -.fa-plus-circle:before { - content: "\f055"; } - -.fa-plus-square:before { - content: "\f0fe"; } - -.fa-podcast:before { - content: "\f2ce"; } - -.fa-poll:before { - content: "\f681"; } - -.fa-poll-h:before { - content: "\f682"; } - -.fa-poo:before { - content: "\f2fe"; } - -.fa-poo-storm:before { - content: "\f75a"; } - -.fa-poop:before { - content: "\f619"; } - -.fa-portrait:before { - content: "\f3e0"; } - -.fa-pound-sign:before { - content: "\f154"; } - -.fa-power-off:before { - content: "\f011"; } - -.fa-pray:before { - content: "\f683"; } - -.fa-praying-hands:before { - content: "\f684"; } - -.fa-prescription:before { - content: "\f5b1"; } - -.fa-prescription-bottle:before { - content: "\f485"; } - -.fa-prescription-bottle-alt:before { - content: "\f486"; } - -.fa-print:before { - content: "\f02f"; } - -.fa-procedures:before { - content: "\f487"; } - -.fa-product-hunt:before { - content: "\f288"; } - -.fa-project-diagram:before { - content: "\f542"; } - -.fa-pushed:before { - content: "\f3e1"; } - -.fa-puzzle-piece:before { - content: "\f12e"; } - -.fa-python:before { - content: "\f3e2"; } - -.fa-qq:before { - content: "\f1d6"; } - -.fa-qrcode:before { - content: "\f029"; } - -.fa-question:before { - content: "\f128"; } - -.fa-question-circle:before { - content: "\f059"; } - -.fa-quidditch:before { - content: "\f458"; } - -.fa-quinscape:before { - content: "\f459"; } - -.fa-quora:before { - content: "\f2c4"; } - -.fa-quote-left:before { - content: "\f10d"; } - -.fa-quote-right:before { - content: "\f10e"; } - -.fa-quran:before { - content: "\f687"; } - -.fa-r-project:before { - content: "\f4f7"; } - -.fa-radiation:before { - content: "\f7b9"; } - -.fa-radiation-alt:before { - content: "\f7ba"; } - -.fa-rainbow:before { - content: "\f75b"; } - -.fa-random:before { - content: "\f074"; } - -.fa-raspberry-pi:before { - content: "\f7bb"; } - -.fa-ravelry:before { - content: "\f2d9"; } - -.fa-react:before { - content: "\f41b"; } - -.fa-reacteurope:before { - content: "\f75d"; } - -.fa-readme:before { - content: "\f4d5"; } - -.fa-rebel:before { - content: "\f1d0"; } - -.fa-receipt:before { - content: "\f543"; } - -.fa-recycle:before { - content: "\f1b8"; } - -.fa-red-river:before { - content: "\f3e3"; } - -.fa-reddit:before { - content: "\f1a1"; } - -.fa-reddit-alien:before { - content: "\f281"; } - -.fa-reddit-square:before { - content: "\f1a2"; } - -.fa-redhat:before { - content: "\f7bc"; } - -.fa-redo:before { - content: "\f01e"; } - -.fa-redo-alt:before { - content: "\f2f9"; } - -.fa-registered:before { - content: "\f25d"; } - -.fa-renren:before { - content: "\f18b"; } - -.fa-reply:before { - content: "\f3e5"; } - -.fa-reply-all:before { - content: "\f122"; } - -.fa-replyd:before { - content: "\f3e6"; } - -.fa-republican:before { - content: "\f75e"; } - -.fa-researchgate:before { - content: "\f4f8"; } - -.fa-resolving:before { - content: "\f3e7"; } - -.fa-restroom:before { - content: "\f7bd"; } - -.fa-retweet:before { - content: "\f079"; } - -.fa-rev:before { - content: "\f5b2"; } - -.fa-ribbon:before { - content: "\f4d6"; } - -.fa-ring:before { - content: "\f70b"; } - -.fa-road:before { - content: "\f018"; } - -.fa-robot:before { - content: "\f544"; } - -.fa-rocket:before { - content: "\f135"; } - -.fa-rocketchat:before { - content: "\f3e8"; } - -.fa-rockrms:before { - content: "\f3e9"; } - -.fa-route:before { - content: "\f4d7"; } - -.fa-rss:before { - content: "\f09e"; } - -.fa-rss-square:before { - content: "\f143"; } - -.fa-ruble-sign:before { - content: "\f158"; } - -.fa-ruler:before { - content: "\f545"; } - -.fa-ruler-combined:before { - content: "\f546"; } - -.fa-ruler-horizontal:before { - content: "\f547"; } - -.fa-ruler-vertical:before { - content: "\f548"; } - -.fa-running:before { - content: "\f70c"; } - -.fa-rupee-sign:before { - content: "\f156"; } - -.fa-sad-cry:before { - content: "\f5b3"; } - -.fa-sad-tear:before { - content: "\f5b4"; } - -.fa-safari:before { - content: "\f267"; } - -.fa-sass:before { - content: "\f41e"; } - -.fa-satellite:before { - content: "\f7bf"; } - -.fa-satellite-dish:before { - content: "\f7c0"; } - -.fa-save:before { - content: "\f0c7"; } - -.fa-schlix:before { - content: "\f3ea"; } - -.fa-school:before { - content: "\f549"; } - -.fa-screwdriver:before { - content: "\f54a"; } - -.fa-scribd:before { - content: "\f28a"; } - -.fa-scroll:before { - content: "\f70e"; } - -.fa-sd-card:before { - content: "\f7c2"; } - -.fa-search:before { - content: "\f002"; } - -.fa-search-dollar:before { - content: "\f688"; } - -.fa-search-location:before { - content: "\f689"; } - -.fa-search-minus:before { - content: "\f010"; } - -.fa-search-plus:before { - content: "\f00e"; } - -.fa-searchengin:before { - content: "\f3eb"; } - -.fa-seedling:before { - content: "\f4d8"; } - -.fa-sellcast:before { - content: "\f2da"; } - -.fa-sellsy:before { - content: "\f213"; } - -.fa-server:before { - content: "\f233"; } - -.fa-servicestack:before { - content: "\f3ec"; } - -.fa-shapes:before { - content: "\f61f"; } - -.fa-share:before { - content: "\f064"; } - -.fa-share-alt:before { - content: "\f1e0"; } - -.fa-share-alt-square:before { - content: "\f1e1"; } - -.fa-share-square:before { - content: "\f14d"; } - -.fa-shekel-sign:before { - content: "\f20b"; } - -.fa-shield-alt:before { - content: "\f3ed"; } - -.fa-ship:before { - content: "\f21a"; } - -.fa-shipping-fast:before { - content: "\f48b"; } - -.fa-shirtsinbulk:before { - content: "\f214"; } - -.fa-shoe-prints:before { - content: "\f54b"; } - -.fa-shopping-bag:before { - content: "\f290"; } - -.fa-shopping-basket:before { - content: "\f291"; } - -.fa-shopping-cart:before { - content: "\f07a"; } - -.fa-shopware:before { - content: "\f5b5"; } - -.fa-shower:before { - content: "\f2cc"; } - -.fa-shuttle-van:before { - content: "\f5b6"; } - -.fa-sign:before { - content: "\f4d9"; } - -.fa-sign-in-alt:before { - content: "\f2f6"; } - -.fa-sign-language:before { - content: "\f2a7"; } - -.fa-sign-out-alt:before { - content: "\f2f5"; } - -.fa-signal:before { - content: "\f012"; } - -.fa-signature:before { - content: "\f5b7"; } - -.fa-sim-card:before { - content: "\f7c4"; } - -.fa-simplybuilt:before { - content: "\f215"; } - -.fa-sistrix:before { - content: "\f3ee"; } - -.fa-sitemap:before { - content: "\f0e8"; } - -.fa-sith:before { - content: "\f512"; } - -.fa-skating:before { - content: "\f7c5"; } - -.fa-sketch:before { - content: "\f7c6"; } - -.fa-skiing:before { - content: "\f7c9"; } - -.fa-skiing-nordic:before { - content: "\f7ca"; } - -.fa-skull:before { - content: "\f54c"; } - -.fa-skull-crossbones:before { - content: "\f714"; } - -.fa-skyatlas:before { - content: "\f216"; } - -.fa-skype:before { - content: "\f17e"; } - -.fa-slack:before { - content: "\f198"; } - -.fa-slack-hash:before { - content: "\f3ef"; } - -.fa-slash:before { - content: "\f715"; } - -.fa-sleigh:before { - content: "\f7cc"; } - -.fa-sliders-h:before { - content: "\f1de"; } - -.fa-slideshare:before { - content: "\f1e7"; } - -.fa-smile:before { - content: "\f118"; } - -.fa-smile-beam:before { - content: "\f5b8"; } - -.fa-smile-wink:before { - content: "\f4da"; } - -.fa-smog:before { - content: "\f75f"; } - -.fa-smoking:before { - content: "\f48d"; } - -.fa-smoking-ban:before { - content: "\f54d"; } - -.fa-sms:before { - content: "\f7cd"; } - -.fa-snapchat:before { - content: "\f2ab"; } - -.fa-snapchat-ghost:before { - content: "\f2ac"; } - -.fa-snapchat-square:before { - content: "\f2ad"; } - -.fa-snowboarding:before { - content: "\f7ce"; } - -.fa-snowflake:before { - content: "\f2dc"; } - -.fa-snowman:before { - content: "\f7d0"; } - -.fa-snowplow:before { - content: "\f7d2"; } - -.fa-socks:before { - content: "\f696"; } - -.fa-solar-panel:before { - content: "\f5ba"; } - -.fa-sort:before { - content: "\f0dc"; } - -.fa-sort-alpha-down:before { - content: "\f15d"; } - -.fa-sort-alpha-up:before { - content: "\f15e"; } - -.fa-sort-amount-down:before { - content: "\f160"; } - -.fa-sort-amount-up:before { - content: "\f161"; } - -.fa-sort-down:before { - content: "\f0dd"; } - -.fa-sort-numeric-down:before { - content: "\f162"; } - -.fa-sort-numeric-up:before { - content: "\f163"; } - -.fa-sort-up:before { - content: "\f0de"; } - -.fa-soundcloud:before { - content: "\f1be"; } - -.fa-sourcetree:before { - content: "\f7d3"; } - -.fa-spa:before { - content: "\f5bb"; } - -.fa-space-shuttle:before { - content: "\f197"; } - -.fa-speakap:before { - content: "\f3f3"; } - -.fa-spider:before { - content: "\f717"; } - -.fa-spinner:before { - content: "\f110"; } - -.fa-splotch:before { - content: "\f5bc"; } - -.fa-spotify:before { - content: "\f1bc"; } - -.fa-spray-can:before { - content: "\f5bd"; } - -.fa-square:before { - content: "\f0c8"; } - -.fa-square-full:before { - content: "\f45c"; } - -.fa-square-root-alt:before { - content: "\f698"; } - -.fa-squarespace:before { - content: "\f5be"; } - -.fa-stack-exchange:before { - content: "\f18d"; } - -.fa-stack-overflow:before { - content: "\f16c"; } - -.fa-stamp:before { - content: "\f5bf"; } - -.fa-star:before { - content: "\f005"; } - -.fa-star-and-crescent:before { - content: "\f699"; } - -.fa-star-half:before { - content: "\f089"; } - -.fa-star-half-alt:before { - content: "\f5c0"; } - -.fa-star-of-david:before { - content: "\f69a"; } - -.fa-star-of-life:before { - content: "\f621"; } - -.fa-staylinked:before { - content: "\f3f5"; } - -.fa-steam:before { - content: "\f1b6"; } - -.fa-steam-square:before { - content: "\f1b7"; } - -.fa-steam-symbol:before { - content: "\f3f6"; } - -.fa-step-backward:before { - content: "\f048"; } - -.fa-step-forward:before { - content: "\f051"; } - -.fa-stethoscope:before { - content: "\f0f1"; } - -.fa-sticker-mule:before { - content: "\f3f7"; } - -.fa-sticky-note:before { - content: "\f249"; } - -.fa-stop:before { - content: "\f04d"; } - -.fa-stop-circle:before { - content: "\f28d"; } - -.fa-stopwatch:before { - content: "\f2f2"; } - -.fa-store:before { - content: "\f54e"; } - -.fa-store-alt:before { - content: "\f54f"; } - -.fa-strava:before { - content: "\f428"; } - -.fa-stream:before { - content: "\f550"; } - -.fa-street-view:before { - content: "\f21d"; } - -.fa-strikethrough:before { - content: "\f0cc"; } - -.fa-stripe:before { - content: "\f429"; } - -.fa-stripe-s:before { - content: "\f42a"; } - -.fa-stroopwafel:before { - content: "\f551"; } - -.fa-studiovinari:before { - content: "\f3f8"; } - -.fa-stumbleupon:before { - content: "\f1a4"; } - -.fa-stumbleupon-circle:before { - content: "\f1a3"; } - -.fa-subscript:before { - content: "\f12c"; } - -.fa-subway:before { - content: "\f239"; } - -.fa-suitcase:before { - content: "\f0f2"; } - -.fa-suitcase-rolling:before { - content: "\f5c1"; } - -.fa-sun:before { - content: "\f185"; } - -.fa-superpowers:before { - content: "\f2dd"; } - -.fa-superscript:before { - content: "\f12b"; } - -.fa-supple:before { - content: "\f3f9"; } - -.fa-surprise:before { - content: "\f5c2"; } - -.fa-suse:before { - content: "\f7d6"; } - -.fa-swatchbook:before { - content: "\f5c3"; } - -.fa-swimmer:before { - content: "\f5c4"; } - -.fa-swimming-pool:before { - content: "\f5c5"; } - -.fa-synagogue:before { - content: "\f69b"; } - -.fa-sync:before { - content: "\f021"; } - -.fa-sync-alt:before { - content: "\f2f1"; } - -.fa-syringe:before { - content: "\f48e"; } - -.fa-table:before { - content: "\f0ce"; } - -.fa-table-tennis:before { - content: "\f45d"; } - -.fa-tablet:before { - content: "\f10a"; } - -.fa-tablet-alt:before { - content: "\f3fa"; } - -.fa-tablets:before { - content: "\f490"; } - -.fa-tachometer-alt:before { - content: "\f3fd"; } - -.fa-tag:before { - content: "\f02b"; } - -.fa-tags:before { - content: "\f02c"; } - -.fa-tape:before { - content: "\f4db"; } - -.fa-tasks:before { - content: "\f0ae"; } - -.fa-taxi:before { - content: "\f1ba"; } - -.fa-teamspeak:before { - content: "\f4f9"; } - -.fa-teeth:before { - content: "\f62e"; } - -.fa-teeth-open:before { - content: "\f62f"; } - -.fa-telegram:before { - content: "\f2c6"; } - -.fa-telegram-plane:before { - content: "\f3fe"; } - -.fa-temperature-high:before { - content: "\f769"; } - -.fa-temperature-low:before { - content: "\f76b"; } - -.fa-tencent-weibo:before { - content: "\f1d5"; } - -.fa-tenge:before { - content: "\f7d7"; } - -.fa-terminal:before { - content: "\f120"; } - -.fa-text-height:before { - content: "\f034"; } - -.fa-text-width:before { - content: "\f035"; } - -.fa-th:before { - content: "\f00a"; } - -.fa-th-large:before { - content: "\f009"; } - -.fa-th-list:before { - content: "\f00b"; } - -.fa-the-red-yeti:before { - content: "\f69d"; } - -.fa-theater-masks:before { - content: "\f630"; } - -.fa-themeco:before { - content: "\f5c6"; } - -.fa-themeisle:before { - content: "\f2b2"; } - -.fa-thermometer:before { - content: "\f491"; } - -.fa-thermometer-empty:before { - content: "\f2cb"; } - -.fa-thermometer-full:before { - content: "\f2c7"; } - -.fa-thermometer-half:before { - content: "\f2c9"; } - -.fa-thermometer-quarter:before { - content: "\f2ca"; } - -.fa-thermometer-three-quarters:before { - content: "\f2c8"; } - -.fa-think-peaks:before { - content: "\f731"; } - -.fa-thumbs-down:before { - content: "\f165"; } - -.fa-thumbs-up:before { - content: "\f164"; } - -.fa-thumbtack:before { - content: "\f08d"; } - -.fa-ticket-alt:before { - content: "\f3ff"; } - -.fa-times:before { - content: "\f00d"; } - -.fa-times-circle:before { - content: "\f057"; } - -.fa-tint:before { - content: "\f043"; } - -.fa-tint-slash:before { - content: "\f5c7"; } - -.fa-tired:before { - content: "\f5c8"; } - -.fa-toggle-off:before { - content: "\f204"; } - -.fa-toggle-on:before { - content: "\f205"; } - -.fa-toilet:before { - content: "\f7d8"; } - -.fa-toilet-paper:before { - content: "\f71e"; } - -.fa-toolbox:before { - content: "\f552"; } - -.fa-tools:before { - content: "\f7d9"; } - -.fa-tooth:before { - content: "\f5c9"; } - -.fa-torah:before { - content: "\f6a0"; } - -.fa-torii-gate:before { - content: "\f6a1"; } - -.fa-tractor:before { - content: "\f722"; } - -.fa-trade-federation:before { - content: "\f513"; } - -.fa-trademark:before { - content: "\f25c"; } - -.fa-traffic-light:before { - content: "\f637"; } - -.fa-train:before { - content: "\f238"; } - -.fa-tram:before { - content: "\f7da"; } - -.fa-transgender:before { - content: "\f224"; } - -.fa-transgender-alt:before { - content: "\f225"; } - -.fa-trash:before { - content: "\f1f8"; } - -.fa-trash-alt:before { - content: "\f2ed"; } - -.fa-trash-restore:before { - content: "\f829"; } - -.fa-trash-restore-alt:before { - content: "\f82a"; } - -.fa-tree:before { - content: "\f1bb"; } - -.fa-trello:before { - content: "\f181"; } - -.fa-tripadvisor:before { - content: "\f262"; } - -.fa-trophy:before { - content: "\f091"; } - -.fa-truck:before { - content: "\f0d1"; } - -.fa-truck-loading:before { - content: "\f4de"; } - -.fa-truck-monster:before { - content: "\f63b"; } - -.fa-truck-moving:before { - content: "\f4df"; } - -.fa-truck-pickup:before { - content: "\f63c"; } - -.fa-tshirt:before { - content: "\f553"; } - -.fa-tty:before { - content: "\f1e4"; } - -.fa-tumblr:before { - content: "\f173"; } - -.fa-tumblr-square:before { - content: "\f174"; } - -.fa-tv:before { - content: "\f26c"; } - -.fa-twitch:before { - content: "\f1e8"; } - -.fa-twitter:before { - content: "\f099"; } - -.fa-twitter-square:before { - content: "\f081"; } - -.fa-typo3:before { - content: "\f42b"; } - -.fa-uber:before { - content: "\f402"; } - -.fa-ubuntu:before { - content: "\f7df"; } - -.fa-uikit:before { - content: "\f403"; } - -.fa-umbrella:before { - content: "\f0e9"; } - -.fa-umbrella-beach:before { - content: "\f5ca"; } - -.fa-underline:before { - content: "\f0cd"; } - -.fa-undo:before { - content: "\f0e2"; } - -.fa-undo-alt:before { - content: "\f2ea"; } - -.fa-uniregistry:before { - content: "\f404"; } - -.fa-universal-access:before { - content: "\f29a"; } - -.fa-university:before { - content: "\f19c"; } - -.fa-unlink:before { - content: "\f127"; } - -.fa-unlock:before { - content: "\f09c"; } - -.fa-unlock-alt:before { - content: "\f13e"; } - -.fa-untappd:before { - content: "\f405"; } - -.fa-upload:before { - content: "\f093"; } - -.fa-ups:before { - content: "\f7e0"; } - -.fa-usb:before { - content: "\f287"; } - -.fa-user:before { - content: "\f007"; } - -.fa-user-alt:before { - content: "\f406"; } - -.fa-user-alt-slash:before { - content: "\f4fa"; } - -.fa-user-astronaut:before { - content: "\f4fb"; } - -.fa-user-check:before { - content: "\f4fc"; } - -.fa-user-circle:before { - content: "\f2bd"; } - -.fa-user-clock:before { - content: "\f4fd"; } - -.fa-user-cog:before { - content: "\f4fe"; } - -.fa-user-edit:before { - content: "\f4ff"; } - -.fa-user-friends:before { - content: "\f500"; } - -.fa-user-graduate:before { - content: "\f501"; } - -.fa-user-injured:before { - content: "\f728"; } - -.fa-user-lock:before { - content: "\f502"; } - -.fa-user-md:before { - content: "\f0f0"; } - -.fa-user-minus:before { - content: "\f503"; } - -.fa-user-ninja:before { - content: "\f504"; } - -.fa-user-nurse:before { - content: "\f82f"; } - -.fa-user-plus:before { - content: "\f234"; } - -.fa-user-secret:before { - content: "\f21b"; } - -.fa-user-shield:before { - content: "\f505"; } - -.fa-user-slash:before { - content: "\f506"; } - -.fa-user-tag:before { - content: "\f507"; } - -.fa-user-tie:before { - content: "\f508"; } - -.fa-user-times:before { - content: "\f235"; } - -.fa-users:before { - content: "\f0c0"; } - -.fa-users-cog:before { - content: "\f509"; } - -.fa-usps:before { - content: "\f7e1"; } - -.fa-ussunnah:before { - content: "\f407"; } - -.fa-utensil-spoon:before { - content: "\f2e5"; } - -.fa-utensils:before { - content: "\f2e7"; } - -.fa-vaadin:before { - content: "\f408"; } - -.fa-vector-square:before { - content: "\f5cb"; } - -.fa-venus:before { - content: "\f221"; } - -.fa-venus-double:before { - content: "\f226"; } - -.fa-venus-mars:before { - content: "\f228"; } - -.fa-viacoin:before { - content: "\f237"; } - -.fa-viadeo:before { - content: "\f2a9"; } - -.fa-viadeo-square:before { - content: "\f2aa"; } - -.fa-vial:before { - content: "\f492"; } - -.fa-vials:before { - content: "\f493"; } - -.fa-viber:before { - content: "\f409"; } - -.fa-video:before { - content: "\f03d"; } - -.fa-video-slash:before { - content: "\f4e2"; } - -.fa-vihara:before { - content: "\f6a7"; } - -.fa-vimeo:before { - content: "\f40a"; } - -.fa-vimeo-square:before { - content: "\f194"; } - -.fa-vimeo-v:before { - content: "\f27d"; } - -.fa-vine:before { - content: "\f1ca"; } - -.fa-vk:before { - content: "\f189"; } - -.fa-vnv:before { - content: "\f40b"; } - -.fa-volleyball-ball:before { - content: "\f45f"; } - -.fa-volume-down:before { - content: "\f027"; } - -.fa-volume-mute:before { - content: "\f6a9"; } - -.fa-volume-off:before { - content: "\f026"; } - -.fa-volume-up:before { - content: "\f028"; } - -.fa-vote-yea:before { - content: "\f772"; } - -.fa-vr-cardboard:before { - content: "\f729"; } - -.fa-vuejs:before { - content: "\f41f"; } - -.fa-walking:before { - content: "\f554"; } - -.fa-wallet:before { - content: "\f555"; } - -.fa-warehouse:before { - content: "\f494"; } - -.fa-water:before { - content: "\f773"; } - -.fa-weebly:before { - content: "\f5cc"; } - -.fa-weibo:before { - content: "\f18a"; } - -.fa-weight:before { - content: "\f496"; } - -.fa-weight-hanging:before { - content: "\f5cd"; } - -.fa-weixin:before { - content: "\f1d7"; } - -.fa-whatsapp:before { - content: "\f232"; } - -.fa-whatsapp-square:before { - content: "\f40c"; } - -.fa-wheelchair:before { - content: "\f193"; } - -.fa-whmcs:before { - content: "\f40d"; } - -.fa-wifi:before { - content: "\f1eb"; } - -.fa-wikipedia-w:before { - content: "\f266"; } - -.fa-wind:before { - content: "\f72e"; } - -.fa-window-close:before { - content: "\f410"; } - -.fa-window-maximize:before { - content: "\f2d0"; } - -.fa-window-minimize:before { - content: "\f2d1"; } - -.fa-window-restore:before { - content: "\f2d2"; } - -.fa-windows:before { - content: "\f17a"; } - -.fa-wine-bottle:before { - content: "\f72f"; } - -.fa-wine-glass:before { - content: "\f4e3"; } - -.fa-wine-glass-alt:before { - content: "\f5ce"; } - -.fa-wix:before { - content: "\f5cf"; } - -.fa-wizards-of-the-coast:before { - content: "\f730"; } - -.fa-wolf-pack-battalion:before { - content: "\f514"; } - -.fa-won-sign:before { - content: "\f159"; } - -.fa-wordpress:before { - content: "\f19a"; } - -.fa-wordpress-simple:before { - content: "\f411"; } - -.fa-wpbeginner:before { - content: "\f297"; } - -.fa-wpexplorer:before { - content: "\f2de"; } - -.fa-wpforms:before { - content: "\f298"; } - -.fa-wpressr:before { - content: "\f3e4"; } - -.fa-wrench:before { - content: "\f0ad"; } - -.fa-x-ray:before { - content: "\f497"; } - -.fa-xbox:before { - content: "\f412"; } - -.fa-xing:before { - content: "\f168"; } - -.fa-xing-square:before { - content: "\f169"; } - -.fa-y-combinator:before { - content: "\f23b"; } - -.fa-yahoo:before { - content: "\f19e"; } - -.fa-yandex:before { - content: "\f413"; } - -.fa-yandex-international:before { - content: "\f414"; } - -.fa-yarn:before { - content: "\f7e3"; } - -.fa-yelp:before { - content: "\f1e9"; } - -.fa-yen-sign:before { - content: "\f157"; } - -.fa-yin-yang:before { - content: "\f6ad"; } - -.fa-yoast:before { - content: "\f2b1"; } - -.fa-youtube:before { - content: "\f167"; } - -.fa-youtube-square:before { - content: "\f431"; } - -.fa-zhihu:before { - content: "\f63f"; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } diff --git a/shopyo/static/fontawesome/css/fontawesome.min.css b/shopyo/static/fontawesome/css/fontawesome.min.css deleted file mode 100644 index d4da616..0000000 --- a/shopyo/static/fontawesome/css/fontawesome.min.css +++ /dev/null @@ -1 +0,0 @@ -.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-wizard:before{content:"\f6e8"}.fa-haykal:before{content:"\f666"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/regular.css b/shopyo/static/fontawesome/css/regular.css deleted file mode 100644 index e4de961..0000000 --- a/shopyo/static/fontawesome/css/regular.css +++ /dev/null @@ -1,11 +0,0 @@ -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 400; - font-display: auto; - src: url("../webfonts/fa-regular-400.eot"); - src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); } - -.far { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } diff --git a/shopyo/static/fontawesome/css/regular.min.css b/shopyo/static/fontawesome/css/regular.min.css deleted file mode 100644 index 2c13115..0000000 --- a/shopyo/static/fontawesome/css/regular.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:"Font Awesome 5 Free";font-weight:400} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/solid.css b/shopyo/static/fontawesome/css/solid.css deleted file mode 100644 index d6909b2..0000000 --- a/shopyo/static/fontawesome/css/solid.css +++ /dev/null @@ -1,12 +0,0 @@ -@font-face { - font-family: 'Font Awesome 5 Free'; - font-style: normal; - font-weight: 900; - font-display: auto; - src: url("../webfonts/fa-solid-900.eot"); - src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); } - -.fa, -.fas { - font-family: 'Font Awesome 5 Free'; - font-weight: 900; } diff --git a/shopyo/static/fontawesome/css/solid.min.css b/shopyo/static/fontawesome/css/solid.min.css deleted file mode 100644 index 94bb6a9..0000000 --- a/shopyo/static/fontawesome/css/solid.min.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Free";font-weight:900} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/svg-with-js.css b/shopyo/static/fontawesome/css/svg-with-js.css deleted file mode 100644 index 192b881..0000000 --- a/shopyo/static/fontawesome/css/svg-with-js.css +++ /dev/null @@ -1,342 +0,0 @@ -svg:not(:root).svg-inline--fa { - overflow: visible; } - -.svg-inline--fa { - display: inline-block; - font-size: inherit; - height: 1em; - overflow: visible; - vertical-align: -.125em; } - .svg-inline--fa.fa-lg { - vertical-align: -.225em; } - .svg-inline--fa.fa-w-1 { - width: 0.0625em; } - .svg-inline--fa.fa-w-2 { - width: 0.125em; } - .svg-inline--fa.fa-w-3 { - width: 0.1875em; } - .svg-inline--fa.fa-w-4 { - width: 0.25em; } - .svg-inline--fa.fa-w-5 { - width: 0.3125em; } - .svg-inline--fa.fa-w-6 { - width: 0.375em; } - .svg-inline--fa.fa-w-7 { - width: 0.4375em; } - .svg-inline--fa.fa-w-8 { - width: 0.5em; } - .svg-inline--fa.fa-w-9 { - width: 0.5625em; } - .svg-inline--fa.fa-w-10 { - width: 0.625em; } - .svg-inline--fa.fa-w-11 { - width: 0.6875em; } - .svg-inline--fa.fa-w-12 { - width: 0.75em; } - .svg-inline--fa.fa-w-13 { - width: 0.8125em; } - .svg-inline--fa.fa-w-14 { - width: 0.875em; } - .svg-inline--fa.fa-w-15 { - width: 0.9375em; } - .svg-inline--fa.fa-w-16 { - width: 1em; } - .svg-inline--fa.fa-w-17 { - width: 1.0625em; } - .svg-inline--fa.fa-w-18 { - width: 1.125em; } - .svg-inline--fa.fa-w-19 { - width: 1.1875em; } - .svg-inline--fa.fa-w-20 { - width: 1.25em; } - .svg-inline--fa.fa-pull-left { - margin-right: .3em; - width: auto; } - .svg-inline--fa.fa-pull-right { - margin-left: .3em; - width: auto; } - .svg-inline--fa.fa-border { - height: 1.5em; } - .svg-inline--fa.fa-li { - width: 2em; } - .svg-inline--fa.fa-fw { - width: 1.25em; } - -.fa-layers svg.svg-inline--fa { - bottom: 0; - left: 0; - margin: auto; - position: absolute; - right: 0; - top: 0; } - -.fa-layers { - display: inline-block; - height: 1em; - position: relative; - text-align: center; - vertical-align: -.125em; - width: 1em; } - .fa-layers svg.svg-inline--fa { - -webkit-transform-origin: center center; - transform-origin: center center; } - -.fa-layers-text, .fa-layers-counter { - display: inline-block; - position: absolute; - text-align: center; } - -.fa-layers-text { - left: 50%; - top: 50%; - -webkit-transform: translate(-50%, -50%); - transform: translate(-50%, -50%); - -webkit-transform-origin: center center; - transform-origin: center center; } - -.fa-layers-counter { - background-color: #ff253a; - border-radius: 1em; - -webkit-box-sizing: border-box; - box-sizing: border-box; - color: #fff; - height: 1.5em; - line-height: 1; - max-width: 5em; - min-width: 1.5em; - overflow: hidden; - padding: .25em; - right: 0; - text-overflow: ellipsis; - top: 0; - -webkit-transform: scale(0.25); - transform: scale(0.25); - -webkit-transform-origin: top right; - transform-origin: top right; } - -.fa-layers-bottom-right { - bottom: 0; - right: 0; - top: auto; - -webkit-transform: scale(0.25); - transform: scale(0.25); - -webkit-transform-origin: bottom right; - transform-origin: bottom right; } - -.fa-layers-bottom-left { - bottom: 0; - left: 0; - right: auto; - top: auto; - -webkit-transform: scale(0.25); - transform: scale(0.25); - -webkit-transform-origin: bottom left; - transform-origin: bottom left; } - -.fa-layers-top-right { - right: 0; - top: 0; - -webkit-transform: scale(0.25); - transform: scale(0.25); - -webkit-transform-origin: top right; - transform-origin: top right; } - -.fa-layers-top-left { - left: 0; - right: auto; - top: 0; - -webkit-transform: scale(0.25); - transform: scale(0.25); - -webkit-transform-origin: top left; - transform-origin: top left; } - -.fa-lg { - font-size: 1.33333em; - line-height: 0.75em; - vertical-align: -.0667em; } - -.fa-xs { - font-size: .75em; } - -.fa-sm { - font-size: .875em; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: 2.5em; - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: -2em; - position: absolute; - text-align: center; - width: 2em; - line-height: inherit; } - -.fa-border { - border: solid 0.08em #eee; - border-radius: .1em; - padding: .2em .25em .15em; } - -.fa-pull-left { - float: left; } - -.fa-pull-right { - float: right; } - -.fa.fa-pull-left, -.fas.fa-pull-left, -.far.fa-pull-left, -.fal.fa-pull-left, -.fab.fa-pull-left { - margin-right: .3em; } - -.fa.fa-pull-right, -.fas.fa-pull-right, -.far.fa-pull-right, -.fal.fa-pull-right, -.fab.fa-pull-right { - margin-left: .3em; } - -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; } - -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); } - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); } - 100% { - -webkit-transform: rotate(360deg); - transform: rotate(360deg); } } - -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); } - -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - transform: rotate(180deg); } - -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - transform: rotate(270deg); } - -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - transform: scale(-1, 1); } - -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - transform: scale(1, -1); } - -.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(-1, -1); - transform: scale(-1, -1); } - -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical, -:root .fa-flip-both { - -webkit-filter: none; - filter: none; } - -.fa-stack { - display: inline-block; - height: 2em; - position: relative; - width: 2.5em; } - -.fa-stack-1x, -.fa-stack-2x { - bottom: 0; - left: 0; - margin: auto; - position: absolute; - right: 0; - top: 0; } - -.svg-inline--fa.fa-stack-1x { - height: 1em; - width: 1.25em; } - -.svg-inline--fa.fa-stack-2x { - height: 2em; - width: 2.5em; } - -.fa-inverse { - color: #fff; } - -.sr-only { - border: 0; - clip: rect(0, 0, 0, 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; } - -.sr-only-focusable:active, .sr-only-focusable:focus { - clip: auto; - height: auto; - margin: 0; - overflow: visible; - position: static; - width: auto; } diff --git a/shopyo/static/fontawesome/css/svg-with-js.min.css b/shopyo/static/fontawesome/css/svg-with-js.min.css deleted file mode 100644 index a72425e..0000000 --- a/shopyo/static/fontawesome/css/svg-with-js.min.css +++ /dev/null @@ -1 +0,0 @@ -.svg-inline--fa,svg:not(:root).svg-inline--fa{overflow:visible}.svg-inline--fa{display:inline-block;font-size:inherit;height:1em;vertical-align:-.125em}.svg-inline--fa.fa-lg{vertical-align:-.225em}.svg-inline--fa.fa-w-1{width:.0625em}.svg-inline--fa.fa-w-2{width:.125em}.svg-inline--fa.fa-w-3{width:.1875em}.svg-inline--fa.fa-w-4{width:.25em}.svg-inline--fa.fa-w-5{width:.3125em}.svg-inline--fa.fa-w-6{width:.375em}.svg-inline--fa.fa-w-7{width:.4375em}.svg-inline--fa.fa-w-8{width:.5em}.svg-inline--fa.fa-w-9{width:.5625em}.svg-inline--fa.fa-w-10{width:.625em}.svg-inline--fa.fa-w-11{width:.6875em}.svg-inline--fa.fa-w-12{width:.75em}.svg-inline--fa.fa-w-13{width:.8125em}.svg-inline--fa.fa-w-14{width:.875em}.svg-inline--fa.fa-w-15{width:.9375em}.svg-inline--fa.fa-w-16{width:1em}.svg-inline--fa.fa-w-17{width:1.0625em}.svg-inline--fa.fa-w-18{width:1.125em}.svg-inline--fa.fa-w-19{width:1.1875em}.svg-inline--fa.fa-w-20{width:1.25em}.svg-inline--fa.fa-pull-left{margin-right:.3em;width:auto}.svg-inline--fa.fa-pull-right{margin-left:.3em;width:auto}.svg-inline--fa.fa-border{height:1.5em}.svg-inline--fa.fa-li{width:2em}.svg-inline--fa.fa-fw{width:1.25em}.fa-layers svg.svg-inline--fa{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.fa-layers{display:inline-block;height:1em;position:relative;text-align:center;vertical-align:-.125em;width:1em}.fa-layers svg.svg-inline--fa{transform-origin:center center}.fa-layers-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.fa-layers-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:#ff253a;border-radius:1em;box-sizing:border-box;color:#fff;height:1.5em;line-height:1;max-width:5em;min-width:1.5em;overflow:hidden;padding:.25em;right:0;text-overflow:ellipsis;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-bottom-right{bottom:0;right:0;top:auto;transform:scale(.25);transform-origin:bottom right}.fa-layers-bottom-left{bottom:0;left:0;right:auto;top:auto;transform:scale(.25);transform-origin:bottom left}.fa-layers-top-right{right:0;top:0;transform:scale(.25);transform-origin:top right}.fa-layers-top-left{left:0;right:auto;top:0;transform:scale(.25);transform-origin:top left}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:fa-spin 2s infinite linear}.fa-pulse{animation:fa-spin 1s infinite steps(8)}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{display:inline-block;height:2em;position:relative;width:2.5em}.fa-stack-1x,.fa-stack-2x{bottom:0;left:0;margin:auto;position:absolute;right:0;top:0}.svg-inline--fa.fa-stack-1x{height:1em;width:1.25em}.svg-inline--fa.fa-stack-2x{height:2em;width:2.5em}.fa-inverse{color:#fff}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto} \ No newline at end of file diff --git a/shopyo/static/fontawesome/css/v4-shims.css b/shopyo/static/fontawesome/css/v4-shims.css deleted file mode 100644 index ccecd25..0000000 --- a/shopyo/static/fontawesome/css/v4-shims.css +++ /dev/null @@ -1,2162 +0,0 @@ -.fa.fa-glass:before { - content: "\f000"; } - -.fa.fa-meetup { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-star-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-star-o:before { - content: "\f005"; } - -.fa.fa-remove:before { - content: "\f00d"; } - -.fa.fa-close:before { - content: "\f00d"; } - -.fa.fa-gear:before { - content: "\f013"; } - -.fa.fa-trash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-trash-o:before { - content: "\f2ed"; } - -.fa.fa-file-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-o:before { - content: "\f15b"; } - -.fa.fa-clock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-clock-o:before { - content: "\f017"; } - -.fa.fa-arrow-circle-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-down:before { - content: "\f358"; } - -.fa.fa-arrow-circle-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-up:before { - content: "\f35b"; } - -.fa.fa-play-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-play-circle-o:before { - content: "\f144"; } - -.fa.fa-repeat:before { - content: "\f01e"; } - -.fa.fa-rotate-right:before { - content: "\f01e"; } - -.fa.fa-refresh:before { - content: "\f021"; } - -.fa.fa-list-alt { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-dedent:before { - content: "\f03b"; } - -.fa.fa-video-camera:before { - content: "\f03d"; } - -.fa.fa-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-picture-o:before { - content: "\f03e"; } - -.fa.fa-photo { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-photo:before { - content: "\f03e"; } - -.fa.fa-image { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-image:before { - content: "\f03e"; } - -.fa.fa-pencil:before { - content: "\f303"; } - -.fa.fa-map-marker:before { - content: "\f3c5"; } - -.fa.fa-pencil-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-pencil-square-o:before { - content: "\f044"; } - -.fa.fa-share-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-share-square-o:before { - content: "\f14d"; } - -.fa.fa-check-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-check-square-o:before { - content: "\f14a"; } - -.fa.fa-arrows:before { - content: "\f0b2"; } - -.fa.fa-times-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-times-circle-o:before { - content: "\f057"; } - -.fa.fa-check-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-check-circle-o:before { - content: "\f058"; } - -.fa.fa-mail-forward:before { - content: "\f064"; } - -.fa.fa-eye { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-eye-slash { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-warning:before { - content: "\f071"; } - -.fa.fa-calendar:before { - content: "\f073"; } - -.fa.fa-arrows-v:before { - content: "\f338"; } - -.fa.fa-arrows-h:before { - content: "\f337"; } - -.fa.fa-bar-chart { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-bar-chart:before { - content: "\f080"; } - -.fa.fa-bar-chart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-bar-chart-o:before { - content: "\f080"; } - -.fa.fa-twitter-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-facebook-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gears:before { - content: "\f085"; } - -.fa.fa-thumbs-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-thumbs-o-up:before { - content: "\f164"; } - -.fa.fa-thumbs-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-thumbs-o-down:before { - content: "\f165"; } - -.fa.fa-heart-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-heart-o:before { - content: "\f004"; } - -.fa.fa-sign-out:before { - content: "\f2f5"; } - -.fa.fa-linkedin-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-linkedin-square:before { - content: "\f08c"; } - -.fa.fa-thumb-tack:before { - content: "\f08d"; } - -.fa.fa-external-link:before { - content: "\f35d"; } - -.fa.fa-sign-in:before { - content: "\f2f6"; } - -.fa.fa-github-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-lemon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-lemon-o:before { - content: "\f094"; } - -.fa.fa-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-square-o:before { - content: "\f0c8"; } - -.fa.fa-bookmark-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-bookmark-o:before { - content: "\f02e"; } - -.fa.fa-twitter { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-facebook { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-facebook:before { - content: "\f39e"; } - -.fa.fa-facebook-f { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-facebook-f:before { - content: "\f39e"; } - -.fa.fa-github { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-credit-card { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-feed:before { - content: "\f09e"; } - -.fa.fa-hdd-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hdd-o:before { - content: "\f0a0"; } - -.fa.fa-hand-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-o-right:before { - content: "\f0a4"; } - -.fa.fa-hand-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-o-left:before { - content: "\f0a5"; } - -.fa.fa-hand-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-o-up:before { - content: "\f0a6"; } - -.fa.fa-hand-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-o-down:before { - content: "\f0a7"; } - -.fa.fa-arrows-alt:before { - content: "\f31e"; } - -.fa.fa-group:before { - content: "\f0c0"; } - -.fa.fa-chain:before { - content: "\f0c1"; } - -.fa.fa-scissors:before { - content: "\f0c4"; } - -.fa.fa-files-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-files-o:before { - content: "\f0c5"; } - -.fa.fa-floppy-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-floppy-o:before { - content: "\f0c7"; } - -.fa.fa-navicon:before { - content: "\f0c9"; } - -.fa.fa-reorder:before { - content: "\f0c9"; } - -.fa.fa-pinterest { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pinterest-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus:before { - content: "\f0d5"; } - -.fa.fa-money { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-money:before { - content: "\f3d1"; } - -.fa.fa-unsorted:before { - content: "\f0dc"; } - -.fa.fa-sort-desc:before { - content: "\f0dd"; } - -.fa.fa-sort-asc:before { - content: "\f0de"; } - -.fa.fa-linkedin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-linkedin:before { - content: "\f0e1"; } - -.fa.fa-rotate-left:before { - content: "\f0e2"; } - -.fa.fa-legal:before { - content: "\f0e3"; } - -.fa.fa-tachometer:before { - content: "\f3fd"; } - -.fa.fa-dashboard:before { - content: "\f3fd"; } - -.fa.fa-comment-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-comment-o:before { - content: "\f075"; } - -.fa.fa-comments-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-comments-o:before { - content: "\f086"; } - -.fa.fa-flash:before { - content: "\f0e7"; } - -.fa.fa-clipboard { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-paste { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-paste:before { - content: "\f328"; } - -.fa.fa-lightbulb-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-lightbulb-o:before { - content: "\f0eb"; } - -.fa.fa-exchange:before { - content: "\f362"; } - -.fa.fa-cloud-download:before { - content: "\f381"; } - -.fa.fa-cloud-upload:before { - content: "\f382"; } - -.fa.fa-bell-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-bell-o:before { - content: "\f0f3"; } - -.fa.fa-cutlery:before { - content: "\f2e7"; } - -.fa.fa-file-text-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-text-o:before { - content: "\f15c"; } - -.fa.fa-building-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-building-o:before { - content: "\f1ad"; } - -.fa.fa-hospital-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hospital-o:before { - content: "\f0f8"; } - -.fa.fa-tablet:before { - content: "\f3fa"; } - -.fa.fa-mobile:before { - content: "\f3cd"; } - -.fa.fa-mobile-phone:before { - content: "\f3cd"; } - -.fa.fa-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-circle-o:before { - content: "\f111"; } - -.fa.fa-mail-reply:before { - content: "\f3e5"; } - -.fa.fa-github-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-folder-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-folder-o:before { - content: "\f07b"; } - -.fa.fa-folder-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-folder-open-o:before { - content: "\f07c"; } - -.fa.fa-smile-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-smile-o:before { - content: "\f118"; } - -.fa.fa-frown-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-frown-o:before { - content: "\f119"; } - -.fa.fa-meh-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-meh-o:before { - content: "\f11a"; } - -.fa.fa-keyboard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-keyboard-o:before { - content: "\f11c"; } - -.fa.fa-flag-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-flag-o:before { - content: "\f024"; } - -.fa.fa-mail-reply-all:before { - content: "\f122"; } - -.fa.fa-star-half-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-star-half-o:before { - content: "\f089"; } - -.fa.fa-star-half-empty { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-star-half-empty:before { - content: "\f089"; } - -.fa.fa-star-half-full { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-star-half-full:before { - content: "\f089"; } - -.fa.fa-code-fork:before { - content: "\f126"; } - -.fa.fa-chain-broken:before { - content: "\f127"; } - -.fa.fa-shield:before { - content: "\f3ed"; } - -.fa.fa-calendar-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-calendar-o:before { - content: "\f133"; } - -.fa.fa-maxcdn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-html5 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-css3 { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ticket:before { - content: "\f3ff"; } - -.fa.fa-minus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-minus-square-o:before { - content: "\f146"; } - -.fa.fa-level-up:before { - content: "\f3bf"; } - -.fa.fa-level-down:before { - content: "\f3be"; } - -.fa.fa-pencil-square:before { - content: "\f14b"; } - -.fa.fa-external-link-square:before { - content: "\f360"; } - -.fa.fa-compass { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-down:before { - content: "\f150"; } - -.fa.fa-toggle-down { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-toggle-down:before { - content: "\f150"; } - -.fa.fa-caret-square-o-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-up:before { - content: "\f151"; } - -.fa.fa-toggle-up { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-toggle-up:before { - content: "\f151"; } - -.fa.fa-caret-square-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-right:before { - content: "\f152"; } - -.fa.fa-toggle-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-toggle-right:before { - content: "\f152"; } - -.fa.fa-eur:before { - content: "\f153"; } - -.fa.fa-euro:before { - content: "\f153"; } - -.fa.fa-gbp:before { - content: "\f154"; } - -.fa.fa-usd:before { - content: "\f155"; } - -.fa.fa-dollar:before { - content: "\f155"; } - -.fa.fa-inr:before { - content: "\f156"; } - -.fa.fa-rupee:before { - content: "\f156"; } - -.fa.fa-jpy:before { - content: "\f157"; } - -.fa.fa-cny:before { - content: "\f157"; } - -.fa.fa-rmb:before { - content: "\f157"; } - -.fa.fa-yen:before { - content: "\f157"; } - -.fa.fa-rub:before { - content: "\f158"; } - -.fa.fa-ruble:before { - content: "\f158"; } - -.fa.fa-rouble:before { - content: "\f158"; } - -.fa.fa-krw:before { - content: "\f159"; } - -.fa.fa-won:before { - content: "\f159"; } - -.fa.fa-btc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bitcoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bitcoin:before { - content: "\f15a"; } - -.fa.fa-file-text:before { - content: "\f15c"; } - -.fa.fa-sort-alpha-asc:before { - content: "\f15d"; } - -.fa.fa-sort-alpha-desc:before { - content: "\f15e"; } - -.fa.fa-sort-amount-asc:before { - content: "\f160"; } - -.fa.fa-sort-amount-desc:before { - content: "\f161"; } - -.fa.fa-sort-numeric-asc:before { - content: "\f162"; } - -.fa.fa-sort-numeric-desc:before { - content: "\f163"; } - -.fa.fa-youtube-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-youtube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-xing { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-xing-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-youtube-play { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-youtube-play:before { - content: "\f167"; } - -.fa.fa-dropbox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-stack-overflow { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-instagram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-flickr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-adn { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket-square:before { - content: "\f171"; } - -.fa.fa-tumblr { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-tumblr-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-long-arrow-down:before { - content: "\f309"; } - -.fa.fa-long-arrow-up:before { - content: "\f30c"; } - -.fa.fa-long-arrow-left:before { - content: "\f30a"; } - -.fa.fa-long-arrow-right:before { - content: "\f30b"; } - -.fa.fa-apple { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-windows { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-android { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-linux { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-dribbble { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-skype { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-foursquare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-trello { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gratipay { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gittip { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gittip:before { - content: "\f184"; } - -.fa.fa-sun-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-sun-o:before { - content: "\f185"; } - -.fa.fa-moon-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-moon-o:before { - content: "\f186"; } - -.fa.fa-vk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-renren { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pagelines { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-stack-exchange { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-right { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-right:before { - content: "\f35a"; } - -.fa.fa-arrow-circle-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-left:before { - content: "\f359"; } - -.fa.fa-caret-square-o-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-left:before { - content: "\f191"; } - -.fa.fa-toggle-left { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-toggle-left:before { - content: "\f191"; } - -.fa.fa-dot-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-dot-circle-o:before { - content: "\f192"; } - -.fa.fa-vimeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-try:before { - content: "\f195"; } - -.fa.fa-turkish-lira:before { - content: "\f195"; } - -.fa.fa-plus-square-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-plus-square-o:before { - content: "\f0fe"; } - -.fa.fa-slack { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wordpress { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-openid { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-institution:before { - content: "\f19c"; } - -.fa.fa-bank:before { - content: "\f19c"; } - -.fa.fa-mortar-board:before { - content: "\f19d"; } - -.fa.fa-yahoo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-reddit { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-reddit-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-stumbleupon-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-stumbleupon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-delicious { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-digg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pied-piper-pp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pied-piper-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-drupal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-joomla { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-spoon:before { - content: "\f2e5"; } - -.fa.fa-behance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-behance-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-steam { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-steam-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-automobile:before { - content: "\f1b9"; } - -.fa.fa-cab:before { - content: "\f1ba"; } - -.fa.fa-envelope-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-envelope-o:before { - content: "\f0e0"; } - -.fa.fa-deviantart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-soundcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-file-pdf-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-pdf-o:before { - content: "\f1c1"; } - -.fa.fa-file-word-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-word-o:before { - content: "\f1c2"; } - -.fa.fa-file-excel-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-excel-o:before { - content: "\f1c3"; } - -.fa.fa-file-powerpoint-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-powerpoint-o:before { - content: "\f1c4"; } - -.fa.fa-file-image-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-image-o:before { - content: "\f1c5"; } - -.fa.fa-file-photo-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-photo-o:before { - content: "\f1c5"; } - -.fa.fa-file-picture-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-picture-o:before { - content: "\f1c5"; } - -.fa.fa-file-archive-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-archive-o:before { - content: "\f1c6"; } - -.fa.fa-file-zip-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-zip-o:before { - content: "\f1c6"; } - -.fa.fa-file-audio-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-audio-o:before { - content: "\f1c7"; } - -.fa.fa-file-sound-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-sound-o:before { - content: "\f1c7"; } - -.fa.fa-file-video-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-video-o:before { - content: "\f1c8"; } - -.fa.fa-file-movie-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-movie-o:before { - content: "\f1c8"; } - -.fa.fa-file-code-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-file-code-o:before { - content: "\f1c9"; } - -.fa.fa-vine { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-codepen { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-jsfiddle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-life-ring { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-life-bouy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-life-bouy:before { - content: "\f1cd"; } - -.fa.fa-life-buoy { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-life-buoy:before { - content: "\f1cd"; } - -.fa.fa-life-saver { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-life-saver:before { - content: "\f1cd"; } - -.fa.fa-support { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-support:before { - content: "\f1cd"; } - -.fa.fa-circle-o-notch:before { - content: "\f1ce"; } - -.fa.fa-rebel { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ra { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ra:before { - content: "\f1d0"; } - -.fa.fa-resistance { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-resistance:before { - content: "\f1d0"; } - -.fa.fa-empire { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ge:before { - content: "\f1d1"; } - -.fa.fa-git-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-git { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-hacker-news { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator-square:before { - content: "\f1d4"; } - -.fa.fa-yc-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-yc-square:before { - content: "\f1d4"; } - -.fa.fa-tencent-weibo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-qq { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-weixin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wechat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wechat:before { - content: "\f1d7"; } - -.fa.fa-send:before { - content: "\f1d8"; } - -.fa.fa-paper-plane-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-paper-plane-o:before { - content: "\f1d8"; } - -.fa.fa-send-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-send-o:before { - content: "\f1d8"; } - -.fa.fa-circle-thin { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-circle-thin:before { - content: "\f111"; } - -.fa.fa-header:before { - content: "\f1dc"; } - -.fa.fa-sliders:before { - content: "\f1de"; } - -.fa.fa-futbol-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-futbol-o:before { - content: "\f1e3"; } - -.fa.fa-soccer-ball-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-soccer-ball-o:before { - content: "\f1e3"; } - -.fa.fa-slideshare { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-twitch { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-yelp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-newspaper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-newspaper-o:before { - content: "\f1ea"; } - -.fa.fa-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-wallet { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-visa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-mastercard { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-discover { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-amex { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-paypal { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-stripe { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bell-slash-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-bell-slash-o:before { - content: "\f1f6"; } - -.fa.fa-trash:before { - content: "\f2ed"; } - -.fa.fa-copyright { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-eyedropper:before { - content: "\f1fb"; } - -.fa.fa-area-chart:before { - content: "\f1fe"; } - -.fa.fa-pie-chart:before { - content: "\f200"; } - -.fa.fa-line-chart:before { - content: "\f201"; } - -.fa.fa-lastfm { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-lastfm-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ioxhost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-angellist { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-cc:before { - content: "\f20a"; } - -.fa.fa-ils:before { - content: "\f20b"; } - -.fa.fa-shekel:before { - content: "\f20b"; } - -.fa.fa-sheqel:before { - content: "\f20b"; } - -.fa.fa-meanpath { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-meanpath:before { - content: "\f2b4"; } - -.fa.fa-buysellads { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-connectdevelop { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-dashcube { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-forumbee { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-leanpub { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-sellsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-shirtsinbulk { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-simplybuilt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-skyatlas { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-diamond { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-diamond:before { - content: "\f3a5"; } - -.fa.fa-intersex:before { - content: "\f224"; } - -.fa.fa-facebook-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-facebook-official:before { - content: "\f09a"; } - -.fa.fa-pinterest-p { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-whatsapp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-hotel:before { - content: "\f236"; } - -.fa.fa-viacoin { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-medium { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-yc { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-yc:before { - content: "\f23b"; } - -.fa.fa-optin-monster { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-opencart { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-expeditedssl { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-battery-4:before { - content: "\f240"; } - -.fa.fa-battery:before { - content: "\f240"; } - -.fa.fa-battery-3:before { - content: "\f241"; } - -.fa.fa-battery-2:before { - content: "\f242"; } - -.fa.fa-battery-1:before { - content: "\f243"; } - -.fa.fa-battery-0:before { - content: "\f244"; } - -.fa.fa-object-group { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-object-ungroup { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-sticky-note-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-sticky-note-o:before { - content: "\f249"; } - -.fa.fa-cc-jcb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-cc-diners-club { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-clone { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hourglass-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hourglass-o:before { - content: "\f254"; } - -.fa.fa-hourglass-1:before { - content: "\f251"; } - -.fa.fa-hourglass-2:before { - content: "\f252"; } - -.fa.fa-hourglass-3:before { - content: "\f253"; } - -.fa.fa-hand-rock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-rock-o:before { - content: "\f255"; } - -.fa.fa-hand-grab-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-grab-o:before { - content: "\f255"; } - -.fa.fa-hand-paper-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-paper-o:before { - content: "\f256"; } - -.fa.fa-hand-stop-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-stop-o:before { - content: "\f256"; } - -.fa.fa-hand-scissors-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-scissors-o:before { - content: "\f257"; } - -.fa.fa-hand-lizard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-lizard-o:before { - content: "\f258"; } - -.fa.fa-hand-spock-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-spock-o:before { - content: "\f259"; } - -.fa.fa-hand-pointer-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-pointer-o:before { - content: "\f25a"; } - -.fa.fa-hand-peace-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-hand-peace-o:before { - content: "\f25b"; } - -.fa.fa-registered { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-creative-commons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gg { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gg-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-tripadvisor { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-odnoklassniki { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-odnoklassniki-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-get-pocket { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wikipedia-w { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-safari { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-chrome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-firefox { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-opera { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-internet-explorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-television:before { - content: "\f26c"; } - -.fa.fa-contao { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-500px { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-amazon { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-calendar-plus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-calendar-plus-o:before { - content: "\f271"; } - -.fa.fa-calendar-minus-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-calendar-minus-o:before { - content: "\f272"; } - -.fa.fa-calendar-times-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-calendar-times-o:before { - content: "\f273"; } - -.fa.fa-calendar-check-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-calendar-check-o:before { - content: "\f274"; } - -.fa.fa-map-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-map-o:before { - content: "\f279"; } - -.fa.fa-commenting:before { - content: "\f4ad"; } - -.fa.fa-commenting-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-commenting-o:before { - content: "\f4ad"; } - -.fa.fa-houzz { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-vimeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-vimeo:before { - content: "\f27d"; } - -.fa.fa-black-tie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-fonticons { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-reddit-alien { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-edge { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-credit-card-alt:before { - content: "\f09d"; } - -.fa.fa-codiepie { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-modx { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-fort-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-usb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-product-hunt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-mixcloud { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-scribd { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pause-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-pause-circle-o:before { - content: "\f28b"; } - -.fa.fa-stop-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-stop-circle-o:before { - content: "\f28d"; } - -.fa.fa-bluetooth { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-bluetooth-b { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-gitlab { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wpbeginner { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wpforms { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-envira { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wheelchair-alt { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wheelchair-alt:before { - content: "\f368"; } - -.fa.fa-question-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-question-circle-o:before { - content: "\f059"; } - -.fa.fa-volume-control-phone:before { - content: "\f2a0"; } - -.fa.fa-asl-interpreting:before { - content: "\f2a3"; } - -.fa.fa-deafness:before { - content: "\f2a4"; } - -.fa.fa-hard-of-hearing:before { - content: "\f2a4"; } - -.fa.fa-glide { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-glide-g { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-signing:before { - content: "\f2a7"; } - -.fa.fa-viadeo { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-viadeo-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-snapchat { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-snapchat-ghost { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-snapchat-square { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-pied-piper { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-first-order { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-yoast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-themeisle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-official { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-official:before { - content: "\f2b3"; } - -.fa.fa-google-plus-circle { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-circle:before { - content: "\f2b3"; } - -.fa.fa-font-awesome { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-fa { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-fa:before { - content: "\f2b4"; } - -.fa.fa-handshake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-handshake-o:before { - content: "\f2b5"; } - -.fa.fa-envelope-open-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-envelope-open-o:before { - content: "\f2b6"; } - -.fa.fa-linode { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-address-book-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-address-book-o:before { - content: "\f2b9"; } - -.fa.fa-vcard:before { - content: "\f2bb"; } - -.fa.fa-address-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-address-card-o:before { - content: "\f2bb"; } - -.fa.fa-vcard-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-vcard-o:before { - content: "\f2bb"; } - -.fa.fa-user-circle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-user-circle-o:before { - content: "\f2bd"; } - -.fa.fa-user-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-user-o:before { - content: "\f007"; } - -.fa.fa-id-badge { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-drivers-license:before { - content: "\f2c2"; } - -.fa.fa-id-card-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-id-card-o:before { - content: "\f2c2"; } - -.fa.fa-drivers-license-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-drivers-license-o:before { - content: "\f2c2"; } - -.fa.fa-quora { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-free-code-camp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-telegram { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-thermometer-4:before { - content: "\f2c7"; } - -.fa.fa-thermometer:before { - content: "\f2c7"; } - -.fa.fa-thermometer-3:before { - content: "\f2c8"; } - -.fa.fa-thermometer-2:before { - content: "\f2c9"; } - -.fa.fa-thermometer-1:before { - content: "\f2ca"; } - -.fa.fa-thermometer-0:before { - content: "\f2cb"; } - -.fa.fa-bathtub:before { - content: "\f2cd"; } - -.fa.fa-s15:before { - content: "\f2cd"; } - -.fa.fa-window-maximize { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-window-restore { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-times-rectangle:before { - content: "\f410"; } - -.fa.fa-window-close-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-window-close-o:before { - content: "\f410"; } - -.fa.fa-times-rectangle-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-times-rectangle-o:before { - content: "\f410"; } - -.fa.fa-bandcamp { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-grav { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-etsy { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-imdb { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-ravelry { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-eercast { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-eercast:before { - content: "\f2da"; } - -.fa.fa-snowflake-o { - font-family: 'Font Awesome 5 Free'; - font-weight: 400; } - -.fa.fa-snowflake-o:before { - content: "\f2dc"; } - -.fa.fa-superpowers { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-wpexplorer { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } - -.fa.fa-spotify { - font-family: 'Font Awesome 5 Brands'; - font-weight: 400; } diff --git a/shopyo/static/fontawesome/css/v4-shims.min.css b/shopyo/static/fontawesome/css/v4-shims.min.css deleted file mode 100644 index 06c24e9..0000000 --- a/shopyo/static/fontawesome/css/v4-shims.min.css +++ /dev/null @@ -1 +0,0 @@ -.fa.fa-glass:before{content:"\f000"}.fa.fa-meetup{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-star-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-o:before{content:"\f005"}.fa.fa-close:before,.fa.fa-remove:before{content:"\f00d"}.fa.fa-gear:before{content:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-trash-o:before{content:"\f2ed"}.fa.fa-file-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-o:before{content:"\f15b"}.fa.fa-clock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-clock-o:before{content:"\f017"}.fa.fa-arrow-circle-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-down:before{content:"\f358"}.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-up:before{content:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-play-circle-o:before{content:"\f144"}.fa.fa-repeat:before,.fa.fa-rotate-right:before{content:"\f01e"}.fa.fa-refresh:before{content:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dedent:before{content:"\f03b"}.fa.fa-video-camera:before{content:"\f03d"}.fa.fa-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-picture-o:before{content:"\f03e"}.fa.fa-photo{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-photo:before{content:"\f03e"}.fa.fa-image{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-image:before{content:"\f03e"}.fa.fa-pencil:before{content:"\f303"}.fa.fa-map-marker:before{content:"\f3c5"}.fa.fa-pencil-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pencil-square-o:before{content:"\f044"}.fa.fa-share-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-share-square-o:before{content:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-square-o:before{content:"\f14a"}.fa.fa-arrows:before{content:"\f0b2"}.fa.fa-times-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-circle-o:before{content:"\f057"}.fa.fa-check-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-check-circle-o:before{content:"\f058"}.fa.fa-mail-forward:before{content:"\f064"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-warning:before{content:"\f071"}.fa.fa-calendar:before{content:"\f073"}.fa.fa-arrows-v:before{content:"\f338"}.fa.fa-arrows-h:before{content:"\f337"}.fa.fa-bar-chart{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart:before{content:"\f080"}.fa.fa-bar-chart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bar-chart-o:before{content:"\f080"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gears:before{content:"\f085"}.fa.fa-thumbs-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-up:before{content:"\f164"}.fa.fa-thumbs-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-thumbs-o-down:before{content:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-heart-o:before{content:"\f004"}.fa.fa-sign-out:before{content:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin-square:before{content:"\f08c"}.fa.fa-thumb-tack:before{content:"\f08d"}.fa.fa-external-link:before{content:"\f35d"}.fa.fa-sign-in:before{content:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-lemon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lemon-o:before{content:"\f094"}.fa.fa-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-square-o:before{content:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bookmark-o:before{content:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook:before{content:"\f39e"}.fa.fa-facebook-f{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-f:before{content:"\f39e"}.fa.fa-github{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-feed:before{content:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hdd-o:before{content:"\f0a0"}.fa.fa-hand-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-right:before{content:"\f0a4"}.fa.fa-hand-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-left:before{content:"\f0a5"}.fa.fa-hand-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-up:before{content:"\f0a6"}.fa.fa-hand-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-o-down:before{content:"\f0a7"}.fa.fa-arrows-alt:before{content:"\f31e"}.fa.fa-group:before{content:"\f0c0"}.fa.fa-chain:before{content:"\f0c1"}.fa.fa-scissors:before{content:"\f0c4"}.fa.fa-files-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-files-o:before{content:"\f0c5"}.fa.fa-floppy-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-floppy-o:before{content:"\f0c7"}.fa.fa-navicon:before,.fa.fa-reorder:before{content:"\f0c9"}.fa.fa-google-plus,.fa.fa-google-plus-square,.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus:before{content:"\f0d5"}.fa.fa-money{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-money:before{content:"\f3d1"}.fa.fa-unsorted:before{content:"\f0dc"}.fa.fa-sort-desc:before{content:"\f0dd"}.fa.fa-sort-asc:before{content:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-linkedin:before{content:"\f0e1"}.fa.fa-rotate-left:before{content:"\f0e2"}.fa.fa-legal:before{content:"\f0e3"}.fa.fa-dashboard:before,.fa.fa-tachometer:before{content:"\f3fd"}.fa.fa-comment-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comment-o:before{content:"\f075"}.fa.fa-comments-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-comments-o:before{content:"\f086"}.fa.fa-flash:before{content:"\f0e7"}.fa.fa-clipboard,.fa.fa-paste{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paste:before{content:"\f328"}.fa.fa-lightbulb-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-lightbulb-o:before{content:"\f0eb"}.fa.fa-exchange:before{content:"\f362"}.fa.fa-cloud-download:before{content:"\f381"}.fa.fa-cloud-upload:before{content:"\f382"}.fa.fa-bell-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-o:before{content:"\f0f3"}.fa.fa-cutlery:before{content:"\f2e7"}.fa.fa-file-text-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-text-o:before{content:"\f15c"}.fa.fa-building-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-building-o:before{content:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hospital-o:before{content:"\f0f8"}.fa.fa-tablet:before{content:"\f3fa"}.fa.fa-mobile-phone:before,.fa.fa-mobile:before{content:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-o:before{content:"\f111"}.fa.fa-mail-reply:before{content:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-folder-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-o:before{content:"\f07b"}.fa.fa-folder-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-folder-open-o:before{content:"\f07c"}.fa.fa-smile-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-smile-o:before{content:"\f118"}.fa.fa-frown-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-frown-o:before{content:"\f119"}.fa.fa-meh-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-meh-o:before{content:"\f11a"}.fa.fa-keyboard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-keyboard-o:before{content:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-flag-o:before{content:"\f024"}.fa.fa-mail-reply-all:before{content:"\f122"}.fa.fa-star-half-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-o:before{content:"\f089"}.fa.fa-star-half-empty{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-empty:before{content:"\f089"}.fa.fa-star-half-full{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-star-half-full:before{content:"\f089"}.fa.fa-code-fork:before{content:"\f126"}.fa.fa-chain-broken:before{content:"\f127"}.fa.fa-shield:before{content:"\f3ed"}.fa.fa-calendar-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-o:before{content:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ticket:before{content:"\f3ff"}.fa.fa-minus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-minus-square-o:before{content:"\f146"}.fa.fa-level-up:before{content:"\f3bf"}.fa.fa-level-down:before{content:"\f3be"}.fa.fa-pencil-square:before{content:"\f14b"}.fa.fa-external-link-square:before{content:"\f360"}.fa.fa-compass{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-down:before{content:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-down:before{content:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-up:before{content:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-up:before{content:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-right:before{content:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-right:before{content:"\f152"}.fa.fa-eur:before,.fa.fa-euro:before{content:"\f153"}.fa.fa-gbp:before{content:"\f154"}.fa.fa-dollar:before,.fa.fa-usd:before{content:"\f155"}.fa.fa-inr:before,.fa.fa-rupee:before{content:"\f156"}.fa.fa-cny:before,.fa.fa-jpy:before,.fa.fa-rmb:before,.fa.fa-yen:before{content:"\f157"}.fa.fa-rouble:before,.fa.fa-rub:before,.fa.fa-ruble:before{content:"\f158"}.fa.fa-krw:before,.fa.fa-won:before{content:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitcoin:before{content:"\f15a"}.fa.fa-file-text:before{content:"\f15c"}.fa.fa-sort-alpha-asc:before{content:"\f15d"}.fa.fa-sort-alpha-desc:before{content:"\f15e"}.fa.fa-sort-amount-asc:before{content:"\f160"}.fa.fa-sort-amount-desc:before{content:"\f161"}.fa.fa-sort-numeric-asc:before{content:"\f162"}.fa.fa-sort-numeric-desc:before{content:"\f163"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-play,.fa.fa-youtube-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-youtube-play:before{content:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bitbucket-square:before{content:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-long-arrow-down:before{content:"\f309"}.fa.fa-long-arrow-up:before{content:"\f30c"}.fa.fa-long-arrow-left:before{content:"\f30a"}.fa.fa-long-arrow-right:before{content:"\f30b"}.fa.fa-android,.fa.fa-apple,.fa.fa-dribbble,.fa.fa-foursquare,.fa.fa-gittip,.fa.fa-gratipay,.fa.fa-linux,.fa.fa-skype,.fa.fa-trello,.fa.fa-windows{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-gittip:before{content:"\f184"}.fa.fa-sun-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sun-o:before{content:"\f185"}.fa.fa-moon-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-moon-o:before{content:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-right:before{content:"\f35a"}.fa.fa-arrow-circle-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-arrow-circle-o-left:before{content:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-caret-square-o-left:before{content:"\f191"}.fa.fa-toggle-left{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-toggle-left:before{content:"\f191"}.fa.fa-dot-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-dot-circle-o:before{content:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-try:before,.fa.fa-turkish-lira:before{content:"\f195"}.fa.fa-plus-square-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-plus-square-o:before{content:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bank:before,.fa.fa-institution:before{content:"\f19c"}.fa.fa-mortar-board:before{content:"\f19d"}.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-google,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle,.fa.fa-yahoo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-spoon:before{content:"\f2e5"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-automobile:before{content:"\f1b9"}.fa.fa-cab:before{content:"\f1ba"}.fa.fa-envelope-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-o:before{content:"\f0e0"}.fa.fa-deviantart,.fa.fa-soundcloud{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-file-pdf-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-pdf-o:before{content:"\f1c1"}.fa.fa-file-word-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-word-o:before{content:"\f1c2"}.fa.fa-file-excel-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-excel-o:before{content:"\f1c3"}.fa.fa-file-powerpoint-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-powerpoint-o:before{content:"\f1c4"}.fa.fa-file-image-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-image-o:before{content:"\f1c5"}.fa.fa-file-photo-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-photo-o:before{content:"\f1c5"}.fa.fa-file-picture-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-picture-o:before{content:"\f1c5"}.fa.fa-file-archive-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-archive-o:before{content:"\f1c6"}.fa.fa-file-zip-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-zip-o:before{content:"\f1c6"}.fa.fa-file-audio-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-audio-o:before{content:"\f1c7"}.fa.fa-file-sound-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-sound-o:before{content:"\f1c7"}.fa.fa-file-video-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-video-o:before{content:"\f1c8"}.fa.fa-file-movie-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-movie-o:before{content:"\f1c8"}.fa.fa-file-code-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-file-code-o:before{content:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-ring{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-bouy:before{content:"\f1cd"}.fa.fa-life-buoy{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-buoy:before{content:"\f1cd"}.fa.fa-life-saver{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-life-saver:before{content:"\f1cd"}.fa.fa-support{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-support:before{content:"\f1cd"}.fa.fa-circle-o-notch:before{content:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ra:before{content:"\f1d0"}.fa.fa-resistance{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-resistance:before{content:"\f1d0"}.fa.fa-empire,.fa.fa-ge{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-ge:before{content:"\f1d1"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-y-combinator-square:before{content:"\f1d4"}.fa.fa-yc-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc-square:before{content:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wechat:before{content:"\f1d7"}.fa.fa-send:before{content:"\f1d8"}.fa.fa-paper-plane-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-paper-plane-o:before{content:"\f1d8"}.fa.fa-send-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-send-o:before{content:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-circle-thin:before{content:"\f111"}.fa.fa-header:before{content:"\f1dc"}.fa.fa-sliders:before{content:"\f1de"}.fa.fa-futbol-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-futbol-o:before{content:"\f1e3"}.fa.fa-soccer-ball-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-soccer-ball-o:before{content:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-newspaper-o:before{content:"\f1ea"}.fa.fa-cc-amex,.fa.fa-cc-discover,.fa.fa-cc-mastercard,.fa.fa-cc-paypal,.fa.fa-cc-stripe,.fa.fa-cc-visa,.fa.fa-google-wallet,.fa.fa-paypal{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-bell-slash-o:before{content:"\f1f6"}.fa.fa-trash:before{content:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-eyedropper:before{content:"\f1fb"}.fa.fa-area-chart:before{content:"\f1fe"}.fa.fa-pie-chart:before{content:"\f200"}.fa.fa-line-chart:before{content:"\f201"}.fa.fa-angellist,.fa.fa-ioxhost,.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-cc:before{content:"\f20a"}.fa.fa-ils:before,.fa.fa-shekel:before,.fa.fa-sheqel:before{content:"\f20b"}.fa.fa-meanpath{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-meanpath:before{content:"\f2b4"}.fa.fa-buysellads,.fa.fa-connectdevelop,.fa.fa-dashcube,.fa.fa-forumbee,.fa.fa-leanpub,.fa.fa-sellsy,.fa.fa-shirtsinbulk,.fa.fa-simplybuilt,.fa.fa-skyatlas{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-diamond:before{content:"\f3a5"}.fa.fa-intersex:before{content:"\f224"}.fa.fa-facebook-official{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-facebook-official:before{content:"\f09a"}.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-hotel:before{content:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-yc:before{content:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-battery-4:before,.fa.fa-battery:before{content:"\f240"}.fa.fa-battery-3:before{content:"\f241"}.fa.fa-battery-2:before{content:"\f242"}.fa.fa-battery-1:before{content:"\f243"}.fa.fa-battery-0:before{content:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-sticky-note-o:before{content:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-clone,.fa.fa-hourglass-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hourglass-o:before{content:"\f254"}.fa.fa-hourglass-1:before{content:"\f251"}.fa.fa-hourglass-2:before{content:"\f252"}.fa.fa-hourglass-3:before{content:"\f253"}.fa.fa-hand-rock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-rock-o:before{content:"\f255"}.fa.fa-hand-grab-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-grab-o:before{content:"\f255"}.fa.fa-hand-paper-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-paper-o:before{content:"\f256"}.fa.fa-hand-stop-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-stop-o:before{content:"\f256"}.fa.fa-hand-scissors-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-scissors-o:before{content:"\f257"}.fa.fa-hand-lizard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-lizard-o:before{content:"\f258"}.fa.fa-hand-spock-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-spock-o:before{content:"\f259"}.fa.fa-hand-pointer-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-pointer-o:before{content:"\f25a"}.fa.fa-hand-peace-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-hand-peace-o:before{content:"\f25b"}.fa.fa-registered{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-chrome,.fa.fa-creative-commons,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-internet-explorer,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square,.fa.fa-opera,.fa.fa-safari,.fa.fa-tripadvisor,.fa.fa-wikipedia-w{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-television:before{content:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-calendar-plus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-plus-o:before{content:"\f271"}.fa.fa-calendar-minus-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-minus-o:before{content:"\f272"}.fa.fa-calendar-times-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-times-o:before{content:"\f273"}.fa.fa-calendar-check-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-calendar-check-o:before{content:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-map-o:before{content:"\f279"}.fa.fa-commenting:before{content:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-commenting-o:before{content:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-vimeo:before{content:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-credit-card-alt:before{content:"\f09d"}.fa.fa-codiepie,.fa.fa-fort-awesome,.fa.fa-mixcloud,.fa.fa-modx,.fa.fa-product-hunt,.fa.fa-scribd,.fa.fa-usb{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-pause-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-pause-circle-o:before{content:"\f28b"}.fa.fa-stop-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-stop-circle-o:before{content:"\f28d"}.fa.fa-bluetooth,.fa.fa-bluetooth-b,.fa.fa-envira,.fa.fa-gitlab,.fa.fa-wheelchair-alt,.fa.fa-wpbeginner,.fa.fa-wpforms{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-wheelchair-alt:before{content:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-question-circle-o:before{content:"\f059"}.fa.fa-volume-control-phone:before{content:"\f2a0"}.fa.fa-asl-interpreting:before{content:"\f2a3"}.fa.fa-deafness:before,.fa.fa-hard-of-hearing:before{content:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-signing:before{content:"\f2a7"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat,.fa.fa-snapchat-ghost,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-viadeo,.fa.fa-viadeo-square,.fa.fa-yoast{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-official:before{content:"\f2b3"}.fa.fa-google-plus-circle{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-google-plus-circle:before{content:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-fa:before{content:"\f2b4"}.fa.fa-handshake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-handshake-o:before{content:"\f2b5"}.fa.fa-envelope-open-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-envelope-open-o:before{content:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-book-o:before{content:"\f2b9"}.fa.fa-vcard:before{content:"\f2bb"}.fa.fa-address-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-address-card-o:before{content:"\f2bb"}.fa.fa-vcard-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-vcard-o:before{content:"\f2bb"}.fa.fa-user-circle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-circle-o:before{content:"\f2bd"}.fa.fa-user-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-user-o:before{content:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license:before{content:"\f2c2"}.fa.fa-id-card-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-id-card-o:before{content:"\f2c2"}.fa.fa-drivers-license-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-drivers-license-o:before{content:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-thermometer-4:before,.fa.fa-thermometer:before{content:"\f2c7"}.fa.fa-thermometer-3:before{content:"\f2c8"}.fa.fa-thermometer-2:before{content:"\f2c9"}.fa.fa-thermometer-1:before{content:"\f2ca"}.fa.fa-thermometer-0:before{content:"\f2cb"}.fa.fa-bathtub:before,.fa.fa-s15:before{content:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle:before{content:"\f410"}.fa.fa-window-close-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-window-close-o:before{content:"\f410"}.fa.fa-times-rectangle-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-times-rectangle-o:before{content:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 5 Brands";font-weight:400}.fa.fa-eercast:before{content:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 5 Free";font-weight:400}.fa.fa-snowflake-o:before{content:"\f2dc"}.fa.fa-spotify,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 5 Brands";font-weight:400} \ No newline at end of file diff --git a/shopyo/static/fontawesome/webfonts/fa-brands-400.eot b/shopyo/static/fontawesome/webfonts/fa-brands-400.eot deleted file mode 100644 index e30fd00..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-brands-400.eot and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-brands-400.svg b/shopyo/static/fontawesome/webfonts/fa-brands-400.svg deleted file mode 100644 index 599dfbd..0000000 --- a/shopyo/static/fontawesome/webfonts/fa-brands-400.svg +++ /dev/null @@ -1,3300 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Feb 1 12:28:28 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shopyo/static/fontawesome/webfonts/fa-brands-400.ttf b/shopyo/static/fontawesome/webfonts/fa-brands-400.ttf deleted file mode 100644 index 1543db8..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-brands-400.woff b/shopyo/static/fontawesome/webfonts/fa-brands-400.woff deleted file mode 100644 index c293cef..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-brands-400.woff and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-brands-400.woff2 b/shopyo/static/fontawesome/webfonts/fa-brands-400.woff2 deleted file mode 100644 index d9f97df..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-regular-400.eot b/shopyo/static/fontawesome/webfonts/fa-regular-400.eot deleted file mode 100644 index 12be17b..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-regular-400.eot and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-regular-400.svg b/shopyo/static/fontawesome/webfonts/fa-regular-400.svg deleted file mode 100644 index d594678..0000000 --- a/shopyo/static/fontawesome/webfonts/fa-regular-400.svg +++ /dev/null @@ -1,803 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Feb 1 12:28:28 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shopyo/static/fontawesome/webfonts/fa-regular-400.ttf b/shopyo/static/fontawesome/webfonts/fa-regular-400.ttf deleted file mode 100644 index abf3f48..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-regular-400.woff b/shopyo/static/fontawesome/webfonts/fa-regular-400.woff deleted file mode 100644 index 257b315..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-regular-400.woff and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-regular-400.woff2 b/shopyo/static/fontawesome/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 0f55b06..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-solid-900.eot b/shopyo/static/fontawesome/webfonts/fa-solid-900.eot deleted file mode 100644 index 89e407d..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-solid-900.eot and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-solid-900.svg b/shopyo/static/fontawesome/webfonts/fa-solid-900.svg deleted file mode 100644 index 9a0a64f..0000000 --- a/shopyo/static/fontawesome/webfonts/fa-solid-900.svg +++ /dev/null @@ -1,4520 +0,0 @@ - - - - - -Created by FontForge 20190112 at Fri Feb 1 12:28:29 2019 - By Robert Madole -Copyright (c) Font Awesome - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/shopyo/static/fontawesome/webfonts/fa-solid-900.ttf b/shopyo/static/fontawesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index 6c9fe78..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-solid-900.woff b/shopyo/static/fontawesome/webfonts/fa-solid-900.woff deleted file mode 100644 index bf52883..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-solid-900.woff and /dev/null differ diff --git a/shopyo/static/fontawesome/webfonts/fa-solid-900.woff2 b/shopyo/static/fontawesome/webfonts/fa-solid-900.woff2 deleted file mode 100644 index 318cd3d..0000000 Binary files a/shopyo/static/fontawesome/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/shopyo/static/jquery_3.2.1.min.js b/shopyo/static/jquery_3.2.1.min.js deleted file mode 100644 index 644d35e..0000000 --- a/shopyo/static/jquery_3.2.1.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - {% include get_active_front_theme()+'/sections/drawer_head.html'%} - - - {% include 'base/blocks/flashed_messages.html' %} - {% include get_active_front_theme()+'/sections/nav.html'%} -
- - {% include get_active_front_theme()+'/sections/carousel.html'%} -
- - {% include get_active_front_theme()+'/sections/image_row.html'%} - -
-
-

WELCOME TO FREAKS BOUTIQUE

- - -

-
-
- -
-
-

HOME DELIVERY

-

PLAINE WILHEMS ONLY

-
-
- -
-
   OUR CATEGORIES   
- -
-
- - {%for category in get_categories()%} - {%if category.name.upper() != 'UNCATEGORISED'%} - -
- - -
- - -
- -
- - -
- - -

{{ category.name }}

- - {%set sum_ = namespace(items=0) %} - {%for subcategory in category.subcategories%} - {%set sum_.items = sum_.items + len(subcategory.products) %} - - {%endfor%} -

{{ sum_.items }} products

- - - -
- -
- - - -
- {%endif%} - {%endfor%} - -
-
- -
   NEW PRODUCTS   
- -
- {%set target_prds = get_products()[::-1]%} - {%set target_num=5%} - {%if len(target_prds) >= 5%} - - {%else%} - {%set target_num=len(target_prds)%} - {%endif%} - {%for i in range(target_num)%} - - {%set product = target_prds[i]%} -
- - - -
- - -
- -
- - -
- - -

{{ product.name }}

- - -

Rs {{product.selling_price}}

- - - -
- -
- - - -
- {%endfor%} - -
- -
   FOLLOW US ON FB AND INSTAGRAM   
- -
- - -
- -
   SIGN UP & BE THE FIRST TO KNOW   
- -
-
-
-
- -
-
- - - -
- -
-
-
-
- - - - {% include get_active_front_theme()+'/sections/footer.html'%} - - \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/info.json b/shopyo/static/themes/front/ecommerceus/info.json deleted file mode 100644 index 91b4f3a..0000000 --- a/shopyo/static/themes/front/ecommerceus/info.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "author": "ARJ", - "version": "1.0.20000000000003" -} \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/sections/carousel.html b/shopyo/static/themes/front/ecommerceus/sections/carousel.html deleted file mode 100644 index f13a39d..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/carousel.html +++ /dev/null @@ -1,38 +0,0 @@ - \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/sections/drawer_head.html b/shopyo/static/themes/front/ecommerceus/sections/drawer_head.html deleted file mode 100644 index 4517a3e..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/drawer_head.html +++ /dev/null @@ -1,68 +0,0 @@ - - \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/sections/footer.html b/shopyo/static/themes/front/ecommerceus/sections/footer.html deleted file mode 100644 index 08d7482..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/footer.html +++ /dev/null @@ -1,20 +0,0 @@ - \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/sections/image_row.html b/shopyo/static/themes/front/ecommerceus/sections/image_row.html deleted file mode 100644 index 578ab60..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/image_row.html +++ /dev/null @@ -1,41 +0,0 @@ -
-
-
- -
- smaple image -
-

- pegje p0rewtj e0e tyj
- -

-
-
-
-
- -
- smaple image -
-

- pegje p0rewtj e0e tyj
- -

-
-
-
-
- -
- smaple image -
-

- pegje p0rewtj e0e tyj
- -

-
-
-
-
- -
diff --git a/shopyo/static/themes/front/ecommerceus/sections/nav.html b/shopyo/static/themes/front/ecommerceus/sections/nav.html deleted file mode 100644 index c55d669..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/nav.html +++ /dev/null @@ -1,184 +0,0 @@ - - - - \ No newline at end of file diff --git a/shopyo/static/themes/front/ecommerceus/sections/resources.html b/shopyo/static/themes/front/ecommerceus/sections/resources.html deleted file mode 100644 index e9c8ed5..0000000 --- a/shopyo/static/themes/front/ecommerceus/sections/resources.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -{%if active_page == 'index.html'%} - - - -{%endif%} - diff --git a/shopyo/static/themes/front/ecommerceus/styles.css b/shopyo/static/themes/front/ecommerceus/styles.css deleted file mode 100644 index e8e4064..0000000 --- a/shopyo/static/themes/front/ecommerceus/styles.css +++ /dev/null @@ -1,43 +0,0 @@ - - html { - scroll-behavior: smooth; - } - .suggest { - - } - - .suggest span { - padding-left: 5px; - padding-right: 5px; - margin: 5px; - min-width: 50px; - } - - a{ - text-decoration: inherit; - color: inherit; - } - a:hover{ - text-decoration: inherit; - color: inherit; - } - - #flashed-messages{ - padding: 5px; - position: fixed; - right: 5px; - top: 5px; - z-index: 10; - height: 300px; - overflow-y: scroll; - - } - #flashed-messages::-webkit-scrollbar { - display: none; - } - /* Hide scrollbar for IE and Edge */ - #flashed-messages{ - -ms-overflow-style: none; - } - - diff --git a/shopyo/static/tinymce/icons/default/icons.min.js b/shopyo/static/tinymce/icons/default/icons.min.js deleted file mode 100644 index 086f297..0000000 --- a/shopyo/static/tinymce/icons/default/icons.min.js +++ /dev/null @@ -1 +0,0 @@ -tinymce.IconManager.add("default",{icons:{"accessibility-check":'',"action-next":'',"action-prev":'',"align-center":'',"align-justify":'',"align-left":'',"align-none":'',"align-right":'',"arrow-left":'',"arrow-right":'',bold:'',bookmark:'',"border-width":'',brightness:'',browse:'',cancel:'',"change-case":'',"character-count":'',"checklist-rtl":'',checklist:'',checkmark:'',"chevron-down":'',"chevron-left":'',"chevron-right":'',"chevron-up":'',close:'',"code-sample":'',"color-levels":'',"color-picker":'',"color-swatch-remove-color":'',"color-swatch":'',"comment-add":'',comment:'',contrast:'',copy:'',crop:'',"cut-column":'',"cut-row":'',cut:'',"document-properties":'',drag:'',"duplicate-column":'',"duplicate-row":'',duplicate:'',"edit-block":'',"edit-image":'',"embed-page":'',embed:'',emoji:'',"export":'',fill:'',"flip-horizontally":'',"flip-vertically":'',"format-painter":'',format:'',fullscreen:'',gallery:'',gamma:'',help:'',"highlight-bg-color":'',home:'',"horizontal-rule":'',"image-options":'',image:'',indent:'',info:'',"insert-character":'',"insert-time":'',invert:'',italic:'',"line-height":'',line:'',link:'',"list-bull-circle":'',"list-bull-default":'',"list-bull-square":'',"list-num-default-rtl":'',"list-num-default":'',"list-num-lower-alpha-rtl":'',"list-num-lower-alpha":'',"list-num-lower-greek-rtl":'',"list-num-lower-greek":'',"list-num-lower-roman-rtl":'',"list-num-lower-roman":'',"list-num-upper-alpha-rtl":'',"list-num-upper-alpha":'',"list-num-upper-roman-rtl":'',"list-num-upper-roman":'',lock:'',ltr:'',"more-drawer":'',"new-document":'',"new-tab":'',"non-breaking":'',notice:'',"ordered-list-rtl":'',"ordered-list":'',orientation:'',outdent:'',"page-break":'',paragraph:'',"paste-column-after":'',"paste-column-before":'',"paste-row-after":'',"paste-row-before":'',"paste-text":'',paste:'',"permanent-pen":'',plus:'',preferences:'',preview:'',print:'',quote:'',redo:'',reload:'',"remove-formatting":'',remove:'',"resize-handle":'',resize:'',"restore-draft":'',"rotate-left":'',"rotate-right":'',rtl:'',save:'',search:'',"select-all":'',selected:'',settings:'',sharpen:'',sourcecode:'',"spell-check":'',"strike-through":'',subscript:'',superscript:'',"table-cell-properties":'',"table-cell-select-all":'',"table-cell-select-inner":'',"table-delete-column":'',"table-delete-row":'',"table-delete-table":'',"table-insert-column-after":'',"table-insert-column-before":'',"table-insert-row-above":'',"table-insert-row-after":'',"table-left-header":'',"table-merge-cells":'',"table-row-properties":'',"table-split-cells":'',"table-top-header":'',table:'',template:'',"temporary-placeholder":'',"text-color":'',toc:'',translate:'',underline:'',undo:'',unlink:'',unlock:'',"unordered-list":'',unselected:'',upload:'',user:'',visualblocks:'',visualchars:'',warning:'',"zoom-in":'',"zoom-out":''}}); \ No newline at end of file diff --git a/shopyo/static/tinymce/jquery.tinymce.min.js b/shopyo/static/tinymce/jquery.tinymce.min.js deleted file mode 100644 index f26b879..0000000 --- a/shopyo/static/tinymce/jquery.tinymce.min.js +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - */ -/** - * Jquery integration plugin. - * - * @class tinymce.core.JqueryIntegration - * @private - */ -!function(){var f,c,u,s=[],p="undefined"!=typeof global?global:window,d=p.jQuery,v=function(){ -// Reference to tinymce needs to be lazily evaluated since tinymce -// might be loaded through the compressor or other means -return p.tinymce};d.fn.tinymce=function(o){var e,t,i,l=this,r=""; -// No match then just ignore the call -if(!l.length)return l; -// Get editor instance -if(!o)return v()?v().get(l[0].id):null;l.css("visibility","hidden");// Hide textarea to avoid flicker -var n,a=function(){var a=[],c=0; -// Apply patches to the jQuery object, only once -u||(m(),u=!0), -// Create an editor instance for each matched node -l.each(function(e,t){var n,i=t.id,r=o.oninit; -// Generate unique id for target element if needed -i||(t.id=i=v().DOM.uniqueId()), -// Only init the editor once -v().get(i)||( -// Create editor instance and render it -n=v().createEditor(i,o),a.push(n),n.on("init",function(){var e,t=r;l.css("visibility",""), -// Run this if the oninit setting is defined -// this logic will fire the oninit callback ones each -// matched editor instance is initialized -r&&++c==a.length&&("string"==typeof t&&(e=-1===t.indexOf(".")?null:v().resolve(t.replace(/\.\w+$/,"")),t=v().resolve(t)), -// Call the oninit function with the object -t.apply(e||v(),a))}))}), -// Render the editor instances in a separate loop since we -// need to have the full editors array used in the onInit calls -d.each(a,function(e,t){t.render()})}; -// Load TinyMCE on demand, if we need to -return p.tinymce||c||!(e=o.script_url)? -// Delay the init call until tinymce is loaded -1===c?s.push(a):a():(c=1,t=e.substring(0,e.lastIndexOf("/")), -// Check if it's a dev/src version they want to load then -// make sure that all plugins, themes etc are loaded in source mode as well --1!=e.indexOf(".min")&&(r=".min"), -// Setup tinyMCEPreInit object this will later be used by the TinyMCE -// core script to locate other resources like CSS files, dialogs etc -// You can also predefined a tinyMCEPreInit object and then it will use that instead -p.tinymce=p.tinyMCEPreInit||{base:t,suffix:r}, -// url contains gzip then we assume it's a compressor --1!=e.indexOf("gzip")&&(i=o.language||"en",e=e+(/\?/.test(e)?"&":"?")+"js=true&core=true&suffix="+escape(r)+"&themes="+escape(o.theme||"modern")+"&plugins="+escape(o.plugins||"")+"&languages="+(i||""), -// Check if compressor script is already loaded otherwise setup a basic one -p.tinyMCE_GZ||(p.tinyMCE_GZ={start:function(){var n=function(e){v().ScriptLoader.markDone(v().baseURI.toAbsolute(e))}; -// Add core languages -n("langs/"+i+".js"), -// Add themes with languages -n("themes/"+o.theme+"/theme"+r+".js"),n("themes/"+o.theme+"/langs/"+i+".js"), -// Add plugins with languages -d.each(o.plugins.split(","),function(e,t){t&&(n("plugins/"+t+"/plugin"+r+".js"),n("plugins/"+t+"/langs/"+i+".js"))})},end:function(){}})),(n=document.createElement("script")).type="text/javascript",n.onload=n.onreadystatechange=function(e){e=e||window.event,2===c||"load"!=e.type&&!/complete|loaded/.test(n.readyState)||(v().dom.Event.domLoaded=1,c=2, -// Execute callback after mainscript has been loaded and before the initialization occurs -o.script_loaded&&o.script_loaded(),a(),d.each(s,function(e,t){t()}))},n.src=e,document.body.appendChild(n)),l}, -// Add :tinymce pseudo selector this will select elements that has been converted into editor instances -// it's now possible to use things like $('*:tinymce') to get all TinyMCE bound elements. -d.extend(d.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in p&&(t=v().get(e.id))&&t.editorManager===v())}}); -// This function patches internal jQuery functions so that if -// you for example remove an div element containing an editor it's -// automatically destroyed by the TinyMCE API -var m=function(){ -// Removes any child editor instances by looking for editor wrapper elements -var r=function(e){ -// If the function is remove -"remove"===e&&this.each(function(e,t){var n=l(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=v().get(t.id.replace(/_parent$/,""));n&&n.remove()})},o=function(i){var e,t=this; -// Handle set value -/*jshint eqnull:true */if(null!=i)r.call(t), -// Saves the contents before get/set value of textarea/div -t.each(function(e,t){var n;(n=v().get(t.id))&&n.setContent(i)});else if(0])*>/g,""):n.getContent({save:!0}):a.apply(d(t),r)}),i}}), -// Makes it possible to use $('#id').append("content"); to append contents to the TinyMCE editor iframe -d.each(["append","prepend"],function(e,t){var n=s[t]=d.fn[t],r="prepend"===t;d.fn[t]=function(i){var e=this;return u(e)?i!==f?("string"==typeof i&&e.filter(":tinymce").each(function(e,t){var n=l(t);n&&n.setContent(r?i+n.getContent():n.getContent()+i)}),n.apply(e.not(":tinymce"),arguments),e):void 0:n.apply(e,arguments)}}), -// Makes sure that the editor instance gets properly destroyed when the parent element is removed -d.each(["remove","replaceWith","replaceAll","empty"],function(e,t){var n=s[t]=d.fn[t];d.fn[t]=function(){return r.call(this,t),n.apply(this,arguments)}}),s.attr=d.fn.attr, -// Makes sure that $('#tinymce_id').attr('value') gets the editors current HTML contents -d.fn.attr=function(e,t){var n=this,i=arguments;if(!e||"value"!==e||!u(n))return s.attr.apply(n,i);if(t!==f)return o.call(n.filter(":tinymce"),t),s.attr.apply(n.not(":tinymce"),i),n;// return original set for chaining -var r=n[0],a=l(r);return a?a.getContent({save:!0}):s.attr.apply(d(r),i)}}}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/langs/readme.md b/shopyo/static/tinymce/langs/readme.md deleted file mode 100644 index a52bf03..0000000 --- a/shopyo/static/tinymce/langs/readme.md +++ /dev/null @@ -1,3 +0,0 @@ -This is where language files should be placed. - -Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/ diff --git a/shopyo/static/tinymce/license.txt b/shopyo/static/tinymce/license.txt deleted file mode 100644 index b17fc90..0000000 --- a/shopyo/static/tinymce/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/shopyo/static/tinymce/plugins/advlist/plugin.min.js b/shopyo/static/tinymce/plugins/advlist/plugin.min.js deleted file mode 100644 index c10bf3b..0000000 --- a/shopyo/static/tinymce/plugins/advlist/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var n,e,t,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(n,e,t){var r="UL"===e?"InsertUnorderedList":"InsertOrderedList";n.execCommand(r,!1,!1===t?null:{"list-style-type":t})},l=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n){return function(){return n}},c=i(!1),s=i(!0),o=function(){return a},a=(n=function(n){return n.isNone()},{fold:function(n,e){return n()},is:c,isSome:c,isNone:s,getOr:t=function(n){return n},getOrThunk:e=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:t,orThunk:e,map:o,each:function(){},bind:o,exists:c,forall:s,filter:o,equals:n,equals_:n,toArray:function(){return[]},toString:i("none()")}),f=function(t){var n=i(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:s,isNone:c,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return f(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:a},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(c,function(n){return e(t,n)})}};return o},d=function(n){return null===n||n===undefined?a:f(n)},g=function(n){return n&&/^(TH|TD)$/.test(n.nodeName)},m=function(r){return function(n){return n&&/^(OL|UL|DL)$/.test(n.nodeName)&&(t=n,(e=r).$.contains(e.getBody(),t));var e,t}},p=function(n,e,t){var r=function(n,e){for(var t=0;ty(e)&&(r=g+u),(l=e.getParam("max_height",0,"number"))&&li(t.getParam("autosave_retention"),"20m"))||(c(t,!1),!1)},c=function(t,e){var r=u(t);n.removeItem(r+"draft"),n.removeItem(r+"time"),!1!==e&&t.fire("RemoveDraft")},m=function(t){var e=u(t);!s(t)&&t.isDirty()&&(n.setItem(e+"draft",t.getContent({format:"raw",no_events:!0})),n.setItem(e+"time",(new Date).getTime().toString()),t.fire("StoreDraft"))},l=function(t){var e=u(t);f(t)&&(t.setContent(n.getItem(e+"draft"),{format:"raw"}),t.fire("RestoreDraft"))},v=function(t){var e=i(t.getParam("autosave_interval"),"30s");r.setInterval(function(){t.removed||m(t)},e)},d=function(t){t.undoManager.transact(function(){l(t),c(t)}),t.focus()},g=tinymce.util.Tools.resolve("tinymce.EditorManager"),y=function(r){return function(t){t.setDisabled(!f(r));var e=function(){return t.setDisabled(!f(r))};return r.on("StoreDraft RestoreDraft RemoveDraft",e),function(){return r.off("StoreDraft RestoreDraft RemoveDraft",e)}}};t.add("autosave",function(t){var e,r;return t.editorManager.on("BeforeUnload",function(t){var e;o.each(g.get(),function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e&&(t.preventDefault(),t.returnValue=e)}),v(e=t),e.ui.registry.addButton("restoredraft",{tooltip:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),e.ui.registry.addMenuItem("restoredraft",{text:"Restore last draft",icon:"restore-draft",onAction:function(){d(e)},onSetup:y(e)}),t.on("init",function(){t.getParam("autosave_restore_when_empty",!1)&&t.dom.isEmpty(t.getBody())&&l(t)}),r=t,{hasDraft:function(){return f(r)},storeDraft:function(){return m(r)},restoreDraft:function(){return l(r)},removeDraft:function(t){return c(r,t)},isEmpty:function(t){return s(r,t)}}})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/bbcode/plugin.min.js b/shopyo/static/tinymce/plugins/bbcode/plugin.min.js deleted file mode 100644 index 9b3ea25..0000000 --- a/shopyo/static/tinymce/plugins/bbcode/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var o=tinymce.util.Tools.resolve("tinymce.PluginManager"),e=tinymce.util.Tools.resolve("tinymce.util.Tools"),t=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/\n/gi,"
"),o(/\[b\]/gi,""),o(/\[\/b\]/gi,""),o(/\[i\]/gi,""),o(/\[\/i\]/gi,""),o(/\[u\]/gi,""),o(/\[\/u\]/gi,""),o(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2'),o(/\[url\](.*?)\[\/url\]/gi,'$1'),o(/\[img\](.*?)\[\/img\]/gi,''),o(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2'),o(/\[code\](.*?)\[\/code\]/gi,'$1 '),o(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 '),t};o.add("bbcode",function(o){o.on("BeforeSetContent",function(o){o.content=t(o.content)}),o.on("PostProcess",function(o){o.set&&(o.content=t(o.content)),o.get&&(o.content=function(t){t=e.trim(t);var o=function(o,e){t=t.replace(o,e)};return o(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),o(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),o(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"),o(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"),o(/(.*?)<\/font>/gi,"$1"),o(//gi,"[img]$1[/img]"),o(/(.*?)<\/span>/gi,"[code]$1[/code]"),o(/(.*?)<\/span>/gi,"[quote]$1[/quote]"),o(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),o(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),o(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),o(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),o(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),o(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),o(/<\/(strong|b)>/gi,"[/b]"),o(/<(strong|b)>/gi,"[b]"),o(/<\/(em|i)>/gi,"[/i]"),o(/<(em|i)>/gi,"[i]"),o(/<\/u>/gi,"[/u]"),o(/(.*?)<\/span>/gi,"[u]$1[/u]"),o(//gi,"[u]"),o(/]*>/gi,"[quote]"),o(/<\/blockquote>/gi,"[/quote]"),o(/
/gi,"\n"),o(//gi,"\n"),o(/
/gi,"\n"),o(/

/gi,""),o(/<\/p>/gi,"\n"),o(/ |\u00a0/gi," "),o(/"/gi,'"'),o(/</gi,"<"),o(/>/gi,">"),o(/&/gi,"&"),t}(o.content))})})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/charmap/plugin.min.js b/shopyo/static/tinymce/plugins/charmap/plugin.min.js deleted file mode 100644 index 32abe40..0000000 --- a/shopyo/static/tinymce/plugins/charmap/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var e,n,r,t,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),s=function(e,n){var r,t=(r=n,e.fire("insertCustomChar",{chr:r}).chr);e.execCommand("mceInsertContent",!1,t)},i=function(e){return function(){return e}},o=i(!1),c=i(!0),u=function(){return l},l=(e=function(e){return e.isNone()},{fold:function(e,n){return e()},is:o,isSome:o,isNone:c,getOr:r=function(e){return e},getOrThunk:n=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:i(null),getOrUndefined:i(undefined),or:r,orThunk:n,map:u,each:function(){},bind:u,exists:o,forall:c,filter:u,equals:e,equals_:e,toArray:function(){return[]},toString:i("none()")}),g=function(r){var e=i(r),n=function(){return a},t=function(e){return e(r)},a={fold:function(e,n){return n(r)},is:function(e){return r===e},isSome:c,isNone:o,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:n,orThunk:n,map:function(e){return g(e(r))},each:function(e){e(r)},bind:t,exists:t,forall:t,filter:function(e){return e(r)?a:l},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,n){return e.fold(o,function(e){return n(r,e)})}};return a},m={some:g,none:u,from:function(e){return null===e||e===undefined?l:g(e)}},f=(t="array",function(e){return r=typeof(n=e),(null===n?"null":"object"==r&&(Array.prototype.isPrototypeOf(n)||n.constructor&&"Array"===n.constructor.name)?"array":"object"==r&&(String.prototype.isPrototypeOf(n)||n.constructor&&"String"===n.constructor.name)?"string":r)===t;var n,r}),h=Array.prototype.push,p=function(e,n){for(var r=e.length,t=new Array(r),a=0;a>>0===o))throw RangeError("Invalid code point: "+o);16383<=(o<=65535?r.push(o):(o-=65536,r.push(55296+(o>>10),o%1024+56320)))&&(t+=String.fromCharCode.apply(null,r),r.length=0)}return t+String.fromCharCode.apply(null,r)},S=function(e,n){var a=[],i=n.toLowerCase();return function(e,n){for(var r=0,t=e.length;r>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/,number:/(?:\b0x(?:[\da-f]+\.?[\da-f]*|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?)[ful]*/i}),Prism.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+(?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(?:<.+?>|("|')(?:\\?.)+?\2)/,lookbehind:!0},directive:{pattern:/(#\s*)\b(?:define|defined|elif|else|endif|error|ifdef|ifndef|if|import|include|line|pragma|undef|using)\b/,lookbehind:!0,alias:"keyword"}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete Prism.languages.c["boolean"]},{}],2:[function(e,n,t){Prism.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|interface|extends|implements|trait|instanceof|new)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(?:true|false)\b/,"function":/\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/}},{}],3:[function(e,t,n){(function(e){var n=function(u){var c=/\blang(?:uage)?-([\w-]+)\b/i,n=0,C={manual:u.Prism&&u.Prism.manual,disableWorkerMessageHandler:u.Prism&&u.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof O?new O(e.type,C.util.encode(e.content),e.alias):Array.isArray(e)?e.map(C.util.encode):e.replace(/&/g,"&").replace(/e.length)return;if(!(w instanceof O)){if(m&&b!=n.length-1){if(d.lastIndex=y,!(P=d.exec(e)))break;for(var v=P.index+(g&&P[1]?P[1].length:0),k=P.index+P[0].length,x=b,_=y,F=n.length;x"+a.content+""},!u.document)return u.addEventListener&&(C.disableWorkerMessageHandler||u.addEventListener("message",function(e){var n=JSON.parse(e.data),t=n.language,a=n.code,r=n.immediateClose;u.postMessage(C.highlight(a,C.languages[t],t)),r&&u.close()},!1)),C;var e,t,a=C.util.currentScript();return a&&(C.filename=a.src,a.hasAttribute("data-manual")&&(C.manual=!0)),C.manual||(e=function(){C.manual||C.highlightAll()},"loading"===(t=document.readyState)||"interactive"===t&&a&&a.defer?document.addEventListener("DOMContentLoaded",e):window.requestAnimationFrame?window.requestAnimationFrame(e):window.setTimeout(e,16)),C}("undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{});void 0!==t&&t.exports&&(t.exports=n),void 0!==e&&(e.Prism=n)}).call(this,void 0!==b?b:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],4:[function(e,n,t){Prism.languages.cpp=Prism.languages.extend("c",{"class-name":{pattern:/(\b(?:class|enum|struct)\s+)\w+/,lookbehind:!0},keyword:/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+\.?[\da-f']*|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+\.?[\d']*|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]*/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,"boolean":/\b(?:true|false)\b/}),Prism.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}})},{}],5:[function(e,n,t){Prism.languages.csharp=Prism.languages.extend("clike",{keyword:/\b(?:abstract|add|alias|as|ascending|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|descending|do|double|dynamic|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|from|get|global|goto|group|if|implicit|in|int|interface|internal|into|is|join|let|lock|long|namespace|new|null|object|operator|orderby|out|override|params|partial|private|protected|public|readonly|ref|remove|return|sbyte|sealed|select|set|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|value|var|virtual|void|volatile|where|while|yield)\b/,string:[{pattern:/@("|')(?:\1\1|\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},{pattern:/("|')(?:\\.|(?!\1)[^\\\r\n])*?\1/,greedy:!0}],"class-name":[{pattern:/\b[A-Z]\w*(?:\.\w+)*\b(?=\s+\w+)/,inside:{punctuation:/\./}},{pattern:/(\[)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}},{pattern:/((?:\b(?:class|interface|new)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,lookbehind:!0,inside:{punctuation:/\./}}],number:/\b0x[\da-f]+\b|(?:\b\d+\.?\d*|\B\.\d+)f?/i,operator:/>>=?|<<=?|[-=]>|([-+&|?])\1|~|[-+*/%&|^!=<>]=?/,punctuation:/\?\.?|::|[{}[\];(),.:]/}),Prism.languages.insertBefore("csharp","class-name",{"generic-method":{pattern:/\w+\s*<[^>\r\n]+?>\s*(?=\()/,inside:{"function":/^\w+/,"class-name":{pattern:/\b[A-Z]\w*(?:\.\w+)*\b/,inside:{punctuation:/\./}},keyword:Prism.languages.csharp.keyword,punctuation:/[<>(),.:]/}},preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0,alias:"property",inside:{directive:{pattern:/(\s*#)\b(?:define|elif|else|endif|endregion|error|if|line|pragma|region|undef|warning)\b/,lookbehind:!0,alias:"keyword"}}}}),Prism.languages.dotnet=Prism.languages.cs=Prism.languages.csharp},{}],6:[function(e,n,t){!function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+[\s\S]*?(?:;|(?=\s*\{))/,inside:{rule:/@[\w-]+/}},url:{pattern:RegExp("url\\((?:"+n.source+"|[^\n\r()]*)\\)","i"),inside:{"function":/^url/i,punctuation:/^\(|\)$/}},selector:RegExp("[^{}\\s](?:[^{};\"']|"+n.source+")*?(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:t.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:e.languages.css}},alias:"language-css"}},t.tag))}(Prism)},{}],7:[function(e,n,t){var a,r,i;a=Prism,r=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|null|open|opens|package|private|protected|provides|public|requires|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,i=/\b[A-Z](?:\w*[a-z]\w*)?\b/,a.languages.java=a.languages.extend("clike",{"class-name":[i,/\b[A-Z]\w*(?=\s+\w+\s*[;,=())])/],keyword:r,"function":[a.languages.clike["function"],{pattern:/(\:\:)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x[\da-f_]*\.?[\da-f_p+-]+\b|(?:\b\d[\d_]*\.?[\d_]*|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0}}),a.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"}}),a.languages.insertBefore("java","class-name",{annotation:{alias:"punctuation",pattern:/(^|[^.])@\w+/,lookbehind:!0},namespace:{pattern:/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)[a-z]\w*(?:\.[a-z]\w*)+/,lookbehind:!0,inside:{punctuation:/\./}},generics:{pattern:/<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,inside:{"class-name":i,keyword:r,punctuation:/[<>(),.:]/,operator:/[?&|]/}}})},{}],8:[function(e,n,t){Prism.languages.javascript=Prism.languages.extend("clike",{"class-name":[Prism.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])[_$A-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,"function":/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,operator:/--|\+\+|\*\*=?|=>|&&|\|\||[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?[.?]?|[~:]/}),Prism.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,Prism.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s])\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*[\s\S]*?\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0},"function-variable":{pattern:/#?[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*)?\s*\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\))/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/[_$a-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*(?=\s*=>)/i,inside:Prism.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*=>)/,lookbehind:!0,inside:Prism.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:[_$A-Za-z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\s*)\(\s*)(?!\s)(?:[^()]|\([^()]*\))+?(?=\s*\)\s*\{)/,lookbehind:!0,inside:Prism.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),Prism.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:Prism.languages.javascript}},string:/[\s\S]+/}}}),Prism.languages.markup&&Prism.languages.markup.tag.addInlined("script","javascript"),Prism.languages.js=Prism.languages.javascript},{}],9:[function(e,n,t){function b(e,n){return"___"+e.toUpperCase()+n+"___"}var y;y=Prism,Object.defineProperties(y.languages["markup-templating"]={},{buildPlaceholders:{value:function(a,r,e,i){var s;a.language===r&&(s=a.tokenStack=[],a.code=a.code.replace(e,function(e){if("function"==typeof i&&!i(e))return e;for(var n,t=s.length;-1!==a.code.indexOf(n=b(r,t));)++t;return s[t]=e,n}),a.grammar=y.languages.markup)}},tokenizePlaceholders:{value:function(p,g){var m,f;p.language===g&&p.tokenStack&&(p.grammar=y.languages[g],m=0,f=Object.keys(p.tokenStack),function h(e){for(var n=0;n=f.length);n++){var t,a,r,i,s,o,l,u,c,d=e[n];"string"==typeof d||d.content&&"string"==typeof d.content?(t=f[m],a=p.tokenStack[t],r="string"==typeof d?d:d.content,i=b(g,t),-1<(s=r.indexOf(i))&&(++m,o=r.substring(0,s),l=new y.Token(g,y.tokenize(a,p.grammar),"language-"+g,a),u=r.substring(s+i.length),c=[],o&&c.push.apply(c,h([o])),c.push(l),u&&c.push.apply(c,h([u])),"string"==typeof d?e.splice.apply(e,[n,1].concat(c)):d.content=c)):d.content&&h(d.content)}return e}(p.tokens))}}})},{}],10:[function(e,n,t){Prism.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:(?!)*\]\s*)?>/i,greedy:!0},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/i,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/i,inside:{punctuation:[/^=/,{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},Prism.languages.markup.tag.inside["attr-value"].inside.entity=Prism.languages.markup.entity,Prism.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(Prism.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:Prism.languages[n]},t.cdata=/^$/i;var a={"included-cdata":{pattern://i,inside:t}};a["language-"+n]={pattern:/[\s\S]+/,inside:Prism.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[\s\S]*?>)(?:\s*|[\s\S])*?(?=<\/__>)/.source.replace(/__/g,e),"i"),lookbehind:!0,greedy:!0,inside:a},Prism.languages.insertBefore("markup","cdata",r)}}),Prism.languages.xml=Prism.languages.extend("markup",{}),Prism.languages.html=Prism.languages.markup,Prism.languages.mathml=Prism.languages.markup,Prism.languages.svg=Prism.languages.markup},{}],11:[function(e,n,t){!function(n){n.languages.php=n.languages.extend("clike",{keyword:/\b(?:__halt_compiler|abstract|and|array|as|break|callable|case|catch|class|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|eval|exit|extends|final|finally|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|namespace|new|or|parent|print|private|protected|public|require|require_once|return|static|switch|throw|trait|try|unset|use|var|while|xor|yield)\b/i,"boolean":{pattern:/\b(?:false|true)\b/i,alias:"constant"},constant:[/\b[A-Z_][A-Z0-9_]*\b/,/\b(?:null)\b/i],comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","string",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","comment",{delimiter:{pattern:/\?>$|^<\?(?:php(?=\s)|=)?/i,alias:"important"}}),n.languages.insertBefore("php","keyword",{variable:/\$+(?:\w+\b|(?={))/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}});var e={pattern:/{\$(?:{(?:{[^{}]+}|[^{}]+)}|[^{}])+}|(^|[^\\{])\$+(?:\w+(?:\[.+?]|->\w+)*)/,lookbehind:!0,inside:n.languages.php};n.languages.insertBefore("php","string",{"nowdoc-string":{pattern:/<<<'([^']+)'(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;/,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<'[^']+'|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<'?|[';]$/}}}},"heredoc-string":{pattern:/<<<(?:"([^"]+)"(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\1;|([a-z_]\w*)(?:\r\n?|\n)(?:.*(?:\r\n?|\n))*?\2;)/i,greedy:!0,alias:"string",inside:{delimiter:{pattern:/^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,alias:"symbol",inside:{punctuation:/^<<<"?|[";]$/}},interpolation:e}},"single-quoted-string":{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0,alias:"string"},"double-quoted-string":{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,alias:"string",inside:{interpolation:e}}}),delete n.languages.php.string,n.hooks.add("before-tokenize",function(e){/<\?/.test(e.code)&&n.languages["markup-templating"].buildPlaceholders(e,"php",/<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#)(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|\/\*[\s\S]*?(?:\*\/|$))*?(?:\?>|$)/gi)}),n.hooks.add("after-tokenize",function(e){n.languages["markup-templating"].tokenizePlaceholders(e,"php")})}(Prism)},{}],12:[function(e,n,t){Prism.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]+?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,"boolean":/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},Prism.languages.python["string-interpolation"].inside.interpolation.inside.rest=Prism.languages.python,Prism.languages.py=Prism.languages.python},{}],13:[function(e,n,t){!function(e){e.languages.ruby=e.languages.extend("clike",{comment:[/#.*/,{pattern:/^=begin\s[\s\S]*?^=end/m,greedy:!0}],"class-name":{pattern:/(\b(?:class)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|protected|private|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/});var n={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.languages.ruby}};delete e.languages.ruby["function"],e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,greedy:!0,inside:{interpolation:n}},{pattern:/(^|[^/])\/(?!\/)(?:\[.+?]|\\.|[^/\\\r\n])+\/[gim]{0,3}(?=\s*(?:$|[\r\n,.;})]))/,lookbehind:!0,greedy:!0}],variable:/[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,symbol:{pattern:/(^|[^:]):[a-zA-Z_]\w*(?:[?!]|\b)/,lookbehind:!0},"method-definition":{pattern:/(\bdef\s+)[\w.]+/,lookbehind:!0,inside:{"function":/\w+$/,rest:e.languages.ruby}}}),e.languages.insertBefore("ruby","number",{builtin:/\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|Fixnum|Float|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z]\w*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,greedy:!0,inside:{interpolation:n}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,greedy:!0,inside:{interpolation:n}},{pattern:/("|')(?:#\{[^}]+\}|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0,inside:{interpolation:n}}],e.languages.rb=e.languages.ruby}(Prism)},{}],14:[function(e,n,t){var a=e("prismjs/components/prism-core");e("prismjs/components/prism-clike"),e("prismjs/components/prism-markup-templating"),e("prismjs/components/prism-c"),e("prismjs/components/prism-cpp"),e("prismjs/components/prism-csharp"),e("prismjs/components/prism-css"),e("prismjs/components/prism-java"),e("prismjs/components/prism-javascript"),e("prismjs/components/prism-markup"),e("prismjs/components/prism-php"),e("prismjs/components/prism-python"),e("prismjs/components/prism-ruby"),n.exports={boltExport:a}},{"prismjs/components/prism-c":1,"prismjs/components/prism-clike":2,"prismjs/components/prism-core":3,"prismjs/components/prism-cpp":4,"prismjs/components/prism-csharp":5,"prismjs/components/prism-css":6,"prismjs/components/prism-java":7,"prismjs/components/prism-javascript":8,"prismjs/components/prism-markup":10,"prismjs/components/prism-markup-templating":9,"prismjs/components/prism-php":11,"prismjs/components/prism-python":12,"prismjs/components/prism-ruby":13}]},{},[14])(14)});var r=window.Prism;window.Prism=e}(undefined,f,h,undefined);var y=h.exports.boltExport,w=function(e){return m.Prism&&e.getParam("codesample_global_prismjs",!1,"boolean")?m.Prism:y},v=function(e){var n=e.selection?e.selection.getNode():null;return p(n)?c.some(n):c.none()},k=function(i){var e,t,n=i.getParam("codesample_languages")||[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],a=(0===(e=n).length?c.none():c.some(e[0])).fold(function(){return""},function(e){return e.value}),r=(t=a,v(i).fold(function(){return t},function(e){var n=e.className.match(/language-(\w+)/);return n?n[1]:t})),s=v(i).fold(function(){return""},function(e){return e.textContent});i.windowManager.open({title:"Insert/Edit Code Sample",size:"large",body:{type:"panel",items:[{type:"selectbox",name:"language",label:"Language",items:n},{type:"textarea",name:"code",label:"Code view"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:{language:r,code:s},onSubmit:function(e){var n,t,a,r=e.getData();n=i,t=r.language,a=r.code,n.undoManager.transact(function(){var e=v(n);return a=d.DOM.encode(a),e.fold(function(){n.insertContent('

'+a+"
"),n.selection.select(n.$("#__new").removeAttr("id")[0])},function(e){n.dom.setAttrib(e,"class","language-"+t),e.innerHTML=a,w(n).highlightElement(e),n.selection.select(e)})}),e.close()}})},x=function(a){a.ui.registry.addToggleButton("codesample",{icon:"code-sample",tooltip:"Insert/edit code sample",onAction:function(){return k(a)},onSetup:function(t){var e=function(){var e,n;t.setActive((n=(e=a).selection.getStart(),e.dom.is(n,'pre[class*="language-"]')))};return a.on("NodeChange",e),function(){return a.off("NodeChange",e)}}}),a.ui.registry.addMenuItem("codesample",{text:"Code sample...",icon:"code-sample",onAction:function(){return k(a)}})};a.add("codesample",function(n){var t,r,a;r=(t=n).$,t.on("PreProcess",function(e){r("pre[contenteditable=false]",e.node).filter(g(p)).each(function(e,n){var t=r(n),a=n.textContent;t.attr("class",r.trim(t.attr("class"))),t.removeAttr("contentEditable"),t.empty().append(r("").each(function(){this.textContent=a}))})}),t.on("SetContent",function(){var e=r("pre").filter(g(p)).filter(function(e,n){return"false"!==n.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,n){r(n).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),n.contentEditable="false",n.innerHTML=t.dom.encode(n.textContent),w(t).highlightElement(n),n.className=r.trim(n.className)})})}),x(n),(a=n).addCommand("codesample",function(){var e=a.selection.getNode();a.selection.isCollapsed()||p(e)?k(a):a.formatter.toggle("code")}),n.on("dblclick",function(e){p(e.target)&&k(n)})})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/colorpicker/plugin.min.js b/shopyo/static/tinymce/plugins/colorpicker/plugin.min.js deleted file mode 100644 index 1877f50..0000000 --- a/shopyo/static/tinymce/plugins/colorpicker/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("colorpicker",function(){console.warn("Color picker plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/contextmenu/plugin.min.js b/shopyo/static/tinymce/plugins/contextmenu/plugin.min.js deleted file mode 100644 index e4fa52b..0000000 --- a/shopyo/static/tinymce/plugins/contextmenu/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";tinymce.util.Tools.resolve("tinymce.PluginManager").add("contextmenu",function(){console.warn("Context menu plugin is now built in to the core editor, please remove it from your editor configuration")})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/directionality/plugin.min.js b/shopyo/static/tinymce/plugins/directionality/plugin.min.js deleted file mode 100644 index 296b31c..0000000 --- a/shopyo/static/tinymce/plugins/directionality/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var n,t,e,o,r=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=tinymce.util.Tools.resolve("tinymce.util.Tools"),i=function(n,t){var e,o=n.dom,r=n.selection.getSelectedBlocks();r.length&&(e=o.getAttrib(r[0],"dir"),u.each(r,function(n){o.getParent(n.parentNode,'*[dir="'+t+'"]',o.getRoot())||o.setAttrib(n,"dir",e!==t?t:null)}),n.nodeChanged())},c=function(n){return function(){return n}},f=c(!1),d=c(!0),l=function(){return m},m=(n=function(n){return n.isNone()},{fold:function(n,t){return n()},is:f,isSome:f,isNone:d,getOr:e=function(n){return n},getOrThunk:t=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:c(null),getOrUndefined:c(undefined),or:e,orThunk:t,map:l,each:function(){},bind:l,exists:f,forall:d,filter:l,equals:n,equals_:n,toArray:function(){return[]},toString:c("none()")}),a=function(e){var n=c(e),t=function(){return r},o=function(n){return n(e)},r={fold:function(n,t){return t(e)},is:function(n){return e===n},isSome:d,isNone:f,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:t,orThunk:t,map:function(n){return a(n(e))},each:function(n){n(e)},bind:o,exists:o,forall:o,filter:function(n){return n(e)?r:m},toArray:function(){return[e]},toString:function(){return"some("+e+")"},equals:function(n){return n.is(e)},equals_:function(n,t){return n.fold(f,function(n){return t(e,n)})}};return r},s={some:a,none:l,from:function(n){return null===n||n===undefined?m:a(n)}},g=(o="function",function(n){return typeof n===o}),h=function(n){if(null===n||n===undefined)throw new Error("Node cannot be null or undefined");return{dom:n}},y={fromHtml:function(n,t){var e=(t||document).createElement("div");if(e.innerHTML=n,!e.hasChildNodes()||1Could not load emoticons

"}]},buttons:[{type:"cancel",text:"Close",primary:!0}],initialData:{pattern:"",results:[]}}),f.focus(x),f.unblock()}))};o.add("emoticons",function(n,t){var e,o,r,i,u,a,c,l=(o=t,(e=n).getParam("emoticons_database_url",o+"/js/emojis"+e.suffix+".js")),s=n.getParam("emoticons_database_id","tinymce.plugins.emoticons","string"),f=_(n,l,s);i=f,u=function(){return L(r,i)},(r=n).ui.registry.addButton("emoticons",{tooltip:"Emoticons",icon:"emoji",onAction:u}),r.ui.registry.addMenuItem("emoticons",{text:"Emoticons...",icon:"emoji",onAction:u}),c=f,(a=n).ui.registry.addAutocompleter("emoticons",{ch:":",columns:"auto",minChars:2,fetch:function(t,e){return c.waitForLoad().then(function(){var n=c.listAll();return P(n,t,y.some(e))})},onAction:function(n,t,e){a.selection.setRng(t),a.insertContent(e),n.hide()}})})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/fullpage/plugin.min.js b/shopyo/static/tinymce/plugins/fullpage/plugin.min.js deleted file mode 100644 index f1bf947..0000000 --- a/shopyo/static/tinymce/plugins/fullpage/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var s=function(e){var t=e;return{get:function(){return t},set:function(e){t=e}}},e=tinymce.util.Tools.resolve("tinymce.PluginManager"),u=function(){return(u=Object.assign||function(e){for(var t,n=1,l=arguments.length;n"),(n=r.getAll("title")[0])&&n.firstChild&&(a.title=n.firstChild.value),p.each(r.getAll("meta"),function(e){var t,n=e.attr("name"),l=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"===l&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")))&&(a.docencoding=t[1])}),(n=r.getAll("html")[0])&&(a.langcode=s(n,"lang")||s(n,"xml:lang")),a.stylesheets=[],p.each(r.getAll("link"),function(e){"stylesheet"===e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),(n=r.getAll("body")[0])&&(a.langdir=s(n,"dir"),a.style=s(n,"style"),a.visited_color=s(n,"vlink"),a.link_color=s(n,"link"),a.active_color=s(n,"alink")),a);function s(e,t){return e.attr(t)||""}var d=u(u({},{title:"",keywords:"",description:"",robots:"",author:"",docencoding:""}),c);l.windowManager.open({title:"Metadata and Document Properties",size:"normal",body:{type:"panel",items:[{name:"title",type:"input",label:"Title"},{name:"keywords",type:"input",label:"Keywords"},{name:"description",type:"input",label:"Description"},{name:"robots",type:"input",label:"Robots"},{name:"author",type:"input",label:"Author"},{name:"docencoding",type:"input",label:"Encoding"}]},buttons:[{type:"cancel",name:"cancel",text:"Cancel"},{type:"submit",name:"save",text:"Save",primary:!0}],initialData:d,onSubmit:function(e){var t=e.getData(),n=function(e,o,t){var r,n,l=e.dom;function i(e,t,n){e.attr(t,n||undefined)}function a(e){c.firstChild?c.insert(e,c.firstChild):c.append(e)}var c,s=v(t);(c=s.getAll("head")[0])||(r=s.getAll("html")[0],c=new m("head",1),r.firstChild?r.insert(c,r.firstChild,!0):r.append(c)),r=s.firstChild,o.xml_pi?(n='version="1.0"',o.docencoding&&(n+=' encoding="'+o.docencoding+'"'),7!==r.type&&(r=new m("xml",7),s.insert(r,s.firstChild,!0)),r.value=n):r&&7===r.type&&r.remove(),r=s.getAll("#doctype")[0],o.doctype?(r||(r=new m("#doctype",10),o.xml_pi?s.insert(r,s.firstChild):a(r)),r.value=o.doctype.substring(9,o.doctype.length-1)):r&&r.remove(),r=null,p.each(s.getAll("meta"),function(e){"Content-Type"===e.attr("http-equiv")&&(r=e)}),o.docencoding?(r||((r=new m("meta",1)).attr("http-equiv","Content-Type"),r.shortEnded=!0,a(r)),r.attr("content","text/html; charset="+o.docencoding)):r&&r.remove(),r=s.getAll("title")[0],o.title?(r?r.empty():a(r=new m("title",1)),r.append(new m("#text",3)).value=o.title):r&&r.remove(),p.each("keywords,description,author,copyright,robots".split(","),function(e){for(var t,n=s.getAll("meta"),l=o[e],i=0;i"))}(l,p.extend(c,t),i.get());i.set(n),e.close()}})},_=p.each,b=function(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})},x=function(e,t,n,l){var i,o,r,a,c,s,d,u,m,f="",g=e.dom;l.selection||(a=e.getParam("protect"),c=l.content,p.each(a,function(e){c=c.replace(e,function(e){return"\x3c!--mce:protected "+escape(e)+"--\x3e"})}),r=c,"raw"===l.format&&t.get()||l.source_view&&y(e)||(0!==r.length||l.source_view||(r=p.trim(t.get())+"\n"+p.trim(r)+"\n"+p.trim(n.get())),-1!==(i=(r=r.replace(/<(\/?)BODY/gi,"<$1body")).indexOf("",i),t.set(b(r.substring(0,i+1))),-1===(o=r.indexOf("\n")),s=v(t.get()),_(s.getAll("style"),function(e){e.firstChild&&(f+=e.firstChild.value)}),(d=s.getAll("body")[0])&&g.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),g.remove("fullpage_styles"),u=e.getDoc().getElementsByTagName("head")[0],f&&g.add(u,"style",{id:"fullpage_styles"}).appendChild(document.createTextNode(f)),m={},p.each(u.getElementsByTagName("link"),function(e){"stylesheet"===e.rel&&e.getAttribute("data-mce-fullpage")&&(m[e.href]=e)}),p.each(s.getAll("link"),function(e){var t=e.attr("href");if(!t)return!0;m[t]||"stylesheet"!==e.attr("rel")||g.add(u,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),delete m[t]}),p.each(m,function(e){e.parentNode.removeChild(e)})))},k=function(e){var t,n="",l="";return e.getParam("fullpage_default_xml_pi")&&(n+='\n'),n+=e.getParam("fullpage_default_doctype",""),n+="\n\n\n",(t=e.getParam("fullpage_default_title"))&&(n+=""+t+"\n"),(t=i(e))&&(n+='\n'),(t=g(e))&&(l+="font-family: "+t+";"),(t=h(e))&&(l+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(l+="color: "+t+";"),n+="\n\n"},C=function(e,t,n,l){l.selection||l.source_view&&y(e)||(l.content=(p.trim(t)+"\n"+p.trim(l.content)+"\n"+p.trim(n)).replace(//g,function(e,t){return unescape(t)}))};e.add("fullpage",function(e){var t,n,l,i,o,r,a=s(""),c=s("");n=a,(t=e).addCommand("mceFullPageProperties",function(){d(t,n)}),(l=e).ui.registry.addButton("fullpage",{tooltip:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),l.ui.registry.addMenuItem("fullpage",{text:"Metadata and document properties",icon:"document-properties",onAction:function(){l.execCommand("mceFullPageProperties")}}),o=a,r=c,(i=e).on("BeforeSetContent",function(e){x(i,o,r,e)}),i.on("GetContent",function(e){C(i,o.get(),r.get(),e)})})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/fullscreen/plugin.min.js b/shopyo/static/tinymce/plugins/fullscreen/plugin.min.js deleted file mode 100644 index f78e8f0..0000000 --- a/shopyo/static/tinymce/plugins/fullscreen/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var l=function(n){var e=n;return{get:function(){return e},set:function(n){e=n}}},n=tinymce.util.Tools.resolve("tinymce.PluginManager"),i=function(n){return{isFullscreen:function(){return null!==n.get()}}},e=function(){},u=function(n){return function(){return n}};var t,r,o,c=u(!1),f=u(!0),a=function(){return d},d=(t=function(n){return n.isNone()},{fold:function(n,e){return n()},is:c,isSome:c,isNone:f,getOr:o=function(n){return n},getOrThunk:r=function(n){return n()},getOrDie:function(n){throw new Error(n||"error: getOrDie called on none.")},getOrNull:u(null),getOrUndefined:u(undefined),or:o,orThunk:r,map:a,each:e,bind:a,exists:c,forall:f,filter:a,equals:t,equals_:t,toArray:function(){return[]},toString:u("none()")}),s=function(t){var n=u(t),e=function(){return o},r=function(n){return n(t)},o={fold:function(n,e){return e(t)},is:function(n){return t===n},isSome:f,isNone:c,getOr:n,getOrThunk:n,getOrDie:n,getOrNull:n,getOrUndefined:n,or:e,orThunk:e,map:function(n){return s(n(t))},each:function(n){n(t)},bind:r,exists:r,forall:r,filter:function(n){return n(t)?o:d},toArray:function(){return[t]},toString:function(){return"some("+t+")"},equals:function(n){return n.is(t)},equals_:function(n,e){return n.fold(c,function(n){return e(t,n)})}};return o},b={some:s,none:a,from:function(n){return null===n||n===undefined?d:s(n)}},m=function(){return n=function(n){return n.unbind()},e=l(b.none()),t=function(){return e.get().each(n)},{clear:function(){t(),e.set(b.none())},isSet:function(){return e.get().isSome()},set:function(n){t(),e.set(b.some(n))}};var n,e,t},h=function(r){return function(n){return t=typeof(e=n),(null===e?"null":"object"==t&&(Array.prototype.isPrototypeOf(e)||e.constructor&&"Array"===e.constructor.name)?"array":"object"==t&&(String.prototype.isPrototypeOf(e)||e.constructor&&"String"===e.constructor.name)?"string":t)===r;var e,t}},g=function(e){return function(n){return typeof n===e}},p=h("string"),v=h("array"),y=g("boolean"),w=function(n){return!(null===(e=n)||e===undefined);var e},S=g("function"),E=g("number"),F=Array.prototype.push,T=function(n,e){for(var t=n.length,r=new Array(t),o=0;o'+e.name+""};return{name:"plugins",title:"Plugins",items:[{type:"htmlpanel",presets:"document",html:[null==(n=e)?"":'
'+function(a){var e,t,n,o=(t=f((e=a).plugins),(n=e.getParam("forced_plugins"))===undefined?t:function(e,t){for(var n=[],a=0,o=e.length;a"+(t=a,n=e,g(C,function(e){return e.key===n}).fold(function(){var e=t.plugins[n].getMetadata;return"function"==typeof e?l(e()):n},function(e){var t=e.slug||e.key;return l({name:e.name,url:"https://www.tiny.cloud/docs/plugins/"+t})}))+"";var t,n}),r=i.length,s=i.join("");return"

"+A.translate(["Plugins installed ({0}):",r])+"

    "+s+"
"}(n)+"
",(t=p(["Accessibility Checker","Advanced Code Editor","Advanced Tables","Case Change","Checklist","Tiny Comments","Tiny Drive","Enhanced Media Embed","Format Painter","Link Checker","Mentions","MoxieManager","Page Embed","Permanent Pen","PowerPaste","Spell Checker Pro"],function(e){return"
  • "+A.translate(e)+"
  • "}).join(""),'

    '+A.translate("Premium plugins:")+"

    ")].join("")}]}},x=tinymce.util.Tools.resolve("tinymce.EditorManager"),P=function(e,t){var n,a,o,i,r,s={name:"shortcuts",title:"Handy Shortcuts",items:[{type:"table",header:["Action","Shortcut"],cells:p(w,function(e){var t=p(e.shortcuts,v).join(" or ");return[e.action,t]})}]},l={name:"keyboardnav",title:"Keyboard Navigation",items:[{type:"htmlpanel",presets:"document",html:"

    Editor UI keyboard navigation

    \n\n

    Activating keyboard navigation

    \n\n

    The sections of the outer UI of the editor - the menubar, toolbar, sidebar and footer - are all keyboard navigable. As such, there are multiple ways to activate keyboard navigation:

    \n
      \n
    • Focus the menubar: Alt + F9 (Windows) or ⌥F9 (MacOS)
    • \n
    • Focus the toolbar: Alt + F10 (Windows) or ⌥F10 (MacOS)
    • \n
    • Focus the footer: Alt + F11 (Windows) or ⌥F11 (MacOS)
    • \n
    \n\n

    Focusing the menubar or toolbar will start keyboard navigation at the first item in the menubar or toolbar, which will be highlighted with a gray background. Focusing the footer will start keyboard navigation at the first item in the element path, which will be highlighted with an underline.

    \n\n

    Moving between UI sections

    \n\n

    When keyboard navigation is active, pressing tab will move the focus to the next major section of the UI, where applicable. These sections are:

    \n
      \n
    • the menubar
    • \n
    • each group of the toolbar
    • \n
    • the sidebar
    • \n
    • the element path in the footer
    • \n
    • the wordcount toggle button in the footer
    • \n
    • the branding link in the footer
    • \n
    \n\n

    Pressing shift + tab will move backwards through the same sections, except when moving from the footer to the toolbar. Focusing the element path then pressing shift + tab will move focus to the first toolbar group, not the last.

    \n\n

    Moving within UI sections

    \n\n

    Keyboard navigation within UI sections can usually be achieved using the left and right arrow keys. This includes:

    \n
      \n
    • moving between menus in the menubar
    • \n
    • moving between buttons in a toolbar group
    • \n
    • moving between items in the element path
    • \n
    \n\n

    In all these UI sections, keyboard navigation will cycle within the section. For example, focusing the last button in a toolbar group then pressing right arrow will move focus to the first item in the same toolbar group.

    \n\n

    Executing buttons

    \n\n

    To execute a button, navigate the selection to the desired button and hit space or enter.

    \n\n

    Opening, navigating and closing menus

    \n\n

    When focusing a menubar button or a toolbar button with a menu, pressing space, enter or down arrow will open the menu. When the menu opens the first item will be selected. To move up or down the menu, press the up or down arrow key respectively. This is the same for submenus, which can also be opened and closed using the left and right arrow keys.

    \n\n

    To close any active menu, hit the escape key. When a menu is closed the selection will be restored to its previous selection. This also works for closing submenus.

    \n\n

    Context toolbars and menus

    \n\n

    To focus an open context toolbar such as the table context toolbar, press Ctrl + F9 (Windows) or ⌃F9 (MacOS).

    \n\n

    Context toolbar navigation is the same as toolbar navigation, and context menu navigation is the same as standard menu navigation.

    \n\n

    Dialog navigation

    \n\n

    There are two types of dialog UIs in TinyMCE: tabbed dialogs and non-tabbed dialogs.

    \n\n

    When a non-tabbed dialog is opened, the first interactive component in the dialog will be focused. Users can navigate between interactive components by pressing tab. This includes any footer buttons. Navigation will cycle back to the first dialog component if tab is pressed while focusing the last component in the dialog. Pressing shift + tab will navigate backwards.

    \n\n

    When a tabbed dialog is opened, the first button in the tab menu is focused. Pressing tab will navigate to the first interactive component in that tab, and will cycle through the tab\u2019s components, the footer buttons, then back to the tab button. To switch to another tab, focus the tab button for the current tab, then use the arrow keys to cycle through the tab buttons.

    "}]},c=T(e),u=(i='TinyMCE '+(a=x.majorVersion,o=x.minorVersion,0===a.indexOf("@")?"X.X.X":a+"."+o)+"",{name:"versions",title:"Version",items:[{type:"htmlpanel",html:"

    "+A.translate(["You are using {0}",i])+"

    ",presets:"document"}]}),h=m(((n={})[s.name]=s,n[l.name]=l,n[c.name]=c,n[u.name]=u,n),t.get());return r=e,d.from(r.getParam("help_tabs")).fold(function(){return t=f(e=h),-1!==(n=t.indexOf("versions"))&&(t.splice(n,1),t.push("versions")),{tabs:e,names:t};var e,t,n},function(e){return t=h,n={},a=p(e,function(e){return"string"==typeof e?(y(t,e)&&(n[e]=t[e]),e):(n[e.name]=e).name}),{tabs:n,names:a};var t,n,a})},M=function(o,i){return function(){var e=P(o,i),a=e.tabs,t=e.names,n={type:"tabpanel",tabs:function(e){for(var t=[],n=function(e){t.push(e)},a=0;a")}),(t=n).ui.registry.addButton("hr",{icon:"horizontal-rule",tooltip:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}}),t.ui.registry.addMenuItem("hr",{icon:"horizontal-rule",text:"Horizontal line",onAction:function(){return t.execCommand("InsertHorizontalRule")}})})}(); \ No newline at end of file diff --git a/shopyo/static/tinymce/plugins/image/plugin.min.js b/shopyo/static/tinymce/plugins/image/plugin.min.js deleted file mode 100644 index 9c443e5..0000000 --- a/shopyo/static/tinymce/plugins/image/plugin.min.js +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Copyright (c) Tiny Technologies, Inc. All rights reserved. - * Licensed under the LGPL or a commercial license. - * For LGPL see License.txt in the project root for license information. - * For commercial licenses see https://www.tiny.cloud/ - * - * Version: 5.5.0 (2020-09-29) - */ -!function(){"use strict";var t,e,n,r,o,a=tinymce.util.Tools.resolve("tinymce.PluginManager"),c=function(){return(c=Object.assign||function(e){for(var t,n=1,r=arguments.length;n'+n+"")):e.insertContent(s(e,t))},t=function(t){t.addCommand("mceInsertDate",function(){var e;l(t,(e=t).getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),t.addCommand("mceInsertTime",function(){l(t,u(t))})},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),n=function(n){var e,t,r,a,i=c(n),o=(a=c(r=n),e=0=e.childNodes.length?t.data.length:0}:t.previousSibling&&je(t.previousSibling)?{container:t.previousSibling,offset:t.previousSibling.data.length}:t.nextSibling&&je(t.nextSibling)?{container:t.nextSibling,offset:0}:{container:e,offset:n}},un=function(e){var n=e.cloneRange(),t=on(e.startContainer,e.startOffset);n.setStart(t.container,t.offset);var r=on(e.endContainer,e.endOffset);return n.setEnd(r.container,r.offset),n},an=tinymce.util.Tools.resolve("tinymce.dom.DomQuery"),sn=function(e,n){var t=n||e.selection.getStart(!0);return e.dom.getParent(t,"OL,UL,DL",dn(e,t))},cn=function(e){var n,t,r,o=sn(e),i=e.selection.getSelectedBlocks();return r=i,(t=o)&&1===r.length&&r[0]===t?(n=o,Fe.grep(n.querySelectorAll("ol,ul,dl"),function(e){return qe(e)})):Fe.grep(i,function(e){return qe(e)&&o!==e})},fn=function(e){var t,n,r,o=e.selection.getSelectedBlocks();return Fe.grep((t=e,n=o,r=Fe.map(n,function(e){var n=t.dom.getParent(e,"li,dd,dt",dn(t,e));return n||e}),an.unique(r)),function(e){return We(e)})},dn=function(e,n){var t=e.dom.getParents(n,"TD,TH");return 0e.length?On:Cn)(t,e,n)},[]),I(r).map(function(e){return e.list}).toArray()},In=function(a,e,s){var n,t=En(e,(n=D(fn(a),le.fromDom),gn(E(n,c(Ln)),E(B(n),c(Ln)),function(e,n){return{start:e,end:n}})));k(t,function(e){var n,t;n=e.entries,t=s,k(w(n,Dn),function(e){return function(e,n){switch(e){case"Indent":n.depth++;break;case"Outdent":n.depth--;break;case"Flatten":n.depth=0}n.dirty=!0}(t,e),0});var r,o,i,u=(r=a,o=e.entries,P(function(e,n){if(0===e.length)return[];for(var t=n(e[0]),r=[],o=[],i=0,u=e.length;i"):"application/x-shockwave-flash"===n.sourcemime?(l='',s.poster&&(l+=''),l+=""):-1!==n.sourcemime.indexOf("audio")?(c=n,(u=h)?u(c):'"):"script"===n.type?' - """ - - if fading: - return alert + scriptFade - else: - return alert - - -def notify_success(message): - return notify(message, alert_type="success") - - -def notify_danger(message): - return notify(message, alert_type="danger") - - -def notify_warning(message): - return notify(message, alert_type="warning") - - -def notify_info(message): - return notify(message, alert_type="info") diff --git a/src/shopcube/shopyoapi/icons.txt b/src/shopcube/shopyoapi/icons.txt deleted file mode 100644 index 58ccf2e..0000000 --- a/src/shopcube/shopyoapi/icons.txt +++ /dev/null @@ -1,1609 +0,0 @@ -500px -accessible-icon -accusoft -acquisitions-incorporated -ad -address-book -address-book -address-card -address-card -adjust -adn -adversal -affiliatetheme -air-freshener -airbnb -algolia -align-center -align-justify -align-left -align-right -alipay -allergies -amazon -amazon-pay -ambulance -american-sign-language-interpreting -amilia -anchor -android -angellist -angle-double-down -angle-double-left -angle-double-right -angle-double-up -angle-down -angle-left -angle-right -angle-up -angry -angry -angrycreative -angular -ankh -app-store -app-store-ios -apper -apple -apple-alt -apple-pay -archive -archway -arrow-alt-circle-down -arrow-alt-circle-down -arrow-alt-circle-left -arrow-alt-circle-left -arrow-alt-circle-right -arrow-alt-circle-right -arrow-alt-circle-up -arrow-alt-circle-up -arrow-circle-down -arrow-circle-left -arrow-circle-right -arrow-circle-up -arrow-down -arrow-left -arrow-right -arrow-up -arrows-alt -arrows-alt-h -arrows-alt-v -artstation -assistive-listening-systems -asterisk -asymmetrik -at -atlas -atlassian -atom -audible -audio-description -autoprefixer -avianex -aviato -award -aws -baby -baby-carriage -backspace -backward -bacon -bacteria -bacterium -bahai -balance-scale -balance-scale-left -balance-scale-right -ban -band-aid -bandcamp -barcode -bars -baseball-ball -basketball-ball -bath -battery-empty -battery-full -battery-half -battery-quarter -battery-three-quarters -battle-net -bed -beer -behance -behance-square -bell -bell -bell-slash -bell-slash -bezier-curve -bible -bicycle -biking -bimobject -binoculars -biohazard -birthday-cake -bitbucket -bitcoin -bity -black-tie -blackberry -blender -blender-phone -blind -blog -blogger -blogger-b -bluetooth -bluetooth-b -bold -bolt -bomb -bone -bong -book -book-dead -book-medical -book-open -book-reader -bookmark -bookmark -bootstrap -border-all -border-none -border-style -bowling-ball -box -box-open -box-tissue -boxes -braille -brain -bread-slice -briefcase -briefcase-medical -broadcast-tower -broom -brush -btc -buffer -bug -building -building -bullhorn -bullseye -burn -buromobelexperte -bus -bus-alt -business-time -buy-n-large -buysellads -calculator -calendar -calendar -calendar-alt -calendar-alt -calendar-check -calendar-check -calendar-day -calendar-minus -calendar-minus -calendar-plus -calendar-plus -calendar-times -calendar-times -calendar-week -camera -camera-retro -campground -canadian-maple-leaf -candy-cane -cannabis -capsules -car -car-alt -car-battery -car-crash -car-side -caravan -caret-down -caret-left -caret-right -caret-square-down -caret-square-down -caret-square-left -caret-square-left -caret-square-right -caret-square-right -caret-square-up -caret-square-up -caret-up -carrot -cart-arrow-down -cart-plus -cash-register -cat -cc-amazon-pay -cc-amex -cc-apple-pay -cc-diners-club -cc-discover -cc-jcb -cc-mastercard -cc-paypal -cc-stripe -cc-visa -centercode -centos -certificate -chair -chalkboard -chalkboard-teacher -charging-station -chart-area -chart-bar -chart-bar -chart-line -chart-pie -check -check-circle -check-circle -check-double -check-square -check-square -cheese -chess -chess-bishop -chess-board -chess-king -chess-knight -chess-pawn -chess-queen -chess-rook -chevron-circle-down -chevron-circle-left -chevron-circle-right -chevron-circle-up -chevron-down -chevron-left -chevron-right -chevron-up -child -chrome -chromecast -church -circle -circle -circle-notch -city -clinic-medical -clipboard -clipboard -clipboard-check -clipboard-list -clock -clock -clone -clone -closed-captioning -closed-captioning -cloud -cloud-download-alt -cloud-meatball -cloud-moon -cloud-moon-rain -cloud-rain -cloud-showers-heavy -cloud-sun -cloud-sun-rain -cloud-upload-alt -cloudflare -cloudscale -cloudsmith -cloudversify -cocktail -code -code-branch -codepen -codiepie -coffee -cog -cogs -coins -columns -comment -comment -comment-alt -comment-alt -comment-dollar -comment-dots -comment-dots -comment-medical -comment-slash -comments -comments -comments-dollar -compact-disc -compass -compass -compress -compress-alt -compress-arrows-alt -concierge-bell -confluence -connectdevelop -contao -cookie -cookie-bite -copy -copy -copyright -copyright -cotton-bureau -couch -cpanel -creative-commons -creative-commons-by -creative-commons-nc -creative-commons-nc-eu -creative-commons-nc-jp -creative-commons-nd -creative-commons-pd -creative-commons-pd-alt -creative-commons-remix -creative-commons-sa -creative-commons-sampling -creative-commons-sampling-plus -creative-commons-share -creative-commons-zero -credit-card -credit-card -critical-role -crop -crop-alt -cross -crosshairs -crow -crown -crutch -css3 -css3-alt -cube -cubes -cut -cuttlefish -d-and-d -d-and-d-beyond -dailymotion -dashcube -database -deaf -deezer -delicious -democrat -deploydog -deskpro -desktop -dev -deviantart -dharmachakra -dhl -diagnoses -diaspora -dice -dice-d20 -dice-d6 -dice-five -dice-four -dice-one -dice-six -dice-three -dice-two -digg -digital-ocean -digital-tachograph -directions -discord -discourse -disease -divide -dizzy -dizzy -dna -dochub -docker -dog -dollar-sign -dolly -dolly-flatbed -donate -door-closed -door-open -dot-circle -dot-circle -dove -download -draft2digital -drafting-compass -dragon -draw-polygon -dribbble -dribbble-square -dropbox -drum -drum-steelpan -drumstick-bite -drupal -dumbbell -dumpster -dumpster-fire -dungeon -dyalog -earlybirds -ebay -edge -edge-legacy -edit -edit -egg -eject -elementor -ellipsis-h -ellipsis-v -ello -ember -empire -envelope -envelope -envelope-open -envelope-open -envelope-open-text -envelope-square -envira -equals -eraser -erlang -ethereum -ethernet -etsy -euro-sign -evernote -exchange-alt -exclamation -exclamation-circle -exclamation-triangle -expand -expand-alt -expand-arrows-alt -expeditedssl -external-link-alt -external-link-square-alt -eye -eye -eye-dropper -eye-slash -eye-slash -facebook -facebook-f -facebook-messenger -facebook-square -fan -fantasy-flight-games -fast-backward -fast-forward -faucet -fax -feather -feather-alt -fedex -fedora -female -fighter-jet -figma -file -file -file-alt -file-alt -file-archive -file-archive -file-audio -file-audio -file-code -file-code -file-contract -file-csv -file-download -file-excel -file-excel -file-export -file-image -file-image -file-import -file-invoice -file-invoice-dollar -file-medical -file-medical-alt -file-pdf -file-pdf -file-powerpoint -file-powerpoint -file-prescription -file-signature -file-upload -file-video -file-video -file-word -file-word -fill -fill-drip -film -filter -fingerprint -fire -fire-alt -fire-extinguisher -firefox -firefox-browser -first-aid -first-order -first-order-alt -firstdraft -fish -fist-raised -flag -flag -flag-checkered -flag-usa -flask -flickr -flipboard -flushed -flushed -fly -folder -folder -folder-minus -folder-open -folder-open -folder-plus -font -font-awesome -font-awesome-alt -font-awesome-flag -fonticons -fonticons-fi -football-ball -fort-awesome -fort-awesome-alt -forumbee -forward -foursquare -free-code-camp -freebsd -frog -frown -frown -frown-open -frown-open -fulcrum -funnel-dollar -futbol -futbol -galactic-republic -galactic-senate -gamepad -gas-pump -gavel -gem -gem -genderless -get-pocket -gg -gg-circle -ghost -gift -gifts -git -git-alt -git-square -github -github-alt -github-square -gitkraken -gitlab -gitter -glass-cheers -glass-martini -glass-martini-alt -glass-whiskey -glasses -glide -glide-g -globe -globe-africa -globe-americas -globe-asia -globe-europe -gofore -golf-ball -goodreads -goodreads-g -google -google-drive -google-pay -google-play -google-plus -google-plus-g -google-plus-square -google-wallet -gopuram -graduation-cap -gratipay -grav -greater-than -greater-than-equal -grimace -grimace -grin -grin -grin-alt -grin-alt -grin-beam -grin-beam -grin-beam-sweat -grin-beam-sweat -grin-hearts -grin-hearts -grin-squint -grin-squint -grin-squint-tears -grin-squint-tears -grin-stars -grin-stars -grin-tears -grin-tears -grin-tongue -grin-tongue -grin-tongue-squint -grin-tongue-squint -grin-tongue-wink -grin-tongue-wink -grin-wink -grin-wink -grip-horizontal -grip-lines -grip-lines-vertical -grip-vertical -gripfire -grunt -guilded -guitar -gulp -h-square -hacker-news -hacker-news-square -hackerrank -hamburger -hammer -hamsa -hand-holding -hand-holding-heart -hand-holding-medical -hand-holding-usd -hand-holding-water -hand-lizard -hand-lizard -hand-middle-finger -hand-paper -hand-paper -hand-peace -hand-peace -hand-point-down -hand-point-down -hand-point-left -hand-point-left -hand-point-right -hand-point-right -hand-point-up -hand-point-up -hand-pointer -hand-pointer -hand-rock -hand-rock -hand-scissors -hand-scissors -hand-sparkles -hand-spock -hand-spock -hands -hands-helping -hands-wash -handshake -handshake -handshake-alt-slash -handshake-slash -hanukiah -hard-hat -hashtag -hat-cowboy -hat-cowboy-side -hat-wizard -hdd -hdd -head-side-cough -head-side-cough-slash -head-side-mask -head-side-virus -heading -headphones -headphones-alt -headset -heart -heart -heart-broken -heartbeat -helicopter -highlighter -hiking -hippo -hips -hire-a-helper -history -hive -hockey-puck -holly-berry -home -hooli -hornbill -horse -horse-head -hospital -hospital -hospital-alt -hospital-symbol -hospital-user -hot-tub -hotdog -hotel -hotjar -hourglass -hourglass -hourglass-end -hourglass-half -hourglass-start -house-damage -house-user -houzz -hryvnia -html5 -hubspot -i-cursor -ice-cream -icicles -icons -id-badge -id-badge -id-card -id-card -id-card-alt -ideal -igloo -image -image -images -images -imdb -inbox -indent -industry -infinity -info -info-circle -innosoft -instagram -instagram-square -instalod -intercom -internet-explorer -invision -ioxhost -italic -itch-io -itunes -itunes-note -java -jedi -jedi-order -jenkins -jira -joget -joint -joomla -journal-whills -js -js-square -jsfiddle -kaaba -kaggle -key -keybase -keyboard -keyboard -keycdn -khanda -kickstarter -kickstarter-k -kiss -kiss -kiss-beam -kiss-beam -kiss-wink-heart -kiss-wink-heart -kiwi-bird -korvue -landmark -language -laptop -laptop-code -laptop-house -laptop-medical -laravel -lastfm -lastfm-square -laugh -laugh -laugh-beam -laugh-beam -laugh-squint -laugh-squint -laugh-wink -laugh-wink -layer-group -leaf -leanpub -lemon -lemon -less -less-than -less-than-equal -level-down-alt -level-up-alt -life-ring -life-ring -lightbulb -lightbulb -line -link -linkedin -linkedin-in -linode -linux -lira-sign -list -list-alt -list-alt -list-ol -list-ul -location-arrow -lock -lock-open -long-arrow-alt-down -long-arrow-alt-left -long-arrow-alt-right -long-arrow-alt-up -low-vision -luggage-cart -lungs -lungs-virus -lyft -magento -magic -magnet -mail-bulk -mailchimp -male -mandalorian -map -map -map-marked -map-marked-alt -map-marker -map-marker-alt -map-pin -map-signs -markdown -marker -mars -mars-double -mars-stroke -mars-stroke-h -mars-stroke-v -mask -mastodon -maxcdn -mdb -medal -medapps -medium -medium-m -medkit -medrt -meetup -megaport -meh -meh -meh-blank -meh-blank -meh-rolling-eyes -meh-rolling-eyes -memory -mendeley -menorah -mercury -meteor -microblog -microchip -microphone -microphone-alt -microphone-alt-slash -microphone-slash -microscope -microsoft -minus -minus-circle -minus-square -minus-square -mitten -mix -mixcloud -mixer -mizuni -mobile -mobile-alt -modx -monero -money-bill -money-bill-alt -money-bill-alt -money-bill-wave -money-bill-wave-alt -money-check -money-check-alt -monument -moon -moon -mortar-pestle -mosque -motorcycle -mountain -mouse -mouse-pointer -mug-hot -music -napster -neos -network-wired -neuter -newspaper -newspaper -nimblr -node -node-js -not-equal -notes-medical -npm -ns8 -nutritionix -object-group -object-group -object-ungroup -object-ungroup -octopus-deploy -odnoklassniki -odnoklassniki-square -oil-can -old-republic -om -opencart -openid -opera -optin-monster -orcid -osi -otter -outdent -page4 -pagelines -pager -paint-brush -paint-roller -palette -palfed -pallet -paper-plane -paper-plane -paperclip -parachute-box -paragraph -parking -passport -pastafarianism -paste -patreon -pause -pause-circle -pause-circle -paw -paypal -peace -pen -pen-alt -pen-fancy -pen-nib -pen-square -pencil-alt -pencil-ruler -penny-arcade -people-arrows -people-carry -pepper-hot -perbyte -percent -percentage -periscope -person-booth -phabricator -phoenix-framework -phoenix-squadron -phone -phone-alt -phone-slash -phone-square -phone-square-alt -phone-volume -photo-video -php -pied-piper -pied-piper-alt -pied-piper-hat -pied-piper-pp -pied-piper-square -piggy-bank -pills -pinterest -pinterest-p -pinterest-square -pizza-slice -place-of-worship -plane -plane-arrival -plane-departure -plane-slash -play -play-circle -play-circle -playstation -plug -plus -plus-circle -plus-square -plus-square -podcast -poll -poll-h -poo -poo-storm -poop -portrait -pound-sign -power-off -pray -praying-hands -prescription -prescription-bottle -prescription-bottle-alt -print -procedures -product-hunt -project-diagram -pump-medical -pump-soap -pushed -puzzle-piece -python -qq -qrcode -question -question-circle -question-circle -quidditch -quinscape -quora -quote-left -quote-right -quran -r-project -radiation -radiation-alt -rainbow -random -raspberry-pi -ravelry -react -reacteurope -readme -rebel -receipt -record-vinyl -recycle -red-river -reddit -reddit-alien -reddit-square -redhat -redo -redo-alt -registered -registered -remove-format -renren -reply -reply-all -replyd -republican -researchgate -resolving -restroom -retweet -rev -ribbon -ring -road -robot -rocket -rocketchat -rockrms -route -rss -rss-square -ruble-sign -ruler -ruler-combined -ruler-horizontal -ruler-vertical -running -rupee-sign -rust -sad-cry -sad-cry -sad-tear -sad-tear -safari -salesforce -sass -satellite -satellite-dish -save -save -schlix -school -screwdriver -scribd -scroll -sd-card -search -search-dollar -search-location -search-minus -search-plus -searchengin -seedling -sellcast -sellsy -server -servicestack -shapes -share -share-alt -share-alt-square -share-square -share-square -shekel-sign -shield-alt -shield-virus -ship -shipping-fast -shirtsinbulk -shoe-prints -shopify -shopping-bag -shopping-basket -shopping-cart -shopware -shower -shuttle-van -sign -sign-in-alt -sign-language -sign-out-alt -signal -signature -sim-card -simplybuilt -sink -sistrix -sitemap -sith -skating -sketch -skiing -skiing-nordic -skull -skull-crossbones -skyatlas -skype -slack -slack-hash -slash -sleigh -sliders-h -slideshare -smile -smile -smile-beam -smile-beam -smile-wink -smile-wink -smog -smoking -smoking-ban -sms -snapchat -snapchat-ghost -snapchat-square -snowboarding -snowflake -snowflake -snowman -snowplow -soap -socks -solar-panel -sort -sort-alpha-down -sort-alpha-down-alt -sort-alpha-up -sort-alpha-up-alt -sort-amount-down -sort-amount-down-alt -sort-amount-up -sort-amount-up-alt -sort-down -sort-numeric-down -sort-numeric-down-alt -sort-numeric-up -sort-numeric-up-alt -sort-up -soundcloud -sourcetree -spa -space-shuttle -speakap -speaker-deck -spell-check -spider -spinner -splotch -spotify -spray-can -square -square -square-full -square-root-alt -squarespace -stack-exchange -stack-overflow -stackpath -stamp -star -star -star-and-crescent -star-half -star-half -star-half-alt -star-of-david -star-of-life -staylinked -steam -steam-square -steam-symbol -step-backward -step-forward -stethoscope -sticker-mule -sticky-note -sticky-note -stop -stop-circle -stop-circle -stopwatch -stopwatch-20 -store -store-alt -store-alt-slash -store-slash -strava -stream -street-view -strikethrough -stripe -stripe-s -stroopwafel -studiovinari -stumbleupon -stumbleupon-circle -subscript -subway -suitcase -suitcase-rolling -sun -sun -superpowers -superscript -supple -surprise -surprise -suse -swatchbook -swift -swimmer -swimming-pool -symfony -synagogue -sync -sync-alt -syringe -table -table-tennis -tablet -tablet-alt -tablets -tachometer-alt -tag -tags -tape -tasks -taxi -teamspeak -teeth -teeth-open -telegram -telegram-plane -temperature-high -temperature-low -tencent-weibo -tenge -terminal -text-height -text-width -th -th-large -th-list -the-red-yeti -theater-masks -themeco -themeisle -thermometer -thermometer-empty -thermometer-full -thermometer-half -thermometer-quarter -thermometer-three-quarters -think-peaks -thumbs-down -thumbs-down -thumbs-up -thumbs-up -thumbtack -ticket-alt -tiktok -times -times-circle -times-circle -tint -tint-slash -tired -tired -toggle-off -toggle-on -toilet -toilet-paper -toilet-paper-slash -toolbox -tools -tooth -torah -torii-gate -tractor -trade-federation -trademark -traffic-light -trailer -train -tram -transgender -transgender-alt -trash -trash-alt -trash-alt -trash-restore -trash-restore-alt -tree -trello -tripadvisor -trophy -truck -truck-loading -truck-monster -truck-moving -truck-pickup -tshirt -tty -tumblr -tumblr-square -tv -twitch -twitter -twitter-square -typo3 -uber -ubuntu -uikit -umbraco -umbrella -umbrella-beach -uncharted -underline -undo -undo-alt -uniregistry -unity -universal-access -university -unlink -unlock -unlock-alt -unsplash -untappd -upload -ups -usb -user -user -user-alt -user-alt-slash -user-astronaut -user-check -user-circle -user-circle -user-clock -user-cog -user-edit -user-friends -user-graduate -user-injured -user-lock -user-md -user-minus -user-ninja -user-nurse -user-plus -user-secret -user-shield -user-slash -user-tag -user-tie -user-times -users -users-cog -users-slash -usps -ussunnah -utensil-spoon -utensils -vaadin -vector-square -venus -venus-double -venus-mars -vest -vest-patches -viacoin -viadeo -viadeo-square -vial -vials -viber -video -video-slash -vihara -vimeo -vimeo-square -vimeo-v -vine -virus -virus-slash -viruses -vk -vnv -voicemail -volleyball-ball -volume-down -volume-mute -volume-off -volume-up -vote-yea -vr-cardboard -vuejs -walking -wallet -warehouse -watchman-monitoring -water -wave-square -waze -weebly -weibo -weight -weight-hanging -weixin -whatsapp -whatsapp-square -wheelchair -whmcs -wifi -wikipedia-w -wind -window-close -window-close -window-maximize -window-maximize -window-minimize -window-minimize -window-restore -window-restore -windows -wine-bottle -wine-glass -wine-glass-alt -wix -wizards-of-the-coast -wodu -wolf-pack-battalion -won-sign -wordpress -wordpress-simple -wpbeginner -wpexplorer -wpforms -wpressr -wrench -x-ray -xbox -xing -xing-square -y-combinator -yahoo -yammer -yandex -yandex-international -yarn -yelp -yen-sign -yin-yang -yoast -youtube -youtube-square -zhihu diff --git a/src/shopcube/shopyoapi/info.py b/src/shopcube/shopyoapi/info.py deleted file mode 100644 index 284b531..0000000 --- a/src/shopcube/shopyoapi/info.py +++ /dev/null @@ -1,22 +0,0 @@ -import datetime - -info = """ - _____ _ - / ____| | - | (___ | |__ ___ _ __ _ _ ___ - \___ \| '_ \ / _ \| '_ \| | | |/ _ \ - ____) | | | | (_) | |_) | |_| | (_) | - |_____/|_| |_|\___/| .__/ \__, |\___/ - | | __/ | - |_| |___/ -Copyright {year} -""".format( - year=datetime.datetime.now().year -) - - -def printinfo(): - """ - prints Shopyo copyright in ASCII art font - """ - print(info) diff --git a/src/shopcube/shopyoapi/models.py b/src/shopcube/shopyoapi/models.py deleted file mode 100644 index 7003904..0000000 --- a/src/shopcube/shopyoapi/models.py +++ /dev/null @@ -1,105 +0,0 @@ -""" -DB-related helper utilities. Taken from database.py -file at https://github.com/cookiecutter-flask/cookiecutter-flask -""" -from shopyoapi.init import db - - -class CRUDMixin: - """ - Mixin that adds convenience methods for - CRUD (create, read, update, delete) operations. - """ - - @classmethod - def create(cls, **kwargs): - """Create a new record and save it in the database. - - Returns: - DB Class Object: returns the created record - """ - instance = cls(**kwargs) - return instance.save() - - def update(self, commit=True, **kwargs): - """Update specific fields of a record - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the updated record if committed, - None otherwise - """ - for attr, value in kwargs.items(): - setattr(self, attr, value) - if commit: - self.save() - return self - return None - - def save(self, commit=True): - """Save the record. - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the record saved to db session - """ - db.session.add(self) - if commit: - db.session.commit() - return self - - def delete(self, commit=True): - """Remove the record from the database. - - Args: - commit (bool, optional): flag whether to commit. Defaults to True. - - Returns: - Db Class object: returns the updated record if committed, - None otherwise - """ - db.session.delete(self) - if commit: - db.session.commit() - return self - return None - - -class YoModel(CRUDMixin, db.Model): - """Base model class that includes CRUD convenience methods.""" - - __abstract__ = True - - -class PkModel(YoModel): - """ - Base model class that includes CRUD convenience methods, - plus adds a 'primary key' column named 'id'. - """ - - __abstract__ = True - id = db.Column(db.Integer, primary_key=True) - - @classmethod - def get_by_id(cls, record_id): - """Get record by ID. - - Args: - record_id (int): ID of record to get - - Returns: - DB Class object: object identified by record_id if any, - None otherwise - """ - if any( - ( - isinstance(record_id, (str, bytes)) and record_id.isdigit(), - isinstance(record_id, (int, float)), - ) - ): - return cls.query.get(int(record_id)) - return None diff --git a/src/shopcube/shopyoapi/module.py b/src/shopcube/shopyoapi/module.py deleted file mode 100644 index f506285..0000000 --- a/src/shopcube/shopyoapi/module.py +++ /dev/null @@ -1,64 +0,0 @@ -import copy -import json -import os - -from flask import Blueprint -from flask import redirect -from flask import render_template -from flask import url_for - -from shopyoapi.assets import get_static - - -class ModuleHelp: - def __init__(self, dunderfile, dundername): - self.dirpath = os.path.dirname(os.path.abspath(dunderfile)) - self.info = {} - self._context = {} - - with open(self.dirpath + "/info.json") as f: - self.info = json.load(f) - - self.blueprint_str = "{}_blueprint".format(self.info["module_name"]) - self.blueprint = Blueprint( - "{}".format(self.info["module_name"]), - dundername, - template_folder="templates", - url_prefix=self.info["url_prefix"], - ) - - self._context.update({"info": self.info}) - - def render(self, filename, **kwargs): - """ - .render('file.html') renders file.html found in module/templates/module/file.html - """ - return render_template( - "{}/{}".format(self.info["module_name"], filename), **kwargs - ) - - def redirect_url(self, url, **kwargs): - return redirect(url_for(url, **kwargs)) - - def context(self): - return copy.deepcopy(self._context) - - def method(self, methodname): - return "{}.{}".format(self.info["module_name"], methodname) - - def get_self_static(self, filename): - module_parent = os.path.dirname(self.dirpath) - module_folder = self.dirpath - - module_parent = os.path.normpath(module_parent) - module_parent = os.path.basename(module_parent) - - module_folder = os.path.normpath(module_folder) - module_folder = os.path.basename(module_folder) - - print(module_parent, module_parent) - if module_parent.startswith('box__'): - boxormodule = '{}/{}'.format(module_parent, module_folder) - else: - boxormodule = module_folder - return get_static(boxormodule=boxormodule, filename=filename) \ No newline at end of file diff --git a/src/shopcube/shopyoapi/path.py b/src/shopcube/shopyoapi/path.py deleted file mode 100644 index 0575a4a..0000000 --- a/src/shopcube/shopyoapi/path.py +++ /dev/null @@ -1,7 +0,0 @@ -import os - -shopyoapi_path = os.path.dirname(os.path.abspath(__file__)) -root_path = os.path.dirname(shopyoapi_path) -static_path = os.path.join(root_path, "static") -modules_path = os.path.join(root_path, "modules") -themes_path = os.path.join(static_path, "themes") diff --git a/src/shopcube/shopyoapi/security.py b/src/shopcube/shopyoapi/security.py deleted file mode 100644 index 0dddaa8..0000000 --- a/src/shopcube/shopyoapi/security.py +++ /dev/null @@ -1,24 +0,0 @@ -from flask import request, g, redirect -from urllib.parse import urlparse, urljoin - - -# from https://security.openstack.org/guidelines/dg_avoid-unvalidated-redirects.html -def is_safe_redirect_url(target): - host_url = urlparse(request.host_url) - redirect_url = urlparse(urljoin(request.host_url, target)) - return ( - redirect_url.scheme in ("http", "https") - and host_url.netloc == redirect_url.netloc - ) - - -def get_safe_redirect(url): - - if url and is_safe_redirect_url(url): - return url - - url = request.referrer - if url and is_safe_redirect_url(url): - return url - - return "/" diff --git a/src/shopcube/shopyoapi/session.py b/src/shopcube/shopyoapi/session.py deleted file mode 100644 index ab7e153..0000000 --- a/src/shopcube/shopyoapi/session.py +++ /dev/null @@ -1,173 +0,0 @@ -import copy -from flask import session -from modules.box__ecommerce.product.models import Product - -class Cart: - ''' - { - 'items': - { - '620ba5dd-08a3-11ec-bfee-40f02f67a6a8': - [ - { - 'color': 'c1', - 'quantity': 1, - 'size': 's1' - }, - { - 'color': 'c1', - 'quantity': 1, - 'size': 's2' - }, - ] - }, - 'num_items': 1, - 'total_price': 100.0 - } - ''' - - - @classmethod - def _data(cls): - ''' - '620ba5dd-08a3-11ec-bfee-40f02f67a6a8': - [ - { - 'color': 'c1', - 'quantity': 1, - 'size': 's1' - }, - { - 'color': 'c1', - 'quantity': 1, - 'size': 's2' - }, - ] - ''' - if 'cart' not in session: - session['cart'] = {} - return session['cart'] - - @classmethod - def _num_items(cls): - return sum([cls.items_quantity(barcode) for barcode in cls._data()]) - - @classmethod - def _total_price(cls): - cart_total_price = 0 - for barcode in cls._data(): - product = Product.query.filter_by(barcode=barcode).first() - cart_total_price += ( - cls.items_quantity(barcode) * product.selling_price - ) - - return cart_total_price - - @classmethod - def data(cls): - num_items = cls._num_items() - cart_data = cls._data() - total_price = cls._total_price() - - return { - 'items': cart_data, - 'num_items': num_items, - 'total_price': total_price - } - - @classmethod - def reset(cls): - session['cart'] = {} - - @classmethod - def has_barcode(cls, barcode): - return barcode in cls._data() - - @classmethod - def has_order(cls, barcode, item_info): - '''if only quantity differs, color and size remains the same''' - if not barcode in cls._data(): - return False - if len(cls._data()[barcode]) == 0: - return False - items = cls._data()[barcode] - for i, item in enumerate(items): - if ( - (item['color'] == item_info['color']) and - (item['size'] == item_info['size']) - ): - return {'i': i} - return False - - @classmethod - def items_quantity(cls, barcode): - items = cls._data()[barcode] - total_q = sum([int(item['quantity']) for item in items]) - return total_q - - - @classmethod - def add(cls, barcode, item_info): - ''' - :item_info: { - 'quantity': 1, - 'color': 'white', - 'size': 'XL' - } - ''' - product = Product.query.filter_by(barcode=barcode).first() - if cls.has_barcode(barcode): - has_order = cls.has_order(barcode, item_info) - if has_order: - updated_quantity = cls.items_quantity(barcode) + item_info['quantity'] - if updated_quantity > product.in_stock: - return False - cls._data()[barcode][has_order['i']]['quantity'] += item_info['quantity'] - else: - cls._data()[barcode].append(item_info) - elif not cls.has_barcode(barcode): - cls._data()[barcode] = [] - cls._data()[barcode].append(item_info) - - return True - - @classmethod - def remove(cls, barcode, size, color): - try: - has_order = cls.has_order(barcode, {'size': size, 'color': color}) - if has_order: - del cls._data()[barcode][has_order['i']] - if len(cls._data()[barcode]) == 0: - del cls._data()[barcode] - except KeyError: - pass - - @classmethod - def update(cls, form_dict): - ''' - ImmutableMultiDict([('csrf_token', 'IjRlNmY3ZmI4ZjY3OGRjZTBhN2M1ZTYxNWNkYWQ5YjM5 -Zjg2NGI2NTEi.YSxyhw.xHbr1Lde7b-nsuJ1ZEYhAZ0wuTQ'), ('barcode_1', '620ba5dd-08a3- -11ec-bfee-40f02f67a6a8'), ('size_1', '5'), ('color_1', '6'), ('quantity_1', '1') -, ('barcode_2', '620ba5dd-08a3-11ec-bfee-40f02f67a6a8'), ('size_2', '6'), ('colo -r_2', '6'), ('quantity_2', '1')]) - ''' - cls.reset() - - for key in form_dict: - if key.startswith("barcode"): - barcode = form_dict[key].strip() - product = Product.query.get(barcode) - - number = key.split("_")[1] - - quantity = form_dict['quantity_{}'.format(number)] - size = form_dict['size_{}'.format(number)] - color = form_dict['color_{}'.format(number)] - - item_info = { - 'quantity': int(quantity), - 'size': size, - 'color': color - } - - cls.add(barcode, item_info) diff --git a/src/shopcube/shopyoapi/tests/__init__.py b/src/shopcube/shopyoapi/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/shopcube/shopyoapi/tests/test_cmd.py b/src/shopcube/shopyoapi/tests/test_cmd.py deleted file mode 100644 index 181d117..0000000 --- a/src/shopcube/shopyoapi/tests/test_cmd.py +++ /dev/null @@ -1,310 +0,0 @@ -""" -tests for all commandline arguments work as expected -Uses pytest with fixture built in fixtures -(https://docs.pytest.org/en/stable/fixture.html) -""" -import os -from shopyoapi.cmd import clean -import pytest - - -@pytest.mark.order("last") -class TestCommandlineClean: - """tests the clean command line api function""" - - def test_clean_pycache_present_only_in_cwd(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - __pycache__/ - file.pyc - """ - fd = tmpdir.mkdir("__pycache__").join("file.pyc") - fd.write("content") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" "[x] __pycache__ successfully deleted\n" - ) - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert os.path.exists("__pycache__") is False - assert expected_out in captured.out - assert expected_err_shopyo_db in captured.err - assert expected_err_migrations in captured.err - - def test_clean_pycache_in_a_lvl_below_cwd(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - shopyo/ - __pycache__/ - file.pyc - """ - shopyo_path = tmpdir.mkdir("shopyo") - pycache_path = shopyo_path.mkdir("__pycache__") - pyc = pycache_path.join("file.pyc") - pyc.write("content") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" "[x] __pycache__ successfully deleted\n" - ) - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert os.path.exists(pycache_path) is False - assert expected_out in captured.out - assert expected_err_shopyo_db in captured.err - assert expected_err_migrations in captured.err - - def test_clean_pycache_many_lvls_below_cwd(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - shopyo/ - shopyo/ - mod/ - box/ - __pycache__/ - file.pyc - """ - - path = tmpdir.mkdir("shopyo").mkdir("shopyo").mkdir("mod").mkdir("box") - pycache_path = path.mkdir("__pycache__") - pyc = pycache_path.join("file.pyc") - pyc.write("content") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" "[x] __pycache__ successfully deleted\n" - ) - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert os.path.exists(pycache_path) is False - assert expected_out in captured.out - assert expected_err_shopyo_db in captured.err - assert expected_err_migrations in captured.err - - def test_clean_many_pycache_in_nested_dirs(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - __pycache__/ - file.pyc - shopyo/ - __pycache__ - file.pyc - module/ - __pycache__ - file.pyc - """ - pycache_path1 = tmpdir.mkdir("__pycache__") - pyc1 = pycache_path1.join("file.pyc") - pyc1.write("content") - shopyo_path = tmpdir.mkdir("shopyo") - pycache_path2 = shopyo_path.mkdir("__pycache__") - pyc2 = pycache_path2.join("file.pyc") - pyc2.write("content") - pycache_path3 = shopyo_path.mkdir("module").mkdir("__pycache__") - pyc3 = pycache_path3.join("file.pyc") - pyc3.write("content") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" "[x] __pycache__ successfully deleted\n" - ) - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert os.path.exists(pycache_path1) is False - assert os.path.exists(pycache_path2) is False - assert os.path.exists(pycache_path3) is False - assert expected_out in captured.out - assert expected_err_shopyo_db in captured.err - assert expected_err_migrations in captured.err - - def test_no_clean_applied_on_multiple_pycache(self, tmpdir, capfd): - """ - run clean on the following test directory: - - / - __pycache__/ - shopyo/ - __pycache__/ - - """ - path1 = tmpdir.mkdir("__pycache__") - path2 = tmpdir.mkdir("shopyo").mkdir("__pycache__") - - assert os.path.exists(path1) - assert os.path.exists(path2) - - def test_clean_on_shopyo_db_file(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - shopyo.db - """ - shopyo_db = tmpdir.join("shopyo.db") - shopyo_db.write("content") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" - f"[x] file '{os.path.join(tmpdir, 'shopyo.db')}' " - "successfully deleted\n" - ) - expected_err_pycache = "[ ] __pycache__ doesn't exist\n" - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert os.path.exists(shopyo_db) is False - assert expected_out in captured.out - assert expected_err_pycache in captured.err - assert expected_err_migrations in captured.err - - def test_clean_on_migration_folder(self, tmpdir, capfd, flask_app): - """ - run clean on the following test directory: - - / - migrations/ - env.py - alembic.ini - """ - migrations_path = tmpdir.mkdir("migrations") - env = migrations_path.join("env.py") - alembic = migrations_path.join("alembic.ini") - env.write("content-env") - alembic.write("content-alembic") - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" - f"[x] folder '{os.path.join(tmpdir, 'migrations')}' " - "successfully deleted\n" - ) - expected_err_pycache = "[ ] __pycache__ doesn't exist\n" - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - - assert os.path.exists(migrations_path) is False - assert expected_out in captured.out - assert expected_err_pycache in captured.err - assert expected_err_shopyo_db in captured.err - - def test_clean_on_pycache_shopyo_migration(self, tmpdir, flask_app, capfd): - """ - run clean on the following test directory - - shopyo/ - shopyo/ - migrations/ - alembic.ini - env.py - module1/ - __pycache__/ - file.pyc - module2/ - __pycache__/ - file.pyc - shopyo.db - """ - shopyo_path = tmpdir.mkdir("shopyo").mkdir("shopyo") - migrations_path = shopyo_path.mkdir("migrations") - env = migrations_path.join("env.py") - env.write("content-env") - alembic = migrations_path.join("alembic.ini") - alembic.write("content-alembic") - pycache_path1 = shopyo_path.mkdir("module1").mkdir("__pycache__") - pycache_path2 = shopyo_path.mkdir("module2").mkdir("__pycache__") - pyc1 = pycache_path1.join("file.pyc") - pyc1.write("content") - pyc2 = pycache_path2.join("file.pyc") - pyc2.write("content") - shopyo_db = shopyo_path.join("shopyo.db") - shopyo_db.write("content") - os.chdir(shopyo_path) - clean(flask_app) - captured = capfd.readouterr() - expected_out = ( - "[x] all tables dropped\n" - "[x] __pycache__ successfully deleted\n" - f"[x] file '{os.path.join(shopyo_path, 'shopyo.db')}' " - "successfully deleted\n" - f"[x] folder '{os.path.join(shopyo_path, 'migrations')}' " - "successfully deleted\n" - ) - - assert expected_out in captured.out - assert os.path.exists(migrations_path) is False - assert os.path.exists(pycache_path1) is False - assert os.path.exists(pycache_path2) is False - assert os.path.exists(shopyo_db) is False - - def test_no_clean_on_shopyo_and_migrations(self, tmpdir): - """ - run test on the following test directory: - - / - migrations/ - shopyo.db - """ - migrations_path = tmpdir.mkdir("migrations") - shopyo_db = tmpdir.join("shopyo.db") - shopyo_db.write("content") - - assert os.path.exists(migrations_path) - assert os.path.exists(shopyo_db) - - def test_clean_on_no_files_to_clean(self, tmpdir, capfd, flask_app): - os.chdir(tmpdir) - clean(flask_app) - captured = capfd.readouterr() - expected_out = "[x] all tables dropped\n" - expected_err_pycache = "[ ] __pycache__ doesn't exist\n" - expected_err_shopyo_db = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'shopyo.db')}" - ) - expected_err_migrations = ( - f"[ ] unable to delete {os.path.join(tmpdir, 'migrations')}" - ) - - assert expected_out in captured.out - assert expected_err_pycache in captured.err - assert expected_err_shopyo_db in captured.err - assert expected_err_migrations in captured.err - - # TODO: add test_clean for postgresSQL to see if tables dropped @rehmanis diff --git a/src/shopcube/shopyoapi/tests/test_models.py b/src/shopcube/shopyoapi/tests/test_models.py deleted file mode 100644 index 9cac308..0000000 --- a/src/shopcube/shopyoapi/tests/test_models.py +++ /dev/null @@ -1,106 +0,0 @@ -""" -Tests all db utilities such as CRUDMixin defined under shopapi/models.py -Most of the test cases taken from: -https://github.com/cookiecutter-flask/cookiecutter-flask -""" - -import pytest -from flask_login import UserMixin -from shopyoapi.init import db -from shopyoapi.models import PkModel - - -class ExampleUserModel(PkModel, UserMixin): - """Example user model for testing purposes""" - - __tablename__ = "testusers" - - username = db.Column(db.String(100), unique=True, nullable=False) - email = db.Column(db.String(120), unique=True, nullable=False) - - -class TestPKModel: - """Tests all functions of PKModel""" - - def test_get_by_id(self): - result = ExampleUserModel.get_by_id("myId") - - assert not result - - def test_get_by_id_valid(self, db_session): - user_bar = ExampleUserModel(username="bar", email="bar@domain.com") - user_foo = ExampleUserModel(username="foo", email="foo@domain.com") - user_bar.save() - user_foo.save() - result_int = ExampleUserModel.get_by_id(user_bar.id) - result_str = ExampleUserModel.get_by_id(str(user_bar.id)) - expected = ( - db_session.query(ExampleUserModel) - .filter(ExampleUserModel.username == "bar") - .scalar() - ) - - assert result_int - assert expected - assert result_int.username == expected.username - assert result_str.username == expected.username - - -class TestCRUDMixin: - """Test class for testing all CRUD functions""" - - def test_create(self, db_session): - user = ExampleUserModel.create(username="bar", email="bar@domain.com") - result_raw = db_session.execute( - """select * from testusers""" - ).fetchone() - result_orm = ( - db_session.query(ExampleUserModel) - .filter(ExampleUserModel.id == user.id) - .scalar() - ) - - assert result_orm - assert result_raw - assert result_raw.username == "bar" - assert result_orm.username == "bar" - - @pytest.mark.parametrize( - "commit,expected", [(True, "foo"), (False, "bar")] - ) - def test_update_single(self, db_session, commit, expected): - user = ExampleUserModel(username="bar", email="bar@domain.com") - user.save() - user.update(commit=commit, username="foo") - result = db_session.execute("""select * from testusers""").fetchone() - - assert result - assert result.username == expected - - @pytest.mark.parametrize( - "commit,expected", - [ - (True, {"username": "foo", "email": "foo@domain.com"}), - (False, {"username": "bar", "email": "bar@domain.com"}), - ], - ) - def test_update_multiple(self, db_session, commit, expected): - user = ExampleUserModel(username="bar", email="bar@domain.com") - user.save() - user.update(commit=commit, username="foo", email="foo@domain.com") - result = db_session.execute("""select * from testusers""").fetchone() - - assert result - assert result.username == expected["username"] - assert result.email == expected["email"] - - @pytest.mark.parametrize("commit,expected", [(True, None), (False, "bar")]) - def test_delete(self, commit, expected): - user = ExampleUserModel(username="bar", email="bar@domain.com") - user.save() - user.delete(commit=commit) - result = ExampleUserModel.get_by_id(user.id) - if result: - result = result.username - - assert result == expected diff --git a/src/shopcube/shopyoapi/validators.py b/src/shopcube/shopyoapi/validators.py deleted file mode 100644 index 7f76d81..0000000 --- a/src/shopcube/shopyoapi/validators.py +++ /dev/null @@ -1,50 +0,0 @@ -import re - -from wtforms.validators import ValidationError - -# https://wtforms.readthedocs.io/en/2.3.x/validators/ - - -def is_empty_str(string): - return string.strip() == "" - - -def is_valid_slug(text): - # from validators package - slug_regex = re.compile(r"^[-a-zA-Z0-9_]+$") - return slug_regex.match(text) - - -def verify_slug(form, field): - - if not is_valid_slug(field.data): - raise ValidationError( - "Slugs can only contain alphabets, numbers and hyphens (-). eg. good-day-1" - ) - - -def require_if_default_address(form, field): - - if form.diffAddress.data == False: - if is_empty_str(field.data): - raise ValidationError("{} cannot be empty!".format(field.label)) - - -def require_if_diff_address(form, field): - if form.diffAddress.data == True: - if is_empty_str(field.data): - raise ValidationError("{} cannot be empty!".format(field.label)) - - -def require_if_apply_coupon(form, field): - - if form.applyCoupon.data == True: - if is_empty_str(field.data): - raise ValidationError("{} cannot be empty!".format(field.label)) - - -def require_if_create_account(form, field): - - if form.createAccount.data == True: - if is_empty_str(field.data): - raise ValidationError("{} cannot be empty!".format(field.label)) diff --git a/src/shopcube/static/logo.png b/src/shopcube/static/logo.png new file mode 100644 index 0000000..9d210f5 Binary files /dev/null and b/src/shopcube/static/logo.png differ diff --git a/src/shopcube/static/logo.svg b/src/shopcube/static/logo.svg new file mode 100644 index 0000000..834f2eb --- /dev/null +++ b/src/shopcube/static/logo.svg @@ -0,0 +1,80 @@ + + + + diff --git a/src/shopcube/static/logo2.png b/src/shopcube/static/logo2.png new file mode 100644 index 0000000..9d210f5 Binary files /dev/null and b/src/shopcube/static/logo2.png differ diff --git a/src/shopcube/static/shopyo.svg b/src/shopcube/static/shopyo.svg index dc62018..ecea174 100644 --- a/src/shopcube/static/shopyo.svg +++ b/src/shopcube/static/shopyo.svg @@ -13,7 +13,7 @@ version="1.1" id="svg1249" inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)" - sodipodi:docname="shopyo.svg"> + sodipodi:docname="shopyo.api.svg"> diff --git a/src/shopcube/static/themes/front/ecommerceus/sections/nav.html b/src/shopcube/static/themes/front/ecommerceus/sections/nav.html index c55d669..7f7beb4 100644 --- a/src/shopcube/static/themes/front/ecommerceus/sections/nav.html +++ b/src/shopcube/static/themes/front/ecommerceus/sections/nav.html @@ -1,5 +1,5 @@