diff --git a/.github/ISSUE_TEMPLATE/mistake-report.md b/.github/ISSUE_TEMPLATE/mistake-report.md deleted file mode 100644 index 9fdc9e03e4..0000000000 --- a/.github/ISSUE_TEMPLATE/mistake-report.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: Mistake report -about: Report a mistake in the database -title: '' -labels: bug -assignees: '' - ---- - -**Describe the mistake** -A clear and concise description of what the bug is, which element(s) it relates to. - -**Additional context** -Add any other context about the mistake here. diff --git a/.github/ISSUE_TEMPLATE/new-element.md b/.github/ISSUE_TEMPLATE/new-element.md deleted file mode 100644 index 50dec424b8..0000000000 --- a/.github/ISSUE_TEMPLATE/new-element.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: New element -about: Suggest a new element for the database -title: Add [NAME] element -labels: new element -assignees: '' - ---- - -**Details.** -Include some information about the element. - -**Reference(s)** -- Links to -- or titles of references -- can be put here diff --git a/.github/ISSUE_TEMPLATE/suggest-an-improvement.md b/.github/ISSUE_TEMPLATE/suggest-an-improvement.md deleted file mode 100644 index 96cb0a405a..0000000000 --- a/.github/ISSUE_TEMPLATE/suggest-an-improvement.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Suggest an improvement -about: Suggest an idea for this project -title: '' -labels: feature request -assignees: '' - ---- - -Describe your suggestion. diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 6cd87d7879..0000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,13 +0,0 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "weekly" - cooldown: - default-days: 7 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md deleted file mode 100644 index 72aa59ab5f..0000000000 --- a/.github/pull_request_template.md +++ /dev/null @@ -1,8 +0,0 @@ -Changes in this pull request: - -- List -- your -- changes -- here - -Fixes # (issue) diff --git a/.github/scripts/check_dependency_versions.py b/.github/scripts/check_dependency_versions.py deleted file mode 100644 index 3fbd01efa8..0000000000 --- a/.github/scripts/check_dependency_versions.py +++ /dev/null @@ -1,65 +0,0 @@ -"""Check that dependencies are up to date.""" - -import os - -import requests - -try: - import tomllib -except ModuleNotFoundError: # TODO: remove this once minimum Python version is 3.10 - import tomli as tomllib - -green = "\033[32m" -red = "\033[31m" -blue = "\033[34m" -default = "\033[0m" - - -class Version: - def __init__(self, v: str): - self.v = v.split(".") - - def __eq__(self, other): - if not isinstance(other, Version): - return NotImplemented - - n = min(len(self.v), len(other.v)) - return self.v[:n] == other.v[:n] - - def __str__(self): - return ".".join(self.v) - - -class DependenciesNeedUpdating(BaseException): - pass - - -requirements = {} -with open( - os.path.join( - os.path.join( - os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."), - "..", - ), - "pyproject.toml", - ), - "rb", -) as f: - for dep in tomllib.load(f)["project"]["dependencies"]: - lib, version = dep.split("==") - requirements[lib] = Version(version) - -need_updating = {} -for lib, version in requirements.items(): - libname = lib.split("@")[0].split("[")[0] - latest = Version( - requests.get(f"https://pypi.org/pypi/{libname}/json").json()["info"]["version"] - ) - if version == latest: - print(f"{green}{lib}{default} is at latest version ({version})") - else: - need_updating[lib] = latest - print(f"{red}{lib}{default} can be updated from {version} to {latest}") - -if len(need_updating) > 0: - raise DependenciesNeedUpdating() diff --git a/.github/scripts/check_version_number.py b/.github/scripts/check_version_number.py deleted file mode 100644 index cb8bdd29ab..0000000000 --- a/.github/scripts/check_version_number.py +++ /dev/null @@ -1,33 +0,0 @@ -import os - -try: - import tomllib -except ModuleNotFoundError: # TODO: remove this once minimum Python version is 3.10 - import tomli as tomllib - -import github - -with open( - os.path.join( - os.path.join( - os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."), - "..", - ), - "pyproject.toml", - ), - "rb", -) as f: - version = tomllib.load(f)["project"]["version"] - -access_key = os.environ.get("GITHUB_TOKEN", None) - -git = github.Github(auth=github.Auth.Token(access_key)) - -defelement = git.get_repo("DefElement/DefElement") - -for release in defelement.get_releases(): - if release.tag_name == f"v{version}": - print("release=no") - break -else: - print(f"release={version}") diff --git a/.github/scripts/compare_json.py b/.github/scripts/compare_json.py deleted file mode 100644 index e22cb37159..0000000000 --- a/.github/scripts/compare_json.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Check if two JSON files contain the same data.""" - -import argparse -import json - -parser = argparse.ArgumentParser(description="Check if two JSON files contain the same data") -parser.add_argument( - "files", - metavar="files", - nargs=2, - default=None, - help="Names of input json files.", -) - -args = parser.parse_args() - -with open(args.files[0]) as f: - data0 = json.load(f) -with open(args.files[1]) as f: - data1 = json.load(f) - - -def is_equal(a, b): - if isinstance(a, dict): - if not isinstance(b, dict) or len(a) != len(b): - return False - for ai, aj in a.items(): - if ai not in b or not is_equal(aj, b[ai]): - return False - return True - elif isinstance(a, list): - if not isinstance(b, list) or len(a) != len(b): - return False - for ai, bi in zip(a, b): - if not is_equal(ai, bi): - return False - return True - - return a == b - - -assert is_equal(data0, data1) diff --git a/.github/scripts/make_release.py b/.github/scripts/make_release.py deleted file mode 100644 index 9e9f909f2a..0000000000 --- a/.github/scripts/make_release.py +++ /dev/null @@ -1,30 +0,0 @@ -import os -from datetime import datetime, timedelta, timezone - -import github - -access_key = os.environ.get("GITHUB_TOKEN", None) -version = os.environ.get("VERSION", None) -tar_gz = f"defelement-v{version}.tar.gz" -if "PATH" in os.environ: - tar_gz = os.path.join(os.environ["PATH"], tar_gz) - -git = github.Github(auth=github.Auth.Token(access_key)) - -defelement = git.get_repo("DefElement/DefElement") -main_branch = defelement.get_branch("main") -ref = defelement.get_git_ref("heads/main") - -release = defelement.create_git_tag_and_release( - f"v{version}", - f"v{version}", - f"v{version}", - f"Snapshot of DefElement, {datetime.now(tz=timezone(timedelta())).strftime('%d %B %Y')}.\n\nThis release is archived at [doi.org/10.5281/zenodo.17904468](https://doi.org/10.5281/zenodo.17904468)", - main_branch.commit.sha, - "commit", -) - -for asset in release.get_assets(): - asset.delete_asset() - -release.upload_asset(tar_gz) diff --git a/.github/scripts/push_verification.py b/.github/scripts/push_verification.py deleted file mode 100644 index 5d90d184a7..0000000000 --- a/.github/scripts/push_verification.py +++ /dev/null @@ -1,35 +0,0 @@ -import os -import sys - -import github - -access_key = os.environ.get("GITHUB_TOKEN", None) -_, path = sys.argv - -git = github.Github(auth=github.Auth.Token(access_key)) - -defelement = git.get_repo("DefElement/DefElement") -branch = defelement.get_branch("verification") - -with open(os.path.join(path, "verification.json")) as f: - new_verification = f.read() -with open(os.path.join(path, "verification-history.json")) as f: - new_verification_history = f.read() - -old_verification = branch.get_contents("verification.json") -defelement.update_file( - "verification.json", - "verification.json", - new_verification, - old_verification.sha, - branch="verification", -) - -old_verification_history = branch.get_contents("verification-history.json") -defelement.update_file( - "verification-history.json", - "verification-history.json", - new_verification_history, - old_verification_history.sha, - branch="verification", -) diff --git a/.github/scripts/update_version_number.py b/.github/scripts/update_version_number.py deleted file mode 100644 index 68897b16f9..0000000000 --- a/.github/scripts/update_version_number.py +++ /dev/null @@ -1,58 +0,0 @@ -import os -from datetime import datetime, timedelta, timezone - -import github - -version = datetime.now(tz=timezone(timedelta())).strftime("%Y.%m") -branch_name = f"v{version}" - -access_key = os.environ.get("PA_TOKEN", None) - -git = github.Github(auth=github.Auth.Token(access_key)) - -defelement = git.get_repo("DefElement/DefElement") -main_branch = defelement.get_branch("main") -ref = defelement.get_git_ref("heads/main") -base_tree = defelement.get_git_tree(main_branch.commit.sha) - -defelement.create_git_ref(ref=f"refs/heads/{branch_name}", sha=main_branch.commit.sha) -new_branch = defelement.get_branch(branch_name) - -# Update pyproject.toml -pyproject_file = defelement.get_contents("pyproject.toml", main_branch.commit.sha) -pyproject = pyproject_file.decoded_content.decode("utf8") -pre_project, post_project = pyproject.split("[project]\n") -pre_version, post_version = post_project.split("version = ") -post_version = post_version.split("\n", 1)[1] -pyproject = f'{pre_project}[project]\n{pre_version}version = "{version}"\n{post_version}' -defelement.update_file( - "pyproject.toml", - "[AUTOMATED] Update version number", - pyproject, - sha=pyproject_file.sha, - branch=branch_name, -) - -# Update .zenodo.json -zenodo_file = defelement.get_contents(".zenodo.json", main_branch.commit.sha) -zenodo = zenodo_file.decoded_content.decode("utf8") -pre_version, post_version = zenodo.split('"version": "') -post_version = post_version.split('"', 1)[1] -zenodo = f'{pre_version}"version": "v{version}"{post_version}' -pre_pubdate, post_pubdate = zenodo.split('"publication_date": "') -post_pubdate = post_pubdate.split('"', 1)[1] -zenodo = f'{pre_pubdate}"publication_date": "{datetime.now(tz=timezone(timedelta())).strftime("%Y-%m-%d")}"{post_pubdate}' -defelement.update_file( - ".zenodo.json", - "[AUTOMATED] Update version number", - zenodo, - sha=zenodo_file.sha, - branch=branch_name, -) - -pr = defelement.create_pull( - title="[AUTOMATED] Update version number", body="", base="main", head=branch_name -) -pr.enable_automerge("SQUASH") - -print(f"branch={branch_name}") diff --git a/.github/scripts/upload_to_zenodo.py b/.github/scripts/upload_to_zenodo.py deleted file mode 100644 index c2c37ded9e..0000000000 --- a/.github/scripts/upload_to_zenodo.py +++ /dev/null @@ -1,83 +0,0 @@ -import json -import os - -import requests - -token = os.environ.get("ZENODO_TOKEN", None) -version = os.environ.get("VERSION", None) -tar_gz = f"defelement-v{version}.tar.gz" -if "PATH" in os.environ: - tar_gz = os.path.join(os.environ["PATH"], tar_gz) - -doi = "10.5281/zenodo.17904468" -api_url = "zenodo.org" -# api_url = "sandbox.zenodo.org" - -headers = {"Authorization": f"Bearer {token}"} -filename = tar_gz.split("/")[-1] -root_dir = os.path.join( - os.path.join(os.path.dirname(os.path.realpath(__file__)), ".."), - "..", -) - -with open(os.path.join(root_dir, ".zenodo.json")) as f: - metadata = json.load(f) - - -def post(url, **params): - print(f"POST {url}") - r = requests.post(url, params=params, headers=headers).json() - print(r) - return r - - -def get(url, **params): - print(f"GET {url}") - r = requests.get(url, params=params, headers=headers).json() - print(r) - return r - - -def put(url, data=None, content_type=None, **params): - print(f"PUT {url}") - if content_type is None: - put_headers = headers - else: - put_headers = {**headers, "Content-Type": content_type} - r = requests.put(url, data=data, params=params, headers=put_headers).json() - print(r) - return r - - -def delete(url, **params): - print(f"DELETE {url}") - r = requests.delete(url, params=params, headers=headers) - print(r) - return r - - -r = get(f"https://{api_url}/api/records", q=f"conceptdoi:{doi}") -id = r["hits"]["hits"][0]["id"] - -r = get(f"https://{api_url}/api/deposit/depositions/{id}") -newversion_link = r["links"]["newversion"] - -r = post(newversion_link) -new_id = r["links"]["latest_draft"].split("/")[-1] -bucket_link = r["links"]["bucket"] - -for f in r["files"]: - delete(f["links"]["self"]) - -r = put( - f"https://{api_url}/api/deposit/depositions/{new_id}", - json.dumps(metadata), - "application/json", -) - -with open(tar_gz, "rb") as f: - r = put(f"{bucket_link}/{filename}", f) - -r = post(f"https://{api_url}/api/deposit/depositions/{new_id}/actions/publish") - -assert r["state"] == "done" diff --git a/.github/set_symfem_branch.py b/.github/set_symfem_branch.py deleted file mode 100644 index 41a6405093..0000000000 --- a/.github/set_symfem_branch.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Script to update Symfem branch in CI. - -For example, to make the tests run using a Symfem branch called "test2", run: - python3 set_symfem_branch.py test2 -""" - -import argparse -import os - -parser = argparse.ArgumentParser(description="Set Symfem branch") -parser.add_argument("branch") -branch = parser.parse_args().branch - -print(f'Setting Symfem branch to "{branch}"') - -for file in os.listdir("workflows"): - skip = False - content = "" - with open(os.path.join("workflows", file)) as f: - for line in f: - if skip: - assert "ref:" in line - skip = False - else: - content += line - if "repository: mscroggs/symfem" in line: - content += line.split("repository")[0] - content += f"ref: {branch}\n" - skip = True - with open(os.path.join("workflows", file), "w") as f: - f.write(content) diff --git a/.github/workflows/archive.yml b/.github/workflows/archive.yml deleted file mode 100644 index 5cec352973..0000000000 --- a/.github/workflows/archive.yml +++ /dev/null @@ -1,133 +0,0 @@ -name: Archive DefElement - -on: - push: - branches: [ main ] - workflow_dispatch: - -permissions: {} - -concurrency: - group: archive-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - check-version-number: - name: Check version number - runs-on: ubuntu-22.04 - outputs: - release: ${{ steps.version.outputs.release }} - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Install PyGitHub - run: python3 -m pip install PyGitHub - - - name: Check version number - run: python3 .github/scripts/check_version_number.py >> $GITHUB_OUTPUT - id: version - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - permissions: - contents: read - - build-archive: - name: Build archive - runs-on: ubuntu-22.04 - needs: - - check-version-number - permissions: - id-token: write # Needed by push - contents: write # Allow pushing of zip - if: needs.check-version-number.outputs.release != 'no' - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - name: Clone verification - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./verification - repository: DefElement/DefElement - ref: verification - persist-credentials: false - continue-on-error: true - - - name: Move verification jsons - run: | - mv verification/*.json . - rm -r verification - - - run: mkdir -p ~/.local/share/fonts - name: Make font folder - - name: Clone Varela Round - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./varela-r - repository: avrahamcornfeld/Varela-Round-Hebrew - ref: master - persist-credentials: false - - run: | - cp varela-r/fonts/VarelaRound-Regular.otf ~/.local/share/fonts/ - rm -r varela-r - name: Install Varela Round - - name: Download and install Computer Modern - run: | - wget https://downloads.sourceforge.net/project/cm-unicode/cm-unicode/0.7.0/cm-unicode-0.7.0-otf.tar.xz - tar -xf cm-unicode-0.7.0-otf.tar.xz - cp cm-unicode-0.7.0/cmunti.otf ~/.local/share/fonts/ - rm -r cm-unicode-0.7.0 - rm cm-unicode-0.7.0-otf.tar.xz - - - run: python3 -m pip install . - name: Install defelement - - run: python3 build.py _html --verification-json verification.json --processes 4 - name: Build website HTML - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Install implementations - run: | - python3 -m pip install setuptools - python3 install_implementations.py - - - name: Remove build cache - run: rm -r .defelement-build-cache - - name: Remove __pycache__ - run: | - rm -r defelement/__pycache__ - rm -r defelement/implementations/__pycache__ - - - name: Make lock file - run: python3 -m pip freeze > requirements.lock - - - name: Make tar.gz - run: tar --exclude '.git' -czvf ../defelement-v${NEEDS_CHECK_VERSION_NUMBER_OUTPUTS_RELEASE}.tar.gz . - env: - NEEDS_CHECK_VERSION_NUMBER_OUTPUTS_RELEASE: ${{ needs.check-version-number.outputs.release }} - - - name: Install PyGitHub - run: python3 -m pip install PyGitHub - - name: Make release - run: python3 .github/scripts/make_release.py - env: - PATH: ".." - VERSION: ${{ needs.check-version-number.outputs.release }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Upload to Zenodo - run: python3 .github/scripts/upload_to_zenodo.py - env: - PATH: ".." - VERSION: ${{ needs.check-version-number.outputs.release }} - ZENODO_TOKEN: ${{ secrets.ZENODO_TOKEN }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 2f0ca48a6b..0000000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,128 +0,0 @@ -name: Build and deploy DefElement - -on: - workflow_call: - workflow_dispatch: - -permissions: {} - -concurrency: - group: build-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - build-website: - name: Build - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Load Symfem cache - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: /home/runner/.cache/symfem - key: symfem-cache - - name: Load DefElement cache - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: .defelement-build-cache - key: defelement-cache - - - name: Clone Symfem - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./symfem - repository: mscroggs/symfem - ref: main - persist-credentials: false - - name: Install Symfem - run: | - cd symfem - python3 -m pip install .[optional] - - - name: Clone verification - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./verification - repository: DefElement/DefElement - ref: verification - persist-credentials: false - continue-on-error: true - - - run: mkdir -p ~/.local/share/fonts - name: Make font folder - - name: Clone Varela Round - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./varela-r - repository: avrahamcornfeld/Varela-Round-Hebrew - ref: master - persist-credentials: false - - run: cp varela-r/fonts/VarelaRound-Regular.otf ~/.local/share/fonts/ - name: Install Varela Round - - name: Download and install Computer Modern - run: | - wget https://downloads.sourceforge.net/project/cm-unicode/cm-unicode/0.7.0/cm-unicode-0.7.0-otf.tar.xz - tar -xf cm-unicode-0.7.0-otf.tar.xz - cp cm-unicode-0.7.0/cmunti.otf ~/.local/share/fonts/ - - - run: python3 -m pip install . - name: Install defelement - - run: python3 build.py _html --verification-json verification/verification.json --processes 4 - name: Build website HTML - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - if: ${{ !github.event.pull_request.head.repo.fork }} - - run: python3 build.py _html --verification-json verification/verification.json --processes 4 - name: Build website HTML - if: ${{ github.event.pull_request.head.repo.fork }} - - - name: Setup Pages - uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 - if: github.ref == 'refs/heads/main' - - name: Upload artifact - uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 - with: - path: '_html' - if: github.ref == 'refs/heads/main' - - - name: Save Symfem cache - uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: /home/runner/.cache/symfem - key: symfem-cache-${{ github.run_id }}-${{ github.run_attempt }} - if: github.ref == 'refs/heads/main' - - name: Tidy DefElement cache - run: python -c "from defelement.caching import tidy_cache; tidy_cache()" - if: github.ref == 'refs/heads/main' - - name: Save DefElement cache - uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: .defelement-build-cache - key: defelement-cache-${{ github.run_id }}-${{ github.run_attempt }} - if: github.ref == 'refs/heads/main' - permissions: - contents: read - - deploy-website: - name: Deploy - runs-on: ubuntu-22.04 - if: github.ref == 'refs/heads/main' - needs: - - build-website - permissions: - contents: read - pages: write # Allow updating of Github Pages website - id-token: write # Needed by Pages - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - steps: - - name: Deploy to GitHub Pages - uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 diff --git a/.github/workflows/check-dependency-versions.yml b/.github/workflows/check-dependency-versions.yml deleted file mode 100644 index ecdb450fea..0000000000 --- a/.github/workflows/check-dependency-versions.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Check dependencies are up to date - -on: - schedule: - - cron: "0 7 * * 1" - workflow_dispatch: - -permissions: {} - -concurrency: - group: check-dependency-versions-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - check_dependency_versions: - name: Check dependencies are up to date - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Check versions - run: | - python3 -m pip install requests - python3 .github/scripts/check_dependency_versions.py - permissions: - contents: read diff --git a/.github/workflows/test-and-build.yml b/.github/workflows/test-and-build.yml deleted file mode 100644 index d0e1a1a244..0000000000 --- a/.github/workflows/test-and-build.yml +++ /dev/null @@ -1,211 +0,0 @@ -name: Test and build - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - schedule: - - cron: "0 7 * * 1" - -permissions: {} - -concurrency: - group: test-and-build-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - style-checks: - name: Run style checks - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - run: | - python3 -m pip install .[style] - name: Install defelement - - run: | - python3 -m ruff format --check . - python3 -m ruff check . - name: Ruff checks - - run: | - python3 -m pydocstyle . - name: Pydocstyle checks - - run: | - python3 -m mypy --install-types --non-interactive . - python3 -m mypy . - name: mypy checks - - test-build-website: - name: Test building of defelement - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Clone Symfem - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./symfem - repository: mscroggs/symfem - ref: main - persist-credentials: false - - name: Install Symfem - run: | - cd symfem - python3 -m pip install .[optional] - - - name: Clone verification - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./verification - repository: DefElement/DefElement - ref: verification - persist-credentials: false - continue-on-error: true - - - run: mkdir -p ~/.local/share/fonts - name: Make font folder - - name: Clone Varela Round - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./varela-r - repository: avrahamcornfeld/Varela-Round-Hebrew - ref: master - persist-credentials: false - - run: cp varela-r/fonts/VarelaRound-Regular.otf ~/.local/share/fonts/ - name: Install Varela Round - - name: Download and install Computer Modern - run: | - wget https://downloads.sourceforge.net/project/cm-unicode/cm-unicode/0.7.0/cm-unicode-0.7.0-otf.tar.xz - tar -xf cm-unicode-0.7.0-otf.tar.xz - cp cm-unicode-0.7.0/cmunti.otf ~/.local/share/fonts/ - - - run: python3 -m pip install . - name: Install defelement - - run: python3 build.py _test_html --no-cache --verification-json verification/verification.json --test auto --processes 4 --include-simplefem - name: Build website HTML - permissions: - contents: read - - build-website: - name: Build and deploy website - needs: - - test-build-website - - run-tests - uses: ./.github/workflows/build.yml - permissions: - contents: read - pages: write # Allow updating of website - id-token: write # Needed by pages - - verification: - name: Test verification - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Load Symfem cache - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: /home/runner/.cache/symfem - key: symfem-cache - - - name: Clone Symfem - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./symfem - repository: mscroggs/symfem - ref: main - persist-credentials: false - - name: Install Symfem - run: | - cd symfem - python3 -m pip install .[optional] - - - run: python3 -m pip install . - name: Install defelement - - - name: Install implementations - run: | - python3 -m pip install setuptools - python3 install_implementations.py --install-type verification - - - run: python3 verify.py --fail-on-missing-libraries --impl simplefem --assert-passing --print-reasons - name: Check that simplefem verification passes - - - run: python3 verify.py verification-serial.json --test auto --fail-on-missing-libraries - name: Run verification test in serial - - run: python3 verify.py verification-4.json --test auto --processes 4 --fail-on-missing-libraries - name: Run verification test on 4 processes - - name: Check that two verifications runs give the same results - run: python3 .github/scripts/compare_json.py verification-serial.json verification-4.json - permissions: - contents: read - - run-tests: - name: Run tests - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - run: python3 -m pip install pytest-xdist - name: Install dependencies - - - name: Load Symfem cache - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: /home/runner/.cache/symfem - key: symfem-cache - - - name: Clone Symfem - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./symfem - repository: mscroggs/symfem - ref: main - persist-credentials: false - - name: Install Symfem - run: | - cd symfem - python3 -m pip install .[optional] - - - run: python3 -m pip install . - name: Install defelement - - name: Install implementations - run: python3 install_implementations.py --install-type all - - - name: Install LaTeΧ - run: | - sudo apt-get update - sudo apt-get install -y texlive-latex-base - - - run: python3 -m pytest -n4 test - name: Run tests with pytest - permissions: - contents: read diff --git a/.github/workflows/update-version-number.yml b/.github/workflows/update-version-number.yml deleted file mode 100644 index 420729f566..0000000000 --- a/.github/workflows/update-version-number.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: Update version number - -on: - schedule: - - cron: "0 7 2 */3 *" - workflow_dispatch: - -permissions: {} - -concurrency: - group: update-version-number-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - update-version-number: - name: Update version number - runs-on: ubuntu-22.04 - permissions: - id-token: write # Needed for puching - contents: write # Allow writing of new tag - pull-requests: write # Allow opening PR to update version numbers - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Install PyGitHub - run: python3 -m pip install PyGitHub - - - name: Set version number - run: python3 .github/scripts/update_version_number.py - env: - PA_TOKEN: ${{ secrets.PA_TOKEN }} diff --git a/.github/workflows/verification.yml b/.github/workflows/verification.yml deleted file mode 100644 index ba2de2548c..0000000000 --- a/.github/workflows/verification.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: Verification - -on: - schedule: - - cron: "0 7 1 * *" - workflow_dispatch: - -permissions: {} - -concurrency: - group: verification-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - verification: - permissions: - id-token: write # Needed to make push work - contents: write # To upload verification data - name: Run verification - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Load Symfem cache - id: cache-restore - uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: /home/runner/.cache/symfem - key: symfem-cache - - - name: Clone Symfem - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./symfem - repository: mscroggs/symfem - ref: main - persist-credentials: false - - name: Install Symfem - run: | - cd symfem - python3 -m pip install .[optional] - - - run: python3 -m pip install . - name: Install defelement - - - name: Install implementations - run: | - python3 -m pip install setuptools - python3 install_implementations.py --install-type verification - - - name: Clone verification history - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - path: ./verification-old - repository: DefElement/DefElement - ref: verification - persist-credentials: false - - - run: | - mkdir ../verification - cp verification-old/verification-history.json ../verification - name: Make verification dir containing history - - run: python3 verify.py ../verification/verification.json --processes 4 - name: Run verification - - run: python3 .github/scripts/push_verification.py ../verification - name: Push to GitHub - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - build-and-deply-website: - name: Build and deploy website - needs: - - verification - uses: ./.github/workflows/build.yml - permissions: - contents: read - pages: write # Allow updating of Github Pages website - id-token: write # Needed by pages diff --git a/.github/workflows/zizmor.yml b/.github/workflows/zizmor.yml deleted file mode 100644 index b4f06b1fca..0000000000 --- a/.github/workflows/zizmor.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Zizmor checks - -on: - push: - branches: [ main ] - pull_request: - branches: [ main ] - -permissions: {} - -concurrency: - group: zizmor-${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true - -jobs: - zizmor: - name: Run Zizmor checks - runs-on: ubuntu-22.04 - steps: - - name: Set up Python - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - with: - python-version: "3.14" - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - with: - persist-credentials: false - - - name: Install zizmor - run: python3 -m pip install zizmor - - - name: Run Zizmor checks - run: zizmor --pedantic . - permissions: - contents: read diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c36e63f335..0000000000 --- a/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -*.pyc -_html -verification.json -verification-history.json -.defelement-build-cache - -*.xcf -_temp* -*.log - diff --git a/.zenodo.json b/.zenodo.json deleted file mode 100644 index 585b1d129e..0000000000 --- a/.zenodo.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "metadata": { - "upload_type": "software", - "license": "mit", - "access_right": "open", - "creators": [ - { - "name": "Scroggs, Matthew W.", - "affiliation": "University College London", - "orcid": "0000-0002-4658-2443" - }, - { - "name": "Brubeck, Pablo D.", - "affiliation": "Oxford University", - "orcid": "0000-0002-3824-0080" - }, - { - "name": "Dean, Joseph P.", - "affiliation": "University of Cambridge", - "orcid": "0000-0001-7499-3373" - }, - { - "name": "Dokken, J\u00f8rgen S.", - "affiliation": "Simula Research Laboratory", - "orcid": "0000-0001-6489-8858" - }, - { - "name": "Marsden, India", - "affiliation": "Oxford University", - "orcid": "0009-0006-0152-4780" - } - ], - "title": "DefElement: an encyclopedia of finite element definitions", - "version": "v2026.07", - "publication_date": "2026-07-02", - "keywords": ["finite element method"] - } -} diff --git a/CITATION.cff b/CITATION.cff deleted file mode 100644 index cd1ff92920..0000000000 --- a/CITATION.cff +++ /dev/null @@ -1,43 +0,0 @@ -cff-version: 1.2.0 -message: If you use this software, please cite it as below. -authors: - - family-names: Scroggs - given-names: Matthew W. - orcid: 0000-0002-4658-2443 - - family-names: Brubeck - given-names: Pablo D. - orcid: https://orcid.org/0000-0002-3824-0080 - - family-names: Dean - given-names: Joseph P. - orcid: https://orcid.org/0000-0001-7499-3373 - - family-names: Dokken - given-names: Jørgen S. - orcid: https://orcid.org/0000-0001-6489-8858 - - family-names: Marsden - given-names: India - orcid: https://orcid.org/0009-0006-0152-4780 -title: "DefElement: an encyclopedia of finite element definitions" -license: MIT -url: https://github.com/DefElement/DefElement -preferred-citation: - type: article - authors: - - family-names: Scroggs - given-names: Matthew W. - orcid: https://orcid.org/0000-0002-4658-2443 - - family-names: Brubeck - given-names: Pablo D. - orcid: https://orcid.org/0000-0002-3824-0080 - - family-names: Dean - given-names: Joseph P. - orcid: https://orcid.org/0000-0001-7499-3373 - - family-names: Dokken - given-names: Jørgen S. - orcid: https://orcid.org/0000-0001-6489-8858 - - family-names: Marsden - given-names: India - orcid: https://orcid.org/0009-0006-0152-4780 - doi: 10.48550/arXiv.2506.20188 - journal: submitted to Computational Science and Engineering - title: "DefElement: an encyclopedia of finite element definitions" - year: 2025 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index dd3615e1a5..0000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,126 +0,0 @@ -# Code of conduct - -## Our pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this code of conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This code of conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at -defelement@mscroggs.co.uk (Matthew Scroggs). All complaints will be reviewed and -investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement guidelines - -Community leaders will follow these community impage guidelines in determining -the consequences for any action they deem in violation of this code of conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the code of conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the code of conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This code of conduct is adapted from the [Contributor covenant](https://www.contributor-covenant.org), -version 2.0, available at -[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html](https://www.contributor-covenant.org/version/2/0/code_of_conduct.html). - -Community impact guidelines were inspired by -[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). - -For answers to common questions about this code of conduct, see the FAQ at -[https://www.contributor-covenant.org/faq](https://www.contributor-covenant.org/faq). Translations are available -at [https://www.contributor-covenant.org/translations](https://www.contributor-covenant.org/translations). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 5d745cb20f..0000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,178 +0,0 @@ -# Contributing to DefElement - -## Making suggestions - -### Reporting mistakes -If you find a mistake in the DefElement database, please report it on the -[issue tracker](https://github.com/DefElement/DefElement/issues/new?assignees=&labels=bug&template=mistake-report.md&title=) -using the *Mistake report* template. - -### Suggesting new elements -If you want to suggest a new element to be added to DefElement, suggest it on the -[issue tracker](https://github.com/DefElement/DefElement/issues/new?assignees=&labels=new+element&template=new-element.md&title=Add+%5BNAME%5D+element) -using the *New element* template. - -### Suggesting improvements -If you want to suggest a new feature or improvement to DefElement, suggest it on the -[issue tracker](https://github.com/DefElement/DefElement/issues/new?assignees=&labels=feature+request&template=suggest-an-improvement.md&title=) -using the *Suggest an improvement* template. - -### Discussion ideas for new features -You can use [Github's Discussions](https://github.com/DefElement/DefElement/discussions) to discuss -ideas you have for features (that perhaps aren't fully formed enough yet to make an issue) or to -discuss other people's ideas. You're welcome to also use the Discussions to just chat to other -members of the community. - -## Contributing directly - -### Submitting a pull request -If you want to directly submit changes to DefElement, you can do this by forking the [DefElement Github repository](https://github.com/DefElement/DefElement), -making changes, then submitting a pull request. -If you want to contribute, but are unsure where to start, have a look at the -[issue tracker](https://github.com/DefElement/DefElement/labels/good%20first%20issue) for issues labelled "good first issue". - -The functional information and examples on the element pages are generated using -[Symfem](https://github.com/mscroggs/symfem), a symbolic finite element definition library. -Before adding an element to DefElement, it should first be implemented in Symfem. - -### Defining an element -Elements in the DefElement database are defined using a yaml file in the `elements/` folder. -The entries in this yaml file are: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameRequiredDescription
`name`{{tick}}The name of the element (ascii).
`html‑name`{{tick}}The name of the element, including HTML special characters.
`reference‑cells`{{tick}}The reference cell(s) that this finite element can be defined on.
`alt‑names`Alternative (HTML) names of the element.
`legacy‑names`Filenames that have previously been used for this element and/or filenames of elements that were merged into this element. Pages that redirect from the old names to new name will be created if this is set.
`short‑names`Abbreviated names of the element.
`variants`Variants of this element.
`complexes`Any discretiations of complexes that this element is part of.
`dofs`Description of the DOFs of this element.
`ndofs`The number of DOFs the element has and the A-numbers of the [OEIS](http://oeis.org) sequence(s) giving the number of DOFs.
`entity‑ndofs`The number of DOFs the element has per sub-entity type and the A-numbers of the [OEIS](http://oeis.org) sequence(s) giving the number of DOFs.
`polynomial‑set`The polynomial set of this element. This can use sets defined in the file [`/data/polysets`](https://github.com/DefElement/DefElement/blob/main/data/polysets). Other sets can be given by writing `[LaTeX definition of set]`. Unions of multiple sets can be given, separated by ` && `.
`mixed`If this element is a mixed element, the subelements that it contains.
`mapping`The mapping used to push/pull values foward/back from/to the reference cell.
`sobolev`The Sobolev space the element lives in.
`min‑degree`The minimum degree of the element
`max‑degree`The maximum degree of the element
`polynomial-subdegree`The degree of the highest degree complete polynomial space that is a subspace of this element's polynomial space
`polynomial-superdegree`The degree of the lowest degree complete polynomial space that is a superspace of this element's polynomial space
`lagrange-subdegree`The degree of the highest degree Lagrange space that is a subspace of this element's polynomial space
`lagrange-superdegree`The degree of the lowest degree Lagrange space that is a superspace of this element's polynomial space
`degree`Degree that is use to index this element, should be `polynomial-subdegree`, `polynomial-superdegree`, `lagrange-subdegree`, `lagrange-superdegree`
`examples`Reference cells and degrees to be included in the examples section of the entry.
`notes`Notes about the element.
`references`References to where the element is defined.
`categories`Categories the element belongs to. Categories are defined in the file [`/data/categories`](https://github.com/DefElement/DefElement/blob/main/data/categories).
`implementations`Strings/enum entries/etc to create this element in supported implementations.
- -#### Implementations -In the `implementations` fields, parameters can be passed to the implementation using syntax like -this: - -```yaml -implementations: - libraryname: String param_name1=param_value1 param_name2=param_value2 -``` - -There are a few special parameters (written in ALL CAPS) that can be used here: - - - - - - - -
ParameterPurpose
`DEGREES`A list of degrees for which this element is defined in this implementation, eg `1,2,4:8` denotes that degrees 1 and 2 and 4 to 8 (including 4 but not including 8) are supported. Note that if `DEGREEMAP` is set, the degrees used here should correspond to the DefElement convention, not the degree after the degree map is applied.
`DEGREEMAP`A map to apply to the degree used on DefElement to obtain the degree used by this library. The value here will be parsed using Sympy, with the variable `k` equal to the degree (using DefElement's convention).
- -### Testing your contribution -When you open a pull request, a series of tests and style checks will run via Github Actions. -(You may have to wait for manual approval for these to run.) -These tests and checks must pass before the pull request can be merged. -If the tests and checks fail, you can click on them on the pull request page to see where the failure is happening. - -The style checks will check that the Python scripts that generate DefElement pass flake8 checks. -If you've changed these scripts, you can run these checks locally by running: - -```bash -python3 -m flake8 defelement build.py test -``` - -Before you can run the tests or do a test build, you'll need to install DefElement's requirements: - -```bash -python3 -m pip install -r requirements.txt -``` - -The DefElement tests can be run using: - -```bash -python3 -m pytest test/ -``` - -To test that DefElement successfully builds, you can pass `--test auto` to the `build.py` script. -This will build the website including examples for a small set of elements, and will take much less time -then building the full website. - -```bash -python3 build.py _test_html --test auto --processes 4 -``` - -If you've updated an element, then you can test this element by replacing `auto` with the filename of the element you have edited. -If you've updated multiple elements, you can use multiple filenames separated by commas. For example: - -```bash -python3 build.py _test_html --test dpc --processes 4 -python3 build.py _test_html --test lagrange,vector-lagrange --processes 4 -``` - -### Adding an implementation -To add a library to the implementations section of DefElement, you must add a file containing to the folder -[`/defelement/implementations`](https://github.com/DefElement/DefElement/blob/main/defelement/implementations). -This file should define a class that is a subclass of [`Implementation`](https://github.com/DefElement/DefElement/blob/main/defelement/implementations/template.py). -This class should include: - - - - - - - - - - - - - - - - - -
ItemTypeUse
`format`methodThis method should take an implementation string and a set of parameters as inputs and return the implementation information for the library, as it will be displayed on each element's page.
`example_import`methodThis method should return the imports to include at the start of a Python example code.
`single_example`methodThis method should take an element name, reference, degree, and parameters and return a block of Python (as a string) that creates the example element using the library. A DefElement element and the example string are additionally passed into this function in case they are needed by the function.
`version`methodThis method should return the version number of the implementation library.
`verify`method (optional)This method should take an element name, reference, degree, and parameters, and a set of points as inputs and returns the element for that example tabulated at the set of points and the number of DOFs associated with each sub-entity as a tuple of tuples. The shape of the first output is `(number of points, value size, number of basis functions)`. These functions are used to [verify](https://defelement.org/verification.html) that the implementation spans the same space as Symfem. A DefElement element and the example string are additionally passed into this function in case they are needed by the function.
`notes`method (optional)This method should take a DefElement `Element` object and return a list of notes about the implementation to include on the element's page.
`references`method (optional)This method should take a DefElement `Element` object and return a list of references relevant to the implementation to include on the element's page.
`id`variableThe unique identifier for your library. This will be used in .def files.
`name`variableThe name of your library.
`install`variableCode snippet to install you library (preferably using `pip3`)
`url`variableURL where the source code of your library is avaliable (eg a Github link).
`verification`variable (optional)Should be set to `True` if the `verify` function is implemented.
- -Once this is done, you can start adding implementation details for your library to -the `implementation` field of elements in the [`elements`](https://github.com/DefElement/DefElement/blob/main/elements) -folder. The [adding an implementation to DefElement walkthough](https://defelement.org/adding-an-implementation.html) -is a more detailed guide to the steps involved in adding an implementation. - -## Style guide -When contributing to DefElement, you should follow [the DefElement style guide](https://defelement.org/style-guide.html). - -## Adding yourself to the contributors list -Once you have contributed to DefElement, you should add your name and some information about yourself to the [contributors page](https://defelement.org/contributors.html). -To do this, you should add info about yourself to the file [data/contributors](https://github.com/DefElement/DefElement/blob/main/data/contributors). If you wish to include a picture of yourself, -add a square-shaped image to the [pictures/](https://github.com/DefElement/DefElement/blob/main/pictures/) folder. - -## Code of conduct -We expect all our contributors to follow our [code of conduct](CODE_OF_CONDUCT.md). Any unacceptable -behaviour can be reported to Matthew (defelement@mscroggs.co.uk). - -## AI-assisted development -If a large language model (LLM) or other AI tool is used, this must be declared in the text of the pull request. Any AI-generated content must be thoroughly -checked by the person opening the pull request before it is opened. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index ea80d6b846..0000000000 --- a/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -MIT (defelement/, templates/, test/, build.py, verification.py, install_implementations.py) - -MIT License -Copyright (c) 2020 Matthew Scroggs & other contributors to DefElement - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE-CC b/LICENSE-CC deleted file mode 100644 index 585c30056b..0000000000 --- a/LICENSE-CC +++ /dev/null @@ -1,399 +0,0 @@ -CC-BY-4.0 (data/, element/, files/ [excluding files/fontawesome], img/, pages/, people/) - -Attribution 4.0 International -Attribution: Matthew Scroggs & other contributors to DefElement - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution 4.0 International Public License ("Public License"). To the -extent this Public License may be interpreted as a contract, You are -granted the Licensed Rights in consideration of Your acceptance of -these terms and conditions, and the Licensor grants You such rights in -consideration of benefits the Licensor receives from making the -Licensed Material available under these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - d. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - g. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - i. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's - License You apply must not prevent recipients of the Adapted - Material from complying with this Public License. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. - diff --git a/LICENSE-FA b/LICENSE-FA deleted file mode 100644 index dc0fd7916b..0000000000 --- a/LICENSE-FA +++ /dev/null @@ -1,3 +0,0 @@ -Font Awesome Free License (files/fontawesome/) - -See files/fontawesome/LICENSE.txt. diff --git a/README.md b/README.md deleted file mode 100644 index e7ef2e24a5..0000000000 --- a/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# DefElement - -This repo contains code to generate the website -[DefElement: an encylopedia of finite element definitions](https://defelement.org). - -The examples included in DefElement are generated using [Symfem](https://github.com/mscroggs/symfem). - -## Building the website - -Before building the website, you must install the required Python dependencies: - -```bash -pip3 install -r requirements.txt -``` - -The html files for the website can be built by running: - -```bash -python build.py -``` - -A version of the website where only some elements are plotted can be built by using the -`--test` input arg. For example, the following can be run to build the website with only -plots for Lagrange and Raviart-Thomas (`lagrange` and `raviart-thomas` are -the filenames of the `.def` files in the `elements` folder that define these -elements): - -```bash -python build.py --test lagrange,raviart-thomas -``` - -## Licensing - -The code to generate and test the DefElement website (`defelement/`, `templates/`, `test/`, `build.py`, `verify.py`, `install_implementations.py`) -is released under an [MIT license](LICENSE.txt). - -The content of the DefElement website itself (including `data/`, `elements/`, `files/`, `pages/`, `people/`) -is released under a [Creative Commons Attribution 4.0 International (CC BY 4.0) license](LICENSE-CC.txt). - -Font Awesome (`files/fontawesome`) is released under a [Font Awesome Free License](files/fontawesome/LICENSE.txt). - -## Archive -Archived snapshots of code for building DefElement and website builds can be found at https://doi.org/10.5281/zenodo.17904468 diff --git a/build.py b/build.py deleted file mode 100644 index 89cb27b777..0000000000 --- a/build.py +++ /dev/null @@ -1,1751 +0,0 @@ -"""Build DefElement website.""" - -import argparse -import json -import os -import typing -from datetime import datetime, timedelta, timezone - -import symfem -from symfem import create_element -from webtools.citations import make_bibtex, markup_citation -from webtools.html import make_html_forwarding_page, make_html_page -from webtools.markup import cap_first, heading, heading_with_self_ref, markup -from webtools.tools import ( - comma_and_join, - html_local, - insert_author_info, - parse_metadata, -) - -from defelement import plotting, settings -from defelement.code_examples import generate_examples -from defelement.element import Categoriser -from defelement.examples import markup_example -from defelement.families import keys_and_names -from defelement.implementations import implementations, parse_example, verifications -from defelement.markup import insert_links -from defelement.rss import make_rss -from defelement.tools import jsify - - -def mkdir(folder): - """Make a directory if it doesn't exist.""" - try: - os.mkdir(folder) - except FileExistsError: - pass - - -def build_example(eg: dict[str, typing.Any]): - """Build examples. - - Args: - eg: Example - """ - start = datetime.now(tz=timezone(timedelta())) - - element = create_element(*eg["args"], **eg["kwargs"]) - - markup_example( - element, - eg["html_name"], - f"/elements/{eg['element_filename']}", - eg["filename"], - eg.get("legacy-filenames", []), - ) - - end = datetime.now(tz=timezone(timedelta())) - print( - f" {eg['args'][0]} {eg['args'][1]} {eg['args'][2]}" - f" (completed in {(end - start).total_seconds():.2f}s)", - flush=True, - ) - - -if __name__ == "__main__": - start_all = datetime.now(tz=timezone(timedelta())) - - parser = argparse.ArgumentParser(description="Build defelement.org") - parser.add_argument( - "destination", - metavar="destination", - nargs="?", - default=None, - help="Destination of HTML files.", - ) - parser.add_argument( - "--test", - metavar="test", - default=None, - help="Builds a version of the website with fewer elements.", - ) - parser.add_argument( - "--processes", - metavar="processes", - default=None, - help="The number of processes to run the building of examples on.", - ) - parser.add_argument( - "--verification-json", - metavar="verification_json", - default=None, - help="Provide a verification JSON.", - ) - parser.add_argument("--no-cache", action="store_true", help="Build without using cache.") - parser.add_argument( - "--include-simplefem", action="store_true", help="Include simplefem on all pages." - ) - - sitemap = {} - - def write_html_page( - path: str, - title: str | None, - content: str, - extra_head: str | None = None, - ): - """Write a HTML page. - - Args: - path: Page path - title: Page title - content: Page content - extra_head: Extra HTML to include inside - """ - assert html_local(path) not in sitemap - if title is not None: - sitemap[html_local(path)] = title - with open(path, "w") as f: - f.write(make_html_page(content, title, extra_head=extra_head)) - - args = parser.parse_args() - if args.destination is not None: - settings.set_html_path(args.destination) - - if args.no_cache: - settings.caching = False - - if args.processes is not None: - settings.set_processes(int(args.processes)) - - if "GITHUB_TOKEN" in os.environ: - settings.set_github_token(os.environ["GITHUB_TOKEN"]) - - if args.verification_json is not None: - settings.set_verification_json(args.verification_json) - - if args.test is None: - test_elements = None - elif args.test == "auto": - test_elements = [ - "buffa-christiansen", - "direct-serendipity", - "dual", - "hellan-herrmann-johnson", - "hsieh-clough-tocher", - "lagrange", - "nedelec1", - "raviart-thomas", - "regge", - "serendipity", - "taylor-hood", - "vector-bubble-enriched-Lagrange", - "enriched-galerkin", - ] - else: - test_elements = args.test.split(",") - - include_simplefem = args.include_simplefem - - # Prepare paths - if os.path.isdir(settings.html_path): - os.system(f"rm -rf {settings.html_path}") - mkdir(settings.html_path) - mkdir(settings.htmlelement_path) - mkdir(settings.htmlindices_path) - mkdir(settings.htmlfamilies_path) - mkdir(settings.htmlimg_path) - mkdir(os.path.join(settings.html_path, "badges")) - - os.system(f"cp -r {settings.dir_path}/people {settings.htmlimg_path}") - mkdir(os.path.join(settings.htmlelement_path, "bibtex")) - mkdir(os.path.join(settings.htmlelement_path, "examples")) - - os.system(f"cp -r {settings.files_path}/* {settings.html_path}") - - with open(os.path.join(settings.html_path, "CNAME"), "w") as f: - f.write("defelement.org") - - # Load categories and reference cells - categoriser = Categoriser() - categoriser.load_categories(os.path.join(settings.data_path, "categories")) - categoriser.load_references(os.path.join(settings.data_path, "references")) - categoriser.load_families(os.path.join(settings.data_path, "families")) - - # Make pages - for file in os.listdir(settings.pages_path): - if file.endswith(".md"): - start = datetime.now(tz=timezone(timedelta())) - fname = file[:-3] - print(f"{fname}.html", end="", flush=True) - with open(os.path.join(settings.pages_path, file)) as f: - metadata, content = parse_metadata(f.read()) - - if "redirect" in metadata: - with open(os.path.join(settings.html_path, f"{fname}.html"), "w") as f: - f.write( - make_html_forwarding_page( - "/" + metadata["redirect"].replace(".md", ".html") - ) - ) - continue - - if "authors" in metadata: - content = insert_author_info(content, metadata["authors"], f"{fname}.html") - - content = markup(content) - - if "{{REFERENCE_CELL_NUMBERING}}" in content: - reference_cell_numbering = "" - for cell in categoriser.references: - if cell == "dual polygon": - for nsides in [4, 5, 6]: - reference_cell_numbering += heading_with_self_ref( - "h2", f"Dual polygon ({nsides})" - ) - reference_cell_numbering += plotting.plot_reference( - symfem.create_reference(f"dual polygon({nsides})") - ) - else: - reference_cell_numbering += heading_with_self_ref("h2", cap_first(cell)) - reference_cell_numbering += plotting.plot_reference( - symfem.create_reference(cell) - ) - content = content.replace("{{REFERENCE_CELL_NUMBERING}}", reference_cell_numbering) - - write_html_page( - os.path.join(settings.html_path, f"{fname}.html"), - metadata["title"], - content, - ) - end = datetime.now(tz=timezone(timedelta())) - print(f" (completed in {(end - start).total_seconds():.2f}s)") - - # Load elements from .def files - categoriser.load_folder(settings.element_path) - - cdescs = { - "L2": "Discontinuous.", - "H1": "Function values are continuous.", - "H2": "Function values and derivatives are continuous.", - "H3": "Function values and first and second derivatives are continuous.", - "H(div)": "Components normal to facets are continuous", - "H(curl)": "Components tangential to facets are continuous", - "H(div div)": "Inner products with normals to facets are continuous", - "H(curl curl)": "Inner products with tangents to facets are continuous", - "H(curl div)": "Tangent-normal inner products on facets are continuous", - "H1(div)": "Function values and divergence are continuous.", - } - - VHistoryDict = typing.TypedDict( - "VHistoryDict", - {"date": str, "pass": int, "total": int, "version": str}, - total=False, - ) - - verification: dict[str, dict[str, dict[str, list[str]]]] = {} - vhistory: dict[str, list[VHistoryDict]] = {} - - v_date = None - if os.path.isfile(settings.verification_json): - with open(settings.verification_json) as f: - v_json = json.load(f) - verification = v_json["verification"] - v_date = v_json["metadata"]["date"] - if os.path.isfile(settings.verification_history_json): - with open(settings.verification_history_json) as f: - vhistory = json.load(f) - - icon_style = "font-size:150%;vertical-align:middle" - icon_style_small = "font-size:80%;vertical-align:middle" - text_style = "font-size:80%;vertical-align:middle" - green_check = ( - "" - ) - orange_check = ( - "" - ) - red_check = f"" - blue_minus = ( - "" - ) - green_check_small = green_check.replace(icon_style, icon_style_small) - orange_check_small = orange_check.replace(icon_style, icon_style_small) - red_check_small = red_check.replace(icon_style, icon_style_small) - blue_minus_small = blue_minus.replace(icon_style, icon_style_small) - - # Generate element pages - all_examples = [] - for e in categoriser.elements: - print(e.name) - content = heading_with_self_ref("h1", cap_first(e.html_name)) - element_data = [] - impl = [] - - # Link to ciarlet.html - content += "

" - content += "Click here to read what the information on this page means." - content += "

" - - # Alternative names - alt_names = e.alternative_names(include_complexes=False) - if len(alt_names) > 0: - element_data.append(("Alternative names", ", ".join(alt_names))) - c_names = e.complexes() - if "de-rham" in c_names: - element_data.append(("De Rham complex families", ", ".join(c_names["de-rham"]))) - - # Short names - short_names = e.short_names() - if len(short_names) > 0: - element_data.append(("Abbreviated names", ", ".join(short_names))) - - # Variants - variants = e.variants() - if len(variants) > 0: - element_data.append(("Variants", "
".join([insert_links(v) for v in variants]))) - - simplex_only = ( - len( - [ - i - for i in e.reference_cells(False) - if i not in ["point", "interval", "triangle", "tetrahedron"] - ] - ) - == 0 - ) - - if simplex_only: - degree_names = { - "polynomial-subdegree": "polynomial subdegree", - "polynomial-superdegree": "polynomial superdegree", - "lagrange-subdegree": "polynomial subdegree", - "lagrange-superdegree": "polynomial superdegree", - } - else: - degree_names = { - "polynomial-subdegree": "polynomial subdegree", - "polynomial-superdegree": "polynomial superdegree", - "lagrange-subdegree": "Lagrange subdegree", - "lagrange-superdegree": "Lagrange superdegree", - } - # Degrees - if e.degree_convention() is None: - element_data.append(("Degrees", e.degree_range())) - else: - element_data.append( - ( - "Degrees", - f"{e.degree_range()}
where \\(k\\) is the {degree_names[e.degree_convention()]}", - ) - ) - if e.polynomial_subdegree() is not None: - element_data.append(("Polynomial subdegree", e.polynomial_subdegree())) - if e.polynomial_superdegree() is not None: - element_data.append(("Polynomial superdegree", e.polynomial_superdegree())) - if not simplex_only: - if e.lagrange_subdegree() is not None: - element_data.append(("Lagrange subdegree", e.lagrange_subdegree())) - if e.lagrange_superdegree() is not None: - element_data.append(("Lagrange superdegree", e.lagrange_superdegree())) - - # Reference cells - refs = e.reference_cells() - element_data.append(("Reference cells", ", ".join(refs))) - - # Mixed elements - if e.is_mixed: - subelements = e.sub_elements() - element_data.append( - ( - "Definition", - "This is a mixed element containing these subelements:" - "", - ) - ) - - # Polynomial set - psets = e.make_polynomial_set_html() - if len(psets) > 0: - element_data.append(("Finite dimensional space", psets)) - - # DOFs - dofs = e.make_dof_descriptions() - if len(dofs) > 0: - element_data.append(("DOFs", dofs)) - - # Number of DOFs - ndofs = e.dof_counts() - if len(ndofs) > 0: - element_data.append(("Number of DOFs", ndofs)) - - # Number of DOFs on sub-entities - ndofs = e.entity_dof_counts() - if len(ndofs) > 0: - element_data.append(("Number of DOFson sub-entities", ndofs)) - - # Mapping - mapping = e.mapping() - if mapping is not None: - element_data.append(("Mapping", mapping)) - - # Continuity - sobolev = e.sobolev() - if sobolev is not None: - if isinstance(sobolev, dict): - element_data.append( - ( - "continuity", - "
".join([f"{cdescs[c]} (\\({n}\\))" for n, c in sobolev.items()]), - ) - ) - else: - element_data.append(("continuity", cdescs[sobolev])) - - # Notes - notes = e.notes - if isinstance(notes, str): - notes = [notes] - if len(notes) > 0: - element_data.append(("Notes", "
\n".join([insert_links(i) for i in notes]))) - - # Implementations - libraries = [(i, j.name, j.url, j.install) for i, j in implementations.items()] - libraries.sort(key=lambda i: i[0]) - for codename, libname, url, pip in libraries: - if not include_simplefem and codename == "simplefem": - continue - jscodename = jsify(libname) - code_examples = {} - for language in implementations[codename].languages: - eg_html = generate_examples(e, implementations[codename], language) - if eg_html is not None: - code_examples[language] = eg_html - if len(code_examples) > 0: - info = e.list_of_implementation_strings(codename) - - info += "\n".join(code_examples.values()) - - short_info = libname - - if codename == "symfem": - short_info += f" {green_check_small}" - info += ( - f"{green_check} " - "This implementation is used to compute the examples below and " - "verify other implementations." - ) - else: - v = None - if codename.startswith("*(") and codename.endswith(")"): - input_code, output_code = codename[2:-1].split(" -> ") - if e.filename in verification and output_code in verification[e.filename]: - v = verification[e.filename][output_code] - elif e.has_implementation_examples(codename): - if e.filename in verification and codename in verification[e.filename]: - v = verification[e.filename][codename] - if v is not None: - if len(v["fail"]) == 0: - if len(v["not implemented"]) == 0: - short_info += f" {green_check_small}" - info += ( - f"{green_check} " - "This implementation is correct for all the examples below." - "" - ) - else: - short_info += f" {green_check_small}" - info += ( - f"{green_check} " - "This implementation is correct for all the examples below " - "that it supports." - "" - f"
" - f"" - "↓ Show more ↓
" - f"" - "" - "" - ) - elif len(v["pass"]) > 0: - short_info += f" {orange_check_small}" - info += ( - f"{orange_check} " - "This implementation is correct for some of " - "the examples below." - f"
" - f"" - "↓ Show more ↓
" - f"" - ) - info += ( - "" - "" - ) - else: - short_info += f" {red_check_small}" - info += ( - f"{red_check} " - "This implementation is incorrect for this element." - ) - notes = e.implementation_notes(codename) - if notes is not None: - for note in notes: - info += f"
Note: {note}
" - - impl.append( - ( - f"{libname}", - info, - short_info, - ) - ) - - # Categories - cats = e.categories() - if len(cats) > 0: - element_data.append(("Categories", ", ".join(cats))) - - # Write element data - content += "" - for i, j in element_data: - content += f"" - content += f"" - content += "
{i.replace(' ', ' ').replace('', ' ')}{j}
" - - # Write implementations - if len(impl) > 0: - content += heading_with_self_ref("h2", "Implementations") - content += "This element is implemented in " - content += comma_and_join( - [f"{i[2]}" for i in impl] - ) - content += "." - content += ( - "" - "↓ Show implementation detail ↓" - ) - content += ( - "" - ) - content += "" - - # Write examples using symfem - if e.has_examples: - element_examples = [] - - if test_elements is None or e.filename in test_elements: - assert e.implemented("symfem") - - for eg in e.examples: - cell, degree, variant, kwargs = parse_example(eg) - symfem_name, symfem_degree, params = e.get_implementation_string( - "symfem", cell, degree, variant - ) - - fname = f"{cell}-{e.filename}" - if variant is not None: - fname += f"-{variant}" - fname += f"-{degree}.html" - for s in " ()": - fname = fname.replace(s, "-") - - name = f"{cell}
degree {degree}" - if variant is not None: - name += f"
{e.variant_name(variant)} variant" - for key, value in kwargs.items(): - name += f"
{key}={str(value).replace(' ', ' ')}" - - eginfo = { - "name": name, - "args": [cell, symfem_name, symfem_degree], - "kwargs": kwargs, - "html_name": e.html_name, - "element_filename": e.html_filename, - "filename": fname, - "url": f"/elements/examples/{fname}", - } - if "variant" in params: - eginfo["kwargs"]["variant"] = params["variant"] - if "legacy-names" in e.data: - eginfo["legacy-filenames"] = [ - fname.replace(e.filename, i) for i in e.data["legacy-names"] - ] - all_examples.append(eginfo) - element_examples.append(eginfo) - - if len(element_examples) > 0: - content += heading_with_self_ref("h2", "Examples") - content += "" - for eg in element_examples: - element = create_element(*eg["args"], **eg["kwargs"]) - content += ( - f"" - ) - content += "
{eg['name']}
" - f"{plotting.plot_dof_diagram(element, link=False)}" - "
(click to view basis functions)
" - - # Write references section - refs = e.references() - if len(refs) > 0: - content += heading_with_self_ref("h2", "References") - content += "" - - # Write created and updated dates - if e.created is not None: - content += heading_with_self_ref("h2", "DefElement stats") - content += "" - content += ( - f"" - ) - content += "" - content += f"" - content += "
Element added{e.created.strftime('%d %B %Y')}
Element last updated{e.modified.strftime('%d %B %Y')}
" - - # Write file - write_html_page( - os.path.join(settings.htmlelement_path, e.html_filename), e.html_name, content - ) - - # Make redirects from legacy filenames - for fname in e.legacy_filenames: - with open(os.path.join(settings.htmlelement_path, f"{fname}.html"), "w") as f: - f.write(make_html_forwarding_page(f"/elements/{e.html_filename}")) - - # Verification badges - img = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIIAAACCCAYAAACKAxD9AAAABHNCSVQICAgIfAhkiAAACiVJREFUeJztnXmwHFUVxn8nDyEkLCoSkzLsFiIGAhHKINkw7siiCSpRiFUohKJUpBSkCgkkiohSllBKAC0FZJUXWaXQgpQBEoISAqUECYssYScYJXkhy/v8o3se8+YtM3P7znS/mfOrelU9031PfzPzvdv39j19LziO4zhOL2ywndJmoONAYDzwjqYoGhhL/54FXgM2AquA9WaDfgynBgb8BiVNB34O7Nc8OUFsIDHEk8DjwEPAcjN7PFdVrYCkb0jq1tDmVUkLJX1H0l6dnZ15f62Fpk+NIGkSsLi/fUOclcCNwPVm9s+8xRSNXj+2JIDlwIG5qGkeDwILgGvMbH3eYopApRH2Bdrpv+V14CLgF2a2Nm8xeTKs4vUhuajIj52Ac4HVkuZK2i5vQXlRaYTK1+3CSOAcYJWkWeklsq1o1x9+IEYDVwN3S9orbzHNxI3QP4cBD0ua0y61gxthYEYClwB/lLR93mIajRuhOkcDj0gq+h3WTLgRamN34H5Jn8lbSKPYKlKc80gGgxqFgB2BXYDtgX2APYFRDTxnJSOA2ySdYmYLmnjephDLCJ1mtjxSrJpJ+/0TgIOBScBkknsDjWIYcImk7czsZw08T74oGWwKYULe2gEkmaSDJP1Q0hOBn6VWvpv3520YGuJGKGfWrFlI+oikBZLWRfv5e/OtvD9nQ1ALGaEcSTtKOkPJ0HRsTsj788WgLXoNZrbWzH5C0vo/H3grYviLJU2OGC8X2sIIJcxsnZmdCXwQuCVS2G2BGyXtEileLsTqNRQabdkCw4ZNAx41s1fM7GlJRwFfAX5J0jXNwijgWklTzWyLpOHADcDOGePG4g2SxJyFc+fOvW/evHmDH60WbCNI2kXSolTnGkmnSeoo2z9W0v3hTYRezC+LOyNSzNjcImlw46vFjCBpjKR/96P3AUn7lB23taTLAj97OZsljS+L+4cIMRvBCkkjyr+rlm0jKBk1vArYrZ/dBwPLJZ2ycuVKzGyjmZ0InJ7xtB3AVZJKqf+nAkVMhRsPXDjgXrVQjSBpao3afydpm7JyJwV+B+WcVhZvXoR4jaBL0rtLOlu2RgCOqvG42cBfJI0EMLNLgTkZz32OpFJD8QJgTcZ4jWA4MKX0opWNsH8dx04GFpd+vNQMF2Q49/bA/DTWm0BRxyV6Bu1a2QjD6zx+ArBQbzeizgBuynD+EyTtmm5fTJIxXTR60q9a2QghTAJukmTp85RfJXmULoStgDOhp1a4PIrCuCwtbbgR+vIJ4MeQ3IkEvkjywG0IX5NUqn4vpFg9iIeAf5ReuBH65wxJnwZI8yzOC4wzHPhmGuc14Po48jKzCTi5/ClyN8LAXFnR8l8VGOdEJbecAS7LLisz/wVmmNmy8jfdCAOzM2lr38y6gO8FxhkFHJlu3w/8K7u0IJ4jebxvXzO7tXJnWww61cEG4F397TCzmyXdQ9LVrJfjgRvMDCXZ0B3VCkTmrREjRqirq2vAA9wIFZjZhkF2zwXuDgh7uKTRZvaSmW0iuUYXCr801Mci4IHAsjNiComNG6EO0lb2rwKL13rLOxfcCPVzPUnLu14+LumdscXEwo1QJ2kb4rqQosC0uGri4UYII3RmrsImuboRwlhE2O3i6bGFxMKNEEDaBVwcUHSc3s5eKhRuhHBCjNABHBBbSAzcCOEsrX5Iv4yLqiISboRwVgSWqydzqmm4EQIxs/8ALwYU7S+rOnfcCNl4IqDMHtFVRMCNkI0QIxTyGUk3QjbeCCizkwo4ZZ8bIRvPBZbbNqqKCLgRshGajDomqooIuBGyEbqmReFGId0IDuBGcFLcCA7gRshKd2C5Z6KqiIAbIRujA8sVbtkgN0I2xgaW2xxVRQTcCNkImY3tsSKuXOtGyMY+1Q/pQxFnT3EjhJKOF+wdULSQSxW7EcLZm7AxAzdCixG6Wm5eT0MPihshnEMDy4WmuDUUN0I4HwsoswZ4KraQGLgRApA0GvhQQNGlRew6ghuhkuGDzFT6SNlxxwbGv6e0IemxhsynKr0s6TZJn6tHmBuhdsqnx5sZGOPPAOlMax/IrKh/RgGHA7dKulFSTT0bnzGlNv4HXAkgaQ/gowExXiKZ0g6a9zDsDKBD0uerXZK8RqiNq82sNFB0SmCM28t+jC9ll1QzRwNfrnaQG6E6m4CfQs86k6GLeS1MY3SQLELeTKpqdiNU53IzK3X5TiIs3/Bl4M50+5PAe2IIq4Op1VLo3QiDs4Z0PuW0Nvh+YJxrzWxLuj0rhrA6qfoovhthcE41s9J8SecS/p98GYCkHchnUq2qafduhIH507Jly64CkLQv6ZzKAfzVzFam218gWcuh2SzxXkMYzwOzJ06ciCQDrqCG6nUALi3bzmsJ4aoLh7gR+tIFHJvOpg7wA+CgwFhPkM7AJmkS4SOWWfh1d3f3ndUOciP05WQzuxdA0iHA2RlinW9mpeb6WZmV1YdI1p04qaOj+tTPfmexNxvN7AoASbuT9P1DJ9B+muSSgpLlgncGlkfQWI31wBLgN2ZWcxKMG6E33QCHvg9IptYPTVcHONvMNgOY2XPAh7OKayR+aahg8li47rjMYf4Om38fQU7T8BqhgmuOg7FZlwyHOWaFnE5xQLxGqCCCCS4yswcjSGkqboS4PEV6S3qo4UaIy/FmVqQl/WrGjRCPs8zsvrxFhOJGiMNC4Ed5i8iCGyE7K4DjipqdXCtuhGw8AxwxVNsF5bgRwnkBmG5mz+ctJAYtYYRp06Yh6b2S9nv427BuXsNPuRqYYmahK8kXjiF1ZzHNu9sReD/J5NZ7A+OBCel7V+4/htkNlvEscFhZHmNLEMsIV0tq1HVS6d+uJA9v5MkK4Mh0EKmliGWEkJlDhhp3AMeY2bq8hTSClmgjNBgB84HPtqoJYIi1EXJgNTDbzO7KW0ijcSMMzFJgvJm9nreQZuCXhgrWbYQFS8DM/tYuJgCvEfrwqUvhvtV5q2g+lTVCyzaGaqUdTQB9jbAoFxVO7vQygpm9CAyppEsnDv01Fk8nuY3qtBF9jJDWClOAVc2Xk531m+DJtmnrx2PAbApJw4GvA8cAE4GtmyVqENaSrLX4OvAmSbLoWuBR4EmSmc9fAJB0L/VPirnBzAq3FJ+TAUn3BkxN15W37rzwG0oO4EZwUtwIDuBGcFLcCA7gg06VmKSReYtoAJtIJgEZ8AA3Qm+2Ibk/0Yq8KOlmYH7pXks5fmloH8YAc4CVkqZU7nQjtB87AHdIOqD8TTdCezICuGTcuHE9bwztJzcHIXCsod3Y08yeBq8R2p2e5QJa2Qhv5S1gCNDTa2xlIzxS/ZC2pydzo5WNcFveAoYAi0sbrWyEu0geUnH657dm9mrpRcv2GgAk7Uri+t3y1lIwVgEHlS1K0tI1Amb2LEn+pafpv82twCHlJoAWrxFKqLsbzKYCR5BMtNGOvALcPnPmzCWdnZ15a3Ecp9D8H6iRYL8kgknaAAAAAElFTkSuQmCC" - badges = os.path.join(settings.html_path, "badges") - for i in verifications: - if i != "symfem" and not i.startswith("*("): - good = 0 - total = 0 - for ver in verification.values(): - if i in ver: - good += len(ver[i]["pass"]) - total += len(ver[i]["pass"]) + len(ver[i]["fail"]) - proportion = f"{good} / {total}" - if good == total: - col = symfem.plotting.Colors.GREEN - elif good < total / 2: - col = "#FF0000" - else: - col = symfem.plotting.Colors.ORANGE - twidth = 50 + 70 * (len(proportion) - 2) - width = 840 + 90 + twidth - svgwidth = width // 10 if width % 10 == 0 else width / 10 - with open(os.path.join(badges, f"{i}.svg"), "w") as f: - f.write( - f'\n' - f"DefElement verification: {proportion}\n" - '\n' - '\n' - '\n\n' - f'\n\n' - '\n' - f'\n' - f'\n\n' - '\n' - f'\n' - "" - ) - with open(os.path.join(badges, "symfem.svg"), "w") as f: - f.write( - f'\n' - "DefElement: used as verification baseline\n" - '\n' - '\n' - '\n\n' - f'\n' - '\n\n' - f'\n' - f'\n\n' - '' - f'\n\n' - "" - ) - - # Make verification pages - mkdir(os.path.join(settings.html_path, "verification")) - - impl_content = {i: "" for i in verifications if i != "symfem" and not i.startswith("*(")} - for i in impl_content: - title = f"{implementations[i].name} verification" - if i in vhistory: - good = vhistory[i][-1]["pass"] - total = vhistory[i][-1]["total"] - if good == total: - col = symfem.plotting.Colors.GREEN - elif good < total / 2: - col = "#FF0000" - else: - col = symfem.plotting.Colors.ORANGE - title += ( - "{good} / {total}" - ) - impl_content[i] += heading("h1", title) - - content = heading_with_self_ref("h1", "Verification") - long_content = heading_with_self_ref("h1", "Verification: full detail") - if v_date is not None: - year, month, day = [int(i) for i in v_date.split("-")] - monthname = [ - "Zeromber", - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ][month] - updated = f"Last updated: {day} {monthname} {year}

" - content += updated - long_content += updated - for i in impl_content: - impl_content[i] += updated - - for i in impl_content: - if i in vhistory: - hist = vhistory[i] - impl_content[i] += ( - "
" - impl_content[i] += ( - "The plot above shows the number of elements passing verificiation (green line) " - "out of the number of elements being verified (dashed black line) over time." - ) - impl_content[i] += "

" - - content += "" - content += "" - content += "" - long_content += "
Element
" - long_content += "" - long_content += "" - for i in impl_content: - impl_content[i] += ( - "
ElementExample
" - "" - "" - "" - ) - vs = [] - for i in verifications: - if i != "symfem": - if i.startswith("*(") and i.endswith(")"): - continue - vs.append(i) - if not include_simplefem and i == "simplefem": - continue - content += f"" - long_content += ( - f"" - ) - content += "" - long_content += "" - rows = [] - for e in categoriser.elements: - n = 0 - row = "" - row += f"" - for i in vs: - if not include_simplefem and i == "simplefem": - continue - row += "" - row += "" - - examples = [] - if e.filename in verification: - for vv in verification[e.filename].values(): - for egs in vv.values(): - for eg in egs: - if eg not in examples: - examples.append(eg) - sorted_examples = [] - for cell in [ - "interval", - "triangle", - "quadrilateral", - "tetrahedron", - "hexahedron", - "prism", - "pyramid", - "dual", - ]: - sorted_examples += sorted( - [i for i in examples if i.startswith(cell)], - key=lambda i: ",".join(i.split(",")[:0:-1]), - ) - assert len(examples) == len(sorted_examples) - long_row = "" - impl_rows: dict[str, list[str]] = {i: [] for i in impl_content} - for eg in sorted_examples: - long_row += "" - if long_row == "": - long_row += ( - f"" - ) - long_row += f"" - for i in vs: - long_row += "" - ) - long_row += green_check - elif eg in result["fail"]: - long_row += red_check - impl_rows[i].append( - f"" - ) - else: - long_row += blue_minus - else: - long_row += blue_minus - long_row += "" - long_row += "" - - for i, i_rows in impl_rows.items(): - if len(i_rows) > 0: - impl_content[i] += ( - f"" - ) - impl_content[i] += "".join(i_rows) - impl_content[i] += "" - - rows.append((row, long_row, n)) - rows.sort(key=lambda i: -i[2]) - for r in rows: - if r[2] > 0: - content += r[0] - long_content += r[1] - - c = ( - "
ElementExample
{implementations[i].name}{implementations[i].name}
{e.html_name}" - if e.filename in verification and i in verification[e.filename]: - result = verification[e.filename][i] - if len(result["pass"]) > 0 or len(result["fail"]) > 0: - n += 1 - if len(result["fail"]) == 0: - row += green_check - elif len(result["pass"]) > 0: - row += orange_check - else: - row += red_check - row += "
" - f"{e.html_name}{eg}" - if e.filename in verification and i in verification[e.filename]: - result = verification[e.filename][i] - if eg in result["pass"]: - impl_rows[i].append( - f"{eg}{green_check}{eg}{red_check}
" - f"{e.html_name}
" - "

For each element in the table above, the verification test passes for an example if:

" - "" - "

The algorithm used to perform verification is described in detail in the DefElement paper {{citation::defelement_paper}}.

" - "

The symbols in the table have the following meaning:

" - ) - content += c - content += ( - "" - f"" - f"" - f"" - "
{green_check}Verification passes from all the examples on the element's page" - "
{orange_check}Verification passes for some examples, but not all
{red_check}Verification fails for all examples
" - "

You can view more details of which examples pass and fail on the " - "verification with full detail page.

" - ) - long_content += c - long_content += ( - "" - f"" - f"" - f"" - "
{green_check}Verification passes
{red_check}Verification fails
{blue_minus}Example not implemented
" - "

You can view a summarised version of this information on the " - "verification page.

" - ) - for i in impl_content: - impl_content[i] += c - impl_content[i] += ( - "" - f"" - f"" - "
{green_check}Verification passes
{red_check}Verification fails
" - "

You can information about verification of other libraries on the " - "verification page.

" - ) - if os.path.isfile(settings.verification_json): - os.system(f"cp {settings.verification_json} {settings.html_path}/verification.json") - c = ( - "

The verification data is also available " - "in JSON format.

" - ) - content += c - long_content += c - - c = heading_with_self_ref("h2", "Verification Github badges") - c += "" - c += "" - for i in verifications: - if i == "symfem": - url = "https://defelement.org/verification/" - else: - url = f"https://defelement.org/verification/{i}.html" - if i.startswith("*(") and i.endswith(")"): - continue - if i in impl_content: - impl_content[i] += heading_with_self_ref("h2", "Verification Github badge") - impl_content[i] += ( - "
ImplementationBadgeMarkdown
" - "" - "" - f"" - "" - "" - "
BadgeMarkdown
" - f"[![DefElement verification](https://defelement.org/badges/{i}.svg)]" - f"(https://defelement.org/verification/{i}.html)
" - ) - if not include_simplefem and i == "simplefem": - continue - c += ( - "" - f"{implementations[i].name}" - f"" - "" - f"[![DefElement verification](https://defelement.org/badges/{i}.svg)]" - f"({url})" - "" - ) - - c += "" - content += c - long_content += c - write_html_page( - os.path.join(settings.html_path, "verification/index.html"), - "Verification", - markup(content), - ) - write_html_page( - os.path.join(settings.html_path, "verification/detailed.html"), - "Verification: full detail", - markup(long_content), - ) - with open(os.path.join(settings.html_path, "verification.html"), "w") as f: - f.write(make_html_forwarding_page("/verification/")) - - for i in verifications: - if i == "symfem": - continue - if i.startswith("*(") and i.endswith(")"): - continue - write_html_page( - os.path.join(settings.html_path, f"verification/{i}.html"), - f"{implementations[i].name} verification", - markup(impl_content[i]), - extra_head=( - "" - ), - ) - - # Make example pages - print("Making examples") - if settings.processes == 1: - for e in all_examples: - build_example(e) - else: - import multiprocessing - - multiprocessing.set_start_method("fork") - - with multiprocessing.Pool(settings.processes) as p: - p.map(build_example, all_examples) - - # Index page - content = heading_with_self_ref("h1", "Index of elements") - # Generate filtering Javascript - content += "" - content += "Alternative names" - " " - " " - " " - "" - ) - content += "Reference cells" - content += ( - " " - content += "" - content += "Categories" - content += ( - " " - content += "" - content += "\n" - # Write element list - elementlist = [] - for e in categoriser.elements: - id = " ".join( - [f"ref-{r}" for r in e.reference_cells(False)] - + [f"cat-{c}" for c in e.categories(False, False)] - ) - elementlist.append( - ( - e.html_name.lower(), - ( - f"
  • " - f"{e.html_name}
  • " - ), - ) - ) - for name in e.alternative_names(False, False, False, True): - elementlist.append( - ( - name.lower(), - ( - f"
  • " - f"{name}
  • " - ), - ) - ) - for name in e.short_names(False): - elementlist.append( - ( - name.lower(), - ( - f"
  • " - f"{name}
  • " - ), - ) - ) - elementlist.sort(key=lambda x: x[0]) - content += "" - content += "" - - write_html_page( - os.path.join(settings.htmlelement_path, "index.html"), "Index of elements", content - ) - - # Recently updated elements - rss_icon = ( - "" - "" - ) - content = heading_with_self_ref("h1", "Recent elements") - content += f"

    Recently added elements {rss_icon}

    \n" - content += "\n" - - content += ( - f"

    Recently updated elements {rss_icon}

    \n" - ) - content += "\n" - - write_html_page( - os.path.join(settings.htmlindices_path, "recent.html"), "Recent elements", content - ) - - with open(os.path.join(settings.html_path, "new-elements.xml"), "w") as f: - f.write( - make_rss( - categoriser.recently_added(10), - "recently added elements", - "Finite elements that have recently been added to DefElement", - "created", - ) - ) - - with open(os.path.join(settings.html_path, "updated-elements.xml"), "w") as f: - f.write( - make_rss( - categoriser.recently_updated(10), - "recently updated elements", - "Finite element whose pages on DefElement have recently been updated", - "modified", - ) - ) - - # Category index - mkdir(os.path.join(settings.htmlindices_path, "categories")) - content = heading_with_self_ref("h1", "Categories") - for c in categoriser.categories: - category_pages = [] - for e in categoriser.elements_in_category(c): - for name in [e.html_name]: - category_pages.append( - ( - name.lower(), - f"
  • {name}
  • ", - ) - ) - - category_pages.sort(key=lambda x: x[0]) - - content += ( - f"

    {categoriser.get_category_name(c)}" - "

    \n" - - sub_content = heading_with_self_ref("h1", categoriser.get_category_name(c)) - sub_content += "" - - write_html_page( - os.path.join(settings.htmlindices_path, f"categories/{c}.html"), - categoriser.get_category_name(c), - sub_content, - ) - - write_html_page( - os.path.join(settings.htmlindices_path, "categories/index.html"), - "Categories", - content, - ) - - # Implementations index - mkdir(os.path.join(settings.htmlindices_path, "implementations")) - content = heading_with_self_ref("h1", "Implemented elements") - for c, info in implementations.items(): - if c.startswith("*("): - continue - category_pages = [] - for e in categoriser.elements_in_implementation(c, include_dependent_implementations=True): - names = {e.html_name} - refs = set() - for cname in categoriser.references: - for i_str in e.list_of_implementation_strings( - c, None, include_dependent_implementations=True - ): - if "(" not in i_str or f"({cname})" in i_str: - refs.add(cname) - break - for name in names: - category_pages.append( - ( - name.lower(), - f"
  • {name}
  • ", - ) - ) - - category_pages.sort(key=lambda x: x[0]) - - content += ( - f"

    Implemented in {info.name}" - "

    \n" - - sub_content = f"

    Implemented in {info.name}

    \n" - - write_html_page( - os.path.join(settings.htmlindices_path, f"implementations/{jsify(c)}.html"), - f"Implemented in {info.name}", - sub_content, - ) - - write_html_page( - os.path.join(settings.htmlindices_path, "implementations/index.html"), - "Implemented elements", - content, - ) - - # Reference cells index - mkdir(os.path.join(settings.htmlindices_path, "references")) - content = heading_with_self_ref("h1", "Reference cells") - for c in categoriser.references: - refels = [] - for e in categoriser.elements_by_reference(c): - for name in [e.html_name]: - refels.append( - ( - name.lower(), - f"
  • {name}
  • ", - ) - ) - - refels.sort(key=lambda x: x[0]) - - content += f"

    {cap_first(c)}

    \n" - content += "" - - title = "Finite elements on a" - if c[0] in "aeiou": - title += "n" - title += f" {c}" - sub_content = heading_with_self_ref("h1", title) - sub_content += "" - - write_html_page( - os.path.join(settings.htmlindices_path, f"references/{c}.html"), - title, - sub_content, - ) - - write_html_page( - os.path.join(settings.htmlindices_path, "references/index.html"), - "Reference cells", - content, - ) - - # Families - def linked_names(dim: str, fname: str, cell: str) -> str: - """Create list of linked names. - - Args: - dim: Dimension - fname: Filename - cell: Reference cell - - Returns: - List of linked names - """ - out = [] - for key, cname in keys_and_names: - if key in data: - out.append( - f"" - "\\(" + cname(data[key], cell=cell, dim=dim) + "\\)" - "" - ) - return ", ".join(out) - - def de_rham_row( - family: dict[str, dict[str, list[str]]], - fname: str, - cell: str, - diff_form_deg: list[str], - ) -> str: - """Create HTML string of FEs. - - Args: - family: Elements - fname: Filename - cell: Reference cell - diff_form_deg: List of differential form degrees - - Returns: - HTML string of FEs - """ - row = "" - if all(i in family[cell] for i in diff_form_deg): - row += "" - row += f"{linked_names(str(len(diff_form_deg) - 1), fname, cell)}" - for o in diff_form_deg: - row += f"" - if o != "d": - row += " " - row += "" - return row - - de_rham_3d: list[str] = [] - de_rham_2d_hdiv: list[str] = [] - de_rham_2d_hcurl: list[str] = [] - - for fname, data in categoriser.families["de-rham"].items(): - family = data["elements"] - cnames = [] - for key, cname in keys_and_names: - if key in data: - cnames.append("\\(" + cname(data[key], dim="3") + "\\)") - if len(cnames) == 0: - raise ValueError(f"No name found for family: {fname}") - sub_content = heading_with_self_ref("h1", "The " + " or ".join(cnames) + " family") - - assert len([i for i in ["simplex", "tp"] if i in family]) == 1 - - sub_content += "" - - write_html_page( - os.path.join(settings.htmlfamilies_path, f"{fname}.html"), - "The " + " or ".join(cnames) + " family", - sub_content, - ) - - content = heading_with_self_ref("h1", "Complex families") - content += "

    You can find some information about how these familes are defined " - content += "here

    " - content += heading_with_self_ref("h2", "De Rham complex in 3D") - content += "\n" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "\n" - content += "\n".join(de_rham_3d) - content += "
    Name(s)\\(H^1\\)\\(\\xrightarrow{\\nabla}\\)\\(\\textbf{H}(\\text{curl})\\)\\(\\xrightarrow{\\nabla\\times}\\)\\(\\textbf{H}(\\text{div})\\)\\(\\xrightarrow{\\nabla\\cdot}\\)\\(L^2\\)
    " - content += heading_with_self_ref("h2", "De Rham complex in 2D") - content += "

    In 2D, \\(\\textbf{H}(\\text{div})\\) and \\(\\textbf{H}(\\text{curl})\\) " - content += "are isomorphic via a 90 degree rotation \\(R\\). This means that we can define " - content += "the de Rham complex in two ways.

    " - content += "

    One variant uses \\(\\textbf{H}(\\text{div})\\) and the vector-valued " - content += "\\(\\textbf{curl}\\) operator, " - content += "\\(\\textbf{curl} \\, u = (\\partial_y u, -\\partial_x u)\\). " - content += "Note that \\(\\textbf{curl} \\, u = R \\, \\nabla u\\).

    " - content += "\n" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "\n" - content += "\n".join(de_rham_2d_hdiv) - content += "
    Name(s)\\(H^1\\)\\(\\xrightarrow{\\textbf{curl}}\\)\\(\\textbf{H}(\\text{div})\\)\\(\\xrightarrow{\\nabla\\cdot}\\)\\(L_2\\)
    " - content += "

    The second variant uses \\(\\textbf{H}(\\text{curl})\\) and the scalar-valued " - content += "\\(\\text{curl}\\) operator, " - content += "\\(\\text{curl} \\, \\mathbf{u} = \\partial_x u_y - \\partial_y u_x\\). " - content += "Note that \\(\\text{curl} \\, \\mathbf{u} = \\nabla\\cdot R \\mathbf{u}\\).

    " - content += "\n" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "" - content += "\n" - content += "\n".join(de_rham_2d_hcurl) - content += "
    Name(s)\\(H^1\\)\\(\\xrightarrow{\\nabla}\\)\\(\\textbf{H}(\\text{curl})\\)\\(\\xrightarrow{\\text{curl}}\\)\\(L_2\\)
    " - content += "

    These two de Rham complex definitions in 2D account for the " - content += "double element diagrams in the orange boxes in the " - content += "" - content += "Periodic table of the finite elements. That is also why the " - content += "boxes are orange, and not red nor yellow as in 3D.

    " - write_html_page( - os.path.join(settings.htmlfamilies_path, "index.html"), "Complex families", content - ) - - # List of lists - content = heading_with_self_ref("h1", "Lists of elements") - content += "" - write_html_page( - os.path.join(settings.htmlindices_path, "index.html"), "Lists of elements", content - ) - - # Site map - sitemap[html_local(os.path.join(settings.html_path, "sitemap.html"))] = "List of all pages" - - def list_pages(folder: str) -> str: - """Create list of pages in a folder. - - Args: - folder: The folder - - Returns: - List of pages - """ - items = [] - if folder == "": - items.append(("A", "
  • Front page")) - for i, j in sitemap.items(): - if i.startswith(folder): - file = i[len(folder) + 1 :] - if "/" in file: - subfolder, subfile = file.split("/", 1) - if subfile == "index.html": - items.append((j.lower(), list_pages(f"{folder}/{subfolder}"))) - elif file != "index.html": - items.append((j.lower(), f"
  • {j}
  • ")) - items.sort(key=lambda a: a[0]) - out = "" - if folder != "": - title = sitemap[f"{folder}/index.html"] - out += f"
  • {title}" - out += "" - if folder != "": - out += "
  • " - return out - - content = heading_with_self_ref("h1", "List of all pages") + list_pages("") - with open(os.path.join(settings.html_path, "sitemap.html"), "w") as f: - f.write(make_html_page(content)) - - end_all = datetime.now(tz=timezone(timedelta())) - print(f"Total time: {(end_all - start_all).total_seconds():.2f}s") diff --git a/data/categories b/data/categories deleted file mode 100644 index 2e7f6c99a0..0000000000 --- a/data/categories +++ /dev/null @@ -1,7 +0,0 @@ -scalar: Scalar-valued elements -vector: Vector-valued elements -matrix: Matrix-valued elements -Hcurl: H(curl) conforming elements -Hdiv: H(div) conforming elements -mixed: Mixed elements -macro: Macro elements diff --git a/data/contributors b/data/contributors deleted file mode 100644 index 0f286cdf1f..0000000000 --- a/data/contributors +++ /dev/null @@ -1,39 +0,0 @@ -- name: Scroggs, Matthew W. - img: m-scroggs.jpg - bluesky: mscroggs.co.uk - mastodon: mscroggs@mathstodon.xyz - github: mscroggs - website: https://mscroggs.co.uk - email: defelement@mscroggs.co.uk - desc: "Matthew is a Research Software Engineer at the University College London who works on finite and boundary element methods. He is a developer of the open-source finite element software [FEniCSx](https://github.com/FEniCS) and the open-source boundary element software [Bempp](https://github.com/bempp)." - -- name: Dokken, Jørgen S. - img: dokken.jpg - github: jorgensd - website: https://jsdokken.com - email: dokken@simula.no - desc: "Jørgen is a Senior Research Engineer at Simula Research Laboratory working on development and applications of the finite element method. He is a developer of the open-source finite element software [FEniCSx](https://github.com/FEniCS) and the author of the [DOLFINx tutorial](https://jsdokken.com/dolfinx-tutorial)." - -- name: Dean, Joseph P. - img: dean.png - github: jpdean - email: jpd62@cam.ac.uk - desc: "Joe is a postdoctoral research associate at the University of Cambridge. He works on finite element discretisations of multiphysics problems and is a developer of the [FEniCSx](https://github.com/FEniCS) finite element library." - -- name: Marsden, India - img: marsden.jpeg - github: indiamai - email: marsden@maths.ox.ac.uk - desc: "India is a DPhil Student at the University of Oxford. She works on the fundamentals of the finite element method and is a developer of [Firedrake](https://firedrakeproject.org), a finite element package." - -- name: Brubeck, Pablo D. - img: brubeck.jpeg - github: pbrubeck - email: brubeck@protonmail.com - desc: "Pablo is a postdoctoral research associate at the University of Oxford. He works on fast solvers for high-order finite element discretisations of PDEs and is a developer of [Firedrake](https://firedrakeproject.org), a finite element package." - -- name: Nobre, Nuno - img: nobre.jpeg - github: nmnobre - email: nuno.nobre@stfc.ac.uk - desc: "Nuno is a computational scientist at the STFC Hartree Centre. He collaborates with research institutions worldwide to optimise scientific applications for tomorrow's computer architectures. He has contributed to the [libMesh](https://github.com/libMesh/libmesh), [MOOSE](https://github.com/idaholab/moose) and [MFEM](https://github.com/mfem/mfem) finite element packages." diff --git a/data/editors b/data/editors deleted file mode 100644 index 382a5c93f3..0000000000 --- a/data/editors +++ /dev/null @@ -1,7 +0,0 @@ -# Github usernames of editors. -# Editors will be sorted alphabetically when website is generated, so no need for any specific order here. -- mscroggs -- jorgensd -- jpdean -- pbrubeck -- indiamai diff --git a/data/families b/data/families deleted file mode 100644 index 618c24d51e..0000000000 --- a/data/families +++ /dev/null @@ -1,35 +0,0 @@ -de-rham: - P: - arnold-logg: P - cockburn-fu: 1 - P-: - arnold-logg: P- - cockburn-fu: 2 - Q-: - arnold-logg: Q- - cockburn-fu: 4 - S: - arnold-logg: S - cockburn-fu: 1 - S-: - arnold-logg: S- - cockburn-fu: 2 - TNT: - cockburn-fu: 3 - CH: - name: - general: \mathrm{C}\mathrm{P}^{3-r}\mathrm{\Lambda}^r(\mathcal{R}) - '0': \mathrm{C}^1\mathrm{P}^3\mathrm{\Lambda}^0(\mathcal{R}) - d-1: \mathrm{C}_d^0\mathrm{P}^2\mathrm{\Lambda}^1(\mathcal{R}) - d: \mathrm{C}^0\mathrm{P}^1\mathrm{\Lambda}^2(\mathcal{R}) - references: - - title: Generalized Finite Element Systems for smooth differential forms and Stokes' problem - author: - - Christansen, Snorre H. - - Hu, Kaibo - journal: Numerische Mathematik - volume: 140 - year: 2018 - pagestart: 327 - pageend: 371 - doi: 10.1007/s00211-018-0970-6 diff --git a/data/polysets b/data/polysets deleted file mode 100644 index 85dd805158..0000000000 --- a/data/polysets +++ /dev/null @@ -1,18 +0,0 @@ -poly: - - \mathcal{P} - - \operatorname{span}\left\{\prod_{i=1}^dx_i^{p_i}\middle|\sum_{i=1}^dp_i\leqslant k\right\} -tpoly: - - \hat{\mathcal{P}} - - \operatorname{span}\left\{\prod_{i=1}^dx_i^{p_i}\middle|\sum_{i=1}^dp_i=k\right\}=\mathcal{P}_k\setminus\mathcal{P}_{k-1} -qoly: - - \mathcal{Q} - - \operatorname{span}\left\{\prod_{i=1}^dx_i^{p_i}\middle|\max_i(p_i)\leqslant k\right\} -tqoly: - - \hat{\mathcal{Q}} - - \operatorname{span}\left\{\prod_{i=1}^dx_i^{p_i}\middle|\max_i(p_i)=k\right\}=\mathcal{Q}_k\setminus\mathcal{Q}_{k-1} -serendipity: - - \mathcal{X} - - \operatorname{span}\left\{\prod_{i=1}^dx_i^{p_i}\middle|k<\sum_{i=1}^da_i\leqslant k+\#\left\{i\in\{1,\dots,d\}\middle| a_i=1\right\}\right\} -apoly: - - \mathcal{A} - - \operatorname{span}\bigcup_{p\in\mathcal{P}_k(\mathbb{R}^{d-1})}\left\{\left(\begin{array}{c}0\\xzp(y,z)\\-xyp(y,z)\end{array}\right),\left(\begin{array}{c}yzp(x,z)\\0\\-xyp(x,z)\end{array}\right),\left(\begin{array}{c}yzp(x,y)\\-xzp(x,y)\\0\end{array}\right)\right\} diff --git a/data/references b/data/references deleted file mode 100644 index 2d0b9d1168..0000000000 --- a/data/references +++ /dev/null @@ -1,9 +0,0 @@ -interval -triangle -tetrahedron -quadrilateral -tetrahedron -hexahedron -prism -pyramid -dual polygon diff --git a/defelement/__init__.py b/defelement/__init__.py deleted file mode 100644 index f41588cde3..0000000000 --- a/defelement/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""DefElement.""" diff --git a/defelement/caching.py b/defelement/caching.py deleted file mode 100644 index ca7c7997db..0000000000 --- a/defelement/caching.py +++ /dev/null @@ -1,62 +0,0 @@ -"""Caching.""" - -import json -import os - -import symfem -from webtools.tools import join - -from defelement import settings - -cache_version = "1.0.0" - - -def load_cache( - item_key: str, - last_updated: str, -) -> str | None: - """Load item from cache.""" - if not settings.caching: - return None - try: - with open(join(settings.cache_path, f"{item_key}.json")) as f: - data = json.load(f) - if data.get("symfem_version") != symfem.__version__: - return None - if data.get("last_updated") != last_updated: - return None - if data.get("cache_version") != cache_version: - return None - return data.get("content") - except FileNotFoundError: - return None - - -def save_cache(item_key: str, last_updated: str, item: str): - """Save item to cache.""" - if not settings.caching: - return - if not os.path.isdir(settings.cache_path): - os.mkdir(settings.cache_path) - data = { - "content": item, - "symfem_version": symfem.__version__, - "last_updated": last_updated, - "cache_version": cache_version, - } - with open(join(settings.cache_path, f"{item_key}.json"), "w") as f: - return json.dump(data, f) - - -def tidy_cache(): - """Remove old items from cache.""" - if not settings.caching or not os.path.isdir(settings.cache_path): - return - for file in os.listdir(settings.cache_path): - with open(join(settings.cache_path, file)) as f: - data = json.load(f) - if ( - data.get("symfem_version") != symfem.__version__ - or data.get("cache_version") != cache_version - ): - os.remove(join(settings.cache_path, file)) diff --git a/defelement/citations.py b/defelement/citations.py deleted file mode 100644 index d16ca923e1..0000000000 --- a/defelement/citations.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Major references that are used in many places.""" - -arnold_logg = { - "title": "Periodic table of the finite elements", - "author": "Arnold, Douglas N. and Logg, Anders", - "journal": "SIAM News", - "year": "2014", - "volume": "47", - "number": "9", - "url": "https://www.siam.org/publications/siam-news/issues/volume-47-number-09-november-2014/", -} - -cockburn_fu = { - "title": "A systematic construction of finite element commuting exact sequences", - "author": "Cockburn, Bernardo and Fu, Guosheng", - "journal": "SIAM journal on numerical analysis", - "volume": "55", - "number": "4", - "pagestart": "1650", - "pageend": "1688", - "year": "2017", - "doi": "10.1137/16M1073352", -} - -kirby_mapping = { - "author": "Kirby, Robert C.", - "title": "A general approach to transforming finite elements", - "journal": "The SMAI journal of computational mathematics", - "pagestart": "197", - "pageend": "224", - "volume": "4", - "year": "2018", - "doi": "10.5802/smai-jcm.33", -} - -defelement_paper = { - "type": "unpublished", - "author": "Scroggs, Matthew W. and Brubeck, Pablo D. and Dean, Joseph P. and Dokken, Jørgen S. and Marsden, India", - "title": "DefElement: an encyclopedia of finite element definitions", - "year": "2025", - "howpublished": "submitted to Computational Science and Engineering", - "doi": "10.48550/arXiv.2506.20188", -} diff --git a/defelement/code_examples.py b/defelement/code_examples.py deleted file mode 100644 index 4307f0b639..0000000000 --- a/defelement/code_examples.py +++ /dev/null @@ -1,87 +0,0 @@ -"""Generating code snippets.""" - -import symfem - -from defelement.caching import load_cache, save_cache -from defelement.element import Element -from defelement.implementations import Implementation -from defelement.languages import languages -from defelement.tools import jsify - - -def generate_examples(e: Element, impl: type[Implementation], language: str) -> str | None: - """Generate code snippets. - - Args: - e: The element to generate examples for - impl: The implementation to generate example for - language: Programming language - - Returns: - Code snippets or None if none were generated - """ - langname = languages[language].name - assert impl.id is not None - jscodename = jsify(impl.id) - if not e.implemented(impl.id): - return None - - # Implementations generated from other implementations (eg Basix code generated by Symfem) - if impl.id.startswith("*(") and impl.id.endswith(")"): - cache_id = f"{e.name}-{impl.id}-implementation-code" - c = load_cache(cache_id, symfem.__version__) - _input_code, output_code = impl.id[2:-1].split(" -> ") - jscodename = jsify(output_code) - if c is None: - if e.implemented(output_code): - return None - try: - example_code = e.make_implementation_examples(impl.id, language) - save_cache(cache_id, symfem.__version__, example_code) - except (NotImplementedError, KeyError): - save_cache(cache_id, symfem.__version__, "_NONE") - return None - elif c == "_NONE": - return None - else: - example_code = c - - # Standard implementations - elif e.has_implementation_examples(impl.id): - example_code = e.make_implementation_examples(impl.id, language) - - # Make the HTML for the examples - info = ( - f"" - f"↓ Show {impl.name} {langname} examples ↓" - f"" - f"" - ) - - info += ( - "" - ) - return info diff --git a/defelement/element.py b/defelement/element.py deleted file mode 100644 index f89175fb3f..0000000000 --- a/defelement/element.py +++ /dev/null @@ -1,1303 +0,0 @@ -"""DefElement elements.""" - -import itertools -import os -import re -import typing -import warnings -from datetime import datetime - -import pytz -import sympy -import yaml -from github import Github - -from defelement import citations, settings -from defelement.citations import arnold_logg as arnold_logg_citation -from defelement.citations import cockburn_fu as cockburn_fu_citation -from defelement.families import keys_and_names -from defelement.markup import insert_links -from defelement.polyset import make_extra_info, make_poly_set - - -def make_dof_data( - ndofs: dict[str, typing.Any] | list[dict[str, typing.Any]], -) -> str: - """Make DOF data. - - Args: - ndofs: DOF information - - Returns: - DOFs formatted as HTML - """ - if isinstance(ndofs, list): - return "

    ".join( - [f"\\({i}\\):
    {make_dof_data(j)}" for a in ndofs for i, j in a.items()] - ) - - dof_text = [] - for i, j in ndofs.items(): - txt = f"{i}: " - txt += make_formula(j) - dof_text.append(txt) - - return "
    ".join(dof_text) - - -def make_formula(data: dict[str, typing.Any]) -> str: - """Make formula. - - Args: - data: Element data - - Returns: - Formula for number of DOFs in HTML format - """ - txt = "" - if "formula" not in data and "oeis" not in data: - return ", ".join(f"{make_formula(j)} ({i})" for i, j in data.items()) - if "formula" in data: - txt += "\\(" - if isinstance(data["formula"], list): - txt += "\\begin{cases}" - txt += "\\\\".join([f"{c}&{b}" for a in data["formula"] for b, c in a.items()]) - txt += "\\end{cases}" - else: - txt += f"{data['formula']}" - txt += "\\)" - if "oeis" in data: - if "formula" in data: - txt += " (" - txt += f"{data['oeis']}" - if "formula" in data: - txt += ")" - return txt - - -def extract_degreemap(info): - """Extract degree map information.""" - if isinstance(info, str): - return info.split("DEGREEMAP=")[1].split()[0] - - assert isinstance(info, dict) - maps = {i: extract_degreemap(j) for i, j in info.items() if i != "display"} - - value = next(iter(maps.values())) - for i in maps.values(): - if i != value: - return maps - return value - - -def degreemap_equal(a, b) -> bool: - """Check if two degreemaps are equal.""" - if isinstance(a, str): - return a == b - assert isinstance(a, dict) - for i in a: - if not degreemap_equal(a[i], b[i]): - return False - return True - - -class Element: - """An element.""" - - def __init__(self, data: dict[str, typing.Any], fname: str): - """Initialise. - - Args: - data: element data - fname: filename - """ - self.data = data - self.filename = fname - self._c: Categoriser | None = None - self.created = None - self.modified = None - - def name_with_variant(self, variant: str | None) -> str: - """Get name with variant. - - Args: - variant: The variant - - Return: - Name with variant - """ - if variant is None: - return self.name - return f"{self.name} ({self.variant_name(variant)} variant)" - - def variant_name(self, variant: str) -> str: - """Get variant name. - - Args: - variant: The variant - - Returns: - The variant name - """ - return self.data["variants"][variant]["variant-name"] - - def variants(self) -> list[str]: - """Get variants of the element. - - Returns: - A list of variants - """ - if "variants" not in self.data: - return [] - return [f"{v['variant-name']}: {v['description']}" for v in self.data["variants"].values()] - - def min_degree(self, ref: str) -> int: - """Get the minimum degree. - - Args: - ref: Reference cell - - Returns: - The minimum degree - """ - if "min-degree" not in self.data: - return 0 - if isinstance(self.data["min-degree"], dict): - return self.data["min-degree"][ref] - return self.data["min-degree"] - - def max_degree(self, ref: str) -> int | None: - """Get the maximum degree. - - Args: - ref: Reference cell - - Returns: - The maximum degree - """ - if "max-degree" not in self.data: - return None - if isinstance(self.data["max-degree"], dict): - return self.data["max-degree"][ref] - return self.data["max-degree"] - - def degree_convention(self) -> str | None: - """Get the degree convention. - - Returns: - The degree convention - """ - if "degree" not in self.data: - return None - return self.data["degree"] - - def _edegree(self, dtype: str) -> str | None: - """Get an embedded degree. - - Returns: - Information about the embedded degree - """ - if dtype not in self.data: - return None - - def to_tex(txt): - if isinstance(txt, dict): - return ", ".join( - [ - to_tex(j) + " (" + ("otherwise" if i == "_" else f"degree={i}") + ")" - for i, j in txt.items() - ] - ) - txt = str(txt) - if txt == "none": - return "undefined" - txt = txt.replace("floor", "\\operatorname{floor}") - txt = txt.replace("min", "\\min") - txt = txt.replace("max", "\\max") - return f"\\({txt}\\)" - - d = self.data[dtype] - if isinstance(d, dict): - return "
    ".join([f"{cell}: {to_tex(deg)}" for cell, deg in d.items()]) - return to_tex(d) - - def polynomial_subdegree(self) -> str | None: - """Get the polynomial subdegree. - - Returns: - The degree convention - """ - return self._edegree("polynomial-subdegree") - - def polynomial_superdegree(self) -> str | None: - """Get the polynomial superdegree. - - Returns: - The degree convention - """ - return self._edegree("polynomial-superdegree") - - def lagrange_subdegree(self) -> str | None: - """Get the Lagrange subdegree. - - Returns: - The degree convention - """ - return self._edegree("lagrange-subdegree") - - def lagrange_superdegree(self) -> str | None: - """Get the polynomial superdegree. - - Returns: - The degree convention - """ - return self._edegree("lagrange-superdegree") - - def reference_cells(self, link: bool = True) -> list[str]: - """Get reference cells. - - Args: - link: Should a link be included? - - Returns: - List of reference cells. - """ - if link: - return [ - f"{e}" - for e in self.data["reference-cells"] - ] - else: - return self.data["reference-cells"] - - def alternative_names( - self, - include_bracketed: bool = True, - include_complexes: bool = True, - include_variants: bool = True, - link: bool = True, - strip_cell_name: bool = False, - cell: str | None = None, - ) -> list[str]: - """Get alternative names. - - Args: - include_bracketed: Should bracketed names be included? - include_complexes: Should names complexes be included? - include_variants: Should variants be included? - link: Should the names be linked? - strip_cell_names: Should cell names be stripped? - cell: Reference cell - - Returns: - A list of names - """ - if "alt-names" not in self.data: - return [] - out = self.data["alt-names"] - if include_complexes: - out += self.complexes(link=link) - if include_variants and "variants" in self.data: - for v in self.data["variants"].values(): - if "names" in v: - out += [f"{i} ({v['variant-name']} variant)" for i in v["names"]] - - if include_bracketed: - out = [i[1:-1] if i[0] == "(" and i[-1] == ")" else i for i in out] - else: - out = [i for i in out if i[0] != "(" or i[-1] != ")"] - - if cell is not None: - out = [i for i in out if " (" not in i or cell in i] - - if strip_cell_name: - out = [i.split(" (")[0] for i in out] - - return out - - def short_names(self, include_variants: bool = True) -> list[str]: - """Get short names. - - Args: - include_variants: Should variants be included? - - Returns: - A list of short names - """ - out = [] - if "short-names" in self.data: - out += self.data["short-names"] - if include_variants and "variants" in self.data: - for v in self.data["variants"].values(): - if "short-names" in v: - out += [f"{i} ({v['variant-name']} variant)" for i in v["short-names"]] - return out - - def mapping(self) -> str | None: - """Get mapping name. - - Returns: - Mapping name - """ - if "mapping" not in self.data: - return None - mapping = self.data["mapping"] - while "{{citation::" in mapping: - pre, post = mapping.split("{{citation::", 1) - id, post = post.split("}}", 1) - c = getattr(citations, id) - if "references" not in self.data: - self.data["references"] = [] - if c not in self.data["references"]: - self.data["references"].append(c) - index = self.data["references"].index(c) + 1 - mapping = f'{pre}[{index}]{post}' - return mapping - - def sobolev(self) -> str | None: - """Get Sobolev space name. - - Returns: - Sobolev space - """ - if "sobolev" not in self.data: - return None - return self.data["sobolev"] - - def complexes(self, link: bool = True, names: bool = True) -> dict[str, list[str]]: - """Get complexes. - - Args: - link: Should links be included? - names: Should names be used? - - Returns: - Complexes - """ - assert self._c is not None - - if "complexes" not in self.data: - return {} - - out: dict[str, list[str]] = {} - com = self.data["complexes"] - for key, families in com.items(): - out[key] = [] - if not isinstance(families, (list, tuple)): - families = [families] - for e in families: - if names: - namelist = [] - e_s = e.split(",") - if len(e_s) == 3: - fam, ext, cell = e_s - k = "k" - else: - fam, ext, cell, k = e_s - data = self._c.families[key][fam] - for key2, f in keys_and_names: - if key2 in data: - namelist.append("\\(" + f(data[key2], ext, cell, k) + "\\)") - entry = "" - if link: - entry = f"" - entry += " or ".join(namelist) - if link: - entry += "" - out[key].append(entry) - else: - out[key].append(e) - return out - - def degree_range(self) -> str: - """Format the range of allowed degrees. - - Returns: - The formatted range - """ - - def make_degree_data( - min_o: dict[str, int] | int | None, - max_o: dict[str, int] | int | None, - ) -> str: - """Make degree data. - - Args: - min_o: The minimum degree - max_o: The maximum degree - - Returns: - The formatted degree - """ - if isinstance(min_o, dict): - degrees = [] - for i, min_i in min_o.items(): - if isinstance(max_o, dict) and i in max_o: - degrees.append(i + ": " + make_degree_data(min_i, max_o[i])) - else: - degrees.append(i + ": " + make_degree_data(min_i, max_o)) - return "
    \n".join(degrees) - if isinstance(max_o, dict): - degrees = [] - for i, max_i in max_o.items(): - degrees.append(i + ": " + make_degree_data(min_o, max_i)) - return "
    \n".join(degrees) - if max_o is None: - return f"\\({min_o}\\leqslant k\\)" - if max_o == min_o: - return f"\\(k={min_o}\\)" - return f"\\({min_o}\\leqslant k\\leqslant {max_o}\\)" - - return make_degree_data( - self.data.get("min-degree", 0), - self.data.get("max-degree", None), - ) - - def sub_elements(self, link: bool = True) -> list[str]: - """Get sub elements of a mixed element. - - Args: - link: Should a link be included? - - Returns: - List of sub-elements - """ - assert self.is_mixed - assert self._c is not None - - out = [] - for e in self.data["mixed"]: - element, degree = e.split("(") - degree = degree.split(")")[0] - space_link = self._c.get_space_name(element, link=link) - out.append(f"
  • degree \\({degree}\\) {space_link} space
  • ") - return out - - def make_dof_descriptions(self) -> str: - """Make DOF descroptions. - - Returns: - Descriptions of DOFs - """ - if "dofs" not in self.data: - return "" - - def dofs_on_entity(entity: str, dofs: str | list[str]) -> str: - """Get DOFs on an entity. - - Args: - entity: The entity name - dofs: The dofs - - Returns: - Formatted DOFs - """ - assert self._c is not None - if not isinstance(dofs, str): - doflist = [dofs_on_entity(entity, d) for d in dofs] - if len(doflist) == 1: - return doflist[0] - return ",
    ".join(doflist[:-1]) + ", and " + doflist[-1] - if "integral moment" in dofs: - mom_type, space_info = dofs.split(" with ") - space_info = space_info.strip() - if space_info.startswith("{") and space_info.endswith("}"): - return f"{mom_type} with \\(\\left\\{{{space_info[1:-1]}\\right\\}}\\)" - if space_info.startswith('"') and space_info.endswith('"'): - return f"{mom_type} with {insert_links(space_info[1:-1])}" - - def insert_space_links(matches): - space_link = self._c.get_space_name(matches[1]) - return f"a degree \\({matches[2]}\\) {space_link} space" - - dofs = re.sub(r"\(([A-Za-z0-9\-]+),([^\)]*)\)", insert_space_links, dofs) - return dofs - - def make_dof_d(data: dict[str, typing.Any], post: str = "") -> str: - """Make a decription of a single DOF. - - Args: - data: Data - post: String to include after DOF name - - Returns: - Formatted DOF - """ - dof_data = [] - for i in [ - "interval", - "triangle", - "tetrahedron", - "quadrilateral", - "hexahedron", - ]: - if i in data: - dof_data.append(make_dof_d(data[i], f" ({i})")) - if len(dof_data) != 0: - return "
    \n
    \n".join(dof_data) - - for i, j in [ - ("On each vertex", "vertices"), - ("On each edge", "edges"), - ("On each face", "faces"), - ("On each volume", "volumes"), - ("On each ridge", "ridges"), - ("On each peak", "peaks"), - ("On each facet", "facets"), - ("On the interior of the reference cell", "cell"), - ]: - if j in data: - if isinstance(data[j], dict): - for shape, sub_data in data[j].items(): - if i.startswith("On each"): - dof_data.append( - f"{i} (of a {shape}){post}: {dofs_on_entity(j, sub_data)}" - ) - else: - assert i == "On the interior of the reference cell" - dof_data.append( - f"On the interior of a reference {shape}{post}: {dofs_on_entity(j, sub_data)}" - ) - - else: - dof_data.append(f"{i}{post}: {dofs_on_entity(j, data[j])}") - return "
    \n".join(dof_data) - - return make_dof_d(self.data["dofs"]) - - def make_polynomial_set_html(self) -> str: - """Format polynomial set / finite dimensional space as HTML. - - Returns: - Formatted polynomial set - """ - # TODO: move some of this to polynomial file - if "polynomial-set" not in self.data: - return "" - psets: dict[str, list[str]] = {} - if isinstance(self.data["polynomial-set"], dict): - for i, j in self.data["polynomial-set"].items(): - if j not in psets: - psets[j] = [] - psets[j].append(i) - else: - assert isinstance(self.data["polynomial-set"], str) - psets[self.data["polynomial-set"]] = self.data["reference-cells"] - if ( - "reference-cells" in self.data - and len(psets) == 1 - and len(next(iter(psets.values()))) == len(self.data["reference-cells"]) - ): - out = f"\\({make_poly_set(next(iter(psets.keys())))}\\)
    " - else: - out = "" - for i, j in psets.items(): - out += f"\\({make_poly_set(i)}\\) ({', '.join(j)})
    \n" - extra = make_extra_info(" && ".join(psets.keys())) - if len(extra) > 0: - out += " str: - """Get DOF counts. - - Returns: - DOF counts - """ - if "ndofs" not in self.data: - return "" - return make_dof_data(self.data["ndofs"]) - - def entity_dof_counts(self) -> str: - """Get entity DOF counts. - - Returns: - Entity DOF counts - """ - if "entity-ndofs" not in self.data: - return "" - return make_dof_data(self.data["entity-ndofs"]) - - @property - def name(self) -> str: - """Get element name. - - Returns: - The element name - """ - return self.data["name"] - - @property - def legacy_filenames(self) -> list[str]: - """Get any filenames that this element previously used. - - Returns: - A list of filenames - """ - if "legacy-names" not in self.data: - return [] - return self.data["legacy-names"] - - @property - def notes(self) -> list[str]: - """Get notes. - - Returns: - notes - """ - if "notes" not in self.data: - return [] - return self.data["notes"] - - @property - def html_name(self) -> str: - """Get HTML name. - - Returns: - The HTML name - """ - if "html-name" in self.data: - return self.data["html-name"] - else: - return self.data["name"] - - @property - def html_filename(self) -> str: - """Get HTML filename. - - Returns: - The filename - """ - return f"{self.filename}.html" - - @property - def is_mixed(self) -> bool: - """Check if element is mixed. - - Returns: - True if mixed, otherwise False - """ - return "mixed" in self.data - - @property - def html_link(self) -> str: - """Get link to element. - - Returns: - Link to this element - """ - return f"{self.html_name}" - - def implemented(self, lib: str, include_dependent_implementations: bool = False) -> bool: - """Check if element in implemented in a library. - - Args: - lib: The library - - Returns: - True if implemented, otherwise False - """ - from defelement.implementations import implementations - - if not implementations[lib].implemented(self): - return False - if "implementations" in self.data and lib in self.data["implementations"]: - return True - - if lib.startswith("*(") and lib.endswith(")"): - assert not include_dependent_implementations - in_lib, _ = lib[2:-1].split(" -> ") - return "implementations" in self.data and in_lib in self.data["implementations"] - elif include_dependent_implementations: - for i in implementations: - if i.endswith(f"-> {lib})") and self.implemented(i): - return True - - return False - - def get_implementation_string( - self, - lib: str, - reference: str | None, - degree: int | None, - variant: str | None = None, - any_variant: bool | None = False, - ) -> tuple[str, int | None, dict[str, typing.Any]]: - """Get implementation string. - - Args: - lib: Library - reference: Reference cell - degree: Degree - variant: Variant name - any_variant: Allow any variant if requested variant not found - - Returns: - Implementation string, degree and parameters to pass to implementation - """ - from defelement.implementations import ( - DegreeNotImplemented, - NotImplementedOnReference, - VariantNotImplemented, - ) - - assert self.implemented(lib) - if variant is None: - data = self.data["implementations"][lib] - else: - if variant not in self.data["implementations"][lib] and any_variant: - for v in self.data["implementations"][lib]: - if reference in self.data["implementations"][lib][v]: - variant = v - break - if variant not in self.data["implementations"][lib]: - raise VariantNotImplemented() - data = self.data["implementations"][lib][variant] - if isinstance(data, dict): - if reference not in data: - raise NotImplementedOnReference() - out = data[reference] - else: - out = data - params = {} - if "=" in out: - sp = out.split("=") - out = " ".join(sp[0].split(" ")[:-1]) - sp[-1] += " " - for i, j in itertools.pairwise(sp): - i = i.split(" ")[-1] - j = " ".join(j.split(" ")[:-1]) - params[i] = j - - if "DEGREES" in params: - if degree is not None: - for d in params["DEGREES"].split(","): - if ":" in d: - start, end = [int(i) for i in d.split(":")] - if start <= degree < end: - break - elif degree == int(d): - break - else: - raise DegreeNotImplemented() - del params["DEGREES"] - - input_deg = degree - if "DEGREEMAP" in params: - if degree is not None: - input_deg = int(sympy.S(params["DEGREEMAP"]).subs(sympy.Symbol("k"), degree)) - del params["DEGREEMAP"] - - return out, input_deg, params - - def list_of_implementation_strings( - self, - lib: str, - joiner: str | None = "
    ", - include_dependent_implementations: bool = False, - ) -> str | list[str]: - """Get a list of implementation strings. - - Args: - lib: The library - joiner: HTML to put between strings, or None if a list is desired - - Returns: - List of implemtation strings - """ - from defelement.implementations import implementations - - if include_dependent_implementations: - assert not lib.startswith("*(") - imp_list: list[str] = [] - if self.implemented(lib): - imp_list += self.list_of_implementation_strings(lib, None) - for other_lib in implementations: - if other_lib.endswith(f" -> {lib}") and self.implemented(other_lib): - imp_list += self.list_of_implementation_strings(other_lib, None) - - else: - assert self.implemented(lib) - - if lib.startswith("*(") and lib.endswith(")"): - return "Uses custom element code" - - if "display" in self.data["implementations"][lib]: - d = implementations[lib].format(self.data["implementations"][lib]["display"], {}) - return f"{d}" - if "variants" in self.data: - variants = self.data["variants"] - else: - variants = {None: {}} - - i_dict: dict[str, list[str]] = {} - for v, vinfo in variants.items(): - if v is None: - data = self.data["implementations"][lib] - else: - if v not in self.data["implementations"][lib]: - continue - data = self.data["implementations"][lib][v] - if isinstance(data, str): - istring, _, params = self.get_implementation_string(lib, None, None, v) - s = implementations[lib].format(istring, params) - if s not in i_dict: - i_dict[s] = [] - if v is None: - i_dict[s].append("") - else: - i_dict[s].append(vinfo["variant-name"]) - else: - for i in data: - istring, _, params = self.get_implementation_string(lib, i, None, v) - s = implementations[lib].format(istring, params) - if s not in i_dict: - i_dict[s] = [] - if v is None: - i_dict[s].append(i) - else: - i_dict[s].append(f"{i}, {vinfo['variant-name']}") - if len(i_dict) == 1: - return f"{next(iter(i_dict.keys()))}" - imp_list = [ - f"{i} ({'; '.join(j)})" - for i, j in i_dict.items() - ] - if joiner is None: - return imp_list - else: - return joiner.join(imp_list) - - def make_implementation_examples(self, lib: str, language: str) -> str: - """Make implementation examples for a library. - - Args: - lib: The library - - Returns: - Examples - """ - from defelement.implementations import implementations - - return implementations[lib].examples(self, language) - - def has_implementation_examples(self, lib: str) -> bool: - """Check if element has implementation examples for a library. - - Args: - lib: The library - - Returns: - True if library has examples, otherwise False - """ - from defelement.implementations import examples - - return lib in examples - - def implementation_notes(self, lib: str) -> list[str]: - """Get implementation notes for a library. - - Args: - lib: The library - - Returns: - Implementation notes - """ - from defelement.implementations import implementations - - notes = implementations[lib].notes(self) - - if "implementations" in self.data and lib in self.data["implementations"]: - impl = self.data["implementations"][lib] - if "DEGREEMAP" in f"{impl}": - degreemap = extract_degreemap(impl) - if degreemap == "None": - pass - else: - for id, info in [ - ("polynomial-subdegree", "polynomial subdegree"), - ("lagrange-superdegree", "Lagrange superdegree"), - ("polynomial-superdegree", "polynomial superdegree"), - ("lagrange-subdegree", "Lagrange subdegree"), - ]: - if id in self.data and degreemap_equal(degreemap, self.data[id]): - notes.append( - f"This element uses the {info} as the canonical degree " - "of this element" - ) - break - else: - notes.append( - "This implementation uses an alternative value of " - "degree for this element" - ) - return notes - - def implementation_references(self, lib: str) -> list[dict[str, str]]: - """Get implementation notes for a library. - - Args: - lib: The library - - Returns: - Implementation notes - """ - from defelement.implementations import implementations - - return implementations[lib].references(self) - - def categories(self, link: bool = True, map_name: bool = True) -> list[str]: - """Get categories. - - Args: - link: Should links be included? - map_name: Should names be mapped? - - Returns: - Categories - """ - assert self._c is not None - - if "categories" not in self.data: - return [] - if map_name: - cnames = {c: self._c.get_category_name(c) for c in self.data["categories"]} - else: - cnames = {c: c for c in self.data["categories"]} - if link: - return [ - f"{cnames[c]}" - for c in self.data["categories"] - ] - else: - return [f"{cnames[c]}" for c in self.data["categories"]] - - def references(self) -> list[str]: - """Get reference cells. - - Returns: - reference cells - """ - from defelement.implementations import implementations - - assert self._c is not None - - references = self.data.get("references", []) - - if "complexes" in self.data: - for key, families in self.data["complexes"].items(): - if not isinstance(families, (list, tuple)): - families = [families] - for e in families: - e_s = e.split(",") - if len(e_s) == 3: - fam, _ext, _cell = e_s - else: - fam, _ext, _cell, _k = e_s - data = self._c.families[key][fam] - if "arnold-logg" in data and arnold_logg_citation not in references: - references.append(arnold_logg_citation) - if "cockburn-fu" in data and cockburn_fu_citation not in references: - references.append(cockburn_fu_citation) - if "references" in data: - for r in references: - if r not in references: - references.append(r) - for i in implementations: - if self.implemented(i): - for ref in self.implementation_references(i): - if ref not in references: - references.append(ref) - return references - - @property - def test(self) -> bool: - """Check if element should be tested by default. - - Returns: - True if it should be tested, otherwise False - """ - return "test" in self.data - - @property - def has_examples(self) -> bool: - """Check if element has examples. - - Returns: - True if it has examples, otherwise False - """ - return "examples" in self.data - - @property - def examples(self) -> list[str]: - """Get exmaples. - - Returns: - List of examples - """ - if "examples" not in self.data: - return [] - return self.data["examples"] - - -class Categoriser: - """Categoriser.""" - - def __init__(self): - """Initialise.""" - self.elements = [] - self.families = {} - self.references = {} - self.categories = {} - - def recently_added(self, n: int) -> list[Element]: - """Get recently added elements. - - Args: - n: Number of elements - - Returns: - List of recently added elements - """ - if self.elements[0].created is None: - return self.elements[:n] - return sorted(self.elements, key=lambda e: e.created)[: -n - 1 : -1] - - def recently_updated(self, n: int) -> list[Element]: - """Get recently updated elements. - - Args: - n: Number of elements - - Returns: - List of recently updated elements - """ - if self.elements[0].modified is None: - return self.elements[:n] - return sorted(self.elements, key=lambda e: e.modified)[: -n - 1 : -1] - - def load_categories(self, file: str): - """Load categories from a file. - - Args: - file: Filename - """ - with open(file) as f: - for line in f: - if line.strip() != "": - a, b = line.split(":", 1) - self.add_category(a.strip(), b.strip(), f"{a.strip()}.html") - - def load_families(self, file: str): - """Load families from a file. - - Args: - file: Filename - """ - with open(file) as f: - self.families = yaml.load(f, Loader=yaml.FullLoader) - for t in self.families: - for i in self.families[t]: - self.families[t][i]["elements"] = {} - - def load_references(self, file: str): - """Load references from a file. - - Args: - file: Filename - """ - with open(file) as f: - for line in f: - if line.strip() != "": - self.add_reference(line.strip(), f"{line.strip()}.html") - - def load_folder(self, folder: str): - """Load elements from a folder. - - Args: - folder: Folder name - """ - for file in os.listdir(folder): - if file.endswith(".def") and not file.startswith("."): - with open(os.path.join(folder, file)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - fname = file[:-4] - - self.add_element(Element(data, fname)) - - if settings.github_token is None: - warnings.warn("Building without Github token. Timestamps will not be obtained.") - else: - g = Github(settings.github_token) - repo = g.get_repo("DefElement/DefElement") - for e in self.elements: - commits = repo.get_commits(path=f"elements/{e.filename}.def") - try: - e.created = commits.get_page(-1)[-1].commit.committer.date - e.modified = commits.get_page(0)[0].commit.committer.date - except IndexError: - e.created = datetime.now(tz=pytz.utc) - e.modified = datetime.now(tz=pytz.utc) - - self.elements.sort(key=lambda x: x.name.lower()) - - def add_family(self, t: str, e: str, name: str, fname: str): - """Add a family. - - Args: - t: Family name - e: Element information - name: Element name - fname: Filename - """ - if len(e.split(",")) == 3: - i, j, k = e.split(",") - else: - i, j, k, _ = e.split(",") - if t not in self.families: - self.families[t] = {} - warnings.warn(f"Complex type included in familes data: {t}") - if i not in self.families[t]: - warnings.warn(f"Family not included in familes data: {i}") - self.families[t][i] = {"elements": {}} - if k not in self.families[t][i]["elements"]: - self.families[t][i]["elements"][k] = {} - self.families[t][i]["elements"][k][j] = (name, fname) - - def add_reference(self, e: str, fname: str): - """Add reference cell. - - Args: - e: Reference name - fname: filename - """ - self.references[e] = fname - - def add_category(self, fname: str, cname: str, html_filename: str): - """Add a category. - - Args: - fname: Filename - cname: Category name - html_filename: HTML filename to link to - """ - self.categories[fname] = (cname, html_filename) - - def get_category_name(self, c: str) -> str: - """Get category name. - - Args: - c: Category - - Returns: - Category name - """ - return self.categories[c][0] - - def get_space_name(self, element: str, link: bool = True) -> str: - """Get element space name. - - Args: - element: Element id - link: Should a link be included? - - Returns: - Space name, with or without a link to the element page - """ - for e in self.elements: - if e.filename == element: - if link: - return e.html_link - else: - return e.html_name - break - raise ValueError(f"Could not find space: {element}") - - def get_element(self, ename: str) -> Element: - """Get an element. - - Args: - ename: Element id - - Returns: - The element - """ - for e in self.elements: - if e.name == ename: - return e - raise ValueError(f"Could not find element: {ename}") - - def add_element(self, e: Element): - """Add an element. - - Args: - e: The element - """ - self.elements.append(e) - e._c = self - for r in e.reference_cells(False): - assert r in self.references - - for j, k in e.complexes(False, False).items(): - for i in k: - self.add_family(j, i, e.html_name, e.html_filename) - - def elements_in_category(self, c: str) -> list[Element]: - """Get elements in a category. - - Args: - c: Category id - - Returns: - List of elements - """ - return [e for e in self.elements if c in e.categories(False, False)] - - def elements_in_implementation( - self, i: str, include_dependent_implementations=False - ) -> list[Element]: - """Get elements in an implementation. - - Args: - i: Implementation - - Returns: - List of elements - """ - return [ - e - for e in self.elements - if e.implemented(i, include_dependent_implementations=include_dependent_implementations) - ] - - def elements_by_reference(self, r: str) -> list[Element]: - """Get elements on a reference. - - Args: - r: Reference - - Returns: - List of elements - """ - return [e for e in self.elements if r in e.reference_cells(False)] diff --git a/defelement/examples.py b/defelement/examples.py deleted file mode 100644 index 831249ca88..0000000000 --- a/defelement/examples.py +++ /dev/null @@ -1,219 +0,0 @@ -"""Examples.""" - -import os - -import sympy -from symfem.finite_element import CiarletElement, DirectElement, FiniteElement -from symfem.functionals import BaseFunctional -from symfem.functions import Function -from symfem.piecewise_functions import PiecewiseFunction -from symfem.symbols import t -from webtools.html import make_html_forwarding_page, make_html_page -from webtools.markup import heading_with_self_ref - -from defelement import plotting, settings, symbols -from defelement.caching import load_cache, save_cache - -defelement_t = ["s_{0}", "s_{1}", "s_{2}"] - - -def to_tex( - f: Function - | sympy.core.expr.Expr - | list[Function | sympy.core.expr.Expr] - | tuple[Function | sympy.core.expr.Expr, ...], - tfrac: bool = False, -) -> str: - """Convert function to TeX. - - Args: - f: A function - tfrac: Should tfrac be used in the place of frac? - - Returns: - TeX - """ - if isinstance(f, PiecewiseFunction): - sub_f = None - for p in f.pieces.values(): - if sub_f is None: - sub_f = p - if p != sub_f: - break - else: - return to_tex(sub_f) - - if isinstance(f, (list, tuple)): - return ( - "\\left(\\begin{array}{c}" - + "\\\\".join(["\\displaystyle " + to_tex(i) for i in f]) - + "\\end{array}\\right)" - ) - elif isinstance(f, Function): - out = f.as_tex() - else: - out = sympy.latex(sympy.simplify(sympy.expand(f))) - out = out.replace("\\left[", "\\left(") - out = out.replace("\\right]", "\\right)") - - for i, j in zip(t, defelement_t): - out = out.replace(sympy.latex(i), j) - - if tfrac: - return out.replace("\\frac", "\\tfrac") - else: - return out - - -def entity_name(dim: int) -> str: - """Get the name of a sub-entity. - - Args: - dim: The dimension - - Returns: - Sub-entity name - """ - return ["vertex", "edge", "face", "volume"][dim] - - -def describe_dof(element: FiniteElement, d: BaseFunctional) -> tuple[str, list[str]]: - """Describe a DOF. - - Args: - element: The element - d: The DOF - - Returns: - Formatted DOF, and list of symbols included in definition - """ - desc, symb = d.get_tex() - - for i, j in zip(t, defelement_t): - desc = desc.replace(sympy.latex(i), j) - - for j in defelement_t: - if j in desc: - dim = element.reference.tdim - new_s = "\\(" - if dim == 1: - new_s += defelement_t[0] - else: - new_s += ",".join(defelement_t[:dim]) - new_s += f"\\) is a parametrisation of \\({d.entity_tex()}\\)" - symb.append(new_s) - break - - return desc, symb - - -def markup_example( - element: FiniteElement, - html_name: str, - element_page: str, - fname: str, - legacy_filenames: list[str] | None = None, -) -> str: - """Markup examples. - - Args: - element: The element - html_name: Name of element - element_page: URL of elemtn page - fname: Filename - legacy_filenames: Old filenames to create redirects from - - Returns: - Example as HTML - """ - if legacy_filenames is None: - legacy_filenames = [] - eg = heading_with_self_ref( - "h1", f"Degree {element.order} {html_name} on a {element.reference.name}" - ) - eg += "\n" - eg += f"◀ Back to {html_name} definition page" - eg += "\n" - eg += "
    " + plotting.plot_dof_diagram(element) + "
    \n" - eg += "In this example:\n" - - plots = plotting.plot_basis_functions(element) - - cache_key = f"markup_example-{html_name}-{element.order}-{element.reference.name}" - for i, j in element.init_kwargs().items(): - cache_key += f"-{i}-{j}" - basis = load_cache(cache_key, element.last_updated) - - if basis is None: - basis = "" - for dof_i, func in enumerate(element.get_basis_functions()): - basis += "
    " - pd = plots[dof_i] - if pd is not None: - basis += pd - basis += "
    " - basis += "
    " - if isinstance(element, CiarletElement) and len(element.dofs) > 0: - dof = element.dofs[dof_i] - basis += f"\\(\\displaystyle {symbols.functional}_{{{dof_i}}}:" - dof_tex, symbols_used = describe_dof(element, dof) - basis += dof_tex + "\\)" - if len(symbols_used) > 0: - basis += "
    where " + ";
    ".join(symbols_used[:-1]) - if len(symbols_used) > 1: - basis += ";
    and " - basis += symbols_used[-1] + "." - basis += "

    " - if element.range_dim == 1: - basis += f"\\(\\displaystyle {symbols.basis_function}_{{{dof_i}}} = " - elif element.range_shape is None or len(element.range_shape) == 1: - basis += f"\\(\\displaystyle {symbols.vector_basis_function}_{{{dof_i}}} = " - else: - basis += f"\\(\\displaystyle {symbols.matrix_basis_function}_{{{dof_i}}} = " - basis += to_tex(func) + "\\)" - if isinstance(element, CiarletElement): - if len(element.dofs) > 0: - basis += "

    " - basis += "This DOF is associated with " - basis += entity_name(dof.entity[0]) + f" {dof.entity[1]}" - basis += " of the reference cell." - elif isinstance(element, DirectElement): - basis += "

    " - basis += "This DOF is associated with " - basis += entity_name(element._basis_entities[dof_i][0]) - basis += f" {element._basis_entities[dof_i][1]}" - basis += " of the reference cell." - basis += "
    " - basis += "
    " - save_cache(cache_key, element.last_updated, basis) - - eg += basis - - with open(os.path.join(os.path.join(settings.htmlelement_path, "examples", fname)), "w") as f: - f.write(make_html_page(eg)) - - for i in legacy_filenames: - with open(os.path.join(os.path.join(settings.htmlelement_path, "examples", i)), "w") as f: - f.write(make_html_forwarding_page(f"/elements/examples/{fname}")) - - return f"/elements/examples/{fname}" diff --git a/defelement/families.py b/defelement/families.py deleted file mode 100644 index 34fd66296d..0000000000 --- a/defelement/families.py +++ /dev/null @@ -1,108 +0,0 @@ -"""Element families.""" - - -def arnold_logg_name( - family: str, - r: str = "r", - cell: str | None = None, - degree: str = "k", - dim: str = "d", -) -> str: - """Get the name used in the Periodic Table of Finite Elements. - - Args: - family: Family - r: Exterior derivative order - cell: Cell type - degree: Polynomial degree - dim: Cell dimension - - Returns: - Formatted name - """ - out = f"\\mathcal{{{family[0]}}}" - if len(family) > 1: - out += f"^{family[1]}" - out += f"_{{{degree}}}" - out += f"\\Lambda^{{{r}}}" - if cell is not None: - if cell == "simplex": - out += f"(\\Delta_{dim})" - elif cell == "tp": - out += f"(\\square_{dim})" - else: - raise ValueError(f"Unknown cell: {cell}") - return out - - -def cockburn_fu_name( - family: str, - r: str = "r", - cell: str | None = None, - degree: str = "k", - dim: str = "d", -) -> str: - """Get the name used in the Cockburn-Fu paper. - - Args: - family: Family - r: Exterior derivative order - cell: Cell type - degree: Polynomial degree - dim: Cell dimension - - Returns: - Formatted name - """ - out = "" - if r != "r": - out += "\\left[" - out += f"S_{{{family},{degree}}}" - if cell is not None: - if cell == "simplex": - out += "^\\unicode{0x25FA}" - elif cell == "tp": - out += "^\\square" - else: - raise ValueError(f"Unknown cell: {cell}") - if r != "r": - out += f"\\right]_{{{r}}}" - return out - - -def custom_name( - family: str, - r: str = "r", - cell: str | None = None, - degree: str = "k", - dim: str = "d", -): - """Get a custom name. - - Args: - family: Family - r: Exterior derivative order - cell: Cell type - degree: Polynomial degree - dim: Cell dimension - - Returns: - Formatted name - """ - out = family - if isinstance(family, dict): - if r == "r": - out = family["general"] - else: - out = family[r] - out = out.replace("", f"{r}") - out = out.replace("", f"{dim}") - out = out.replace("", f"{degree}") - return out - - -keys_and_names = [ - ("cockburn-fu", cockburn_fu_name), - ("arnold-logg", arnold_logg_name), - ("name", custom_name), -] diff --git a/defelement/implementations/__init__.py b/defelement/implementations/__init__.py deleted file mode 100644 index 88778cbdba..0000000000 --- a/defelement/implementations/__init__.py +++ /dev/null @@ -1,41 +0,0 @@ -"""Implementations.""" - -import importlib -import os -from inspect import isclass - -from defelement.implementations.core import ( - DegreeNotImplemented, - Implementation, - NotImplementedOnReference, - VariantNotImplemented, - parse_example, -) - -__all__ = [ - "DegreeNotImplemented", - "Implementation", - "NotImplementedOnReference", - "VariantNotImplemented", - "examples", - "formats", - "implementations", - "parse_example", - "verifications", -] - -implementations = {} -this_dir = os.path.dirname(os.path.realpath(__file__)) -for file in os.listdir(this_dir): - if file.endswith(".py") and not file.startswith("_") and file != "core.py": - mod = importlib.import_module(f"defelement.implementations.{file[:-3]}") - for name in dir(mod): - if not name.startswith("_"): - c = getattr(mod, name) - if isclass(c) and c != Implementation and issubclass(c, Implementation): - implementations[c.id] = c - -formats = {id: i.format for id, i in implementations.items()} -examples = {id: i.examples for id, i in implementations.items()} -versions = {id: i.version for id, i in implementations.items()} -verifications = {id: i.verify for id, i in implementations.items() if i.verification} diff --git a/defelement/implementations/basix.py b/defelement/implementations/basix.py deleted file mode 100644 index f26ebb10da..0000000000 --- a/defelement/implementations/basix.py +++ /dev/null @@ -1,122 +0,0 @@ -"""Basix implementation.""" - -import typing - -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element - -# -from defelement.implementations.core import Implementation, pypi_name - - -@pypi_name("fenics-basix") -class BasixImplementation(Implementation): - """Basix implementation.""" - - # - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = f"basix.ElementFamily.{string}" - for p, v in params.items(): - out += f", {p}=" - if p == "lagrange_variant": - out += f"basix.LagrangeVariant.{v}" - elif p == "dpc_variant": - out += f"basix.DPCVariant.{v}" - elif p == "discontinuous": - out += v - else: - raise ValueError(f"Unexpected parameter: {p}") - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import basix" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate examples.""" - out = "element = basix.create_element(" - out += f"basix.ElementFamily.{name}, basix.CellType.{reference}, {degree}" - if "lagrange_variant" in params: - out += f", lagrange_variant=basix.LagrangeVariant.{params['lagrange_variant']}" - if "dpc_variant" in params: - out += f", dpc_variant=basix.DPCVariant.{params['dpc_variant']}" - if "discontinuous" in params: - assert params["discontinuous"] in ["True", "False"] - out += f", discontinuous={params['discontinuous']}" - out += ")" - return out - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - import basix - - kwargs = {} - if "lagrange_variant" in params: - kwargs["lagrange_variant"] = getattr(basix.LagrangeVariant, params["lagrange_variant"]) - if "dpc_variant" in params: - kwargs["dpc_variant"] = getattr(basix.DPCVariant, params["dpc_variant"]) - if "discontinuous" in params: - kwargs["discontinuous"] = params["discontinuous"] == "True" - - e = basix.create_element( - getattr(basix.ElementFamily, name), - getattr(basix.CellType, reference), - degree, - **kwargs, - ) - - entity_dofs = e.entity_dofs - if reference == "triangle": - entity_dofs[1] = [entity_dofs[1][2], entity_dofs[1][1], entity_dofs[1][0]] - elif reference == "tetrahedron": - entity_dofs[1] = [ - entity_dofs[1][5], - entity_dofs[1][4], - entity_dofs[1][3], - entity_dofs[1][2], - entity_dofs[1][1], - entity_dofs[1][0], - ] - entity_dofs[2] = [ - entity_dofs[2][3], - entity_dofs[2][2], - entity_dofs[2][1], - entity_dofs[2][0], - ] - - def tabulate(points): - table = e.tabulate(0, points)[0] - return table.transpose((0, 2, 1)) - - return entity_dofs, tabulate - - id = "basix" - name = "Basix" - url = "https://github.com/FEniCS/basix" - verification = True - languages = ("python",) diff --git a/defelement/implementations/basix_ufl.py b/defelement/implementations/basix_ufl.py deleted file mode 100644 index ee34c02fe6..0000000000 --- a/defelement/implementations/basix_ufl.py +++ /dev/null @@ -1,295 +0,0 @@ -"""Basix.UFL implementation.""" - -import typing - -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element -from defelement.implementations.basix import BasixImplementation -from defelement.implementations.core import ( - Implementation, - parse_example, - pypi_name, -) - - -@pypi_name("fenics-basix", ["fenics-ufl"]) -class BasixUFLImplementation(Implementation): - """Basix.UFL implementation.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = BasixImplementation.format(string, {i: j for i, j in params.items() if i != "shape"}) - if "shape" in params: - out += f", shape={params['shape']}" - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import basix\nimport basix.ufl" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - out = "element = basix.ufl.element(" - out += f"basix.ElementFamily.{name}, basix.CellType.{reference}, {degree}" - if "lagrange_variant" in params: - out += f", lagrange_variant=basix.LagrangeVariant.{params['lagrange_variant']}" - if "dpc_variant" in params: - out += f", dpc_variant=basix.DPCVariant.{params['dpc_variant']}" - if "discontinuous" in params: - assert params["discontinuous"] in ["True", "False"] - out += f", discontinuous={params['discontinuous']}" - if "shape" in params: - if reference == "interval": - dim = 1 - elif reference in ["triangle", "quadrilateral"]: - dim = 2 - else: - dim = 3 - out += ", shape=" + params["shape"].replace("dim", f"{dim}") - out += ")" - return out - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - import basix - import basix.ufl - - kwargs = {} - if "lagrange_variant" in params: - kwargs["lagrange_variant"] = getattr(basix.LagrangeVariant, params["lagrange_variant"]) - if "dpc_variant" in params: - kwargs["dpc_variant"] = getattr(basix.DPCVariant, params["dpc_variant"]) - if "discontinuous" in params: - kwargs["discontinuous"] = params["discontinuous"] == "True" - if "shape" in params: - if reference == "interval": - dim = 1 - elif reference in ["triangle", "quadrilateral"]: - dim = 2 - else: - dim = 3 - kwargs["shape"] = tuple( - dim if i == "dim" else int(i) for i in params["shape"][1:-1].split(",") if i != "" - ) - - e = basix.ufl.element( - getattr(basix.ElementFamily, name), - getattr(basix.CellType, reference), - degree, - **kwargs, - ) - - entity_dofs = e.entity_dofs - if reference == "triangle": - entity_dofs[1] = [entity_dofs[1][2], entity_dofs[1][1], entity_dofs[1][0]] - elif reference == "tetrahedron": - entity_dofs[1] = [ - entity_dofs[1][5], - entity_dofs[1][4], - entity_dofs[1][3], - entity_dofs[1][2], - entity_dofs[1][1], - entity_dofs[1][0], - ] - entity_dofs[2] = [ - entity_dofs[2][3], - entity_dofs[2][2], - entity_dofs[2][1], - entity_dofs[2][0], - ] - - def tabulate(points): - table = e.tabulate(0, points)[0] - return table.reshape(points.shape[0], e.reference_value_size, -1) - - return entity_dofs, tabulate - - id = "basix.ufl" - name = "Basix.UFL" - url = "https://github.com/FEniCS/basix" - verification = True - languages = ("python",) - - -class CustomBasixUFLImplementation(BasixUFLImplementation): - """Basix.UFL implementation via custom element.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - raise NotImplementedError() - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import basix\nimport basix.ufl\nimport numpy as np" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - import symfem - import symfem.basix_interface - - cell, degree, variant, kwargs = parse_example(example) - symfem_name, symfem_degree, params = element.get_implementation_string( - "symfem", cell, degree, variant - ) - if "variant" in params: - kwargs["variant"] = params["variant"] - symfem_e = symfem.create_element(cell, symfem_name, symfem_degree, **kwargs) # type: ignore - - return symfem.basix_interface.generate_basix_element_code( - symfem_e, include_comment=False, include_imports=False, ufl=True - ) - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - import basix.ufl - import symfem - import symfem.basix_interface - - kwargs = {} - if "variant" in params: - kwargs["variant"] = params["variant"] - symfem_e = symfem.create_element(reference, name, degree, **kwargs) # type: ignore - - e = symfem.basix_interface.create_basix_element(symfem_e, ufl=True) - assert isinstance(e, basix.ufl._ElementBase) - - entity_dofs = e.entity_dofs - if reference == "triangle": - entity_dofs[1] = [entity_dofs[1][2], entity_dofs[1][1], entity_dofs[1][0]] - elif reference == "tetrahedron": - entity_dofs[1] = [ - entity_dofs[1][5], - entity_dofs[1][4], - entity_dofs[1][3], - entity_dofs[1][2], - entity_dofs[1][1], - entity_dofs[1][0], - ] - entity_dofs[2] = [ - entity_dofs[2][3], - entity_dofs[2][2], - entity_dofs[2][1], - entity_dofs[2][0], - ] - - def tabulate(points): - table = e.tabulate(0, points)[0] - return table.reshape(points.shape[0], e.reference_value_size, -1) - - return entity_dofs, tabulate - - @classmethod - def implemented(cls, element: Element) -> bool: - """Check if an element is implemented.""" - # Elements with DOFs that include derivatives - if element.filename in [ - "alfeld-sorokina", - "argyris", - "arnold-boffi-falk", - "bell", - "bernardi-raugel", - "bogner-fox-schmitt", - "hermite", - "morley", - "morley-wang-xu", - "taylor", - "wu-xu", - ]: - return False - - # D(div curl) elements - if element.filename in [ - "gopalakrishnan-lederer-schoberl", - ]: - return False - - # Macro elements - if element.filename in [ - "alfeld-sorokina", - "guzman-neilan", - "guzman-neilan2", - "hsieh-clough-tocher", - "johnson-mercier", - "p1-iso-p2", - "p1-macro", - "reduced-hsieh-clough-tocher", - ]: - return False - - # Elements with different numbers of DOFs on entities of the same type - if element.filename in [ - "fortin-soulie", - "transition", - ]: - return False - - # Mixed elements - if element.filename in [ - "mini", - "pechstein-schoberl", - "taylor-hood", - "scott-vogelius", - ]: - return False - - # Dual elements - if element.filename in [ - "buffa-christiansen", - "dual", - "rotated-buffa-christiansen", - ]: - return False - - # non-Ciarlet elements - return element.filename not in [ - "direct-serendipity", - "enriched-galerkin", - "lfeg", - "rotated-buffa-christiansen", - ] - - id = "*(symfem -> basix.ufl)" diff --git a/defelement/implementations/bempp_cl.py b/defelement/implementations/bempp_cl.py deleted file mode 100644 index c0244aaa00..0000000000 --- a/defelement/implementations/bempp_cl.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Bempp-cl implementation.""" - -import typing - -from defelement.element import Element -from defelement.implementations.core import Implementation, pypi_name - - -@pypi_name("bempp-cl", ["numba", "scipy", "meshio"]) -class BemppClImplementation(Implementation): - """Bempp-cl implementation.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - return f'"{string}"' - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import bempp_cl.api\ngrid = bempp_cl.api.shapes.regular_sphere(1)" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - return f'element = bempp_cl.api.function_space(grid, "{name}", {degree})' - - id = "bempp-cl" - name = "Bempp-cl" - url = "https://github.com/bempp/bempp-cl" - languages = ("python",) diff --git a/defelement/implementations/core.py b/defelement/implementations/core.py deleted file mode 100644 index a149bc0eea..0000000000 --- a/defelement/implementations/core.py +++ /dev/null @@ -1,358 +0,0 @@ -"""Implementation template class and other functions.""" - -import re -import typing - -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element - - -def pypi_name(package_name: str, dependencies: list[str] | None = None): - """Use the PyPI name of a package to define the install variable and version method. - - Args: - package_name: The name of the package on PyPI - dependencies: Packages to install before installing the package - - Returns: - A wrapped class - """ - - def pypi_name(Cls): - class Wrapped(Cls): - @classmethod - def version(cls) -> str: - """Get the version number of this implementation.""" - from importlib.metadata import PackageNotFoundError, version - - try: - return version(package_name) - except PackageNotFoundError: - import requests - - return requests.get(f"https://pypi.org/pypi/{package_name}/json").json()[ - "info" - ]["version"] - - @classmethod - def install(cls, language: str) -> str | None: - """Get the command(s) to install this implementation.""" - if language == "python": - return ( - "" - if dependencies is None - else "pip install " + " ".join(dependencies) + "\n" - ) + f"pip install {package_name}" - return None - - return Wrapped - - return pypi_name - - -class Implementation: - """An implementation.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string. - - This function is passed the string and parameters set in a .def file for an - implementation and should return the string to display on the element's page. - - This function must be implemented. - - Args: - string: Implementation string as set in the .def file - params: Additional parameters set in the .def file - - Returns: - Formatted implementation string - """ - raise NotImplementedError() - - @classmethod - def example_import(cls, language: str) -> str: - """Get code for imports to include at start of examples snippet. - - This function must be implemented. - - Args: - language: Programming language - - Returns: - Python code for imports - """ - raise NotImplementedError() - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example. - - This function takes the element string and parameters (as set in the .def file) - and the reference cell and degree for an example and should return a string of Python code - that will create the example element. - - The additional inputs element and example may be needed in some more complex cases. - - This function must be implemented. - - Args: - name: Implementation string as set in the .def file - reference: The name of the reference cell - degree: The degree of this example - params: Additional parameters set in the .def file - language: Programming language - element: The DefElement element object - example: Raw example data - - Returns: - Example code - """ - raise NotImplementedError() - - @classmethod - def version(cls) -> str: - """Get the version number of this implementation. - - This function must be implemented. - - Returns: - Version number - """ - raise NotImplementedError() - - @classmethod - def install(cls, language: str) -> str | None: - """Get the command(s) to install this implementation. - - Args: - language: Programming language - - Returns: - Version number - """ - return None - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get information needed to run verification. - - Implementation of this function is optional, but it must be implemented for verification - to be carried out. If this function is implemented, then the class variable `verification` - should be set to `True` to activate verification. - - Args: - name: Implementation string as set in the .def file - reference: The name of the reference cell - degree: The degree of this example - params: Additional parameters set in the .def file - element: The DefElement element object - example: Raw example data - - Returns: - This function returns two things: - - A list of lists of lists that gives the degrees of freedom (DOFs) associated with - each sub-entity. The entry `[i][j][k]` of this returned value is the `k`th dof that - is associated with the `j`th sub-entity of dimension `i`. - - A function thtat takes a set of points on the DefElement reference cell as input and - returns the a Numpy array containing the values of the basis functions at every point. - The entry `[i, j, k]` in this Numpy array is the `j`th component of the `k`th basis - function evaluated at the `i`th point. - """ - raise NotImplementedError() - - @classmethod - def implemented(cls, element: Element) -> bool: - """Check if an element is implemented. - - This can be used to overrule Element's implemented function. - - Implementation of this function is optional. - - Args: - element: The element - - Returns: - Example code - """ - return True - - @classmethod - def notes(cls, element: Element) -> list[str]: - """Return a list of notes to include for the implementation of this element. - - Implementation of this function is optional. - - Args: - element: Element data - - Returns: - List of notes - """ - return [] - - @classmethod - def references(cls, element: Element) -> list[dict[str, str]]: - """Return a list of additional references to include for the implementation of this element. - - Implementation of this function is optional. - - Args: - element: Element data - - Returns: - List of references - """ - return [] - - @classmethod - def examples(cls, element: Element, language: str) -> str: - """Generate code for all examples. - - This function should not be overridden in subclasses. - - Args: - element: The element - language: Programming language - - Returns: - Example code - """ - if language not in cls.languages: - raise ValueError(f"Implementation cannot create snippets for language: {language}") - code = cls.example_import(language) - assert cls.id is not None - for eg in element.examples: - reference, defelement_degree, variant, kwargs = parse_example(eg) - try: - if cls.id.startswith("*(") and cls.id.endswith(")"): - name, degree, params = element.get_implementation_string( - cls.id[2:-1].split(" -> ")[0], - reference, - defelement_degree, - variant, - ) - else: - name, degree, params = element.get_implementation_string( - cls.id, reference, defelement_degree, variant - ) - except NotImplementedError: - continue - - for i, j in kwargs.items(): - assert i not in params - params[i] = j - - assert degree is not None - code += "\n\n" - if language in ["python", "julia"]: - code += "# " - elif language in ["rust", "c++", "c"]: - code += "// " - else: - raise ValueError(f"Unsupported language: {language}") - code += "Create " - if variant is None: - code += element.name - else: - code += element.name_with_variant(variant) - code += f" degree {degree} on a {reference}\n" - code += cls.single_example(name, reference, degree, params, language, element, eg) - return code - - # Unique identifier used in implementation section of .def files - id: str - # The name of the implementation - name: str - # URL of source of implementation (eg Github link) - url: str - # Set to true if this implementation should be verified - verification = False - # Language(s) that this implementation can create snippets for - languages: tuple[str, ...] - # Language to pass into install command to get command(s) to install - # Note that this only needs to be set if len(languages) > 1 - install_language: str | None = None - - -class VariantNotImplemented(NotImplementedError): - """Error for variants that are not implemented.""" - - -class DegreeNotImplemented(NotImplementedError): - """Error for degrees that are not implemented.""" - - -class NotImplementedOnReference(NotImplementedError): - """Error for element not implemented on a reference cell.""" - - -ValueType = int | str | list["ValueType"] - - -def _parse_value(v: str) -> ValueType: - """Parse a string. - - Args: - v: String - - Returns: - Parsed string - """ - v = v.strip() - if v[0] == "[" and v[-1] == "]": - return [_parse_value(i) for i in v[1:-1].split(";")] - if re.match(r"[0-9]+$", v): - return int(v) - return v - - -def parse_example( - e: str, -) -> tuple[str, int, str | None, dict[str, int | str | list[ValueType]]]: - """Parse an example. - - Args: - e: The example - - Returns: - Parsed example information - """ - if " {" in e: - e, rest = e.split(" {") - rest = rest.split("}")[0] - while re.search(r"\[([^\]]*),", rest): - rest = re.sub(r"\[([^\]]*),", r"[\1;", rest) - kwargs = {} - for i in rest.split(","): - key, value = i.split("=") - kwargs[key] = _parse_value(value) - else: - kwargs = {} - s = e.split(",") - if len(s) == 3: - ref, degree, variant = s - else: - ref, degree = e.split(",") - variant = None - return ref, int(degree), variant, kwargs diff --git a/defelement/implementations/ferrite.py b/defelement/implementations/ferrite.py deleted file mode 100644 index 32fee532ec..0000000000 --- a/defelement/implementations/ferrite.py +++ /dev/null @@ -1,107 +0,0 @@ -"""Implementation in Ferrite.jl.""" - -import re -import typing - -from defelement.element import Element -from defelement.implementations.core import Implementation, NotImplementedOnReference - -# DefElement reference cell names mapped to the Ferrite.jl reference shapes -reference_shapes = { - "interval": "RefLine", - "triangle": "RefTriangle", - "quadrilateral": "RefQuadrilateral", - "tetrahedron": "RefTetrahedron", - "hexahedron": "RefHexahedron", - "prism": "RefPrism", - "pyramid": "RefPyramid", -} - -# The registry file that Julia's package manager resolves Ferrite's versions from -versions_url = ( - "https://raw.githubusercontent.com/JuliaRegistries/General/master/F/Ferrite/Versions.toml" -) - - -class FerriteImplementation(Implementation): - """Implementation in Ferrite.jl.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = string - for p, v in params.items(): - if p == "vdim": - out += f"^{v}" - else: - raise ValueError(f"Unexpected parameter: {p}") - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - if language != "julia": - raise ValueError(f"Unsupported language: {language}") - return "using Ferrite" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - if language != "julia": - raise ValueError(f"Unsupported language: {language}") - if reference not in reference_shapes: - raise NotImplementedOnReference() - out = f"ip = {name}{{{reference_shapes[reference]}, {degree}}}()" - for p, v in params.items(): - if p == "vdim": - out += f"^{v}" - else: - raise ValueError(f"Unexpected parameter: {p}") - return out - - @classmethod - def install(cls, language: str) -> str | None: - """Get the command(s) to install this implementation.""" - if language == "julia": - return "julia -e 'using Pkg; Pkg.add(\"Ferrite\")'" - return None - - @classmethod - def version(cls) -> str: - """Get the version number of this implementation.""" - import requests - - # Ferrite is not registered on PyPI, so the latest release is read from the entries of - # Julia's General registry, which are of the form `["1.2.3"]` - versions = re.findall( - r'^\["([0-9]+(?:\.[0-9]+)*)"\]', requests.get(versions_url).text, re.MULTILINE - ) - return max(versions, key=lambda v: tuple(int(i) for i in v.split("."))) - - @classmethod - def notes(cls, element: Element) -> list[str]: - """Return a list of notes to include for the implementation of this element.""" - if element.filename == "serendipity": - return [ - ( - "Ferrite.jl uses point evaluations at the midpoints of the edges of the cell " - "in place of the integral moments used in DefElement's definition of this " - "element. Its basis functions therefore differ from the ones shown here, " - "although they span the same space." - ) - ] - return [] - - id = "ferrite" - name = "Ferrite.jl" - url = "https://github.com/Ferrite-FEM/Ferrite.jl" - languages = ("julia",) diff --git a/defelement/implementations/fiat.py b/defelement/implementations/fiat.py deleted file mode 100644 index 2370c80e37..0000000000 --- a/defelement/implementations/fiat.py +++ /dev/null @@ -1,241 +0,0 @@ -"""FIAT implementation.""" - -import typing - -import sympy -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element -from defelement.implementations.core import ( - Implementation, - parse_example, - pypi_name, -) - -# TODO make this a FIAT attribute -true_space_dimension = { - "Bell": 18, - "Mardal-Tai-Winther": 9, - "reduced Hsieh-Clough-Tocher": 9, - "Arnold-Winther": 24, - "nonconforming Arnold-Winther": 15, -} - - -@pypi_name("firedrake-fiat") -class FIATImplementation(Implementation): - """FIAT implementation.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = f"FIAT.{string}" - started = False - for p, v in params.items(): - if p == "variant": - if not started: - out += "(..." - started = True - out += f', {p}="{v}"' - elif p in ["subdegree", "reduced"]: - if not started: - out += "(..." - started = True - out += f", {p}={v}" - elif p != "degree": - raise ValueError(f"Unexpected parameter: {p}") - if started: - out += ")" - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import FIAT" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - if reference in ["interval", "triangle", "tetrahedron"]: - cell = f'FIAT.ufc_cell("{reference}")' - elif reference == "quadrilateral": - cell = "FIAT.reference_element.UFCQuadrilateral()" - elif reference == "hexahedron": - cell = "FIAT.reference_element.UFCHexahedron()" - else: - raise ValueError(f"Unsupported cell: {reference}") - out = f"element = FIAT.{name}({cell}" - if params.get("degree", "") != "None": - out += f", {degree}" - for i, j in params.items(): - if i == "variant": - out += f', {i}="{j}"' - if i == "subdegree": - subdegree = parse_example(example)[1] - out += f", {i}={sympy.S(j).subs(sympy.Symbol('k'), subdegree)}" - if i == "reduced": - out += f", {i}={j}" - out += ")" - return out - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - import FIAT - - if reference in ["interval", "triangle", "tetrahedron"]: - cell = FIAT.ufc_cell(reference) - elif reference == "quadrilateral": - cell = FIAT.reference_element.UFCQuadrilateral() - elif reference == "hexahedron": - cell = FIAT.reference_element.UFCHexahedron() - else: - raise ValueError(f"Unsupported cell: {reference}") - - args = [] - kwargs: dict[str, typing.Any] = {} - - if params.get("degree", "") != "None": - args.append(degree) - - if "variant" in params: - kwargs["variant"] = params["variant"] - - if "reduced" in params: - kwargs["reduced"] = bool(params["reduced"]) - - e = getattr(FIAT, name)(cell, *args, **kwargs) - - value_size = 1 - for i in e.value_shape(): - value_size *= i - edofs = [list(i.values()) for i in e.entity_dofs().values()] - - if reference == "triangle": - edofs[1] = [edofs[1][2], edofs[1][1], edofs[1][0]] - elif reference == "tetrahedron": - edofs[1] = [ - edofs[1][5], - edofs[1][4], - edofs[1][3], - edofs[1][2], - edofs[1][1], - edofs[1][0], - ] - edofs[2] = [edofs[2][3], edofs[2][2], edofs[2][1], edofs[2][0]] - elif reference == "quadrilateral": - edofs = [ - [edofs[0][0], edofs[0][2], edofs[0][1], edofs[0][3]], - [edofs[1][2], edofs[1][0], edofs[1][1], edofs[1][3]], - [edofs[2][0]], - ] - elif reference == "hexahedron": - edofs = [ - [ - edofs[0][0], - edofs[0][4], - edofs[0][2], - edofs[0][6], - edofs[0][1], - edofs[0][5], - edofs[0][3], - edofs[0][7], - ], - [ - edofs[1][8], - edofs[1][4], - edofs[1][0], - edofs[1][6], - edofs[1][2], - edofs[1][10], - edofs[1][1], - edofs[1][3], - edofs[1][9], - edofs[1][5], - edofs[1][7], - edofs[1][11], - ], - [ - edofs[2][4], - edofs[2][2], - edofs[2][0], - edofs[2][1], - edofs[2][3], - edofs[2][5], - ], - [edofs[3][0]], - ] - - sd = cell.get_spatial_dimension() - if element.name in { - "Bernardi-Raugel", - "Guzman-Neilan (first kind)", - "Guzman-Neilan (second kind)", - }: - reduced_dim = e.space_dimension() - (sd + 1) * (sd - 1) - else: - reduced_dim = true_space_dimension.get(element.name) - - if reduced_dim is not None: - for dim in range(len(edofs)): - for i in range(len(edofs[dim])): - edofs[dim][i] = [dof for dof in edofs[dim][i] if dof < reduced_dim] - - z = (0,) * sd - return edofs, lambda points: e.tabulate(0, points)[z][slice(reduced_dim)].T.reshape( - points.shape[0], value_size, -1 - ) - - @classmethod - def notes(cls, element: Element) -> list[str]: - """Return a list of notes to include for the implementation of this element.""" - if element.name in true_space_dimension: - return [ - ( - "This implementation includes additional DOFs that are used then filtered " - "out when mapping the element, as described in Kirby (2018)." - ) - ] - return [] - - @classmethod - def references(cls, element: Element) -> list[dict[str, typing.Any]]: - """Return a list of additional references to include for the implementation of this element.""" - if element.name in true_space_dimension: - return [ - { - "title": "A general approach to transforming finite elements", - "author": ["Kirby, Robert C."], - "year": 2018, - "journal": "SMAI Journal of Computational Mathematics", - "volume": 4, - "pagestart": 197, - "pageend": 224, - "doi": "10.5802/smai-jcm.33", - } - ] - return [] - - id = "fiat" - name = "FIAT" - url = "https://github.com/firedrakeproject/fiat" - verification = True - languages = ("python",) diff --git a/defelement/implementations/ndelement.py b/defelement/implementations/ndelement.py deleted file mode 100644 index 01c35be045..0000000000 --- a/defelement/implementations/ndelement.py +++ /dev/null @@ -1,170 +0,0 @@ -"""Implementation in ndelement.""" - -import typing - -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element -from defelement.implementations.core import Implementation - - -class NdelementImplementation(Implementation): - """Implementation in ndelement.""" - - @classmethod - def version(cls) -> str: - """Get the version number of this implementation.""" - from importlib.metadata import PackageNotFoundError, version - - try: - return version("ndelement") - except PackageNotFoundError: - import requests - - return requests.get("https://pypi.org/pypi/ndelement/json").json()["info"]["version"] - - @classmethod - def install(cls, language: str) -> str | None: - """Get the command(s) to install this implementation.""" - if language == "python": - return "pip install ndelement" - if language == "rust": - return f'ndelement = "{cls.version()}"' - return None - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = f"Family.{string}" - for p, v in params.items(): - out += f", {p}=" - if p == "continuity": - out += f"Continuity.{v}" - else: - raise ValueError(f"Unexpected parameter: {p}") - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - if language == "python": - return ( - "from ndelement import ciarlet\n" - "from ndelement.reference_cell import ReferenceCellType" - ) - if language == "rust": - return "use ndelement::{ciarlet, types::{Continuity, ReferenceCellType}};" - raise ValueError(f"Unsupported language: {language}") - - @classmethod - def single_example_python( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> str: - """Generate Python code for a single example.""" - out = "family = ciarlet.create_family(" - out += f"ciarlet.Family.{name}, {degree}" - if "continuity" in params: - assert params["continuity"] in ["Standard", "Discontinuous"] - out += f", continuity=ciarlet.Continuity.{params['continuity']}" - out += ")\n" - out += f"element = family.element(ReferenceCellType.{reference[0].upper() + reference[1:]})" - return out - - @classmethod - def single_example_rust( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> str: - """Generate Rust code for a single example.""" - out = f"let family = ciarlet::{name}ElementFamily({degree}, Continuity::" - if "continuity" in params: - assert params["continuity"] in ["Standard", "Discontinuous"] - out += params["continuity"] - else: - out += "Standard" - out += ");\n" - out += f"let element = family.element(ReferenceCellType::{reference[0].upper() + reference[1:]});" - return out - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - if language == "python": - return cls.single_example_python(name, reference, degree, params, element, example) - if language == "rust": - return cls.single_example_rust(name, reference, degree, params, element, example) - raise ValueError(f"Unsupported language: {language}") - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - from ndelement.ciarlet import Continuity, Family, create_family - from ndelement.reference_cell import ReferenceCellType, entity_counts - - kwargs = {} - if "continuity" in params: - kwargs["continuity"] = getattr(Continuity, params["continuity"]) - - cell = getattr(ReferenceCellType, reference[0].upper() + reference[1:]) - e = create_family(getattr(Family, name), degree, **kwargs).element(cell) - entity_dofs = [ - [e.entity_dofs(dim, entity) for entity in range(n)] - for dim, n in enumerate(entity_counts(cell)) - if n > 0 - ] - - if reference == "triangle": - entity_dofs[1] = [entity_dofs[1][2], entity_dofs[1][1], entity_dofs[1][0]] - elif reference == "tetrahedron": - entity_dofs[1] = [ - entity_dofs[1][5], - entity_dofs[1][4], - entity_dofs[1][3], - entity_dofs[1][2], - entity_dofs[1][1], - entity_dofs[1][0], - ] - entity_dofs[2] = [ - entity_dofs[2][3], - entity_dofs[2][2], - entity_dofs[2][1], - entity_dofs[2][0], - ] - - return entity_dofs, lambda points: e.tabulate(points, 0)[:, :, :, 0].transpose((2, 0, 1)) - - id = "ndelement" - name = "ndelement" - url = "https://codeberg.org/nd-project/nd" - verification = True - languages = ("python", "rust") - install_language = "python" diff --git a/defelement/implementations/simplefem.py b/defelement/implementations/simplefem.py deleted file mode 100644 index 0f9298cd99..0000000000 --- a/defelement/implementations/simplefem.py +++ /dev/null @@ -1,140 +0,0 @@ -"""Simplefem implementation.""" - -# -import typing - -from numpy import float64 -from numpy.typing import NDArray - -from defelement.element import Element -from defelement.implementations.core import Implementation - - -class SimplefemImplementation(Implementation): - """Simplefem implementation.""" - - # - - # - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - return string - - # - - # - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import simplefem" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate code for a single example.""" - return f"element = simplefem.{name}({degree})" - - # - - # - @classmethod - def install(cls, language: str) -> str | None: - """Get the command(s) to install this implementation.""" - if language == "python": - return "pip3 install git+https://github.com/DefElement/simplefem" - return None - - # - - # - @classmethod - def version(cls) -> str: - """Get the version number of this implementation.""" - import simplefem - - return simplefem.__version__ - - # - - # - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - # - # - import numpy as np - import simplefem - # - - # - e = getattr(simplefem, name)(degree) - # - - # - entity_dofs: list[list[list[int]]] = [[[], [], []], [[], [], []], [[]]] - - for i, p in enumerate(e.evaluation_points): - # DOFs associated with vertices - if np.allclose(p, [-1, 0]): - entity_dofs[0][0].append(i) - elif np.allclose(p, [1, 0]): - entity_dofs[0][1].append(i) - elif np.allclose(p, [0, 1]): - entity_dofs[0][2].append(i) - # DOFs associated with edges - elif np.isclose(p[1], 0): - entity_dofs[1][0].append(i) - elif np.isclose(p[1] - p[0], 1): - entity_dofs[1][1].append(i) - elif np.isclose(p[1] + p[0], 1): - entity_dofs[1][2].append(i) - # DOFs associated with interior of cell - else: - entity_dofs[2][0].append(i) - # - - # - def tabulate(points): - mapped_points = np.array([[2 * p[0] + p[1] - 1, p[1]] for p in points]) - table = np.zeros([points.shape[0], 1, degree]) - - for i, p in enumerate(mapped_points): - for j in range(degree): - table[i, 0, j] = e.evaluate(j, p)[0] - return table - - # - - # - return entity_dofs, tabulate - - # - - # - id = "simplefem" - name = "simplefem" - url = "https://github.com/DefElement/simplefem" - languages = ("python",) - # - # - verification = True - - -# diff --git a/defelement/implementations/symfem.py b/defelement/implementations/symfem.py deleted file mode 100644 index b785e8b688..0000000000 --- a/defelement/implementations/symfem.py +++ /dev/null @@ -1,148 +0,0 @@ -"""Symfem implementation.""" - -import typing - -from numpy import float64 -from numpy.typing import NDArray -from symfem.finite_element import FiniteElement - -from defelement.element import Element -from defelement.implementations.core import ( - Implementation, - parse_example, - pypi_name, -) -from defelement.tools import to_array - - -def symfem_create_element(element: Element, example: str) -> FiniteElement: - """Create a Symfem element. - - Args: - element: Element info - example: The example - - Returns: - Symfem element - """ - import symfem - - ref, defelement_deg, variant, _kwargs = parse_example(example) - symfem_name, deg, params = element.get_implementation_string( - "symfem", ref, defelement_deg, variant - ) - assert symfem_name is not None - if ref == "dual polygon": - ref += "(4)" - assert isinstance(deg, int) - return symfem.create_element(ref, symfem_name, deg, **params) - - -class CachedSymfemTabulator: - """Symfem tabulator with caching.""" - - def __init__(self, element: FiniteElement): - """Initialise. - - Args: - element: Symfem element - """ - self.element = element - self.tables: list[tuple[NDArray[float64], NDArray[float64]]] = [] - - def tabulate(self, points: NDArray[float64]) -> NDArray[float64]: - """Tabulate this element. - - Args: - points: Points to tabulate at - - Returns: - Values of basis functions - """ - import numpy as np - - for i, j in self.tables: - if i.shape == points.shape and np.allclose(i, points): - return j - shape = (points.shape[0], self.element.range_dim, self.element.space_dim) - table = to_array(self.element.tabulate_basis(points, "xx,yy,zz")) # type: ignore - assert not isinstance(table, float) - table = table.reshape(shape) - self.tables.append((points, table)) - return table - - -@pypi_name("symfem") -class SymfemImplementation(Implementation): - """Symfem implementation.""" - - @classmethod - def format(cls, string: str, params: dict[str, typing.Any]) -> str: - """Format implementation string.""" - out = f'"{string}"' - for p, v in params.items(): - if p == "variant": - out += f', {p}="{v}"' - else: - raise ValueError(f"Unexpected parameter: {p}") - return out - - @classmethod - def example_import(cls, language: str) -> str: - """Get imports to include at start of example.""" - return "import symfem" - - @classmethod - def single_example( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - language: str, - element: Element, - example: str, - ) -> str: - """Generate examples.""" - out = "element = symfem.create_element(" - if reference == "dual polygon": - out += f'"{reference}(4)",' - else: - out += f'"{reference}",' - out += f' "{name}", {degree}' - for i, j in params.items(): - if isinstance(j, str): - out += f', {i}="{j}"' - else: - out += f", {i}={j}" - out += ")" - return out - - @classmethod - def verify( - cls, - name: str, - reference: str, - degree: int, - params: dict[str, str], - element: Element, - example: str, - ) -> tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]]: - """Get verification data.""" - import symfem - - if reference == "dual polygon": - reference += "(4)" - e = symfem.create_element(reference, name, degree, **params) # type: ignore - edofs = [ - [e.entity_dofs(i, j) for j in range(e.reference.sub_entity_count(i))] - for i in range(e.reference.tdim + 1) - ] - t = CachedSymfemTabulator(e) - return edofs, lambda points: t.tabulate(points) - - id = "symfem" - name = "Symfem" - url = "https://github.com/mscroggs/symfem" - verification = True - languages = ("python",) diff --git a/defelement/info.py b/defelement/info.py deleted file mode 100644 index 97173daf3b..0000000000 --- a/defelement/info.py +++ /dev/null @@ -1,13 +0,0 @@ -"""Information about DefElement.""" - -import os - -from defelement import settings - -number_of_elements = len( - [ - file - for file in os.listdir(settings.element_path) - if file.endswith(".def") and not file.startswith(".") - ] -) diff --git a/defelement/languages.py b/defelement/languages.py deleted file mode 100644 index bd38cfd211..0000000000 --- a/defelement/languages.py +++ /dev/null @@ -1,145 +0,0 @@ -"""Programming languages.""" - -import sys -from inspect import isclass - -from webtools.code_markup import cpp_highlight, python_highlight, rust_highlight - -from defelement.implementations import Implementation - - -def julia_highlight(code: str) -> str: - """Highlight comments in a Julia snippet and convert it to HTML. - - webtools does not provide a Julia highlighter. The snippets are short enough that - keyword highlighting adds little, so only comments are highlighted, using the same - color that webtools uses. - - Args: - code: Julia snippet - - Returns: - Snippet with comments highlighted - """ - out = [] - for line in code.replace(" ", " ").split("\n"): - if "#" in line: - line, comment = line.split("#", 1) - line += f"#{comment}" - out.append(line) - return "
    ".join(out) - - -class Language: - """A programming language.""" - - @classmethod - def highlight(cls, code: str) -> str: - """Add code highlighting. - - Args: - code: Some code - - Returns: - Code with HTML formatting - """ - raise NotImplementedError() - - @classmethod - def install(cls, impl: type[Implementation]) -> str: - """Generate installation information for a language. - - Args: - impl: The implementation - - Returns: - Installation info - """ - info = f"Before running this example, you must install {impl.name}" - - cmd = impl.install(cls.id) - - if cmd is None: - info += ". " - else: - info += ":

    " + cmd.replace("\n", "
    ") + "

    " - return info - - # Javascript-friendly id - id: str - # Human-readable name of language - name: str - - -class Python(Language): - """Python.""" - - @classmethod - def highlight(cls, code: str) -> str: - """Add code highlighting.""" - return python_highlight(code) - - id = "python" - name = "Python" - - -class Rust(Language): - """Rust.""" - - @classmethod - def highlight(cls, code: str) -> str: - """Add code highlighting.""" - return rust_highlight(code) - - @classmethod - def install(cls, impl: type[Implementation]) -> str: - """Generate installation information for a language.""" - info = ( - f"To running this snippet, you must add {impl.name}" - " to your Cargo.toml file" - ) - - cmd = impl.install("rust") - - if cmd is None: - info += ". " - else: - info += ":

    " + cmd.replace("\n", "
    ") + "

    " - return info - - id = "rust" - name = "Rust" - - -class Cpp(Language): - """C++.""" - - @classmethod - def highlight(cls, code: str) -> str: - """Add code highlighting.""" - return cpp_highlight(code) - - id = "cpp" - name = "C++" - - -class Julia(Language): - """Julia.""" - - @classmethod - def highlight(cls, code: str) -> str: - """Add code highlighting.""" - return julia_highlight(code) - - id = "julia" - name = "Julia" - - -this = sys.modules[__name__] - -languages = {} - -for item in dir(): - lang = getattr(this, item) - if isclass(lang) and issubclass(lang, Language) and lang != Language: - languages[lang.id] = lang diff --git a/defelement/markup.py b/defelement/markup.py deleted file mode 100644 index 7e652e7e32..0000000000 --- a/defelement/markup.py +++ /dev/null @@ -1,151 +0,0 @@ -"""Markup.""" - -import re -import typing - -import symfem -from webtools import settings -from webtools.code_markup import code_highlight as _code_highlight -from webtools.markup import insert_links as _insert_links - -from defelement import citations, info, plotting, symbols - -page_references: list[str] = [] - - -def insert_links(txt: str, root_dir: str = "") -> str: - """Insert links. - - Args: - txt: text - - Returns: - Text with links - """ - txt = re.sub(r"\(element::([^\)]+)\)", r"(/elements/\1.html)", txt) - txt = re.sub(r"\(reference::([^\)]+)\)", r"(/lists/references/\1.html)", txt) - txt = txt.replace("(index::all)", "(/elements/index.html)") - txt = txt.replace("(index::families)", "(/families/index.html)") - txt = txt.replace("(index::recent)", "(/lists/recent.html)") - txt = re.sub(r"\(index::([^\)]+)::([^\)]+)\)", r"(/lists/\1/\2.html)", txt) - txt = re.sub(r"\(index::([^\)]+)\)", r"(/lists/\1)", txt) - return _insert_links(txt, root_dir) - - -def plot_element(matches: typing.Match[str]) -> str: - """Plot element. - - Args: - matches: Element data - - Returns: - HTML for plot of element - """ - if "variant=" in matches[1]: - a, b = matches[1].split(" variant=") - e = symfem.create_element(a, matches[2], int(matches[3]), variant=b) - else: - e = symfem.create_element(matches[1], matches[2], int(matches[3])) - - return f"
    {''.join([plotting.plot_function(e, i) for i in range(e.space_dim)])}
    " - - -def plot_single_element(matches: typing.Match[str]) -> str: - """Plot a single element. - - Args: - matches: Element data - - Returns: - HTML for plot of element - """ - if "variant=" in matches[1]: - a, b = matches[1].split(" variant=") - e = symfem.create_element(a, matches[2], int(matches[3]), variant=b) - else: - e = symfem.create_element(matches[1], matches[2], int(matches[3])) - - return f"
    {plotting.plot_function(e, int(matches[4]))}
    " - - -def plot_reference(matches: typing.Match[str]) -> str: - """Plot references. - - Args: - matches: Reference data - - Returns: - HTML - """ - e = symfem.create_reference(matches[1]) - return f"
    {plotting.plot_reference(e)}
    " - - -def plot_img(matches: typing.Match[str]) -> str: - """Plot an image. - - Args: - matches: Image info - - Returns: - HTML for image - """ - e = matches[1] - return f"
    {plotting.plot_img(e)}
    " - - -def insert_citation(matches: typing.Match[str]) -> str: - """Insert a citation. - - Args: - matches: Citation info - - Returns: - HTML for citation - """ - id = matches[1] - return "" - - -def insert_snippet(matches: typing.Match[str]) -> str: - """Insert a snippet. - - Args: - matches: Snippet info - - Returns: - HTML for snippet - """ - file = matches[1] - tag = matches[2] - with open(file) as f: - content = f.read().split(f"# <{tag}>\n")[1].split(f"# \n")[0] - out = "" - for part in re.split(r"\n\n+", content.rstrip(" \n").lstrip("\n")): - out += "

    " - if file.endswith(".py"): - out += _code_highlight(part, "python") - else: - out += _code_highlight(part) - out += "

    " - return out - - -settings.re_extras = [ - (r"{{plot::([^,]+),([^,]+),([0-9]+)}}", plot_element), - (r"{{plot::([^,]+),([^,]+),([0-9]+)::([0-9]+)}}", plot_single_element), - (r"{{reference::([^}]+)}}", plot_reference), - (r"{{img::([^}]+)}}", plot_img), - ( - r"{{symbols\.([^}\(]+)\(([0-9]+)\)}}", - lambda m: getattr(symbols, m[1])(int(m[2])), - ), - (r"{{symbols\.([^}]+)}}", lambda m: getattr(symbols, m[1])), - (r"{{citation::([^}]+)}}", insert_citation), - (r"{{snippet::([^:]*)::([A-Za-z0-9\-_]+)}}", insert_snippet), -] -settings.str_extras = [ - ("{{tick}}", ""), - ("{{number-of-elements}}", f"{info.number_of_elements}"), -] -settings.insert_links = insert_links diff --git a/defelement/plotting.py b/defelement/plotting.py deleted file mode 100644 index 214f3f0720..0000000000 --- a/defelement/plotting.py +++ /dev/null @@ -1,349 +0,0 @@ -"""Plotting.""" - -import base64 -import os -import typing -from datetime import datetime, timedelta, timezone - -import symfem -import sympy -from symfem.finite_element import FiniteElement -from symfem.plotting import Picture - -from defelement import settings -from defelement.caching import load_cache, save_cache - -now = datetime.now(tz=timezone(timedelta())) -svg_desc = ( - "This plot is from DefElement (https://defelement.org) " - "and is available under a Creative Commons Attribution " - "4.0 International (CC BY 4.0) license: " - "https://creativecommons.org/licenses/by/4.0/" -) -svg_metadata = ( - "\n" - " \n" - " \n" - " {title}\n" - f" {now.strftime('%Y-%m-%d')}\n" - " \n" - " DefElement\n" - " Matthew Scroggs\n" - " \n" - " See document description\n" - " \n" - " image/svg+xml\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - "\n" -) -tex_comment = ( - "% -------------------------------------------------------\n" - "% This plot is from DefElement (https://defelement.org)\n" - "% and is available under a Creative Commons Attribution\n" - "% 4.0 International (CC BY 4.0) license:\n" - "% https://creativecommons.org/licenses/by/4.0/\n" - "% -------------------------------------------------------\n" -) - -all_plots: list[str] = [] - - -def do_the_plot( - filename: str, - desc: str, - plot: typing.Callable, - args: list[typing.Any] | None = None, - png_width: int = 180, - scale: int = 250, - link: bool = True, - cache_element: FiniteElement | None = None, -) -> str: - """Create a plot. - - Args: - filename: Filename of plot - desc: Plot description - plot: Function that creates plot - args: Arguments - png_width: PNG width - scale: Scale - link: Should a link be included? - - Returns: - HTML for plot - """ - from webtools.html import make_html_page - from webtools.markup import cap_first, heading_with_self_ref - - if args is None: - args = [] - filename = filename.replace(" ", "-") - - kwargs = { - "title": desc, - "desc": svg_desc, - "svg_metadata": svg_metadata.replace("{title}", desc), - "tex_comment": tex_comment, - } - svg_kw = {"scale": scale, "dof_arrow_size": sympy.Rational(3, 2)} - - if filename not in all_plots: - for fname, pf in [ - (f"{filename}.tex", lambda fn: plot(*args, fn, **kwargs)), - (f"{filename}.svg", lambda fn: plot(*args, fn, **svg_kw, **kwargs)), - ( - f"{filename}.png", - lambda fn: plot( - *args, fn, plot_options={"png_width": png_width}, **svg_kw, **kwargs - ), - ), - ( - f"{filename}-large.png", - lambda fn: plot( - *args, - fn, - plot_options={"png_width": png_width * 9 // 2}, - **svg_kw, - **kwargs, - ), - ), - ]: - c = None - if cache_element is not None: - c = load_cache(f"plot-{fname}", cache_element.last_updated) - if c is not None: - with open(os.path.join(settings.htmlimg_path, fname), "wb") as f: - f.write(base64.b64decode(c)) - else: - pf(os.path.join(settings.htmlimg_path, fname)) - if cache_element is not None: - with open(os.path.join(settings.htmlimg_path, fname), "rb") as f: - save_cache( - f"plot-{fname}", - cache_element.last_updated, - base64.b64encode(f.read()).decode("utf-8"), - ) - - img_page = heading_with_self_ref("h1", cap_first(desc)) - img_page += f"
    " - img_page += f"
    \n" - - img_page += ( - "

    " - "This image can be used under a " - "" - "Creative Commons Attribution 4.0 International (CC BY 4.0) license" - ": if you use it anywhere, you must attribute DefElement. " - "If you use this image anywhere online, please include a link to " - "DefElement; if you use this image in a paper, please cite DefElement." - "

    " - ) - img_page += "" - - with open(os.path.join(settings.htmlimg_path, f"{filename}.html"), "w") as f: - f.write(make_html_page(img_page)) - all_plots.append(filename) - - if link: - return f"" - else: - return f"" - - -def plot_reference(ref, link: bool = True) -> str: - """Plot a reference cell. - - Args: - link: Should a link be included? - - Returns: - HTML for plot - """ - if ref.name == "dual polygon": - assert isinstance(ref, symfem.references.DualPolygon) - ref_id = f"dual-polygon-{ref.number_of_triangles}" - else: - ref_id = ref.name - - filename = f"ref-{ref_id}" - desc = f"{ref.name} reference cell" - - return do_the_plot( - filename, - desc, - ref.plot_entity_diagrams, - png_width=175 * (ref.tdim + 1), - scale=300, - link=link, - ) - - -def plot_function(element: FiniteElement, dof_i: int, link: bool = True) -> str: - """Plot a functions. - - Args: - element: The element - dof_i: The DOF index - link: Should a link be included? - - Returns: - HTML for plot - """ - if element.reference.name == "dual polygon": - ref = element.reference - assert isinstance(ref, symfem.references.DualPolygon) - ref_id = f"dual-polygon-{ref.number_of_triangles}" - else: - ref_id = element.reference.name - - desc = f"Basis function in a {element.name} space" - filename = f"element-{element.name}" - for i, j in element.init_kwargs().items(): - filename += f"-{i}-{j}" - filename += f"-{ref_id}-{element.order}-{dof_i}" - return do_the_plot( - filename, - desc, - element.plot_basis_function, - [dof_i], - link=link, - cache_element=element, - ) - - -def plot_basis_functions(element: FiniteElement, link: bool = True) -> list[str | None]: - """Plot basis functions of an element. - - Args: - element: The element - link: Should a link be included? - - Returns: - HTML for plot - """ - if element.range_dim == 1: - if element.domain_dim > 2: - return [None for i in range(element.space_dim)] - else: - if element.range_dim != element.domain_dim: - return [None for i in range(element.space_dim)] - - return [plot_function(element, i, link=link) for i in range(element.space_dim)] - - -def _parse_point(points: list[str], n: int) -> tuple[float, float]: - """Parge a point. - - Args: - points: Point data - n: Point number - - Returns: - Point - """ - point = points[n].strip() - if point == "cycle": - assert n > 0 - return _parse_point(points, 0) - assert point[0] == "(" and point[-1] == ")" - - x, y = point[1:-1].split(",") - return float(x) / 100, float(y) / 100 - - -def plot_img(img_filename: str, link: bool = True) -> str: - """Plot a image. - - Args: - img_filename: Image filename - link: Should a link be included? - - Returns: - HTML for plot - """ - metadata = {"DESC": ""} - filename = f"img-{img_filename}" - with open(os.path.join(settings.img_path, f"{img_filename}.img")) as f: - for line in f: - if ":" in line: - a, b = line.split(":", 1) - metadata[a.strip()] = b.strip() - desc = metadata["DESC"] - - def actual_plot( - filename: str, - plot_options: dict[str, typing.Any] | None = None, - **kwargs: typing.Any, - ): - if plot_options is None: - plot_options = {} - img = Picture(**kwargs) - colors = img.colors - with open(os.path.join(settings.img_path, f"{img_filename}.img")) as f: - for line in f: - if ":" not in line: - line = line.split("#")[0] - line = line.strip() - color = "black" - if line.startswith("["): - color, line = line[1:].split("]", 1) - line = line.strip() - if hasattr(colors, color.upper()): - color = getattr(colors, color.upper()) - - points = line.split("--") - for i in range(len(points) - 1): - p1 = _parse_point(points, i) - p2 = _parse_point(points, i + 1) - img.add_line(p1, p2, color=color, width=2) - img.save(filename, plot_options) - - return do_the_plot(filename, desc, actual_plot, link=link) - - -def plot_dof_diagram(element: FiniteElement, link: bool = True) -> str: - """Plot a DOF diagram. - - Args: - element: The element - link: Should a link be included? - - Returns: - HTML for plot - """ - if element.reference.name == "dual polygon": - ref = element.reference - assert isinstance(ref, symfem.references.DualPolygon) - ref_id = f"dual-polygon-{ref.number_of_triangles}" - else: - ref_id = element.reference.name - desc = "DOFs of " - desc += "an" if element.name.lower()[0] in "aieou" else "a" - desc += f" {element.name} element" - filename = f"element-{element.name}" - for i, j in element.init_kwargs().items(): - filename += f"-{i}-{j}" - filename += f"-{ref_id}-{element.order}-dofs" - return do_the_plot( - filename, - desc, - element.plot_dof_diagram, - link=link, - cache_element=element, - ) diff --git a/defelement/polyset.py b/defelement/polyset.py deleted file mode 100644 index bef8bf487c..0000000000 --- a/defelement/polyset.py +++ /dev/null @@ -1,201 +0,0 @@ -"""Polynomial sets.""" - -import os -import re -import typing - -import yaml - -with open(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../data/polysets")) as f: - poly_sets = yaml.load(f, Loader=yaml.FullLoader) - -named: dict[str, tuple[str, str, dict[str, str]]] = {} -defs: dict[str, str] = {} - - -def make_name(i: int) -> str: - """Make a polyset name. - - Args: - i: Polyset id - - Returns: - Polyset name - """ - return f"\\mathcal{{Z}}^{{({i})}}" - - -def replace_def(matches: typing.Match[str]) -> str: - """Replace def. - - Args: - matches: TODO - - Returns: - TODO - """ - defs[matches[1]] = matches[2] - return "" - - -def replace_defmath(matches: typing.Match[str]) -> str: - """Replace def. - - Args: - matches: TODO - - Returns: - TODO - """ - defs[matches[1]] = f"\\({matches[2]}\\)" - return "" - - -def _get_match(regex: str, string: str, index: int) -> str: - """Get a regular expression match. - - Args: - regex: Regular expression - string: Search string - index: Index - - Return: Match - """ - m = re.match(regex, string) - assert m is not None - return m[index] - - -def make_poly_set(p: str) -> str: - """Make a polynomial set. - - Args: - p: Polyset data - - Returns: - Formatted polynomial set - """ - global defs - if "&&" in p: - return " \\oplus ".join([make_poly_set(i.strip()) for i in p.split("&&")]) - p = p.strip() - if re.match(r"^\<([^\]]+)\>\[(.+)\]$", p): - degree = _get_match(r"^\<([^\]]+)\>\[(.+)\]$", p, 1) - the_set = _get_match(r"^\<([^\]]+)\>\[(.+)\]$", p, 2) - defs = {} - the_set_out = re.sub(r"\@def\@([^\@]+)\@([^\@]+)\@", replace_def, the_set) - the_set_out = re.sub(r"\@defmath\@([^\@]+)\@([^\@]+)\@", replace_defmath, the_set_out) - if the_set not in named: - named[the_set] = (make_name(len(named)), the_set_out, defs) - return f"{named[the_set][0]}_{{{degree}}}" - if re.match(r"^\<([^\]]+)\>\[(.+)\]\^d$", p): - degree = _get_match(r"^\<([^\]]+)\>\[(.+)\]\^d$", p, 1) - the_set = _get_match(r"^\<([^\]]+)\>\[(.+)\]\^d$", p, 2) - defs = {} - the_set_out = re.sub(r"\@def\@([^\@]+)\@([^\@]+)\@", replace_def, the_set) - the_set_out = re.sub(r"\@defmath\@([^\@]+)\@([^\@]+)\@", replace_defmath, the_set_out) - if the_set not in named: - named[the_set] = (make_name(len(named)), the_set_out, defs) - return f"\\left({named[the_set][0]}_{{{degree}}}\\right)^d" - for i, (j, k) in poly_sets.items(): - if re.match(rf"^{i}\[([^\]]+)\]$", p): - degree = _get_match(rf"^{i}\[([^\]]+)\]$", p, 1) - return f"{j}_{{{degree}}}" - if re.match(rf"^{i}\[([^\]]+)\]\^dd$", p): - degree = _get_match(rf"^{i}\[([^\]]+)\]\^dd$", p, 1) - return f"{j}_{{{degree}}}^{{d\\times d}}" - if re.match(rf"^{i}\[([^\]]+)\]\^d$", p): - degree = _get_match(rf"^{i}\[([^\]]+)\]\^d$", p, 1) - return f"{j}_{{{degree}}}^d" - if re.match(rf"^{i}\[([^\]]+)\]\(([^\)]+)\)$", p): - degree = _get_match(rf"^{i}\[([^\]]+)\]\(([^\)]+)\)$", p, 1) - dim = _get_match(rf"^{i}\[([^\]]+)\]\(([^\)]+)\)$", p, 2) - return f"{j}_{{{degree}}}^d(\\mathbb{{R}}^{{{dim}}})" - raise ValueError(f"Unknown polynomial set: {p}") - - -def make_extra_info(p: str) -> str: - """Make extra info. - - Args: - p: Polyset data - - Returns: - Extra info - """ - done = [] - out = [] - for a in p.split("&&"): - a = a.strip() - if re.match(r"^\<([^\]]+)\>\[(.+)\](?:\^d)?$", a): - the_set = _get_match(r"^\<([^\]]+)\>\[(.+)\](?:\^d)?$", a, 2) - if named[the_set] not in done: - def_txt = "" - if len(named[the_set][2]) > 0: - def_txt = "
    where
      " - def_txt += "\n".join( - [f"
    • \\({i}\\) is {j}
    • " for i, j in named[the_set][2].items()] - ) - def_txt += "
    " - out.append( - f"\\({named[the_set][0]}_k={insert_terms(named[the_set][1])}\\){def_txt}" - ) - done.append(named[the_set]) - for i, (j, k) in poly_sets.items(): - if f"{{{{{i}[" in a and i not in done: - out.append(f"\\({j}_k={k}\\)") - done.append(i) - continue - for i, (j, k) in poly_sets.items(): - if re.match(rf"^{i}\[([^\]]+)\]\(([^\)]+)\)$", p): - if i + "(d)" not in done: - out.append(f"\\({j}_k(\\mathbb{{R}}^d)={k}\\)") - done.append(i) - break - if re.match(rf"^{i}\[([^\]]+)\](?:\^d+)?$", a): - if i not in done: - out.append(f"\\({j}_k={k}\\)") - done.append(i) - break - else: - raise ValueError(f"Unknown polynomial set: {a}") - return "

    ".join(out) - - -def insert_terms(the_set: str) -> str: - """Insert terms into a polyset definition. - - Args: - the_set: Polynomial set - - Returns: - Formatted polynomial set - """ - the_set = the_set.replace("{{x}}", "\\boldsymbol{x}") - for i, (j, k) in poly_sets.items(): - the_set = re.sub( - rf"{{{{{i}\[([^\]]+)\]\^dd}}}}", - rf"{escape(j)}_{{\1}}^{{d\\times d}}", - the_set, - ) - the_set = re.sub(rf"{{{{{i}\[([^\]]+)\]\^d}}}}", rf"{escape(j)}_{{\1}}^d", the_set) - the_set = re.sub(rf"{{{{{i}\[([^\]]+)\]}}}}", rf"{escape(j)}_{{\1}}", the_set) - the_set = re.sub( - rf"{{{{{i}\[([^\]]+)\]\(([^\)]+)\)}}}}", - rf"{escape(j)}_{{\1}}(\\mathbb{{R}}^{{\2}})", - the_set, - ) - - return the_set - - -def escape(i: str) -> str: - """Escape a string. - - Args: - i: The string - - Returns: - Escaped string - """ - return i.replace("\\", "\\\\") diff --git a/defelement/rss.py b/defelement/rss.py deleted file mode 100644 index 9af19b6e33..0000000000 --- a/defelement/rss.py +++ /dev/null @@ -1,39 +0,0 @@ -"""RSS.""" - -import html - -from defelement.element import Element - - -def make_rss(elements: list[Element], title: str, desc: str, date: str) -> str: - """Make RSS XML. - - Args: - elements: Elements to include in feed - title: Title of feed - desc: Description of feed - date: Identifier for date - - Returns: - RSS XML - """ - out = ( - '\n' - '\n' - "\n" - f" DefElement {title}\n" - " https://www.defelement.org/\n" - f" {desc}\n" - ) - - for e in elements: - out += " \n" - out += f" {html.unescape(e.html_name)}\n" - out += f" https://www.defelement.org/elements/{e.html_filename}\n" - out += f" {html.unescape(e.html_name)}\n" - if getattr(e, date) is not None: - out += f" {getattr(e, date).strftime('%a, %d %b %Y')}\n" - out += " \n" - - out += "\n\n" - return out diff --git a/defelement/settings.py b/defelement/settings.py deleted file mode 100644 index b8c9193d26..0000000000 --- a/defelement/settings.py +++ /dev/null @@ -1,85 +0,0 @@ -"""DefElement settings.""" - -import os as _os - -import yaml as _yaml -from webtools import settings - -dir_path = _os.path.join(_os.path.dirname(_os.path.realpath(__file__)), "..") -element_path = _os.path.join(dir_path, "elements") -template_path = _os.path.join(dir_path, "templates") -files_path = _os.path.join(dir_path, "files") -pages_path = _os.path.join(dir_path, "pages") -data_path = _os.path.join(dir_path, "data") -img_path = _os.path.join(dir_path, "img") - -cache_path = _os.path.join(dir_path, ".defelement-build-cache") - -html_path = _os.path.join(dir_path, "_html") -htmlelement_path = _os.path.join(html_path, "elements") -htmlimg_path = _os.path.join(html_path, "img") -htmlindices_path = _os.path.join(html_path, "lists") -htmlfamilies_path = _os.path.join(html_path, "families") - -verification_json = _os.path.join(dir_path, "verification.json") -verification_history_json = _os.path.join(dir_path, "verification-history.json") - -github_token: str | None = None - -processes = 1 -caching = True - -owners = ["mscroggs"] -with open(_os.path.join(data_path, "editors")) as f: - editors = _yaml.load(f, Loader=_yaml.FullLoader) -with open(_os.path.join(data_path, "contributors")) as f: - contributors = _yaml.load(f, Loader=_yaml.FullLoader) - -settings.dir_path = dir_path -settings.html_path = html_path -settings.template_path = template_path -settings.github_token = github_token -settings.owners = owners -settings.editors = editors -settings.contributors = contributors -settings.url = "https://defelement.org" -settings.website_name = ["DefElement", "DefElement"] -settings.repo = "DefElement/DefElement" - - -def set_html_path(path: str): - """Set HTML path.""" - global html_path - global htmlelement_path - global htmlimg_path - global htmlindices_path - global htmlfamilies_path - html_path = path - htmlelement_path = _os.path.join(path, "elements") - htmlimg_path = _os.path.join(path, "img") - htmlindices_path = _os.path.join(path, "lists") - htmlfamilies_path = _os.path.join(path, "families") - - settings.html_path = path - - -def set_processes(n: int): - """Set number of processes.""" - global processes - processes = n - - -def set_github_token(token): - """Set Github token.""" - global github_token - github_token = token - settings.github_token = token - - -def set_verification_json(vj: str): - """Set path of verification JSON.""" - global verification_json - global verification_history_json - assert vj.endswith(".json") - verification_json = vj - verification_history_json = f"{vj[:-5]}-history.json" diff --git a/defelement/symbols.py b/defelement/symbols.py deleted file mode 100644 index 3177007be7..0000000000 --- a/defelement/symbols.py +++ /dev/null @@ -1,34 +0,0 @@ -"""Symbols used on DefElement.""" - -reference = "R" -cell = "C" -polyset = "\\mathcal{V}" -dual_basis = "\\mathcal{L}" -functional = "l" -basis_function = "\\phi" -vector_basis_function = "\\boldsymbol{\\phi}" -matrix_basis_function = "\\mathbf{\\Phi}" -jacobian = "\\mathbf{J}" -mapping = "\\mathcal{F}" -geometry_map = "F" -transpose = "^{\\text{t}}" - - -def entity(dim: int) -> str: - """Get the identifier of an entity. - - Args: - dim: The entity dimension - - Returns: - The identifier - """ - if dim == 0: - return "v" - if dim == 1: - return "e" - if dim == 2: - return "f" - if dim == 3: - return "c" - raise ValueError(f"Unsupported dim: {dim}") diff --git a/defelement/tools.py b/defelement/tools.py deleted file mode 100644 index d81980bd39..0000000000 --- a/defelement/tools.py +++ /dev/null @@ -1,22 +0,0 @@ -"""DefElement tools.""" - -import typing - -from numpy import float64 -from numpy.typing import NDArray - - -def to_array( - data: NDArray[float64] | list[typing.Any] | tuple[typing.Any, ...], -) -> float | NDArray[float64]: - """Convert to an array.""" - import numpy as np - - if isinstance(data, (list, tuple)): - return np.array([to_array(i) for i in data]) - return float(data) - - -def jsify(text): - """Convert to a safe variable name for Javascript.""" - return text.replace(".", "_").replace("-", "_").replace("+", "p") diff --git a/defelement/verification.py b/defelement/verification.py deleted file mode 100644 index 19b01da266..0000000000 --- a/defelement/verification.py +++ /dev/null @@ -1,215 +0,0 @@ -"""Verification.""" - -import typing - -import symfem -from numpy import float64 -from numpy.typing import NDArray - -from defelement.tools import to_array - - -def points(ref: str) -> NDArray[float64]: - """Get tabulation points for a reference cell. - - Args: - ref: Reference cell - - Returns: - Set of points - """ - import numpy as np - - if ref == "point": - return np.array([[0.0]]) - - if ref == "interval": - return np.array([[i / 20] for i in range(21)]) - - if ref == "quadrilateral": - return np.array([[i / 15, j / 15] for i in range(16) for j in range(16)]) - if ref == "triangle": - return np.array([[i / 15, j / 15] for i in range(16) for j in range(16 - i)]) - - if ref == "hexahedron": - return np.array( - [[i / 10, j / 10, k / 10] for i in range(11) for j in range(11) for k in range(11)] - ) - if ref == "tetrahedron": - return np.array( - [ - [i / 10, j / 10, k / 10] - for i in range(11) - for j in range(11 - i) - for k in range(11 - i - j) - ] - ) - if ref == "prism": - return np.array( - [[i / 10, j / 10, k / 10] for i in range(11) for j in range(11 - i) for k in range(11)] - ) - if ref == "pyramid": - return np.array( - [ - [i / 10, j / 10, k / 10] - for i in range(11) - for j in range(11) - for k in range(11 - max(i, j)) - ] - ) - - raise ValueError(f"Unsupported cell type: {ref}") - - -def entity_points(ref: str) -> list[list[NDArray[float64]]]: - """Get tabulation points for sub-entities of a reference cell. - - Args: - ref: Reference cell - - Returns: - Set of points - """ - import numpy as np - - r = symfem.create_reference(ref) - out = [] - for d in range(r.tdim): - row = [] - for n in range(r.sub_entity_count(d)): - e = r.sub_entity(d, n) - epts = points(e.name) - row.append( - np.array( - [ - to_array(e.origin) + sum(i * to_array(a) for i, a in zip(p, e.axes)) # type: ignore - for p in epts - ] - ) - ) - out.append(row) - return out - - -def closure_dofs(entity_dofs: list[list[list[int]]], ref: str) -> list[list[list[int]]]: - """Make lists of DOFs associated with the closure of an entity. - - Args: - entity_dofs: Lists of DOFs associated with each entity - ref: Reference cell - - Returns: - Entity closure DOFs - """ - r = symfem.create_reference(ref) - out: list[list[list[int]]] = [[[] for j in i] for i in entity_dofs] - for dim in range(r.tdim + 1): - for e_n, e in enumerate(r.sub_entities(dim)): - for subdim in range(dim + 1): - for se_n, se in enumerate(r.sub_entities(subdim)): - if all(i in e for i in se): - out[dim][e_n] += entity_dofs[subdim][se_n] - return out - - -def same_span(table0: NDArray[float64], table1: NDArray[float64], complete: bool = True) -> bool: - """Check if two tables span the same space. - - Args: - table0: First table - table1: Second table - complete: Should the tables have full rank? - - Returns: - True if span is the same, otherwise False - """ - import numpy as np - - if table0.shape != table1.shape: - return False - - ndofs = table0.shape[-1] - table0 = table0.reshape(-1, ndofs) - table1 = table1.reshape(-1, ndofs) - - rank0 = np.linalg.matrix_rank(table0) - rank1 = np.linalg.matrix_rank(table1) - if complete and rank0 != ndofs: - return False - - if rank0 != rank1: - return False - - stack = np.hstack([table0, table1]) - srank = np.linalg.matrix_rank(stack, tol=1e-8) - return rank0 == srank - - -def verify( - ref: str, - info0: tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]], - info1: tuple[list[list[list[int]]], typing.Callable[[NDArray[float64]], NDArray[float64]]], -) -> tuple[bool, str | None]: - """Run verification. - - Args: - ref: Reference cell - info0: Verification info for first implementation - info1: Verification info for second implementation - - Returns: - (True, None) if verification successful, otherwise False plus a reason - """ - import numpy as np - - edofs0, tab0 = info0 - edofs1, tab1 = info1 - - ecdofs0 = closure_dofs(edofs0, ref) - ecdofs1 = closure_dofs(edofs1, ref) - - # Check the same number of entity DOFs - if len(edofs0) != len(edofs1): - return False, f"Wrong number of entities ({len(edofs0)} vs {len(edofs1)})" - entity_counts = [] - for dim, (i0, i1) in enumerate(zip(edofs0, edofs1)): - if len(i0) != len(i1): - return ( - False, - f"Wrong number of entities of dim {dim} ({len(i0)} vs {len(i1)})", - ) - entity_counts.append(len(i0)) - for e_n, (j0, j1) in enumerate(zip(i0, i1)): - if len(j0) != len(j1): - return False, ( - "Wrong number of DOFs associated with an entity" - f" {dim},{e_n} ({len(j0)} vs {len(j1)})" - ) - - # Check that polysets span the same space - pts = points(ref) - table0 = tab0(pts) - table1 = tab1(pts) - - if table0.shape != table1.shape: - return False, f"Non-matching table shapes ({table0.shape} vs {table1.shape})" - - if not same_span(table0, table1): - return False, "Polysets do not span the same space" - - # Check that continuity will be the same - epoints = entity_points(ref) - for d, epoints_d in enumerate(epoints): - for e, pts in enumerate(epoints_d): - ed0 = ecdofs0[d][e] - if len(ed0) > 0: - ed1 = ecdofs1[d][e] - - not_ed0 = [k for i in edofs0 for j in i for k in j if k not in ed0] - not_ed1 = [k for i in edofs1 for j in i for k in j if k not in ed1] - t0 = tab0(pts)[:, :, not_ed0] - t1 = tab1(pts)[:, :, not_ed1] - if not np.allclose(t0, t1) and not same_span(t0, t1, False): - return False, f"Continuity does not match for ({d},{e})" - - return True, None diff --git a/elements/alfeld-sorokina.def b/elements/alfeld-sorokina.def deleted file mode 100644 index 6c0da49881..0000000000 --- a/elements/alfeld-sorokina.def +++ /dev/null @@ -1,44 +0,0 @@ -name: Alfeld-Sorokina -html-name: Alfeld–Sorokina -complexes: - de-rham: CH,d-1,simplex -ndofs: - triangle: - formula: 15 -entity-ndofs: - vertices: - formula: 3 - edges: - formula: 2 - faces: - formula: 0 -sobolev: H1(div) -mapping: see {{citation::kirby_mapping}} -min-degree: 2 -max-degree: 2 -categories: - - vector - - macro -reference-cells: - - triangle -dofs: - vertices: - - point evaluations in coordinate directions - - point evaulations of divergence - edges: points evaluations in coordinate directions -implementations: - symfem: Alfeld-Sorokina - fiat: AlfeldSorokina -examples: - - triangle,2 -references: - - title: Linear differential operators on bivariate spline spaces and spline vector fields - author: - - Alfeld, Peter - - Sorokina, Tatyana - journal: BIT Numerical Mathematics - volume: 56 - year: 2016 - pagestart: 15 - pageend: 32 - doi: 10.1007/s10543-015-0557-x diff --git a/elements/argyris.def b/elements/argyris.def deleted file mode 100644 index eab7879306..0000000000 --- a/elements/argyris.def +++ /dev/null @@ -1,47 +0,0 @@ -name: Argyris -html-name: Argyris -min-degree: 5 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -reference-cells: - - triangle -polynomial-set: - triangle: poly[k] -dofs: - vertices: - - point evaluations - - point evaluations of first derivatives - - point evaluations of second derivatives - edges: - - normal derivative integral moments with (lagrange,k-5) - - integral moments with (lagrange,k-6) - faces: - - integral moments with (lagrange,k-6) -ndofs: - triangle: - formula: 21+6(k-5)+(k-5)(k-4)/2 -mapping: see {{citation::kirby_mapping}} -sobolev: H2 -implementations: - symfem: Argyris - fiat: Argyris -examples: - - triangle,5 -references: - - title: The TUBA family of plate elements for the matrix displacement method - author: - - Argyris, John H. - - Fried, Isaac - - Scharpf, Dieter W. - year: 1968 - journal: The Aeronautical Journal - volume: 72 - issue: 692 - pagestart: 701 - pageend: 709 - doi: 10.1017/S000192400008489X diff --git a/elements/arnold-boffi-falk.def b/elements/arnold-boffi-falk.def deleted file mode 100644 index 7a1c082c81..0000000000 --- a/elements/arnold-boffi-falk.def +++ /dev/null @@ -1,43 +0,0 @@ -name: Arnold-Boffi-Falk -html-name: Arnold–Boffi–Falk -short-names: - - ABF -polynomial-subdegree: k -polynomial-superdegree: 2k+2 -lagrange-subdegree: k -lagrange-superdegree: k+2 -degree: polynomial-subdegree -categories: - - vector - - Hdiv -reference-cells: - - quadrilateral -polynomial-set: - triangle: [\left\{\left(\begin{array}{c}x^py^q\\0\end{array}\right)\middle|p\leqslant k+2,q\leqslant k\right\}] && [\left\{\left(\begin{array}{c}0\\x^py^q\end{array}\right)\middle|p\leqslant k,q\leqslant k+2\right\}] -dofs: - edges: normal integral moments with (lagrange,k) - faces: - - integral moments with (nedelec1,k) - - integral moments of the divergence with "\(x^{k+1}y^q\) for q=0,1,...,k" - - integral moments of the divergence with "\(x^qy^{k+1}\) for q=0,1,...,k" -implementations: - symfem: ABF -mapping: see {{citation::kirby_mapping}} -sobolev: H(div) -examples: - - quadrilateral,0 - - quadrilateral,1 - - quadrilateral,2 -references: - - title: Quadrilateral H(div) finite elements - author: - - Arnold, Douglas N. - - Boffi, Daniele - - Falk, Richard S. - year: 2005 - journal: SIAM Journal on Numerical Analysis - pagestart: 2429 - pageend: 2451 - volume: 42 - issue: 5 - doi: 10.1137/S0036142903431924 diff --git a/elements/arnold-winther.def b/elements/arnold-winther.def deleted file mode 100644 index 015de80be1..0000000000 --- a/elements/arnold-winther.def +++ /dev/null @@ -1,45 +0,0 @@ -name: Arnold-Winther -html-name: Arnold–Winther -alt-names: - - conforming Arnold–Winther -min-degree: 2 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - matrix -reference-cells: - - triangle -ndofs: - triangle: - formula: (3k^2+11k+14)/2 -polynomial-set: - triangle: [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\right\}] && [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\text{ and }\operatorname{div}\mathbf{M}=0\right\}] -dofs: - vertices: point evaluations of three components - edges: integral moments of normal-normal and normal-tangent inner products with (lagrange,k-1) - faces: - - integral moments of three components with (lagrange,k-2) - - integral moments of tensor dot product with "\(\frac{\partial}{\partial(x, y)}x^2y^2(1-x-y)^2f\) for each degree \(k-3\) polynomial \(f\) in a degree \(k-3\) [Lagrange](element::lagrange) space" -mapping: double contravariant Piola -sobolev: H(div div) -implementations: - symfem: AW - fiat: ArnoldWinther DEGREES=2 DEGREEMAP=k+1 -examples: - - triangle,2 - - triangle,3 -references: - - title: Mixed finite elements for elasticity - author: - - Arnold, Douglas N. - - Winther, Ragnar - year: 2002 - journal: Numerische Mathematik - pagestart: 401 - pageend: 419 - volume: 92 - issue: 3 - doi: 10.1007/s002110100348 diff --git a/elements/bell.def b/elements/bell.def deleted file mode 100644 index 2ab31a43ab..0000000000 --- a/elements/bell.def +++ /dev/null @@ -1,40 +0,0 @@ -name: Bell -html-name: Bell -min-degree: 4 -max-degree: 4 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - scalar -ndofs: - triangle: - formula: 18 -reference-cells: - - triangle -polynomial-set: - triangle: [\left\{p\in{{poly[k]}}\middle|\text{normal derivative of $p$ on each edge is cubic}\right\}] -dofs: - vertices: - - point evaluations - - point evaluations of first derivatives - - point evaluations of second derivatives -mapping: see {{citation::kirby_mapping}} -sobolev: H3 -implementations: - symfem: Bell - fiat: Bell degree=None -examples: - - triangle,4 -references: - - title: A refined triangular plate bending finite element - author: Bell, Kolbein - year: 1969 - journal: International Journal for Numerical Methods in Engineering - volume: 1 - issue: 1 - pagestart: 101 - pageend: 122 - doi: 10.1002/nme.1620010108 diff --git a/elements/bernardi-raugel.def b/elements/bernardi-raugel.def deleted file mode 100644 index 7b06bddc32..0000000000 --- a/elements/bernardi-raugel.def +++ /dev/null @@ -1,53 +0,0 @@ -name: Bernardi-Raugel -html-name: Bernardi–Raugel -min-degree: 1 -max-degree: d-1 -polynomial-subdegree: k -polynomial-superdegree: d -lagrange-subdegree: k -lagrange-superdegree: d -degree: polynomial-subdegree -short-names: - - BR -ndofs: - triangle: - formula: 9 - tetrahedron: - formula: - - k=1: 16 - - k=2: 37 -categories: - - vector -reference-cells: - - triangle - - tetrahedron -polynomial-set: - triangle: poly[k]^d && [\left\{\left(\begin{array}{c}xy\\xy\end{array}\right),\left(\begin{array}{c}y(1-x-y)\\0\end{array}\right),\left(\begin{array}{c}0\\x(1-x-y)\end{array}\right)\right\}] - tetrahedron, \(k=1\): poly[k]^d && [\left\{\left(\begin{array}{c}xyz\\xyz\\xyz\end{array}\right),\left(\begin{array}{c}yz(1-x-y-z)\\0\\0\end{array}\right),\left(\begin{array}{c}0\\xz(1-x-y-z)\\0\end{array}\right),\left(\begin{array}{c}0\\0\\xy(1-x-y-z)\end{array}\right)\right\}] - tetrahedron, \(k=2\): poly[k]^d && [\left\{\left(\begin{array}{c}xyz\\xyz\\xyz\end{array}\right),\left(\begin{array}{c}yz(1-x-y-z)\\0\\0\end{array}\right),\left(\begin{array}{c}0\\xz(1-x-y-z)\\0\end{array}\right),\left(\begin{array}{c}0\\0\\xy(1-x-y-z)\end{array}\right),\left(\begin{array}{c}xyz(1-x-y-z)\\0\\0\end{array}\right),\left(\begin{array}{c}0\\xyz(1-x-y-z)\\0\end{array}\right),\left(\begin{array}{c}0\\0\\xyz(1-x-y-z)\end{array}\right)\right\}] -dofs: - vertices: - - point evaluations in coordinate directions - edges: (if \(k>1\)) point evaluations in coordinate directions at midpoints - facets: - - normal integral moments with (lagrange,0) -mapping: see {{citation::kirby_mapping}} -sobolev: H1 -implementations: - symfem: Bernardi-Raugel - fiat: BernardiRaugel -examples: - - triangle,1 - - tetrahedron,1 - - tetrahedron,2 -references: - - title: Analysis of some finite elements for the Stokes problem - author: - - Bernardi, Christine - - Raugel, Genevivève - pagestart: 71 - pageend: 79 - journal: Mathematics of Computation - volume: 44 - year: 1985 - doi: 10.1090/S0025-5718-1985-0771031-7 diff --git a/elements/bernstein.def b/elements/bernstein.def deleted file mode 100644 index 6f63e1425e..0000000000 --- a/elements/bernstein.def +++ /dev/null @@ -1,68 +0,0 @@ -name: Bernstein -html-name: Bernstein -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -alt-names: - - Bernstein–Bézier -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron -dofs: - vertices: point evaluations - edges: evaluation of Bernstein coefficients - faces: evaluation of Bernstein coefficients - volumes: evaluation of Bernstein coefficients -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] -mapping: identity -sobolev: H1 -implementations: - symfem: Bernstein - fiat: Bernstein -examples: - - interval,1 - - interval,2 - - interval,3 - - triangle,1 - - triangle,2 - - triangle,3 -references: - - title: Bernstein–Bézier finite elements of arbitrary order and optimal assembly procedures - author: - - Ainsworth, Mark - - Andriamaro, Gaelle - - Davydov, Oleg - journal: SIAM Journal on Scientific Computing - volume: 33 - issue: 6 - pagestart: 3087 - pageend: 3109 - year: 2011 - doi: 10.1137/11082539X - - title: Fast simplicial finite element algorithms using Bernstein polynomials - author: Kirby, Robert C. - year: 2011 - journal: Numerische Mathematik - pagestart: 631 - pageend: 652 - volume: 117 - issue: 4 - doi: 10.1007/s00211-010-0327-2 diff --git a/elements/bogner-fox-schmitt.def b/elements/bogner-fox-schmitt.def deleted file mode 100644 index d8998b6d0d..0000000000 --- a/elements/bogner-fox-schmitt.def +++ /dev/null @@ -1,39 +0,0 @@ -name: Bogner-Fox-Schmitt -html-name: Bogner–Fox–Schmitt -min-degree: 3 -max-degree: 3 -polynomial-subdegree: k -polynomial-superdegree: 2k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -ndofs: - quadrilateral: - formula: 16 -reference-cells: - - quadrilateral -polynomial-set: - quadrilateral: qoly[k] -dofs: - vertices: - - point evaluations - - point evaluations of derivatives in coordinate directions - - point evaluation of mixed second derivative -implementations: - symfem: BFS -mapping: see {{citation::kirby_mapping}} -sobolev: H2 -examples: - - quadrilateral,3 -references: - - title: The generation of interelement compatible stiffness and mass matrices by the use of interpolation formulae - author: - - Bogner, F. K. - - Fox, R. L. - - Schmit, L. A. - year: 1965 - journal: Proceedings of the Conference on Matrix Methods in Structural Mechanics - pagestart: 397 - pageend: 444 diff --git a/elements/brezzi-douglas-duran-fortin.def b/elements/brezzi-douglas-duran-fortin.def deleted file mode 100644 index 835716d099..0000000000 --- a/elements/brezzi-douglas-duran-fortin.def +++ /dev/null @@ -1,44 +0,0 @@ -name: Brezzi-Douglas-Duran-Fortin -html-name: Brezzi–Douglas–Durán–Fortin -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: floor(k/3) -lagrange-superdegree: k -degree: polynomial-subdegree -short-names: - - BDDF -categories: - - vector - - Hdiv -reference-cells: - - hexahedron -ndofs: - hexahedron: - formula: (k+1)(k^2+5k+12)/2 -polynomial-set: - hexahedron: poly[k]^d && [\operatorname{span}\left\{\nabla\times(0,0,x^{k+1}y), \nabla\times(0,xz^{k+1},0), \nabla\times(y^{k+1}z,0,0)\right\}] && [\left\{\nabla\times(0,0,xy^{i+1}z^{k-i}), \nabla\times(0,x^{i+1}y^{k-i}z,0), \nabla\times(x^{k-i}yz^{i+1},0,0)\middle|i=1,...,k\right\}] -dofs: - facets: normal integral moments with (lagrange,k) - cell: integral moments with (vector-lagrange,k-2) -mapping: contravariant Piola -sobolev: H(div) -implementations: - symfem: BDDF -min-degree: 1 -examples: - - hexahedron,1 - - hexahedron,2 -references: - - author: - - Brezzi, Franco - - Douglas, Jim - - Durán, Ricardo G. - - Fortin, Michel - title: Mixed finite elements for second order elliptic problems in three variables - doi: 10.1007/BF01396752 - journal: Numerische Mathematik - year: 1987 - volume: 51 - pagestart: 237 - pageend: 250 diff --git a/elements/brezzi-douglas-fortin-marini.def b/elements/brezzi-douglas-fortin-marini.def deleted file mode 100644 index b1174963ec..0000000000 --- a/elements/brezzi-douglas-fortin-marini.def +++ /dev/null @@ -1,88 +0,0 @@ -name: Brezzi-Douglas-Fortin-Marini -html-name: Brezzi–Douglas–Fortin–Marini -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: - triangle: k - tetrahedron: k - quadrilateral: floor((k+1)/d) - hexahedron: floor((k+1)/d) -lagrange-superdegree: k+1 -degree: polynomial-subdegree -short-names: - - BDFM -categories: - - vector - - Hdiv -reference-cells: - - triangle - - quadrilateral - - tetrahedron - - hexahedron -ndofs: - triangle: - formula: k^2+5k+3 - quadrilateral: - formula: (k+1)(k+4) - oeis: A028552 - tetrahedron: - formula: (k+2)(k^2+7k+4)/2 - hexahedron: - formula: (k+1)(k+2)(k+6)/2 -min-degree: 1 -polynomial-set: [\left\{\boldsymbol{p}\in{{poly[k]}}^d\middle|\boldsymbol{p}\cdot\boldsymbol{n}\in{{poly[k-1]}}\text{ on each facet}\right\}] -dofs: - facets: - triangle: normal integral moments with (lagrange,k) - tetrahedron: normal integral moments with (lagrange,k) - quadrilateral: normal integral moments with (dpc,k) - hexahedron: normal integral moments with (dpc,k) - cell: - triangle: integral moments with (nedelec1,k-1) - tetrahedron: integral moments with (nedelec1,k-1) - quadrilateral: integral moments with (vector-dpc,k-1) - hexahedron: integral moments with (vector-dpc,k-1) -mapping: contravariant Piola -sobolev: H(div) -implementations: - symfem: BDFM - fiat: - triangle: BrezziDouglasFortinMarini DEGREES=2 DEGREEMAP=k+1 -examples: - - triangle,0 - - triangle,1 - - quadrilateral,0 - - quadrilateral,1 - - tetrahedron,0 - - tetrahedron,1 - - hexahedron,0 - - hexahedron,1 -references: - - author: - - Brezzi, Franco - - Douglas, Jim - - Fortin, Michel - - Marini, L. Donatella - title: Efficient rectangular mixed finite elements in two and three space variables - doi: 10.1051/m2an/1987210405811 - journal: "ESAIM: Mathematical Modelling and Numerical Analysis" - year: 1987 - volume: 21 - number: 4 - pagestart: 581 - pageend: 604 - - type: incollection - author: - - Brezzi, Franco - - Fortin, Michel - title: Function spaces and finite element approximations - booktitle: Mixed and hybrid finite element methods - editor: - - Brezzi, Franco - - Fortin, Michel - year: 1991 - pagestart: 89 - pageend: 132 - series: Springer Series in Computational Mathematics - volume: 15 - doi: 10.1007/978-1-4612-3172-1_3 diff --git a/elements/brezzi-douglas-marini.def b/elements/brezzi-douglas-marini.def deleted file mode 100644 index 3ac4acdd5a..0000000000 --- a/elements/brezzi-douglas-marini.def +++ /dev/null @@ -1,81 +0,0 @@ -name: Brezzi-Douglas-Marini -html-name: Brezzi–Douglas–Marini -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -short-names: - - BDM -complexes: - de-rham: P,d-1,simplex -categories: - - vector - - Hdiv -reference-cells: - - triangle - - tetrahedron -ndofs: - triangle: - formula: (k+1)(k+2) - oeis: A002378 - tetrahedron: - formula: (k+1)(k+2)(k+3)/2 - oeis: A027480 -variants: - legendre: - variant-name: Legendre - description: Integral moments are taken against orthonormal polynomials - lagrange: - variant-name: Lagrange - description: Integral moments are taken against [Lagrange](element:lagrange) basis functions -sobolev: H(div) -mapping: contravariant Piola -polynomial-set: - triangle: poly[k]^d - tetrahedron: poly[k]^d -dofs: - facets: normal integral moments with (lagrange,k) - cell: integral moments with (nedelec1,k-2) -mapping: contravariant Piola -sobolev: H(div) -implementations: - symfem: - lagrange: N2div - legendre: N2div variant=legendre - basix: - display: BDM - lagrange: BDM - legendre: BDM lagrange_variant=legendre - basix.ufl: - display: BDM - lagrange: BDM lagrange_variant=equispaced - legendre: BDM - fiat: - legendre: BrezziDouglasMarini variant=integral - ferrite: - lagrange: - triangle: BrezziDouglasMarini DEGREES=1 -examples: - - triangle,1,lagrange - - triangle,2,lagrange - - tetrahedron,1,lagrange - - tetrahedron,2,lagrange - - triangle,1,legendre - - triangle,2,legendre - - tetrahedron,1,legendre - - tetrahedron,2,legendre -references: - - title: Two families of mixed finite elements for second order elliptic problems - author: - - Brezzi, Franco - - Douglas, Jim - - Marini, L. Donatella - journal: Numerische Mathematik - volume: 47 - number: 2 - year: 1985 - pagestart: 217 - pageend: 235 - doi: 10.1007/BF01389710 diff --git a/elements/bubble-enriched-lagrange.def b/elements/bubble-enriched-lagrange.def deleted file mode 100644 index e85db6d31c..0000000000 --- a/elements/bubble-enriched-lagrange.def +++ /dev/null @@ -1,32 +0,0 @@ -name: bubble enriched Lagrange -html-name: bubble enriched Lagrange -ndofs: - triangle: - formula: (k+1)^2 - oeis: A000290 -categories: - - scalar -reference-cells: - - triangle -dofs: - vertices: point evaluations - edges: point evaluations - faces: point evaluations -mapping: identity -sobolev: H1 -polynomial-set: - triangle: poly[k] && [\left\{p\in {{poly[k]}}\middle|p=0\text{ on the boundary}\right\}] -implementations: - symfem: bubble enriched Lagrange - ferrite: - triangle: BubbleEnrichedLagrange DEGREES=1 -examples: - - triangle,1 - - triangle,2 -min-degree: 1 -max-degree: 2 -polynomial-subdegree: k -polynomial-superdegree: k+2 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree diff --git a/elements/bubble.def b/elements/bubble.def deleted file mode 100644 index 2f594930c0..0000000000 --- a/elements/bubble.def +++ /dev/null @@ -1,69 +0,0 @@ -name: bubble -html-name: bubble -min-degree: - interval: 2 - triangle: 3 - tetrahedron: 4 -polynomial-subdegree: -1 -polynomial-superdegree: - interval: k - triangle: k - tetrahedron: k - quadrilateral: dk - hexahedron: dk -lagrange-subdegree: -1 -lagrange-superdegree: k -degree: lagrange-superdegree -ndofs: - interval: - formula: k-1 - oeis: A000027 - triangle: - formula: (k-2)(k-1)/2 - oeis: A000217 - tetrahedron: - formula: (k-3)(k-2)(k-1)/6 - oeis: A000292 -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron -dofs: - cell: point evaluations -polynomial-set: - interval: [\left\{p\in {{poly[k]}}\middle|p=0\text{ on the boundary}\right\}] - triangle: [\left\{p\in {{poly[k]}}\middle|p=0\text{ on the boundary}\right\}] - tetrahedron: [\left\{p\in {{poly[k]}}\middle|p=0\text{ on the boundary}\right\}] -mapping: identity -sobolev: H1 -implementations: - symfem: bubble - basix: bubble - basix.ufl: bubble - fiat: Bubble -examples: - - interval,2 - - interval,3 - - triangle,3 - - triangle,4 -references: - - type: incollection - title: Common and unusual finite elements - author: - - Kirby, Robert C. - - Logg, Anders - - Rognes, Marie E. - - Terrel, Andy R. - booktitle: Automated solution of differential equations by the finite element method - editor: - - Logg, Anders - - Mardal, Kent-Andre - - Wells, Garth N. - year: 2012 - pagestart: 95 - pageend: 119 - series: Lecture Notes in Computational Science and Engineering - volume: 84 - doi: 10.1007/978-3-642-23099-8_3 diff --git a/elements/buffa-christiansen.def b/elements/buffa-christiansen.def deleted file mode 100644 index 27d384faac..0000000000 --- a/elements/buffa-christiansen.def +++ /dev/null @@ -1,38 +0,0 @@ -name: Buffa-Christiansen -html-name: Buffa–Christiansen -short-names: - - BC -ndofs: - dual polygon(n): - formula: n -min-degree: 0 -max-degree: 0 -categories: - - vector - - Hdiv -reference-cells: - - dual polygon -implementations: - symfem: BC - bempp-cl: BC -mapping: contravariant Piola -sobolev: H(div) -examples: - - dual polygon(4),0 - - dual polygon(5),0 - - dual polygon(6),0 -notes: - - These elements are defined on the [barycentric dual grid](barycentric-dual-grid.md). - - These elements are defined as a linear combination of [Raviart-Thomas](element::raviart-thomas) basis functions on the fine grid. -references: - - author: - - Buffa, Annalisa - - Christiansen, Snorre H. - title: A dual finite element complex on the barycentric refinement - journal: Mathematics of Computation - volume: 76 - number: 260 - year: 2007 - pagestart: 1743 - pageend: 1769 - doi: 10.1090/S0025-5718-07-01965-5 diff --git a/elements/conforming-crouzeix-raviart.def b/elements/conforming-crouzeix-raviart.def deleted file mode 100644 index abb2871e17..0000000000 --- a/elements/conforming-crouzeix-raviart.def +++ /dev/null @@ -1,44 +0,0 @@ -name: conforming Crouzeix-Raviart -html-name: conforming Crouzeix–Raviart -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -short-names: - - conforming CR -categories: - - scalar -ndofs: - triangle: - formula: k(k+5)/2 -reference-cells: - - triangle -polynomial-set: - triangle: poly[k] && [\left\{x^iy^{k-i}(x+y)\middle|i=1,...,k-1\right\}] -mapping: identity -sobolev: L2 -dofs: - vertices: points evaluation - edges: point evaluations - faces: point evaluations -implementations: - symfem: conforming Crouzeix-Raviart -examples: - - triangle,1 - - triangle,2 - - triangle,3 - - triangle,4 - - triangle,5 -references: - - title: Conforming and nonconforming finite element methods for solving the stationary Stokes equations - author: - - Crouzeix, Michel - - Raviart, Pierre-Arnaud - year: 1973 - journal: Revue Française d'Automatique, Informatique et Recherche Opérationnelle - volume: 3 - pagestart: 33 - pageend: 75 - doi: 10.1051/m2an/197307R300331 diff --git a/elements/crouzeix-falk.def b/elements/crouzeix-falk.def deleted file mode 100644 index ef6d4593d1..0000000000 --- a/elements/crouzeix-falk.def +++ /dev/null @@ -1,41 +0,0 @@ -name: Crouzeix-Falk -html-name: Crouzeix–Falk -min-degree: 3 -max-degree: 3 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -short-names: - - CF -categories: - - scalar -ndofs: - triangle: - formula: 10 -reference-cells: - - triangle -polynomial-set: - triangle: poly[k] -mapping: identity -sobolev: L2 -dofs: - facets: point evaluation at three points - cell: point evaluation at midpoint -implementations: - symfem: Crouzeix-Falk -examples: - - triangle,3 -references: - - title: Nonconforming finite elements for the Stokes problem - author: - - Crouzeix, Michel - - Falk, Richard S. - year: 1989 - journal: Mathematics of Computation - volume: 52 - number: 186 - pagestart: 437 - pageend: 456 - doi: 10.2307/2008475 diff --git a/elements/crouzeix-raviart.def b/elements/crouzeix-raviart.def deleted file mode 100644 index 0784d199eb..0000000000 --- a/elements/crouzeix-raviart.def +++ /dev/null @@ -1,97 +0,0 @@ -name: Crouzeix-Raviart -html-name: Crouzeix–Raviart -alt-names: - - Rannachker–Turek (quadrilateral, hexahedron) -legacy-names: - - rannacher-turek -min-degree: 1 -max-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: - triangle: k - tetrahedron: k - quadrilateral: k+1 - hexahedron: k+1 -lagrange-subdegree: - triangle: k - tetrahedron: k - quadrilateral: k-1 - hexahedron: k-1 -lagrange-superdegree: - triangle: k - tetrahedron: k - quadrilateral: k+1 - hexahedron: k+1 -degree: polynomial-subdegree -alt-names: - - non-conforming Crouzeix–Raviart -short-names: - - CR -categories: - - scalar -ndofs: - triangle: - formula: 3 - tetrahedron: - formula: 4 - quadrilateral: - formula: 4 - hexahedron: - formula: 6 -reference-cells: - - triangle - - tetrahedron - - quadrilateral - - hexahedron -mapping: identity -sobolev: L2 -polynomial-set: - triangle: poly[k] - tetrahedron: poly[k] - quadrilateral: poly[k] && [\operatorname{span}\left\{(x_1+x_2)(x_1-x_2)\right\}] - hexahedron: poly[k] && [\operatorname{span}\left\{(x_1+x_2)(x_1-x_2),(x_2+x_3)(x_2-x_3))\right\}] -dofs: - facets: point evaluation at midpoint -implementations: - symfem: - triangle: Crouzeix-Raviart - tetrahedron: Crouzeix-Raviart - quadrilateral: Rannacher-Turek - hexahedron: Rannacher-Turek - basix: CR - basix.ufl: CR - fiat: - triangle: CrouzeixRaviart - tetrahedron: CrouzeixRaviart - ferrite: - triangle: CrouzeixRaviart - tetrahedron: CrouzeixRaviart - quadrilateral: RannacherTurek - hexahedron: RannacherTurek -examples: - - triangle,1 - - tetrahedron,1 - - quadrilateral,1 - - hexahedron,1 -references: - - title: Conforming and nonconforming finite element methods for solving the stationary Stokes equations - author: - - Crouzeix, Michel - - Raviart, Pierre-Arnaud - year: 1973 - journal: Revue Française d'Automatique, Informatique et Recherche Opérationnelle - volume: 3 - pagestart: 33 - pageend: 75 - doi: 10.1051/m2an/197307R300331 - - title: Simple nonconforming quadrilateral Stokes element - author: - - Rannacher, Rolf - - Turek, Stefan - year: 1992 - journal: Numerical methods for partial differential equations - volume: 8 - number: 2 - pagestart: 97 - pageend: 111 - doi: 10.1002/num.1690080202 diff --git a/elements/direct-serendipity.def b/elements/direct-serendipity.def deleted file mode 100644 index 1dc958a77a..0000000000 --- a/elements/direct-serendipity.def +++ /dev/null @@ -1,27 +0,0 @@ -name: direct serendipity -html-name: direct serendipity -min-degree: 1 -categories: - - scalar -reference-cells: - - quadrilateral -implementations: - symfem: direct serendipity -mapping: identity -sobolev: H1 -examples: - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 -references: - - title: Direct serendipity and mixed finite elements on convex quadrilaterals - author: - - Arbogast, Todd - - Tao, Zhong - - Wang, Chuning - journal: Numerische Mathematik - year: 2022 - doi: 110.1007/s00211-022-01274-3 - volume: 150 - pagestart: 929 - pageend: 974 diff --git a/elements/discontinuous-lagrange.def b/elements/discontinuous-lagrange.def deleted file mode 100644 index ea80d9c1f6..0000000000 --- a/elements/discontinuous-lagrange.def +++ /dev/null @@ -1,204 +0,0 @@ -name: discontinuous Lagrange -html-name: discontinuous Lagrange -alt-names: - - discontinuous Galerkin -short-names: - - DP - - DQ (quadrilateral and hexahedron) - - DG -variants: - equispaced: - description: The variant has its point evaluations at equally spaced points. - variant-name: equispaced - gll: - description: This variant has its point evaluations at GLL points. - variant-name: GLL - names: - - discontinuous Gauss–Lobatto–Legendre - short-names: - - discontinuous GLL - gl: - description: This variant has its point evaluations at GL points. - variant-name: GL - names: - - Gauss–Legendre - short-names: - - GL - legendre: - description: The basis functions of this variant are orthonormal Legendre polynomials. - variant-name: Legendre - names: - - Legendre -complexes: - de-rham: - - P-,d,simplex - - P,d,simplex - - Q-,d,tp - - TNT,d,tp -sobolev: L2 -mapping: L2 Piola -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 - quadrilateral: - formula: (k+1)^2 - oeis: A000290 - hexahedron: - formula: (k+1)^3 - oeis: A000578 - prism: - formula: (k+1)^2(k+2)/2 - oeis: A002411 - pyramid: - formula: (k+1)(k+2)(2k+3)/6 - oeis: A000330 -entity-ndofs: - cells: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 - quadrilateral: - formula: (k+1)^2 - oeis: A000290 - hexahedron: - formula: (k+1)^3 - oeis: A000578 - prism: - formula: (k+1)^2(k+2)/2 - oeis: A002411 - pyramid: - formula: (k+1)(k+2)(2k+3)/6 - oeis: A000330 -min-degree: 0 -polynomial-subdegree: k -polynomial-superdegree: - interval: k - triangle: k - tetrahedron: k - quadrilateral: dk - hexahedron: dk - prism: 2k - pyramid: none -lagrange-subdegree: k -lagrange-superdegree: k -degree: lagrange-superdegree -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron - - quadrilateral - - hexahedron - - prism - - pyramid -dofs: - vertices: point evaluations - edges: point evaluations - faces: point evaluations - volumes: point evaluations -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] - quadrilateral: qoly[k] - hexahedron: qoly[k] - prism: [\operatorname{span}\left\{x_1^{p_1}x_2^{p_2}x_3^{p_3}\middle|\max(p_1+p_2,p_3)\leqslant k\right\}] - pyramid: poly[k] && [\operatorname{span}\left\{\frac{x_1^{p_1}x_2^{p_2}}{(1-x_3)^{\min(p_1,p_2)}}\middle|(p_1,p_2)=(1,k)\text{ or }(p_1,p_2)=(k,1)\text{ or }p_1\leqslant k-1,p_2\leqslant k-1,k+1\leqslant p_1+p_2\right\}] -implementations: - symfem: - equispaced: discontinuous Lagrange - gll: - interval: discontinuous Lagrange variant=gll - quadrilateral: discontinuous Q variant=gll - hexahedron: discontinuous Q variant=gll - gl: - interval: discontinuous Lagrange variant=gl - quadrilateral: discontinuous Q variant=gl - hexahedron: discontinuous Q variant=gl - legendre: discontinuous Lagrange variant=legendre - basix: - display: P - equispaced: - interval: P lagrange_variant=equispaced discontinuous=True - triangle: P lagrange_variant=equispaced discontinuous=True - quadrilateral: P lagrange_variant=equispaced discontinuous=True - tetrahedron: P lagrange_variant=equispaced discontinuous=True - hexahedron: P lagrange_variant=equispaced discontinuous=True - prism: P lagrange_variant=equispaced discontinuous=True - gll: - interval: P lagrange_variant=gll_warped discontinuous=True - quadrilateral: P lagrange_variant=gll_warped discontinuous=True - hexahedron: P lagrange_variant=gll_warped discontinuous=True - basix.ufl: - display: P - equispaced: - interval: P lagrange_variant=equispaced discontinuous=True - triangle: P lagrange_variant=equispaced discontinuous=True - quadrilateral: P lagrange_variant=equispaced discontinuous=True - tetrahedron: P lagrange_variant=equispaced discontinuous=True - hexahedron: P lagrange_variant=equispaced discontinuous=True - prism: P lagrange_variant=equispaced discontinuous=True - gll: - interval: P lagrange_variant=gll_warped discontinuous=True - quadrilateral: P lagrange_variant=gll_warped discontinuous=True - hexahedron: P lagrange_variant=gll_warped discontinuous=True - bempp-cl: - equispaced: - triangle: DP DEGREES=0,1 - fiat: - equispaced: - interval: DiscontinuousLagrange - triangle: DiscontinuousLagrange - tetrahedron: DiscontinuousLagrange - ndelement: - equispaced: - interval: Lagrange continuity=Discontinuous - triangle: Lagrange continuity=Discontinuous - quadrilateral: Lagrange continuity=Discontinuous - tetrahedron: Lagrange continuity=Discontinuous - hexahedron: Lagrange continuity=Discontinuous - ferrite: - equispaced: - interval: DiscontinuousLagrange DEGREES=0:3 - triangle: DiscontinuousLagrange DEGREES=0:6 - tetrahedron: DiscontinuousLagrange DEGREES=0:5 - quadrilateral: DiscontinuousLagrange DEGREES=0:4 - hexahedron: DiscontinuousLagrange DEGREES=0:4 - prism: DiscontinuousLagrange DEGREES=0:3 - pyramid: DiscontinuousLagrange DEGREES=0:3 -examples: - - interval,0,equispaced - - interval,1,equispaced - - interval,2,equispaced - - triangle,0,equispaced - - triangle,1,equispaced - - triangle,2,equispaced - - quadrilateral,0,equispaced - - quadrilateral,1,equispaced - - quadrilateral,2,equispaced - - tetrahedron,0,equispaced - - tetrahedron,1,equispaced - - tetrahedron,2,equispaced - - hexahedron,0,equispaced - - hexahedron,1,equispaced - - hexahedron,2,equispaced - - prism,0,equispaced - - prism,1,equispaced - - prism,2,equispaced - - pyramid,0,equispaced - - pyramid,1,equispaced - - pyramid,2,equispaced diff --git a/elements/dpc.def b/elements/dpc.def deleted file mode 100644 index e7fdd62793..0000000000 --- a/elements/dpc.def +++ /dev/null @@ -1,53 +0,0 @@ -name: dPc -html-name: dPc -alt-names: - - discontinuous polynomial cubical -complexes: - de-rham: - - S,d,tp - - S-,d,tp -ndofs: - interval: - formula: k+1 - oeis: A000027 - quadrilateral: - formula: (k+1)(k+2)/2 - oeis: A000217 - hexahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 -mapping: L2 Piola -sobolev: L2 -categories: - - scalar -reference-cells: - - interval - - quadrilateral - - hexahedron -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: floor(k/d) -lagrange-superdegree: k -degree: polynomial-subdegree -dofs: - cell: point evaluations -polynomial-set: - interval: poly[k] - quadrilateral: poly[k] - hexahedron: poly[k] -implementations: - symfem: dPc - basix: - quadrilateral: DPC dpc_variant=simplex_equispaced discontinuous=True - hexahedron: DPC dpc_variant=simplex_equispaced discontinuous=True - basix.ufl: - quadrilateral: DPC dpc_variant=simplex_equispaced discontinuous=True - hexahedron: DPC dpc_variant=simplex_equispaced discontinuous=True - fiat: DPC -examples: - - interval,1 - - interval,2 - - interval,3 - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 diff --git a/elements/dual.def b/elements/dual.def deleted file mode 100644 index 2385a6dcbe..0000000000 --- a/elements/dual.def +++ /dev/null @@ -1,41 +0,0 @@ -name: dual polynomial -html-name: dual polynomial -short-names: - - dual -ndofs: - dual polygon(n): - formula: - - k=0: 1 - - k=1: n -max-degree: 1 -categories: - - scalar -reference-cells: - - dual polygon -implementations: - symfem: dual - bempp-cl: DUAL DEGREES=0,1 -mapping: identity -sobolev: - n=0: L2 - n=1: H1 -examples: - - dual polygon(6),0 - - dual polygon(4),1 - - dual polygon(5),1 - - dual polygon(6),1 -notes: - - These elements are defined on the [barycentric dual grid](barycentric-dual-grid.md). - - These elements are defined as a linear combination of [Lagrange](element::lagrange) basis functions on the fine grid. -references: - - author: - - Buffa, Annalisa - - Christiansen, Snorre H. - title: A dual finite element complex on the barycentric refinement - journal: Mathematics of Computation - volume: 76 - number: 260 - year: 2007 - pagestart: 1743 - pageend: 1769 - doi: 10.1016/j.crma.2004.12.022 diff --git a/elements/enriched-galerkin.def b/elements/enriched-galerkin.def deleted file mode 100644 index ea1eee0e7c..0000000000 --- a/elements/enriched-galerkin.def +++ /dev/null @@ -1,73 +0,0 @@ -name: enriched Galerkin -html-name: enriched Galerkin -notes: - - This is a continuous [Lagrange](element::lagrange) element enriched with a discontinuous piecewise constant element. -short-names: - - EG -sobolev: L2 -mapping: identity -ndofs: - interval: - formula: k+2 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 + 1 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 + 1 - quadrilateral: - formula: (k+1)^2 + 1 - hexahedron: - formula: (k+1)^3 + 1 - prism: - formula: (k+1)^2(k+2)/2 + 1 - pyramid: - formula: (k+1)(k+2)(2k+3)/6 + 1 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: - interval: k - triangle: k - tetrahedron: k - quadrilateral: dk - hexahedron: dk -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron - - quadrilateral - - hexahedron - - prism - - pyramid -implementations: - symfem: - interval: EG - triangle: EG - tetrahedron: EG - quadrilateral: EG - hexahedron: EG -examples: - - interval,1 - - interval,2 - - triangle,1 - - triangle,2 - - quadrilateral,1 - - quadrilateral,2 - - tetrahedron,1 - - tetrahedron,2 - - hexahedron,1 - - hexahedron,2 -references: - - type: unpublished - title: A reduced P1-discontinuous Galerkin method - author: - - Becker, Roland - - Burman, Erik - - Hansbo, Peter - - Larson, Mats G. - howpublished: Chalmers Finite Element Center Preprint 2003-13, Chalmers University of Technology, Göteborg, Sweden, - year: 2003 diff --git a/elements/fortin-soulie.def b/elements/fortin-soulie.def deleted file mode 100644 index a4153666c4..0000000000 --- a/elements/fortin-soulie.def +++ /dev/null @@ -1,41 +0,0 @@ -name: Fortin-Soulie -html-name: Fortin–Soulie -min-degree: 2 -max-degree: 2 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -short-names: - - FS -categories: - - scalar -ndofs: - triangle: - formula: 6 -reference-cells: - - triangle -polynomial-set: - triangle: poly[k] -mapping: identity -sobolev: L2 -dofs: - facets: point evaluation at two points (but only one point on one of the edges) - cell: point evaluation at midpoint -implementations: - symfem: Fortin-Soulie -examples: - - triangle,2 -references: - - title: A non‐conforming piecewise quadratic finite element on triangles - author: - - Fortin, Michel - - Soulie, M. - year: 1983 - journal: International Journal for Numerical Methods in Engineering - volume: 19 - number: 4 - pagestart: 505 - pageend: 520 - doi: 10.1002/nme.1620190405 diff --git a/elements/gauss-legendre.def b/elements/gauss-legendre.def deleted file mode 100644 index 5e7cddc325..0000000000 --- a/elements/gauss-legendre.def +++ /dev/null @@ -1,41 +0,0 @@ -name: Gauss-Legendre -html-name: Gauss–Legendre -categories: - - scalar -polynomial-subdegree: k -polynomial-superdegree: dk -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -reference-cells: - - interval - - quadrilateral - - hexahedron -ndofs: - interval: - formula: k+1 - oeis: A000027 - quadrilateral: - formula: (k+1)^2 - oeis: A000290 - hexahedron: - formula: (k+1)^3 - oeis: A000578 -dofs: - vertices: point evaluations - edges: point evaluations at Gauss–Legendre points - faces: point evaluations at Gauss–Legendre points - volumes: point evaluations at Gauss–Legendre points -mapping: identity -sobolev: H1 -polynomial-set: - interval: qoly[k] - quadrilateral: qoly[k] - hexahedron: qoly[k] -implementations: - symfem: Lagrange variant=legendre -examples: - - interval,1 - - interval,2 - - quadrilateral,1 - - quadrilateral,2 diff --git a/elements/gopalakrishnan-lederer-schoberl.def b/elements/gopalakrishnan-lederer-schoberl.def deleted file mode 100644 index 78bf281fbe..0000000000 --- a/elements/gopalakrishnan-lederer-schoberl.def +++ /dev/null @@ -1,49 +0,0 @@ -name: Gopalakrishnan-Lederer-Schoberl -html-name: Gopalakrishnan–Lederer–Schöberl -min-degree: 0 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - matrix -reference-cells: - - triangle -ndofs: - triangle: - formula: 2(k+1)(k+2) - oeis: A046092 - tetrahedron: - formula: 3(k+1)(k+2)(k+3)/2 -polynomial-set: poly[k]^dd -dofs: - facets: integral moments of inner products of tangent(s) and normal to facet with (lagrange,k) - cell: - - integral moments of matrix trace with (lagrange,k) - - integral moments of tensor products against zero normal-tangent trace bubble with (lagrange,k-1) -sobolev: H(curl div) -mapping: covariant-contravariant Piola -implementations: - symfem: Gopalakrishnan-Lederer-Schoberl - fiat: GopalakrishnanLedererSchoberlFirstKind DEGREEMAP=k+1 -examples: - - triangle,0 - - triangle,1 - - triangle,2 - - tetrahedron,0 - - tetrahedron,1 -references: - - title: A mass conserving mixed stress formulation for Stokes flow with weakly imposed stress symmetry - author: - - Gopalakrishnan, Jay - - Lederer, Philip L. - - Schöberl, Joachim - journal: SIAM Journal on Numerical Analysis - volume: 58 - issue: 1 - pagestart: 706 - pageend: 732 - year: 2020 - doi: 10.1137/19M1248960 - diff --git a/elements/guzman-neilan.def b/elements/guzman-neilan.def deleted file mode 100644 index ae500e6296..0000000000 --- a/elements/guzman-neilan.def +++ /dev/null @@ -1,55 +0,0 @@ -name: Guzman-Neilan (first kind) -html-name: Guzmán–Neilan (first kind) -alt-names: - - Guzmán–Neilan -min-degree: 1 -max-degree: d-1 -polynomial-subdegree: k -polynomial-superdegree: d -lagrange-subdegree: k -lagrange-superdegree: d -degree: polynomial-subdegree -short-names: - - GN -ndofs: - triangle: - formula: 9 - tetrahedron: - formula: - - k=1: 16 - - k=2: 34 -categories: - - vector - - macro -reference-cells: - - triangle - - tetrahedron -dofs: - vertices: - - point evaluations in coordinate direcions - edges: (if \(k>1\)) point evaluations in coordinate directions at midpoints - facets: - - normal integral moments with (lagrange,0) -mapping: contravariant Piola -sobolev: H1 -notes: - - This element is a modification of the [Bernardi–Raugel](element::bernardi-raugel) element with the facet bubbles modified to be divergence free. -implementations: - symfem: Guzman-Neilan first kind - fiat: GuzmanNeilanFirstKindH1 -examples: - - triangle,1 - - tetrahedron,1 - - tetrahedron,2 -references: - - title: Inf-sup stable finite elements on barycentric refinements producing divergence-free approximations in arbitrary dimensions - author: - - Guzmán, Johnny - - Neilan, Michael - pagestart: 2826 - pageend: 2844 - journal: SIAM Journal on Numerical Analysis - volume: 56 - number: 5 - year: 2018 - doi: 10.1137/17M1153467 diff --git a/elements/guzman-neilan2.def b/elements/guzman-neilan2.def deleted file mode 100644 index 245008bacd..0000000000 --- a/elements/guzman-neilan2.def +++ /dev/null @@ -1,48 +0,0 @@ -name: Guzman-Neilan (second kind) -html-name: Guzmán–Neilan (second kind) -min-degree: 1 -max-degree: - triangle: 1 - tetrahedron: 2 -ndofs: - triangle: - formula: 11 - tetrahedron: - formula: - - k=1: 19 - - k=2: 49 -categories: - - vector - - macro -reference-cells: - - triangle - - tetrahedron -dofs: - vertices: point evaluations in coordinate directions - edges: (if \(k>1\)) point evaluations in coordinate directions at midpoints - facets: - - normal integral moments with (lagrange,0) - cell: - - point evaluations in coordinate directions at the midpoint - - (if \(k>1\)) point evaluations in coordinate directions at midpoints of internal edges -mapping: contravariant Piola -sobolev: H1 -implementations: - symfem: Guzman-Neilan second kind - fiat: GuzmanNeilanSecondKindH1 -examples: - - triangle,1 - - tetrahedron,1 - - tetrahedron,2 -references: - - title: Inf-sup stable finite elements on barycentric refinements producing divergence-free approximations in arbitrary dimensions - author: - - Guzmán, Johnny - - Neilan, Michael - pagestart: 2826 - pageend: 2844 - journal: SIAM Journal on Numerical Analysis - volume: 56 - number: 5 - year: 2018 - doi: 10.1137/17M1153467 diff --git a/elements/hellan-herrmann-johnson.def b/elements/hellan-herrmann-johnson.def deleted file mode 100644 index 6bd3ba9db8..0000000000 --- a/elements/hellan-herrmann-johnson.def +++ /dev/null @@ -1,60 +0,0 @@ -name: Hellan-Herrmann-Johnson -html-name: Hellan–Herrmann–Johnson -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - matrix -reference-cells: - - triangle - - tetrahedron -ndofs: - triangle: - formula: 3(k+1)(k+2)/2 - oeis: A045943 -polynomial-set: [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\right\}] -dofs: - facets: integral moments of inner products of normal with (lagrange,k) - cell: - triangle: integrals against tensor products with symmetric matrices whose entries are in (lagrange,k-1) - tetrahedron: - - integrals against tensor products with symmetric matrices whose entries are in (lagrange,k-1) - - integrals against tensor products with the matrices \(\frac12(\boldsymbol{n}_1\boldsymbol{n}_2^{\text{t}}+\boldsymbol{n}_2\boldsymbol{n}_1^{\text{t}})\) and \(\frac12(\boldsymbol{n}_2\boldsymbol{n}_3^{\text{t}}+\boldsymbol{n}_3\boldsymbol{n}_2^{\text{t}})\) multiplied by degree \(k\) polynomials -sobolev: H(div div) -mapping: double contravariant Piola -implementations: - symfem: HHJ - fiat: HellanHerrmannJohnson - basix: HHJ - basix.ufl: HHJ -examples: - - triangle,0 - - triangle,1 - - triangle,2 - - tetrahedron,0 - - tetrahedron,1 - - tetrahedron,2 -references: - - title: The Hellan–Herrmann–Johnson method with curved elements - author: - - Arnold, Douglas N. - - Walker, Shawn W. - year: 2020 - journal: SIAM Journal on Numberical Analysis - volume: 58 - issue: 5 - pagestart: 2829 - pageend: 2855 - doi: 10.1137/19M1288723 - - title: An analysis of the TDNNS method using natural norms - author: - - Pechstein, Astrid S. - - Schöberl, Joachim - journal: Numerische Mathematik - year: 2018 - volume: 139 - pagestart: 92 - pageend: 120 - doi: 10.1007/s00211-017-0933-3 diff --git a/elements/hermite.def b/elements/hermite.def deleted file mode 100644 index 691d2c8fe2..0000000000 --- a/elements/hermite.def +++ /dev/null @@ -1,55 +0,0 @@ -name: Hermite -html-name: Hermite -min-degree: 3 -max-degree: 3 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -ndofs: - interval: - formula: 4 - triangle: - formula: 10 - tetrahedron: - formula: 20 -reference-cells: - - interval - - triangle - - tetrahedron -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] -mapping: see {{citation::kirby_mapping}} -sobolev: H1 -notes: - - The derivatives of the basis functions are continuous between cells at the vertices of the element -dofs: - vertices: - - point evaluations - - point evaluations of derivatives in coordinate directions - faces: point evaluations at midpoints -implementations: - symfem: Hermite - basix: Hermite - fiat: CubicHermite -examples: - - interval,3 - - triangle,3 - - tetrahedron,3 -references: - - title: Interpolation theory over curved elements, with applications to finite element methods - author: - - Ciarlet, Philippe G. - - Raviart, Pierre-Arnaud - year: 1972 - journal: Computer Methods in Applied Mechanics and Engineering - volume: 1 - issue: 2 - pagestart: 217 - pageend: 249 - doi: 10.1016/0045-7825(72)90006-0 diff --git a/elements/hsieh-clough-tocher.def b/elements/hsieh-clough-tocher.def deleted file mode 100644 index b4e5c45f90..0000000000 --- a/elements/hsieh-clough-tocher.def +++ /dev/null @@ -1,60 +0,0 @@ -name: Hsieh-Clough-Tocher -html-name: Hsieh–Clough–Tocher -alt-names: - - Clough–Tocher -short-names: - - HCT - - CT -complexes: - de-rham: CH,0,simplex -min-degree: 3 -dofs: - vertices: - - point evaluations - - point evaluations of first derivatives - edges: - - normal derivative integral moments with (lagrange,k-3) - - integral moments with (lagrange,k-4) - faces: - - integral moments with (lagrange,k-4) -ndofs: - triangle: - formula: 12+6(k-3)+(k-3)(k-2)/2 -sobolev: H2 -mapping: identity -categories: - - scalar - - macro -reference-cells: - - triangle -implementations: - symfem: HCT - fiat: HsiehCloughTocher -examples: - - triangle,3 -references: - - title: Finite element stiffness matrices for analysis of plate bending - author: - - Clough, Ray W. - - Tocher, James L. - journal: Proceedings of the First Conference on Matrix Methods in Structural Mechanics - year: 1965 - pagestart: 515 - pageend: 546 - - title: Interpolation error estimates for the reduced Hsieh–Clough–Tocher triangle - author: Ciarlet, Philippe G. - journal: Mathematics of Computation - volume: 32 - year: 1978 - pagestart: 335 - pageend: 344 - doi: 10.1090/S0025-5718-1978-0482249-1 - - title: Generalized C1 Clough–Tocher splines for CAGD and FEM - author: - - Grošelj, Jan - - Knez, Marjeta - journal: Computer Methods in Applied Mechanics and Engineering - volume: 395 - year: 2022 - pagestart: 114983 - doi: 10.1016/j.cma.2022.114983 diff --git a/elements/huang-zhang.def b/elements/huang-zhang.def deleted file mode 100644 index c23a235751..0000000000 --- a/elements/huang-zhang.def +++ /dev/null @@ -1,55 +0,0 @@ -name: Huang-Zhang -html-name: Huang–Zhang -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: 2k+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -alt-names: - - \(Q_{k+1,k}\times Q_{k,k+1}\) -short-names: - - HZ -ndofs: - quadrilateral: - formula: 2(k+1)(k+2) - oeis: A046092 -categories: - - vector - - Hdiv -sobolev: H(div) -mapping: contravariant Piola -reference-cells: - - quadrilateral -polynomial-set: - quadrilateral: [\operatorname{span}\left\{\left(\begin{array}{c}x^iy^j\\0\end{array}\right)\middle|i\in\{0,1,...,k+1\}, j\in\{0,1,...,k\}\right\}] && [\operatorname{span}\left\{\left(\begin{array}{c}0\\x^iy^j\end{array}\right)\middle|i\in\{0,1,...,k\}, j\in\{0,1,...,k+1\}\right\}] -dofs: - facets: - - normal integral moments with (lagrange,k) - - tangent integral moments with (lagrange,k-1) - cell: integral moments with "\(\left\{\left(\begin{array}{c}x^iy^j\\0\end{array}\right)\middle|i\in\{0,1,...,k\}, j\in\{0,1,...,k-1\}\right\}\cup\left\{\left(\begin{array}{c}x^iy^j\\0\end{array}\right)\middle|i\in\{0,1,...,k-1\}, j\in\{0,1,...,k\}\right\}\)" -implementations: - symfem: HZ -examples: - - quadrilateral,1 - - quadrilateral,2 -references: - - title: A family of \(Q_{k+1,k}\times Q+{k,k+1}\) divergence-free finite elements on rectangular grids - author: Zhang, Shangyou - year: 2009 - journal: SIAM journal on numerical analysis - volume: 47 - issue: 3 - pagestart: 2090 - pageend: 2107 - doi: 10.1137/080728949 - - title: A lowest order divergence-free finite element on rectangular grids - author: - - Huang, Yunqing - - Zhang, Shangyou - year: 2011 - journal: Frontiers of mathematics in China - volume: 6 - pagestart: 253 - pageend: 270 - doi: 10.1007/s11464-011-0094-0 diff --git a/elements/johnson-mercier.def b/elements/johnson-mercier.def deleted file mode 100644 index 7135f9fa9e..0000000000 --- a/elements/johnson-mercier.def +++ /dev/null @@ -1,44 +0,0 @@ -name: Johnson-Mercier -html-name: Johnson–Mercier -alt-names: - - Johnson–Mercier–Křížek -min-degree: 1 -max-degree: 1 -categories: - - matrix - - macro -reference-cells: - - triangle - - tetrahedron -ndofs: - triangle: - formula: 15 - tetrahedron: - formula: 42 -dofs: - facets: integral moments of normal-normal and normal-tangent inner products with (lagrange,1) - cell: integral moments of d(d+1)/2 components with (lagrange,0) -mapping: double contravariant Piola -sobolev: H(div div) -implementations: - fiat: JohnsonMercier -references: - - title: Some equilibrium finite element methods for two-dimensional elasticity problems - author: - - Johnson, Claes - - Mercier, Bertrand - year: 1978 - journal: Numerische Mathematik - pagestart: 103 - pageend: 116 - volume: 30 - issue: 1 - doi: 10.1007/BF01403910 - - title: An equilibrium finite element method in three-dimensional elasticity - author: Křížek, Michal - year: 1982 - journal: Aplikace Matematiky - pagestart: 46 - pageend: 75 - volume: 27 - issue: 1 diff --git a/elements/kong-mulder-veldhuizen.def b/elements/kong-mulder-veldhuizen.def deleted file mode 100644 index 1b72d998f9..0000000000 --- a/elements/kong-mulder-veldhuizen.def +++ /dev/null @@ -1,31 +0,0 @@ -name: Kong-Mulder-Veldhuizen -html-name: Kong–Mulder–Veldhuizen -short-names: - - KMV -categories: - - scalar -reference-cells: - - triangle - - tetrahedron -polynomial-subdegree: k -lagrange-subdegree: k -degree: polynomial-subdegree -implementations: - symfem: KMV - fiat: KongMulderVeldhuizen -examples: - - triangle,1 - - triangle,2 - - tetrahedron,1 -references: - - title: Higher-order triangular and tetrahedral finite elements with mass lumping for solving the wave equation - author: - - Chin-Joe-Kong, M. J. S. - - Mulder, Wim A. - - Van Veldhuizen, M. - year: 1999 - journal: Journal of Engineering Mathematics - volume: 35 - pagestart: 405 - pageend: 426 - doi: 10.1023/A:1004420829610 diff --git a/elements/lagrange.def b/elements/lagrange.def deleted file mode 100644 index da67b65526..0000000000 --- a/elements/lagrange.def +++ /dev/null @@ -1,210 +0,0 @@ -name: Lagrange -html-name: Lagrange -legacy-names: - - q - - lobatto - - gauss-lobatto-legendre -alt-names: - - Galerkin - - Hdiv trace (facets) -short-names: - - P - - CG - - DGT (facets) - - Q (quadrilateral and hexahedron) -notes: - - DGT and Hdiv trace are names given to this element when it is defined on the facets of a mesh. - - For the Lobatto variant, the derivatives of most of the basis functions are orthogonal. -variants: - equispaced: - description: The variant has its point evaluations at equally spaced points. - variant-name: equispaced - gll: - description: This variant has its point evaluations at GLL points. - variant-name: GLL - names: - - Gauss–Lobatto–Legendre - short-names: - - GLL - lobatto: - description: This variant uses integrals against L2 duals of Lobatto polynomials in the place of point evaluations - variant-name: Lobatto - names: - - Lobatto -complexes: - de-rham: - - P-,0,simplex,k-1 - - P,0,simplex,k-1 - - Q-,0,tp,k-1 -sobolev: H1 -mapping: identity -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 - quadrilateral: - formula: (k+1)^2 - oeis: A000290 - hexahedron: - formula: (k+1)^3 - oeis: A000578 - prism: - formula: (k+1)^2(k+2)/2 - oeis: A002411 - pyramid: - formula: (k+1)(k+2)(2k+3)/6 - oeis: A000330 -entity-ndofs: - vertices: - formula: 1 - oeis: A000012 - edges: - formula: k-1 - oeis: A000027 - faces: - triangle: - formula: (k-1)(k-2)/2 - oeis: A000217 - quadrilateral: - formula: (k-1)^2 - oeis: A000290 - volumes: - tetrahedron: - formula: (k-1)(k-2)(k-3)/6 - oeis: A000292 - hexahedron: - formula: (k-1)^3 - oeis: A000578 - prism: - formula: (k-1)^2(k-2)/2 - oeis: A002411 - pyramid: - formula: (k-1)(k-2)(2k-3)/6 - oeis: A000330 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: - interval: k - triangle: k - tetrahedron: k - quadrilateral: dk - hexahedron: dk - prism: 2k - pyramid: none -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron - - quadrilateral - - hexahedron - - prism - - pyramid -dofs: - vertices: point evaluations - edges: point evaluations - faces: point evaluations - volumes: point evaluations -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] - quadrilateral: qoly[k] - hexahedron: qoly[k] - prism: [\operatorname{span}\left\{x_1^{p_1}x_2^{p_2}x_3^{p_3}\middle|\max(p_1+p_2,p_3)\leqslant k\right\}] - pyramid: poly[k] && [\operatorname{span}\left\{\frac{x_1^{p_1}x_2^{p_2}}{(1-x_3)^{\min(p_1,p_2)}}\middle|(p_1,p_2)=(1,k)\text{ or }(p_1,p_2)=(k,1)\text{ or }p_1\leqslant k-1,p_2\leqslant k-1,k+1\leqslant p_1+p_2\right\}] -implementations: - symfem: - equispaced: Lagrange - gll: - interval: Lagrange variant=gll - quadrilateral: Q variant=gll - hexahedron: Q variant=gll - lobatto: - interval: Lagrange variant=lobatto - quadrilateral: Q variant=lobatto - hexahedron: Q variant=lobatto - basix: - display: P - equispaced: P lagrange_variant=equispaced - gll: - interval: P lagrange_variant=gll_warped - quadrilateral: P lagrange_variant=gll_warped - hexahedron: P lagrange_variant=gll_warped - basix.ufl: - display: P - equispaced: P lagrange_variant=equispaced - gll: - interval: P lagrange_variant=gll_warped - quadrilateral: P lagrange_variant=gll_warped - hexahedron: P lagrange_variant=gll_warped - bempp-cl: - equispaced: - triangle: P DEGREES=1 - fiat: - equispaced: - interval: Lagrange - triangle: Lagrange - tetrahedron: Lagrange - ndelement: - equispaced: - interval: Lagrange - triangle: Lagrange - quadrilateral: Lagrange - tetrahedron: Lagrange - hexahedron: Lagrange - simplefem: - equispaced: - triangle: lagrange_element DEGREEMAP=(k+1)*(k+2)//2 - ferrite: - equispaced: - interval: Lagrange DEGREES=1,2 - triangle: Lagrange DEGREES=1:6 - tetrahedron: Lagrange DEGREES=1:5 - quadrilateral: Lagrange DEGREES=1:4 - hexahedron: Lagrange DEGREES=1:4 - prism: Lagrange DEGREES=1,2 - pyramid: Lagrange DEGREES=1,2 -examples: - - interval,1,equispaced - - interval,2,equispaced - - interval,3,equispaced - - triangle,1,equispaced - - triangle,2,equispaced - - triangle,3,equispaced - - quadrilateral,1,equispaced - - quadrilateral,2,equispaced - - quadrilateral,3,equispaced - - tetrahedron,1,equispaced - - tetrahedron,2,equispaced - - hexahedron,1,equispaced - - hexahedron,2,equispaced - - prism,1,equispaced - - prism,2,equispaced - - pyramid,1,equispaced - - pyramid,2,equispaced - - interval,1,gll - - interval,2,gll - - interval,3,gll - - interval,4,gll - - quadrilateral,1,gll - - quadrilateral,2,gll - - interval,1,lobatto - - interval,2,lobatto - - interval,3,lobatto - - quadrilateral,1,lobatto - - quadrilateral,2,lobatto - - quadrilateral,3,lobatto - - hexahedron,1,lobatto - - hexahedron,2,lobatto - diff --git a/elements/lfeg.def b/elements/lfeg.def deleted file mode 100644 index 6f0761f8a7..0000000000 --- a/elements/lfeg.def +++ /dev/null @@ -1,63 +0,0 @@ -name: enriched vector Galerkin -html-name: enriched vector Galerkin -notes: - - This is a continuous [vector Lagrange](element::vector-lagrange) element enriched with a single discontinuous function. -alt-names: - - locking-free enriched Galerkin -short-names: - - LFEG -sobolev: L2 -ndofs: - triangle: - formula: (k+1)(k+2) + 1 - tetrahedron: - formula: (k+1)(k+2)(k+3)/2 + 1 - quadrilateral: - formula: 2(k+1)^2 + 1 - hexahedron: - formula: 3(k+1)^3 + 1 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: - triangle: k - tetrahedron: k - quadrilateral: dk - hexahedron: dk -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - vector -reference-cells: - - triangle - - tetrahedron - - quadrilateral - - hexahedron -implementations: - symfem: - triangle: LFEG - tetrahedron: LFEG - quadrilateral: LFEG - hexahedron: LFEG -examples: - - triangle,1 - - triangle,2 - - quadrilateral,1 - - quadrilateral,2 - - tetrahedron,1 - - tetrahedron,2 - - hexahedron,1 - - hexahedron,2 -references: - - title: An enriched Galerkin method for the Stokes equations - author: - - Yi, Son-Young - - Hu, Xiaozhe - - Lee, Sanghyun - - Adler, James H. - year: 2022 - journal: Computers & Mathematics with Applications - volume: 120 - pagestart: 115 - pageend: 131 - doi: 10.1016/j.camwa.2022.06.018 diff --git a/elements/mardal-tai-winther.def b/elements/mardal-tai-winther.def deleted file mode 100644 index f13cd212d1..0000000000 --- a/elements/mardal-tai-winther.def +++ /dev/null @@ -1,65 +0,0 @@ -name: Mardal-Tai-Winther -html-name: Mardal–Tai–Winther -min-degree: 1 -max-degree: 1 -polynomial-subdegree: 1 -polynomial-superdegree: d-1 -lagrange-subdegree: 1 -lagrange-superdegree: d-1 -short-names: - - MTW -ndofs: - triangle: - formula: 9 - tetrahedron: - formula: 24 -categories: - - vector - - Hdiv -reference-cells: - - triangle - - tetrahedron -polynomial-set: - triangle: [\left\{\boldsymbol{p}\in{{poly[k]^d}}\middle|\operatorname{div}\boldsymbol{p}\text{ is constant, and }\boldsymbol{p}\cdot\boldsymbol{n}_{e_i}\text{ is linear on each edge }e_i\right\}] - tetrahedron: poly[k]^d && [\left\{\nabla\times(xyz(1-x-y-z)\boldsymbol{p})\middle|\boldsymbol{p}\in{{poly[k]^d}}\right\}] -dofs: - triangle: - facets: - - normal integral moments with (lagrange,1) - - tangent integral moments with (lagrange,0) - tetrahedron: - facets: - - normal integral moments with (lagrange,1) - - integral moments with (nedelec1,1) -mapping: contravariant Piola -sobolev: H(div) -implementations: - symfem: MTW - fiat: - triangle: MardalTaiWinther -examples: - - triangle,1 - - tetrahedron,1 -references: - - title: A robust finite element method for Darcy–Stokes flow - author: - - Mardal, Kent-Andre - - Tai, Xue-Cheng - - Winther, Ragner - year: 2002 - journal: SIAM Journal on Numerical Analysis - volume: 40 - issue: 5 - pagestart: 1605 - pageend: 1631 - doi: 10.1137/S0036142901383910 - - title: A discrete de Rham complex with enhanced smoothness - author: - - Tai, Xue-Cheng - - Winther, Ragner - year: 2006 - journal: Calcolo - volume: 43 - pagestart: 287 - pageend: 306 - doi: 10.1007/s10092-006-0124-6 diff --git a/elements/mini.def b/elements/mini.def deleted file mode 100644 index 30289fcd11..0000000000 --- a/elements/mini.def +++ /dev/null @@ -1,27 +0,0 @@ -name: mini -html-name: mini -ndofs: - triangle: - formula: (k+1)(3k+4)/2 -categories: - - mixed -reference-cells: - - triangle -mixed: - - vector-bubble-enriched-lagrange(1) - - lagrange(1) -min-degree: 1 -max-degree: 1 -references: - - author: - - Arnold, Douglas N. - - Brezzi, Franco - - Fortin, Michel - year: 1984 - title: A stable finite element for the Stokes equations - journal: CALCOLO - pagestart: 337 - pageend: 344 - volume: 21 - number: 4 - doi: 10.1007/BF02576171 diff --git a/elements/morley-wang-xu.def b/elements/morley-wang-xu.def deleted file mode 100644 index bb41f7cc5f..0000000000 --- a/elements/morley-wang-xu.def +++ /dev/null @@ -1,62 +0,0 @@ -name: Morley-Wang-Xu -html-name: Morley–Wang–Xu -notes: - - A Morley–Wang–Xu element of degree \(k\) and reference cell dimension \(d\) only includes degrees of freedom on sub-entities of dimensions \((d - i), 1 \leqslant i \leqslant k \). - - The [Wu–Xu](element::wu-xu) element is a higher degree version of this element. -min-degree: 1 -max-degree: - interval: 1 - triangle: 2 - tetrahedron: 3 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 -reference-cells: - - interval - - triangle - - tetrahedron -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] -dofs: - vertices: point evaluations - edges: integrals of normal derivatives - faces: integrals of normal derivatives - volumes: integrals of normal derivatives -mapping: see {{citation::kirby_mapping}} -implementations: - symfem: MWX -examples: - - interval,1 - - triangle,1 - - triangle,2 - - tetrahedron,1 - - tetrahedron,2 - - tetrahedron,3 -references: - - title: Minimal finite element spaces for 2m-th-order partial differential equations in Rn - author: - - Wang, Ming - - Xu, Jaochao - year: 2013 - journal: Mathematics of computation - volume: 82 - issue: 281 - pagestart: 25 - pageend: 43 - doi: 10.1090/S0025-5718-2012-02611-1 diff --git a/elements/morley.def b/elements/morley.def deleted file mode 100644 index 989221d47e..0000000000 --- a/elements/morley.def +++ /dev/null @@ -1,40 +0,0 @@ -name: Morley -html-name: Morley -min-degree: 2 -max-degree: 2 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -ndofs: - triangle: - formula: 6 -reference-cells: - - triangle -polynomial-set: - triangle: poly[k] -dofs: - vertices: point evaluations - edges: point evaluations of normal derivatives at midpoints -mapping: see {{citation::kirby_mapping}} -sobolev: H1 -notes: - - The normal derivatives of the basis functions are continuous between cells -implementations: - symfem: Morley - fiat: Morley degree=None -examples: - - triangle,2 -references: - - title: The triangular equilibrium element in the solution of plate bending problems - author: Morley, L. S. D. - year: 1968 - journal: The Aeronautical Quarterly - volume: 19 - issue: 2 - pagestart: 149 - pageend: 169 - doi: 10.1017/S0001925900004546 diff --git a/elements/nedelec1.def b/elements/nedelec1.def deleted file mode 100644 index bb198e17be..0000000000 --- a/elements/nedelec1.def +++ /dev/null @@ -1,157 +0,0 @@ -name: Nedelec (first kind) -html-name: Nédélec (first kind) -legacy-names: - - qcurl -alt-names: - - Whitney (triangle,tetrahedron) - - (Nédélec) - - Q H(curl) (quadrilateral,hexahedron) - - Raviart–Thomas cubical H(curl) (quadrilateral) - - Nédélec cubical H(curl) (hexahedron) -short-names: - - N1curl - - NC - - RTce (quadrilateral) - - Nce (hexahedron) -variants: - legendre: - variant-name: Legendre - description: Integral moments are taken against orthonormal polynomials - lagrange: - variant-name: Lagrange - description: Integral moments are taken against [Lagrange](element:lagrange) basis functions -polynomial-subdegree: k -polynomial-superdegree: - triangle: k+1 - tetrahedron: k+1 - prism: 2k+2 - quadrilateral: dk+d-1 - hexahedron: dk+d-1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hcurl -complexes: - de-rham: - - P-,1,simplex - - Q-,1,tp -sobolev: H(curl) -mapping: covariant Piola -ndofs: - triangle: - formula: (k+1)(k+3) - oeis: A005563 - tetrahedron: - formula: (k+1)(k+3)(k+4)/2 - oeis: A005564 - quadrilateral: - formula: 2(k+1)(k+2) - oeis: A046092 - hexahedron: - formula: 3(k+1)(k+2)^2 - oeis: A059986 - prism: - formula: 3(k+1)(k+2)(k+3)/2 -reference-cells: - - triangle - - tetrahedron - - quadrilateral - - hexahedron - - prism -polynomial-set: - triangle: poly[k]^d && [\left\{\boldsymbol{p}\in{{tpoly[k]^d}}\middle|\boldsymbol{p}({{x}})\cdot {{x}}=0\right\}] - tetrahedron: poly[k]^d && [\left\{\boldsymbol{p}\in{{tpoly[k]^d}}\middle|\boldsymbol{p}({{x}})\cdot {{x}}=0\right\}] - quadrilateral: qoly[k]^d && [\left\{\boldsymbol{q}\in{{tqoly[k]^d}}\middle|\boldsymbol{q}(\boldsymbol{x})\cdot x_i\boldsymbol{e}_i\in{{qoly[k]}}\text{ for }i=1,\dots,d\right\}] - hexahedron: qoly[k]^d && [\left\{\boldsymbol{q}\in{{tqoly[k]^d}}\middle|\boldsymbol{q}(\boldsymbol{x})\cdot x_i\boldsymbol{e}_i\in{{qoly[k]}}\text{ for }i=1,\dots,d\right\}] -dofs: - edges: tangent integral moments with (lagrange,k) - faces: - triangle: integral moments with (vector-lagrange,k-1) - quadrilateral: integral moments with (raviart-thomas,k-1) - volumes: - tetrahedron: integral moments with (vector-lagrange,k-2) - hexahedron: integral moments with (raviart-thomas,k-1) -implementations: - symfem: - lagrange: - triangle: N1curl - tetrahedron: N1curl - quadrilateral: Qcurl - hexahedron: Qcurl - prism: Ncurl - legendre: - triangle: N1curl variant=legendre - tetrahedron: N1curl variant=legendre - quadrilateral: Qcurl variant=legendre - hexahedron: Qcurl variant=legendre - prism: Ncurl variant=legendre - basix: - display: N1E - lagrange: - triangle: N1E DEGREEMAP=k+1 - tetrahedron: N1E DEGREEMAP=k+1 - quadrilateral: N1E DEGREEMAP=k+1 - hexahedron: N1E DEGREEMAP=k+1 - legendre: - triangle: N1E lagrange_variant=legendre DEGREEMAP=k+1 - tetrahedron: N1E lagrange_variant=legendre DEGREEMAP=k+1 - quadrilateral: N1E lagrange_variant=legendre DEGREEMAP=k+1 - hexahedron: N1E lagrange_variant=legendre DEGREEMAP=k+1 - basix.ufl: - display: N1E - lagrange: - triangle: N1E lagrange_variant=equispaced DEGREEMAP=k+1 - tetrahedron: N1E lagrange_variant=equispaced DEGREEMAP=k+1 - quadrilateral: N1E lagrange_variant=equispaced DEGREEMAP=k+1 - hexahedron: N1E lagrange_variant=equispaced DEGREEMAP=k+1 - legendre: - triangle: N1E DEGREEMAP=k+1 - tetrahedron: N1E DEGREEMAP=k+1 - quadrilateral: N1E DEGREEMAP=k+1 - hexahedron: N1E DEGREEMAP=k+1 - bempp-cl: - lagrange: - triangle: SNC DEGREES=0 - fiat: - legendre: - triangle: Nedelec variant=integral DEGREEMAP=k+1 - tetrahedron: Nedelec variant=integral DEGREEMAP=k+1 - ndelement: - legendre: - triangle: NedelecFirstKind DEGREEMAP=k+1 - tetrahedron: NedelecFirstKind DEGREEMAP=k+1 - quadrilateral: NedelecFirstKind DEGREEMAP=k+1 - hexahedron: NedelecFirstKind DEGREEMAP=k+1 - ferrite: - lagrange: - triangle: Nedelec DEGREEMAP=k+1 DEGREES=0,1 - tetrahedron: Nedelec DEGREEMAP=k+1 DEGREES=0 - quadrilateral: Nedelec DEGREEMAP=k+1 DEGREES=0 - hexahedron: Nedelec DEGREEMAP=k+1 DEGREES=0 -examples: - - triangle,0,lagrange - - triangle,1,lagrange - - quadrilateral,0,lagrange - - quadrilateral,1,lagrange - - tetrahedron,0,lagrange - - tetrahedron,1,lagrange - - hexahedron,0,lagrange - - hexahedron,1,lagrange - - prism,0,lagrange - - prism,1,lagrange - - triangle,0,legendre - - triangle,1,legendre - - quadrilateral,0,legendre - - quadrilateral,1,legendre -references: - - title: Mixed finite elements in \(\mathbb{R}^3\) - author: Nédélec, Jean-Claude - year: 1980 - journal: Numerische Mathematik - volume: 35 - issue: 3 - pagestart: 315 - pageend: 341 - doi: 10.1007/BF01396415 diff --git a/elements/nedelec2.def b/elements/nedelec2.def deleted file mode 100644 index a069aa5a3e..0000000000 --- a/elements/nedelec2.def +++ /dev/null @@ -1,79 +0,0 @@ -name: Nedelec (second kind) -html-name: Nédélec (second kind) -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - vector - - Hcurl -short-names: - - N2curl -complexes: - de-rham: P,1,simplex -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2) - oeis: A002378 - tetrahedron: - formula: (k+1)(k+2)(k+3)/2 - oeis: A027480 -variants: - legendre: - variant-name: Legendre - description: Integral moments are taken against orthonormal polynomials - lagrange: - variant-name: Lagrange - description: Integral moments are taken against [Lagrange](element:lagrange) basis functions -reference-cells: - - triangle - - tetrahedron -sobolev: H(curl) -mapping: covariant Piola -polynomial-set: - triangle: poly[k]^d - tetrahedron: poly[k]^d -dofs: - edges: tangent integral moments with (lagrange,k) - faces: integral moments with (raviart-thomas,k-1) - volumes: integral moments with (raviart-thomas,k-2) -implementations: - symfem: - lagrange: N2curl - legendre: N2curl variant=legendre - basix: - display: N2E - lagrange: N2E - legendre: N2E lagrange_variant=legendre - basix.ufl: - display: N2E - lagrange: N2E lagrange_variant=equispaced - legendre: N2E - fiat: - legendre: - triangle: NedelecSecondKind variant=integral - tetrahedron: NedelecSecondKind variant=integral -examples: - - triangle,1,lagrange - - triangle,2,lagrange - - tetrahedron,1,lagrange - - tetrahedron,2,lagrange - - triangle,1,legendre - - triangle,2,legendre - - tetrahedron,1,legendre - - tetrahedron,2,legendre -references: - - title: A new family of mixed finite elements in \(\mathbb{R}^3\) - author: Nédélec, Jean-Claude - year: 1986 - journal: Numerische Mathematik - volume: 50 - issue: 1 - pagestart: 57 - pageend: 81 - doi: 10.1007/BF01389668 diff --git a/elements/nonconforming-arnold-winther.def b/elements/nonconforming-arnold-winther.def deleted file mode 100644 index b83ba01dc4..0000000000 --- a/elements/nonconforming-arnold-winther.def +++ /dev/null @@ -1,40 +0,0 @@ -name: nonconforming Arnold-Winther -html-name: nonconforming Arnold–Winther -min-degree: 1 -max-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - matrix -reference-cells: - - triangle -ndofs: - triangle: - formula: 15 -polynomial-set: - triangle: [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\text{ and for every edge }\hat{\mathbf{n}}_i^t\mathbf{M}\hat{\mathbf{n}}_i\text{ is linear }\right\}] -dofs: - edges: integral moments of normal-normal and normal-tangent inner products with (lagrange,1) - faces: integral moments of three components with (lagrange,0) -mapping: double contravariant Piola -sobolev: H(div div) -implementations: - symfem: nonconforming AW - fiat: ArnoldWintherNC DEGREEMAP=k+1 -examples: - - triangle,1 -references: - - title: Nonconforming mixed elements for elasticity - author: - - Arnold, Douglas N. - - Winther, Ragnar - year: 2003 - journal: Numerische Mathematik - pagestart: 295 - pageend: 307 - volume: 13 - issue: 3 - doi: 10.1142/S0218202503002507 diff --git a/elements/p1-iso-p2.def b/elements/p1-iso-p2.def deleted file mode 100644 index 1b0ebf85b1..0000000000 --- a/elements/p1-iso-p2.def +++ /dev/null @@ -1,60 +0,0 @@ -name: P1-iso-P2 -html-name: P1-iso-P2 -alt-names: - - P2-iso-P1 - - iso-P2 P1 -ndofs: - interval: - formula: 3 - triangle: - formula: 6 - quadrilateral: - formula: 9 -entity-ndofs: - vertices: - formula: 1 - edges: - formula: 1 - faces: - triangle: - formula: 0 - quadrilateral: - formula: 1 -sobolev: H1 -mapping: identity -min-degree: 1 -max-degree: 1 -categories: - - scalar - - macro -reference-cells: - - interval - - triangle - - quadrilateral -dofs: - vertices: point evaluations - edges: point evaluations - faces: point evaluations -implementations: - symfem: P1-iso-P2 - basix: iso - basix.ufl: iso - fiat: - interval: Lagrange variant=iso - triangle: Lagrange variant=iso - tetrahedron: Lagrange variant=iso -examples: - - interval,1 - - triangle,1 - - quadrilateral,1 -references: - - author: - - Bercovier, Michel - - Pironneau, Olivier - title: Error estimates for finite element method solution of the Stokes problem in the primitive variables - journal: Numerische Mathematik - year: 1979 - volume: 33 - pagestart: 211 - pageend: 224 - doi: 10.1007/BF01399555 diff --git a/elements/p1-macro.def b/elements/p1-macro.def deleted file mode 100644 index 3c71b1f5b8..0000000000 --- a/elements/p1-macro.def +++ /dev/null @@ -1,41 +0,0 @@ -name: P1 macro -html-name: P1 macro -complexes: - de-rham: CH,d,simplex -ndofs: - triangle: - formula: 4 -entity-ndofs: - vertices: - formula: 1 - edges: - formula: 0 - faces: - formula: 1 -sobolev: H1 -mapping: identity -min-degree: 1 -max-degree: 1 -categories: - - scalar - - macro -reference-cells: - - triangle -dofs: - vertices: point evaluations - faces: integral of function value -implementations: - symfem: P1 macro -examples: - - triangle,1 -references: - - title: Generalized Finite Element Systems for smooth differential forms and Stokes' problem - author: - - Christansen, Snorre H. - - Hu, Kaibo - journal: Numerische Mathematik - volume: 140 - year: 2018 - pagestart: 327 - pageend: 371 - doi: 10.1007/s00211-018-0970-6 diff --git a/elements/pechstein-schoberl.def b/elements/pechstein-schoberl.def deleted file mode 100644 index 80bdbc3341..0000000000 --- a/elements/pechstein-schoberl.def +++ /dev/null @@ -1,27 +0,0 @@ -name: Pechstein-Schoberl -html-name: Pechstein–Schöberl -alt-names: - - Tangential-displacement normal-normal-stress -short-names: - - TDNNS -categories: - - mixed -reference-cells: - - triangle - - tetrahedron -mixed: - - nedelec2(k) - - lagrange(k+1) - - hellan-herrmann-johnson(k) -min-degree: 1 -references: - - author: - - Pechstein, Astrid S. - - Schöberl, Joachim - title: The TDNNS method for Reissner–Mildlin plates - journal: Numerische Mathematik - pagestart: 713 - pageend: 740 - volume: 137 - year: 2017 - doi: 10.1007/s00211-017-0883-9 diff --git a/elements/radau.def b/elements/radau.def deleted file mode 100644 index 8b51118efc..0000000000 --- a/elements/radau.def +++ /dev/null @@ -1,42 +0,0 @@ -name: Radau -html-name: Radau -categories: - - scalar -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -reference-cells: - - interval - - quadrilateral - - hexahedron -ndofs: - interval: - formula: k+1 - oeis: A000027 - quadrilateral: - formula: (k+1)^2 - oeis: A000290 - hexahedron: - formula: (k+1)^3 - oeis: A000578 -sobolev: H1 -mapping: identity -dofs: - vertices: point evaluations - edges: point evaluations at Radau points - faces: point evaluations at Radau points - volumes: point evaluations at Radau points -polynomial-set: - interval: qoly[k] - quadrilateral: qoly[k] - hexahedron: qoly[k] -implementations: - symfem: Lagrange variant=radau -examples: - - interval,1 - - interval,2 - - quadrilateral,1 - - quadrilateral,2 diff --git a/elements/raviart-thomas.def b/elements/raviart-thomas.def deleted file mode 100644 index ed30e18be1..0000000000 --- a/elements/raviart-thomas.def +++ /dev/null @@ -1,162 +0,0 @@ -name: Raviart-Thomas -html-name: Raviart–Thomas -legacy-names: - - qdiv -polynomial-subdegree: k -polynomial-superdegree: - triangle: k+1 - tetrahedron: k+1 - quadrilateral: dk+1 - hexahedron: dk+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -alt-names: - - Rao–Wilton–Glisson - - Nédélec (first kind) H(div) - - Raviart–Thomas cubical H(div) (quadrilateral) - - Nédélec cubical H(div) (hexahedron) - - Q H(div) (quadrilateral, hexahedron) -short-names: - - RT - - RWG - - RTcf (quadrilateral) - - Ncf (hexahedron) -complexes: - de-rham: - - P-,d-1,simplex - - Q-,d-1,tp -ndofs: - triangle: - formula: (k+1)(k+3) - oeis: A005563 - tetrahedron: - formula: (k+1)(k+2)(k+4)/2 - oeis: A077414 - quadrilateral: - formula: 2(k+1)(k+2) - oeis: A046092 - hexahedron: - formula: 3(k+1)^2(k+2) - oeis: A270205 -variants: - legendre: - variant-name: Legendre - description: Integral moments are taken against orthonormal polynomials - lagrange: - variant-name: Lagrange - description: Integral moments are taken against [Lagrange](element:lagrange) basis functions -categories: - - vector - - Hdiv -sobolev: H(div) -mapping: contravariant Piola -reference-cells: - - triangle - - tetrahedron - - quadrilateral - - hexahedron -polynomial-set: - triangle: poly[k]^d && [\left\{\left(\begin{array}{c}px_1\\\vdots\\px_d\end{array}\right)\middle|p\in{{tpoly[k-1]}}\right\}] - tetrahedron: poly[k]^d && [\left\{\left(\begin{array}{c}px_1\\\vdots\\px_d\end{array}\right)\middle|p\in{{tpoly[k-1]}}\right\}] - quadrilateral: qoly[k]^d && [\left\{\boldsymbol{q}\in{{tqoly[k]^d}}\middle|\boldsymbol{q}(\boldsymbol{x})\cdot x_i\boldsymbol{e}_j\in\begin{cases}{{tqoly[k+1]}}&i=j\\{{tqoly[k]}}&i\not=j\end{cases}\text{ for }i,j=1,\dots,d\right\}] - hexahedron: qoly[k]^d && [\left\{\boldsymbol{q}\in{{tqoly[k]^d}}\middle|\boldsymbol{q}(\boldsymbol{x})\cdot x_i\boldsymbol{e}_j\in\begin{cases}{{tqoly[k+1]}}&i=j\\{{tqoly[k]}}&i\not=j\end{cases}\text{ for }i,j=1,\dots,d\right\}] -dofs: - facets: normal integral moments with (lagrange,k) - cell: - triangle: integral moments with (vector-lagrange,k-1) - tetrahedron: integral moments with (vector-lagrange,k-1) - quadrilateral: integral moments with (nedelec1,k-1) - hexahedron: integral moments with (nedelec1,k-1) -implementations: - symfem: - lagrange: - triangle: N1div - tetrahedron: N1div - quadrilateral: Qdiv - hexahedron: Qdiv - legendre: - triangle: N1div variant=legendre - tetrahedron: N1div variant=legendre - quadrilateral: Qdiv variant=legendre - hexahedron: Qdiv variant=legendre - basix: - display: RT - lagrange: RT DEGREEMAP=k+1 - legendre: RT lagrange_variant=legendre DEGREEMAP=k+1 - basix.ufl: - display: RT - lagrange: RT lagrange_variant=equispaced DEGREEMAP=k+1 - legendre: RT DEGREEMAP=k+1 - bempp-cl: - lagrange: - triangle: RWG DEGREES=0 - ndelement: - legendre: - triangle: RaviartThomas DEGREEMAP=k+1 - tetrahedron: RaviartThomas DEGREEMAP=k+1 - quadrilateral: RaviartThomas DEGREEMAP=k+1 - hexahedron: RaviartThomas DEGREEMAP=k+1 - fiat: - legendre: - triangle: RaviartThomas variant=integral DEGREEMAP=k+1 - tetrahedron: RaviartThomas variant=integral DEGREEMAP=k+1 - ferrite: - lagrange: - triangle: RaviartThomas DEGREEMAP=k+1 DEGREES=0,1 - tetrahedron: RaviartThomas DEGREEMAP=k+1 DEGREES=0 - quadrilateral: RaviartThomas DEGREEMAP=k+1 DEGREES=0 - hexahedron: RaviartThomas DEGREEMAP=k+1 DEGREES=0 -examples: - - triangle,0,lagrange - - triangle,1,lagrange - - quadrilateral,0,lagrange - - quadrilateral,1,lagrange - - tetrahedron,0,lagrange - - tetrahedron,1,lagrange - - hexahedron,0,lagrange - - hexahedron,1,lagrange - - triangle,0,legendre - - triangle,1,legendre - - quadrilateral,0,legendre - - quadrilateral,1,legendre - - tetrahedron,0,legendre - - tetrahedron,1,legendre - - hexahedron,0,legendre - - hexahedron,1,legendre -references: - - type: incollection - title: A mixed finite element method for 2nd order elliptic problems - author: - - Raviart, Pierre-Arnaud - - Thomas, Jean-Marie - booktitle: Mathematical aspects of finite element methods - editor: - - Galligani, Ilio - - Magenes, Enrico - pagestart: 292 - pageend: 315 - series: Lecture Notes in Mathematics - volume: 606 - year: 1977 - doi: 10.1007/BFb0064470 - - title: Mixed finite elements in \(\mathbb{R}^3\) - author: Nédélec, Jean-Claude - year: 1980 - journal: Numerische Mathematik - volume: 35 - issue: 3 - pagestart: 315 - pageend: 341 - doi: 10.1007/BF01396415 - - title: Electromagnetic scattering by surfaces of arbitrary shape - author: - - Rao, S. S. M. - - Wilton, Donald R. - - Glisson, Allen W. - journal: IEEE transactions on antennas and propagation - volume: 30 - year: 1982 - pagestart: 409 - pageend: 418 - doi: 10.1109/TAP.1982.1142818 diff --git a/elements/reduced-hsieh-clough-tocher.def b/elements/reduced-hsieh-clough-tocher.def deleted file mode 100644 index 6e86741da7..0000000000 --- a/elements/reduced-hsieh-clough-tocher.def +++ /dev/null @@ -1,43 +0,0 @@ -name: reduced Hsieh-Clough-Tocher -html-name: reduced Hsieh–Clough–Tocher -short-names: - - rHCT - - HCT-red -min-degree: 3 -max-degree: 3 -dofs: - vertices: - - point evaluations - - point evaluations of first derivatives -ndofs: - triangle: - formula: 9 -sobolev: H2 -mapping: identity -categories: - - scalar - - macro -reference-cells: - - triangle -implementations: - symfem: rHCT - fiat: HsiehCloughTocher reduced=True -examples: - - triangle,3 -references: - - title: Finite element stiffness matrices for analysis of plate bending - author: - - Clough, Ray W. - - Tocher, James L. - journal: Proceedings of the First Conference on Matrix Methods in Structural Mechanics - year: 1965 - pagestart: 515 - pageend: 546 - - title: Interpolation error estimates for the reduced Hsieh–Clough–Tocher triangle - author: Ciarlet, Philippe G. - journal: Mathematics of Computation - volume: 32 - year: 1978 - pagestart: 335 - pageend: 344 - doi: 10.1090/S0025-5718-1978-0482249-1 diff --git a/elements/regge.def b/elements/regge.def deleted file mode 100644 index b760c0ba84..0000000000 --- a/elements/regge.def +++ /dev/null @@ -1,56 +0,0 @@ -name: Regge -html-name: Regge -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - matrix -reference-cells: - - triangle - - tetrahedron -ndofs: - triangle: - formula: 3(k+1)(k+2)/2 - oeis: A045943 - tetrahedron: - formula: (k+1)(k+2)(k+3) - oeis: A007531 -polynomial-set: - triangle: [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\right\}] - tetrahedron: [\left\{\mathbf{M}\in{{poly[k]^dd}}\middle|\mathbf{M}^t=\mathbf{M}\right\}] -dofs: - edges: point evaluations of inner products with direction of edge - faces: point evaluations of inner products with direction of edges - volumes: point evaluations of inner products with direction of edges -sobolev: H(curl curl) -mapping: double covariant Piola -implementations: - symfem: Regge - basix: Regge - basix.ufl: Regge - fiat: Regge -examples: - - triangle,1 - - triangle,2 -references: - - title: General relativity without coordinates - author: Regge, Tullio - journal: Il Nuovo Cimento - volume: 19 - issue: 3 - pagestart: 558 - pageend: 571 - year: 1961 - doi: 10.1007/BF02733251 - - title: On the linearization of Regge calculus - author: Christiansen, Snorre H. - journal: Numerische Mathematik - volume: 119 - issue: 4 - pagestart: 613 - pageend: 640 - year: 2011 - doi: 10.1007/s00211-011-0394-z diff --git a/elements/rotated-buffa-christiansen.def b/elements/rotated-buffa-christiansen.def deleted file mode 100644 index d6e047fcbf..0000000000 --- a/elements/rotated-buffa-christiansen.def +++ /dev/null @@ -1,37 +0,0 @@ -name: rotated Buffa-Christiansen -html-name: rotated Buffa–Christiansen -short-names: - - RBC -ndofs: - dual polygon(n): - formula: n -min-degree: 1 -max-degree: 1 -categories: - - vector - - Hcurl -reference-cells: - - dual polygon -implementations: - symfem: RBC - bempp-cl: RBC -sobolev: H(curl) -mapping: covariant Piola -examples: - - dual polygon(4),0 - - dual polygon(5),0 - - dual polygon(6),0 -notes: - - These elements are defined on the [barycentric dual grid](barycentric-dual-grid.md). - - These elements are defined as a linear combination of [Nédélec first kind](element::nedelec1) basis functions on the fine grid. -references: - - author: - - Buffa, Annalisa - - Christiansen, Snorre H. - title: A dual finite element complex on the barycentric refinement - journal: Mathematics of Computation - volume: 76 - number: 260 - year: 2007 - pagestart: 1743 - pageend: 1769 diff --git a/elements/scott-vogelius.def b/elements/scott-vogelius.def deleted file mode 100644 index a221710414..0000000000 --- a/elements/scott-vogelius.def +++ /dev/null @@ -1,38 +0,0 @@ -name: Scott-Vogelius -html-name: Scott–Vogelius -ndofs: - triangle: - formula: (k+1)(3k+4)/2 - tetrahedron: - formula: (k+1)(k+2)(4k+9)/6 -categories: - - mixed -reference-cells: - - triangle - - tetrahedron -mixed: - - vector-lagrange(k) - - lagrange(k-1) -notes: - - This is the same as the [Taylor–Hood](element::taylor-hood) element, but the second subelement in this case is discontinuous between cells. -min-degree: 1 -references: - - author: - - Scott, L. Ridgway - - Vogelius, Michael - title: Norm estimates for a maximal right inverse of the divergence operator in spaces of piecewise polynomials - journal: "ESAIM: Mathematical Modelling and Numerical Analysis - Modélisation Mathématique et Analyse Numérique" - pagestart: 111 - pageend: 143 - volume: 19 - number: 1 - year: 1985 - - author: Zhang, Shangyou - journal: Mathematics of Computation - number: 250 - pagestart: 543 - pageend: 554 - title: A new family of stable mixed finite elements for the 3D Stokes equations - volume: 74 - year: 2005 - doi: 10.2307/4100078 diff --git a/elements/scurl.def b/elements/scurl.def deleted file mode 100644 index c627513633..0000000000 --- a/elements/scurl.def +++ /dev/null @@ -1,61 +0,0 @@ -name: serendipity H(curl) -html-name: serendipity H(curl) -alt-names: - - Brezzi–Douglas–Marini cubical H(curl) (quadrilateral) - - Arnold–Awanou H(curl) (hexahedron) -short-names: - - BDMce (quadrilateral) - - AAe (hexahedron) -complexes: - de-rham: S,1,tp -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k + d - 1 -lagrange-subdegree: - quadrilateral: floor(k/d) - hexahedron: - 2: 1 - _: floor(k/d) -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hcurl -reference-cells: - - quadrilateral - - hexahedron -sobolev: H(curl) -mapping: covariant Piola -ndofs: - quadrilateral: - formula: k^2+3k+4 - oeis: A014206 - hexahedron: - formula: - - k=1,2,3: 6(k^2+k+2) - - k > 3: k(k+1)(k-1)/2 + 3k^2 + 12k + 9 -dofs: - edges: tangent integral moments with (dpc,k) - faces: integral moments with (vector-dpc,k-2) - volumes: integral moments with (vector-dpc,k-4) -polynomial-set: - quadrilateral: poly[k]^d && [\operatorname{span}\left\{\left(\begin{array}{c}(k+1)x^ky\\-x^{k+1}\end{array}\right),\left(\begin{array}{c}y^{k+1}\\-(k+1)xy^k\end{array}\right)\right\}] - hexahedron: poly[k]^d && apoly[k-1] && [\left\{\nabla p\middle|p\in{{serendipity[k+1]}}\right\}] -implementations: - symfem: Scurl -examples: - - quadrilateral,1 - - quadrilateral,2 - - hexahedron,1 - - hexahedron,2 -references: - - title: Finite element differential forms on cubical meshes - author: - - Arnold, Douglas N. - - Awanou, Gerard - journal: Mathematics of computation - volume: 83 - year: 2014 - pagestart: 1551 - pageend: 5170 - doi: 10.1090/S0025-5718-2013-02783-4 diff --git a/elements/sdiv.def b/elements/sdiv.def deleted file mode 100644 index de43b20427..0000000000 --- a/elements/sdiv.def +++ /dev/null @@ -1,65 +0,0 @@ -name: serendipity H(div) -html-name: serendipity H(div) -alt-names: - - Brezzi–Douglas–Marini cubical H(div) (quadrilateral) - - Arnold–Awanou H(div) (hexahedron) -short-names: - - BDMcf (quadrilateral) - - AAf (hexahedron) -complexes: - de-rham: S,d-1,tp -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: floor(k/d) -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hdiv -reference-cells: - - quadrilateral - - hexahedron -sobolev: H(div) -mapping: contravariant Piola -ndofs: - quadrilateral: - formula: k^2+3k+4 - oeis: A014206 - hexahedron: - formula: (k+1)(k^2+5k+12)/2 -dofs: - facets: normal integral moments with (dpc,k) - cell: integral moments with (vector-dpc,k-2) -polynomial-set: - quadrilateral: poly[k]^d && [\operatorname{span}\left\{\left(\begin{array}{c}x^{k+1}\\(k+1)x^ky\end{array}\right),\left(\begin{array}{c}(k+1)xy^k\\y^{k+1}\end{array}\right)\right\}] - hexahedron: poly[k]^d && [\left\{\nabla\times\boldsymbol{p}\middle|\boldsymbol{p}\in{{apoly[k]}}\right\}] -implementations: - symfem: Sdiv -examples: - - quadrilateral,1 - - quadrilateral,2 - - hexahedron,1 - - hexahedron,2 -references: - - title: Finite element differential forms on cubical meshes - author: - - Arnold, Douglas N. - - Awanou, Gerard - journal: Mathematics of computation - volume: 83 - year: 2014 - pagestart: 1551 - pageend: 5170 - - title: Two families of mixed finite elements for second order elliptic problems - author: - - Brezzi, Franco - - Douglas, Jim - - Marini, L. Donatella - journal: Numerische Mathematik - volume: 47 - number: 2 - year: 1985 - pagestart: 217 - pageend: 235 - doi: 10.1007/BF01389710 diff --git a/elements/serendipity.def b/elements/serendipity.def deleted file mode 100644 index ebab0eb3a4..0000000000 --- a/elements/serendipity.def +++ /dev/null @@ -1,72 +0,0 @@ -name: serendipity -html-name: serendipity -short-names: - - S -complexes: - de-rham: - - S,0,tp - - S-,0,tp,k-d -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: k + d - 1 -lagrange-subdegree: max(1,floor(k/d)) -lagrange-superdegree: k -degree: polynomial-subdegree -categories: - - scalar -reference-cells: - - interval - - quadrilateral - - hexahedron -ndofs: - interval: - formula: k+1 - oeis: A000027 - quadrilateral: - formula: - - k=1: 4 - - k>1: (k+1)(k+2)/2+2 - oeis: A340266 - hexahedron: - formula: - - k=1,2,3: 12k-4 - - k=4,5: 3k^2-3k+14 - - k>6: (k+1)(k+2)(k+3)/6+3k+3 -sobolev: H1 -mapping: identity -dofs: - vertices: point evaluations - edges: integral moments with (dpc,k-2) - faces: integral moments with (dpc,k-4) - volumes: integral moments with (dpc,k-6) -polynomial-set: - interval: poly[k] && serendipity[k] - quadrilateral: poly[k] && serendipity[k] - hexahedron: poly[k] && serendipity[k] -implementations: - symfem: serendipity - basix: serendipity lagrange_variant=equispaced dpc_variant=simplex_equispaced - basix.ufl: serendipity lagrange_variant=equispaced dpc_variant=simplex_equispaced - fiat: Serendipity - ferrite: - quadrilateral: Serendipity DEGREES=2 - hexahedron: Serendipity DEGREES=2 -examples: - - interval,1 - - interval,2 - - interval,3 - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 -references: - - title: The serendipity family of finite elements - author: - - Arnold, Douglas N. - - Awanou, Gerard - year: 2011 - journal: Foundations of Computational Mathematics - volume: 11 - issue: 3 - pagestart: 337 - pageend: 344 - doi: 10.1007/s10208-011-9087-3 diff --git a/elements/taylor-hood.def b/elements/taylor-hood.def deleted file mode 100644 index 7f1c73c3a7..0000000000 --- a/elements/taylor-hood.def +++ /dev/null @@ -1,20 +0,0 @@ -name: Taylor-Hood -html-name: Taylor–Hood -alt-names: - - Hood–Taylor -ndofs: - triangle: - formula: (k+1)(3k+4)/2 - tetrahedron: - formula: (k+1)(k+2)(4k+9)/6 -categories: - - mixed -reference-cells: - - triangle - - tetrahedron -mixed: - - vector-lagrange(k) - - lagrange(k-1) -notes: - - This is the same as the [Scott–Vogelius](element::scott-vogelius) element, but the second subelement in this case is continuous between cells. -min-degree: 2 diff --git a/elements/taylor.def b/elements/taylor.def deleted file mode 100644 index 5be9b3bde9..0000000000 --- a/elements/taylor.def +++ /dev/null @@ -1,46 +0,0 @@ -name: Taylor -html-name: Taylor -alt-names: - - discontinuous Taylor -ndofs: - interval: - formula: k+1 - oeis: A000027 - triangle: - formula: (k+1)(k+2)/2 - oeis: A000217 - tetrahedron: - formula: (k+1)(k+2)(k+3)/6 - oeis: A000292 -categories: - - scalar -reference-cells: - - interval - - triangle - - tetrahedron -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -sobolev: H1 -mapping: see {{citation::kirby_mapping}} -dofs: - cell: - - integral over cell - - point evaluations at midpoint of derivatives up to order \(k\) -polynomial-set: - interval: poly[k] - triangle: poly[k] - tetrahedron: poly[k] -implementations: - symfem: Taylor - fiat: DiscontinuousTaylor -examples: - - interval,1 - - interval,2 - - interval,3 - - triangle,1 - - triangle,2 - - triangle,3 - diff --git a/elements/tnt-curl.def b/elements/tnt-curl.def deleted file mode 100644 index 6f73ae676e..0000000000 --- a/elements/tnt-curl.def +++ /dev/null @@ -1,57 +0,0 @@ -name: Tiniest tensor H(curl) -html-name: Tiniest tensor H(curl) -alt-names: - - TNT H(curl) -complexes: - de-rham: - - TNT,1,tp -ndofs: - quadrilateral: - formula: 2(k+1)^2 + 3 - hexahedron: - formula: 3(k+1)^3 + 18 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: dk + 1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hcurl -sobolev: H(curl) -mapping: covariant Piola -reference-cells: - - quadrilateral - - hexahedron -dofs: - edges: tangent integral moments with (lagrange,k) - faces: - - integral moments with "\(\nabla f\times \boldsymbol{n}\) (where \(\boldsymbol{n}\) is a unit vector normal to the face) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space" - - integral moments with "\(\nabla\times\boldsymbol{f}\times \boldsymbol{n}\) (where \(\boldsymbol{n}\) is a unit vector normal to the face) for each \(\boldsymbol{f}\) in a degree \(k\) [vector Lagrange](element::vector-lagrange) space such that \(\nabla\cdot\boldsymbol{f}=0\) and the normal trace of \(\boldsymbol{f}\) on the edges of the face is 0" - volumes: - - integral moments with "\(\nabla\times\boldsymbol{f}\) for each \(\boldsymbol{f}\) in a degree \(k\) [vector Lagrange](element::vector-lagrange) space such that the tangential trace of \(\boldsymbol{f}\) on the faces of the volume is 0" - - integral moments with "\(\nabla f\) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space such that the trace of \(f\) on the faces of the volume is 0" -polynomial-set: - quadrilateral: qoly[k]^d && [\left\{\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(y)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(y)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(0)\tilde{B}_{k+1}(y)\\-\tilde{B}_{k+1}(0)\tilde{P}_{k}(y)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(0)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\end{array}\right)\right\}] @defmath@\tilde{B}_k@(\tilde{P}_{k+2}-\tilde{P}_k)/(4k+6)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] - hexahedron: qoly[k]^d && [\left\{f\boldsymbol{g}\middle|f\in\{x,1-x\},\boldsymbol{g}\in\left\{\left(\begin{array}{c}\tilde{P}_k(y)\tilde{B}_{k+1}(z)\\-\tilde{B}_{k+1}(y)\tilde{P}_{k}(z)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(0)\tilde{B}_{k+1}(z)\\-\tilde{B}_{k+1}(0)\tilde{P}_{k}(z)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(y)\tilde{B}_{k+1}(0)\\-\tilde{B}_{k+1}(y)\tilde{P}_{k}(0)\end{array}\right),\right\}\right\} @defmath@\tilde{B}_k@(\tilde{P}_{k+2}-\tilde{P}_k)/(4k+6)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] && [\left\{f\boldsymbol{g}\middle|f\in\{y,1-y\},\boldsymbol{g}\in\left\{\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(z)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(z)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(0)\tilde{B}_{k+1}(z)\\-\tilde{B}_{k+1}(0)\tilde{P}_{k}(z)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(0)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\end{array}\right),\right\}\right\}] && [\left\{f\boldsymbol{g}\middle|f\in\{z,1-z\},\boldsymbol{g}\in\left\{\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(y)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(y)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(0)\tilde{B}_{k+1}(y)\\-\tilde{B}_{k+1}(0)\tilde{P}_{k}(y)\end{array}\right),\left(\begin{array}{c}\tilde{P}_k(x)\tilde{B}_{k+1}(0)\\-\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\end{array}\right),\right\}\right\}] -implementations: - symfem: - quadrilateral: TNTcurl - hexahedron: TNTcurl -examples: - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 - - hexahedron,1 -references: - - title: Commuting diagrams for the TNT elements on cubes - author: - - Cockburn, Bernardo - - Qiu, Weifeng - year: 2014 - journal: Mathematics of Computation - volume: 83 - pagestart: 603 - pageend: 633 - doi: 10.1090/S0025-5718-2013-02729-9 diff --git a/elements/tnt-div.def b/elements/tnt-div.def deleted file mode 100644 index 96f1340181..0000000000 --- a/elements/tnt-div.def +++ /dev/null @@ -1,54 +0,0 @@ -name: Tiniest tensor H(div) -html-name: Tiniest tensor H(div) -alt-names: - - TNT H(div) -complexes: - de-rham: - - TNT,d-1,tp -ndofs: - quadrilateral: - formula: 2(k+1)^2 + 3 - hexahedron: - formula: 3(k+1)^3 + 7 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: dk+1 -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hdiv -reference-cells: - - quadrilateral - - hexahedron -sobolev: H(div) -mapping: contravariant Piola -dofs: - facets: normal integral moments with (lagrange,k) - cell: - - integral moments with "\(\nabla f\) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space" - - integral moments with "\(\nabla\times\boldsymbol{f}\) for each \(\boldsymbol{f}\) in a degree \(k\) [vector Lagrange](element::vector-lagrange) space such that the tangential trace of \(\boldsymbol{f}\) on the facets of the cell is 0" -polynomial-set: - quadrilateral: qoly[k]^d && [\left\{\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(y)\\\tilde{P}_k(x)\tilde{B}_{k+1}(y)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(0)\tilde{P}_{k}(y)\\\tilde{P}_k(0)\tilde{B}_{k+1}(y)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\\\tilde{P}_k(x)\tilde{B}_{k+1}(0)\end{array}\right)\right\} @defmath@\tilde{B}_k@(\tilde{P}_k-\tilde{P}_{k-2})/(4k-2)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] - hexahedron: qoly[k]^d && [\left\{\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(y)\tilde{P}_{k}(z)\\\tilde{P}_k(x)\tilde{B}_{k+1}(y)\tilde{P}_{k}(z)\\\tilde{P}_{k}(x)\tilde{P}_{k}(y)\tilde{B}_{k+1}(z)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(y)\tilde{P}_{k}(0)\\\tilde{P}_k(x)\tilde{B}_{k+1}(y)\tilde{P}_{k}(0)\\\tilde{P}_{k}(x)\tilde{P}_{k}(y)\tilde{B}_{k+1}(0)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\tilde{P}_{k}(z)\\\tilde{P}_k(x)\tilde{B}_{k+1}(0)\tilde{P}_{k}(z)\\\tilde{P}_{k}(x)\tilde{P}_{k}(0)\tilde{B}_{k+1}(z)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(x)\tilde{P}_{k}(0)\tilde{P}_{k}(0)\\\tilde{P}_k(x)\tilde{B}_{k+1}(0)\tilde{P}_{k}(0)\\\tilde{P}_{k}(x)\tilde{P}_{k}(0)\tilde{B}_{k+1}(0)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(0)\tilde{P}_{k}(y)\tilde{P}_{k}(z)\\\tilde{P}_k(0)\tilde{B}_{k+1}(y)\tilde{P}_{k}(z)\\\tilde{P}_{k}(0)\tilde{P}_{k}(y)\tilde{B}_{k+1}(z)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(0)\tilde{P}_{k}(y)\tilde{P}_{k}(0)\\\tilde{P}_k(0)\tilde{B}_{k+1}(y)\tilde{P}_{k}(0)\\\tilde{P}_{k}(0)\tilde{P}_{k}(y)\tilde{B}_{k+1}(0)\end{array}\right),\left(\begin{array}{c}\tilde{B}_{k+1}(0)\tilde{P}_{k}(0)\tilde{P}_{k}(z)\\\tilde{P}_k(0)\tilde{B}_{k+1}(0)\tilde{P}_{k}(z)\\\tilde{P}_{k}(0)\tilde{P}_{k}(0)\tilde{B}_{k+1}(z)\end{array}\right)\right\} @defmath@\tilde{B}_k@(\tilde{P}_k-\tilde{P}_{k-2})/(4k-2)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] -implementations: - symfem: - quadrilateral: TNTdiv - hexahedron: TNTdiv -examples: - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 - - hexahedron,1 -references: - - title: Commuting diagrams for the TNT elements on cubes - author: - - Cockburn, Bernardo - - Qiu, Weifeng - year: 2014 - journal: Mathematics of Computation - volume: 83 - pagestart: 603 - pageend: 633 - doi: 10.1090/S0025-5718-2013-02729-9 diff --git a/elements/tnt.def b/elements/tnt.def deleted file mode 100644 index 84440cef03..0000000000 --- a/elements/tnt.def +++ /dev/null @@ -1,53 +0,0 @@ -name: Tiniest tensor -html-name: Tiniest tensor -alt-names: - - TNT -complexes: - de-rham: - - TNT,0,tp -ndofs: - quadrilateral: - formula: k^2 + 4 - hexahedron: - formula: k^3 + 12 -min-degree: 1 -polynomial-subdegree: k -polynomial-superdegree: max(dk,d+k) -lagrange-subdegree: k -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - scalar -sobolev: H1 -mapping: identity -reference-cells: - - quadrilateral - - hexahedron -dofs: - vertices: point evaluations - edges: integral moments with "\(\frac{\partial}{\partial x}f\) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space" - faces: integral moments with "\(\Delta f\) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space such that the trace of \(f\) on the edges of the face is 0" - volumes: integral moments of gradient with "\(\nabla f\) for each \(f\) in a degree \(k\) [Lagrange](element::lagrange) space such that the trace of \(f\) on the faces of the volume is 0" -polynomial-set: - quadrilateral: qoly[k] && [\left\{x\tilde{B}_{k+1}(y),(1-x)\tilde{B}_{k+1}(y),y\tilde{B}_{k+1}(x),(1-y)\tilde{B}_{k+1}(x)\right\} @defmath@\tilde{B}_k@(\tilde{P}_{k+2}-\tilde{P}_k)/(4k+6)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] - hexahedron: qoly[k] && [\left\{xy\tilde{B}_{k+1}(z),(1-x)y\tilde{B}_{k+1}(z),(x(1-y)\tilde{B}_{k+1}(z),(1-x)(1-y)\tilde{B}_{k+1}(z)\right\} @defmath@\tilde{B}_k@(\tilde{P}_{k+2}-\tilde{P}_k)/(4k+6)@ @def@\tilde{P}_k@the degree \(k\) Legendre polynomial on \([0,1]\)@] && [\left\{xz\tilde{B}_{k+1}(y),(1-x)z\tilde{B}_{k+1}(y),(x(1-z)\tilde{B}_{k+1}(y),(1-x)(1-z)\tilde{B}_{k+1}(y)\right\}] && [\left\{yz\tilde{B}_{k+1}(x),(1-y)z\tilde{B}_{k+1}(x),(y(1-z)\tilde{B}_{k+1}(x),(1-y)(1-z)\tilde{B}_{k+1}(x)\right\}] -implementations: - symfem: - quadrilateral: TNT - hexahedron: TNT -examples: - - quadrilateral,2 - - quadrilateral,3 - - quadrilateral,4 - - hexahedron,2 -references: - - title: Commuting diagrams for the TNT elements on cubes - author: - - Cockburn, Bernardo - - Qiu, Weifeng - year: 2014 - journal: Mathematics of Computation - volume: 83 - pagestart: 603 - pageend: 633 - doi: 10.1090/S0025-5718-2013-02729-9 diff --git a/elements/transition.def b/elements/transition.def deleted file mode 100644 index e751479183..0000000000 --- a/elements/transition.def +++ /dev/null @@ -1,23 +0,0 @@ -name: transition -html-name: transition -notes: - - This element is used to bridge the gap between [Lagrange](element::lagrange) elements of different degrees -min-degree: 1 -categories: - - scalar -reference-cells: - - triangle - - tetrahedron -sobolev: H1 -mapping: identity -dofs: - vertices: point evaluations - edges: point evaluations - faces: point evaluations - volumes: point evaluations -implementations: - symfem: transition -examples: - - triangle,1 {edge_orders=[2,1,1]} - - triangle,1 {edge_orders=[3,2,1]} - - triangle,3 {edge_orders=[1,1,1]} diff --git a/elements/trimmed-serendipity-curl.def b/elements/trimmed-serendipity-curl.def deleted file mode 100644 index 9f2d39506c..0000000000 --- a/elements/trimmed-serendipity-curl.def +++ /dev/null @@ -1,58 +0,0 @@ -name: trimmed serendipity H(curl) -html-name: trimmed serendipity H(curl) -complexes: - de-rham: - - S-,1,tp -polynomial-subdegree: k -polynomial-superdegree: k+d-1 -lagrange-subdegree: floor((k+d)/(d+1)) -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hcurl -reference-cells: - - quadrilateral - - hexahedron -dofs: - edges: tangential integral moments with (dpc,k) - faces: - - integral moments with (vector-dpc,k-2) - - integral moments with {\nabla(p)\middle|p\text{ is a degree \(k\) monomial}} -polynomial-set: - quadrilateral: poly[k]^d && [\operatorname{span}\left\{\left(\begin{array}{c}y\\-x\end{array}\right)p\middle|p\in{{tpoly[k-1]}}\right\}] && [\operatorname{span}\left\{\left(\begin{array}{c}y^k\\kxy^{k-1}\end{array}\right),\left(\begin{array}{c}kx^{k-1}y\\x^k\end{array}\right)\right\}] - hexahedron: poly[k]^d && [\operatorname{span}\left\{\boldsymbol{x}\times p\middle|p\in{{tpoly[k-1]}}\right\}] && [\operatorname{span}\left\{\nabla p\middle|p\in\{xyz^k,xy^kz,x^kyz\}\cup\{xy^az^{k-a}|a=0,1,...,k\}\cup\{x^ayz^{k-a}|a=0,1,...,k\}\cup\{x^ay^{k-a}z|a=0,1,...,k\}\right\}] && [\operatorname{span}\left\{\left(\left(\begin{array}{c}-y\\x\\0\end{array}\right)xy^az^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] && [\operatorname{span}\left\{\left(\left(\begin{array}{c}-z\\0\\x\end{array}\right)yx^az^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] && [\operatorname{span}\left\{\left(\left(\begin{array}{c}-y\\x\\0\end{array}\right)zx^ay^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] -implementations: - symfem: TScurl - fiat: TrimmedSerendipityCurl DEGREEMAP=k+1 -sobolev: H(curl) -mapping: covariant Piola -examples: - - quadrilateral,0 - - quadrilateral,1 - - quadrilateral,2 - - hexahedron,0 - - hexahedron,1 - - hexahedron,2 -references: - - title: A systematic construction of finite element commuting exact sequences - author: - - Cockburn, Bernardo - - Fu, Guosheng - year: 2017 - journal: SIAM Journal of Numerical Analysis - volume: 55 - issue: 4 - pagestart: 1650 - pageend: 1688 - doi: 10.1137/16M1073352 - - title: Trimmed serendipity finite element differential forms - author: - - Gillette, Andrew - - Kloefkorn, Tyler - journal: Mathematics of Computation - volume: 88 - year: 2019 - pagestart: 583 - pageend: 606 - doi: 10.1090/mcom/3354 diff --git a/elements/trimmed-serendipity-div.def b/elements/trimmed-serendipity-div.def deleted file mode 100644 index c524629c6d..0000000000 --- a/elements/trimmed-serendipity-div.def +++ /dev/null @@ -1,58 +0,0 @@ -name: trimmed serendipity H(div) -html-name: trimmed serendipity H(div) -complexes: - de-rham: - - S-,d-1,tp -polynomial-subdegree: k -polynomial-superdegree: k+1 -lagrange-subdegree: floor((k+2)/(d+1)) -lagrange-superdegree: k+1 -degree: polynomial-subdegree -categories: - - vector - - Hdiv -reference-cells: - - quadrilateral - - hexahedron -dofs: - facets: normal integral moments with (dpc,k) - cell: - - integral moments with (vector-dpc,k-2) - - integral moments with {\nabla(p)\middle|p\text{ is a degree \(k\) monomial}} -polynomial-set: - quadrilateral: poly[k]^d && [\operatorname{span}\left\{\boldsymbol{x}p\middle|p\in{{tpoly[k-1]}}\right\}] && [\operatorname{span}\left\{\left(\begin{array}{c}kxy^{k-1}\\-y^k\end{array}\right),\left(\begin{array}{c}-x^k\\kx^{k-1}y\end{array}\right)\right\}] - hexahedron: poly[k]^d && [\operatorname{span}\left\{\boldsymbol{x}p\middle|p\in{{tpoly[k-1]}}\right\}] && [\operatorname{span}\left\{\operatorname{curl}\left(\left(\begin{array}{c}0\\-z\\y\end{array}\right)xy^az^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] && [\operatorname{span}\left\{\operatorname{curl}\left(\left(\begin{array}{c}-z\\0\\x\end{array}\right)yx^az^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] && [\operatorname{span}\left\{\operatorname{curl}\left(\left(\begin{array}{c}-y\\x\\0\end{array}\right)zx^ay^{k-1-a}\right)\middle|a=0,1,...,a-1\right\}] -implementations: - symfem: TSdiv - fiat: TrimmedSerendipityDiv DEGREEMAP=k+1 -sobolev: H(div) -mapping: contravariant Piola -examples: - - quadrilateral,0 - - quadrilateral,1 - - quadrilateral,2 - - hexahedron,0 - - hexahedron,1 - - hexahedron,2 -references: - - title: A systematic construction of finite element commuting exact sequences - author: - - Cockburn, Bernardo - - Fu, Guosheng - year: 2017 - journal: SIAM Journal of Numerical Analysis - volume: 55 - issue: 4 - pagestart: 1650 - pageend: 1688 - doi: 10.1137/16M1073352 - - title: Trimmed serendipity finite element differential forms - author: - - Gillette, Andrew - - Kloefkorn, Tyler - journal: Mathematics of Computation - volume: 88 - year: 2019 - pagestart: 583 - pageend: 606 - doi: 10.1090/mcom/3354 diff --git a/elements/vector-bubble-enriched-lagrange.def b/elements/vector-bubble-enriched-lagrange.def deleted file mode 100644 index 4220c5fed1..0000000000 --- a/elements/vector-bubble-enriched-lagrange.def +++ /dev/null @@ -1,32 +0,0 @@ -name: vector bubble enriched Lagrange -html-name: vector bubble enriched Lagrange -ndofs: - triangle: - formula: 2(k+1)^2 - oeis: A001105 -categories: - - vector -reference-cells: - - triangle -sobolev: H1 -mapping: identity -dofs: - vertices: point evaluations in coordinate directions - edges: point evaluations in coordinate directions - faces: point evaluations in coordinate directions -polynomial-set: - triangle: poly[k]^d && [\left\{p\in {{poly[k]}}\middle|p=0\text{ on the boundary}\right\}]^d -implementations: - symfem: bubble enriched vector Lagrange - ferrite: - triangle: BubbleEnrichedLagrange vdim=2 DEGREES=1 -examples: - - triangle,1 - - triangle,2 -min-degree: 1 -max-degree: 2 -polynomial-subdegree: k -polynomial-superdegree: k+2 -lagrange-subdegree: k -lagrange-superdegree: k+2 -degree: polynomial-subdegree diff --git a/elements/vector-dpc.def b/elements/vector-dpc.def deleted file mode 100644 index 3fbabcdcea..0000000000 --- a/elements/vector-dpc.def +++ /dev/null @@ -1,37 +0,0 @@ -name: vector dPc -html-name: vector dPc -ndofs: - quadrilateral: - formula: (k+1)(k+2) - oeis: A002378 - hexahedron: - formula: (k+1)(k+2)(k+3)/2 - oeis: A027480 -categories: - - scalar -sobolev: L2 -mapping: identity -reference-cells: - - interval - - quadrilateral - - hexahedron -dofs: - cell: point evaluations -polynomial-set: - interval: poly[k]^d - quadrilateral: poly[k]^d - hexahedron: poly[k]^d -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: floor(k/d) -lagrange-superdegree: k -degree: polynomial-subdegree -implementations: - symfem: vector dPc - basix.ufl: DPC shape=(dim,) discontinuous=True dpc_variant=simplex_equispaced -examples: - - quadrilateral,1 - - quadrilateral,2 - - quadrilateral,3 - - hexahedron,1 - - hexahedron,2 diff --git a/elements/vector-lagrange.def b/elements/vector-lagrange.def deleted file mode 100644 index 36e5d2c671..0000000000 --- a/elements/vector-lagrange.def +++ /dev/null @@ -1,40 +0,0 @@ -name: vector Lagrange -html-name: vector Lagrange -categories: - - vector -reference-cells: - - triangle - - tetrahedron -ndofs: - triangle: - formula: (k+1)(k+2) - oeis: A002378 - tetrahedron: - formula: (k+1)(k+2)(k+3)/2 - oeis: A027480 -sobolev: H1 -mapping: identity -dofs: - vertices: point evaluations in coordinate directions - edges: point evaluations in coordinate directions - faces: point evaluations in coordinate directions - volumes: point evaluations in coordinate directions -polynomial-set: - triangle: poly[k]^d - tetrahedron: poly[k]^d -polynomial-subdegree: k -polynomial-superdegree: k -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -implementations: - symfem: vector Lagrange - basix.ufl: P shape=(dim,) lagrange_variant=equispaced - ferrite: - triangle: Lagrange vdim=2 DEGREES=1:6 - tetrahedron: Lagrange vdim=3 DEGREES=1:5 -examples: - - triangle,1 - - triangle,2 - - tetrahedron,1 - - tetrahedron,2 diff --git a/elements/vector-q.def b/elements/vector-q.def deleted file mode 100644 index 1bfacb25e1..0000000000 --- a/elements/vector-q.def +++ /dev/null @@ -1,45 +0,0 @@ -name: vector Q -html-name: vector Q -categories: - - vector -alt-names: - - (vector Lagrange) -reference-cells: - - quadrilateral - - hexahedron -ndofs: - interval: - formula: k+1 - oeis: A000027 - quadrilateral: - formula: 2(k+1)^2 - oeis: A001105 - hexahedron: - formula: 3(k+1)^3 - oeis: A117642 -mapping: identity -sobolev: H1 -dofs: - vertices: point evaluations in coordinate directions - edges: point evaluations in coordinate directions - faces: point evaluations in coordinate directions - volumes: point evaluations in coordinate directions -polynomial-subdegree: k -polynomial-superdegree: dk -lagrange-subdegree: k -lagrange-superdegree: k -degree: polynomial-subdegree -polynomial-set: - quadrilateral: qoly[k]^d - hexahedron: qoly[k]^d -implementations: - symfem: vector Q - basix.ufl: P lagrange_variant=equispaced shape=(dim,) - ferrite: - quadrilateral: Lagrange vdim=2 DEGREES=1:4 - hexahedron: Lagrange vdim=3 DEGREES=1:4 -examples: - - quadrilateral,1 - - quadrilateral,2 - - hexahedron,1 - - hexahedron,2 diff --git a/elements/wu-xu.def b/elements/wu-xu.def deleted file mode 100644 index 46de4d60c8..0000000000 --- a/elements/wu-xu.def +++ /dev/null @@ -1,63 +0,0 @@ -name: Wu-Xu -html-name: Wu–Xu -notes: - - This is a higher degree version of the [Morley–Wang–Xu](element::morley-wang-xu) element. -min-degree: - interval: 3 - triangle: 3 - tetrahedron: 4 -max-degree: - interval: 3 - triangle: 3 - tetrahedron: 4 -polynomial-subdegree: - interval: k - triangle: k - tetrahedron: k -polynomial-superdegree: k -lagrange-subdegree: - interval: k - triangle: k - tetrahedron: k -lagrange-superdegree: k -categories: - - scalar -ndofs: - interval: - formula: 4 - triangle: - formula: 12 - tetrahedron: - formula: 38 -reference-cells: - - interval - - triangle - - tetrahedron -polynomial-set: - interval: poly[k] - triangle: poly[k] && <1>[\left\{xy(1-x-y)p\middle|p\in{{poly[k]}}\setminus{{poly[0]}}\right\}] - tetrahedron: poly[k] && <1>[\left\{xyz(1-x-y-z)p\middle|p\in{{poly[k]}}\setminus{{poly[0]}}\right\}] -mapping: see {{citation::kirby_mapping}} -sobolev: H1 -dofs: - vertices: point evaluations - edges: integrals of normal derivatives - faces: integrals of normal derivatives - volumes: integrals of normal derivatives -implementations: - symfem: Wu-Xu -examples: - - interval,3 - - triangle,3 - - tetrahedron,4 -references: - - title: Nonconforming finite element spaces for 2mth order partial differential equations on Rn simplical grids when m=n+1 - author: - - Wu, Shuonan - - Xu, Jinchao - year: 2019 - journal: Mathematics of computation - volume: 88 - pagestart: 531 - pageend: 551 - doi: 10.1090/mcom/3361 diff --git a/files/fontawesome/LICENSE.txt b/files/fontawesome/LICENSE.txt deleted file mode 100644 index e69c5e39a3..0000000000 --- a/files/fontawesome/LICENSE.txt +++ /dev/null @@ -1,165 +0,0 @@ -Fonticons, Inc. (https://fontawesome.com) - --------------------------------------------------------------------------------- - -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/) - -The Font Awesome Free download is licensed under a Creative Commons -Attribution 4.0 International License and applies to all icons packaged -as SVG and JS file types. - --------------------------------------------------------------------------------- - -# Fonts: SIL OFL 1.1 License - -In the Font Awesome Free download, the SIL OFL license applies to all icons -packaged as web and desktop font files. - -Copyright (c) 2024 Fonticons, Inc. (https://fontawesome.com) -with Reserved Font Name: "Font Awesome". - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - -SIL OPEN FONT LICENSE -Version 1.1 - 26 February 2007 - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting — in part or in whole — any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. - --------------------------------------------------------------------------------- - -# 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. - -Copyright 2024 Fonticons, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the "Software"), to deal in the -Software without restriction, including without limitation the rights to use, copy, -modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, -and to permit persons to whom the Software is furnished to do so, subject to the -following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - --------------------------------------------------------------------------------- - -# 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/files/fontawesome/css/all.css b/files/fontawesome/css/all.css deleted file mode 100644 index ffdf0f023f..0000000000 --- a/files/fontawesome/css/all.css +++ /dev/null @@ -1,7913 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa { - font-family: var(--fa-style-family, "Font Awesome 6 Free"); - font-weight: var(--fa-style, 900); } - -.fas, -.far, -.fab, -.fa-solid, -.fa-regular, -.fa-brands, -.fa { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: var(--fa-display, inline-block); - font-style: normal; - font-variant: normal; - line-height: 1; - text-rendering: auto; } - -.fas::before, -.far::before, -.fab::before, -.fa-solid::before, -.fa-regular::before, -.fa-brands::before, -.fa::before { - content: var(--fa); } - -.fa-classic, -.fas, -.fa-solid, -.far, -.fa-regular { - font-family: 'Font Awesome 6 Free'; } - -.fa-brands, -.fab { - font-family: 'Font Awesome 6 Brands'; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-2xs { - font-size: 0.625em; - line-height: 0.1em; - vertical-align: 0.225em; } - -.fa-xs { - font-size: 0.75em; - line-height: 0.08333em; - vertical-align: 0.125em; } - -.fa-sm { - font-size: 0.875em; - line-height: 0.07143em; - vertical-align: 0.05357em; } - -.fa-lg { - font-size: 1.25em; - line-height: 0.05em; - vertical-align: -0.075em; } - -.fa-xl { - font-size: 1.5em; - line-height: 0.04167em; - vertical-align: -0.125em; } - -.fa-2xl { - font-size: 2em; - line-height: 0.03125em; - vertical-align: -0.1875em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: var(--fa-li-margin, 2.5em); - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: calc(-1 * var(--fa-li-width, 2em)); - position: absolute; - text-align: center; - width: var(--fa-li-width, 2em); - line-height: inherit; } - -.fa-border { - border-color: var(--fa-border-color, #eee); - border-radius: var(--fa-border-radius, 0.1em); - border-style: var(--fa-border-style, solid); - border-width: var(--fa-border-width, 0.08em); - padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } - -.fa-pull-left { - float: left; - margin-right: var(--fa-pull-margin, 0.3em); } - -.fa-pull-right { - float: right; - margin-left: var(--fa-pull-margin, 0.3em); } - -.fa-beat { - animation-name: fa-beat; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-bounce { - animation-name: fa-bounce; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } - -.fa-fade { - animation-name: fa-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-beat-fade { - animation-name: fa-beat-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-flip { - animation-name: fa-flip; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-shake { - animation-name: fa-shake; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin { - animation-name: fa-spin; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 2s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin-reverse { - --fa-animation-direction: reverse; } - -.fa-pulse, -.fa-spin-pulse { - animation-name: fa-spin; - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, steps(8)); } - -@media (prefers-reduced-motion: reduce) { - .fa-beat, - .fa-bounce, - .fa-fade, - .fa-beat-fade, - .fa-flip, - .fa-pulse, - .fa-shake, - .fa-spin, - .fa-spin-pulse { - animation-delay: -1ms; - animation-duration: 1ms; - animation-iteration-count: 1; - transition-delay: 0s; - transition-duration: 0s; } } - -@keyframes fa-beat { - 0%, 90% { - transform: scale(1); } - 45% { - transform: scale(var(--fa-beat-scale, 1.25)); } } - -@keyframes fa-bounce { - 0% { - transform: scale(1, 1) translateY(0); } - 10% { - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } - 30% { - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } - 50% { - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } - 57% { - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } - 64% { - transform: scale(1, 1) translateY(0); } - 100% { - transform: scale(1, 1) translateY(0); } } - -@keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); } } - -@keyframes fa-beat-fade { - 0%, 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - transform: scale(1); } - 50% { - opacity: 1; - transform: scale(var(--fa-beat-fade-scale, 1.125)); } } - -@keyframes fa-flip { - 50% { - transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } - -@keyframes fa-shake { - 0% { - transform: rotate(-15deg); } - 4% { - transform: rotate(15deg); } - 8%, 24% { - transform: rotate(-18deg); } - 12%, 28% { - transform: rotate(18deg); } - 16% { - transform: rotate(-22deg); } - 20% { - transform: rotate(22deg); } - 32% { - transform: rotate(-12deg); } - 36% { - transform: rotate(12deg); } - 40%, 100% { - transform: rotate(0deg); } } - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); } - 100% { - transform: rotate(360deg); } } - -.fa-rotate-90 { - transform: rotate(90deg); } - -.fa-rotate-180 { - transform: rotate(180deg); } - -.fa-rotate-270 { - transform: rotate(270deg); } - -.fa-flip-horizontal { - transform: scale(-1, 1); } - -.fa-flip-vertical { - transform: scale(1, -1); } - -.fa-flip-both, -.fa-flip-horizontal.fa-flip-vertical { - transform: scale(-1, -1); } - -.fa-rotate-by { - transform: rotate(var(--fa-rotate-angle, 0)); } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; - z-index: var(--fa-stack-z-index, auto); } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: var(--fa-inverse, #fff); } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ - -.fa-0 { - --fa: "\30"; } - -.fa-1 { - --fa: "\31"; } - -.fa-2 { - --fa: "\32"; } - -.fa-3 { - --fa: "\33"; } - -.fa-4 { - --fa: "\34"; } - -.fa-5 { - --fa: "\35"; } - -.fa-6 { - --fa: "\36"; } - -.fa-7 { - --fa: "\37"; } - -.fa-8 { - --fa: "\38"; } - -.fa-9 { - --fa: "\39"; } - -.fa-fill-drip { - --fa: "\f576"; } - -.fa-arrows-to-circle { - --fa: "\e4bd"; } - -.fa-circle-chevron-right { - --fa: "\f138"; } - -.fa-chevron-circle-right { - --fa: "\f138"; } - -.fa-at { - --fa: "\40"; } - -.fa-trash-can { - --fa: "\f2ed"; } - -.fa-trash-alt { - --fa: "\f2ed"; } - -.fa-text-height { - --fa: "\f034"; } - -.fa-user-xmark { - --fa: "\f235"; } - -.fa-user-times { - --fa: "\f235"; } - -.fa-stethoscope { - --fa: "\f0f1"; } - -.fa-message { - --fa: "\f27a"; } - -.fa-comment-alt { - --fa: "\f27a"; } - -.fa-info { - --fa: "\f129"; } - -.fa-down-left-and-up-right-to-center { - --fa: "\f422"; } - -.fa-compress-alt { - --fa: "\f422"; } - -.fa-explosion { - --fa: "\e4e9"; } - -.fa-file-lines { - --fa: "\f15c"; } - -.fa-file-alt { - --fa: "\f15c"; } - -.fa-file-text { - --fa: "\f15c"; } - -.fa-wave-square { - --fa: "\f83e"; } - -.fa-ring { - --fa: "\f70b"; } - -.fa-building-un { - --fa: "\e4d9"; } - -.fa-dice-three { - --fa: "\f527"; } - -.fa-calendar-days { - --fa: "\f073"; } - -.fa-calendar-alt { - --fa: "\f073"; } - -.fa-anchor-circle-check { - --fa: "\e4aa"; } - -.fa-building-circle-arrow-right { - --fa: "\e4d1"; } - -.fa-volleyball { - --fa: "\f45f"; } - -.fa-volleyball-ball { - --fa: "\f45f"; } - -.fa-arrows-up-to-line { - --fa: "\e4c2"; } - -.fa-sort-down { - --fa: "\f0dd"; } - -.fa-sort-desc { - --fa: "\f0dd"; } - -.fa-circle-minus { - --fa: "\f056"; } - -.fa-minus-circle { - --fa: "\f056"; } - -.fa-door-open { - --fa: "\f52b"; } - -.fa-right-from-bracket { - --fa: "\f2f5"; } - -.fa-sign-out-alt { - --fa: "\f2f5"; } - -.fa-atom { - --fa: "\f5d2"; } - -.fa-soap { - --fa: "\e06e"; } - -.fa-icons { - --fa: "\f86d"; } - -.fa-heart-music-camera-bolt { - --fa: "\f86d"; } - -.fa-microphone-lines-slash { - --fa: "\f539"; } - -.fa-microphone-alt-slash { - --fa: "\f539"; } - -.fa-bridge-circle-check { - --fa: "\e4c9"; } - -.fa-pump-medical { - --fa: "\e06a"; } - -.fa-fingerprint { - --fa: "\f577"; } - -.fa-hand-point-right { - --fa: "\f0a4"; } - -.fa-magnifying-glass-location { - --fa: "\f689"; } - -.fa-search-location { - --fa: "\f689"; } - -.fa-forward-step { - --fa: "\f051"; } - -.fa-step-forward { - --fa: "\f051"; } - -.fa-face-smile-beam { - --fa: "\f5b8"; } - -.fa-smile-beam { - --fa: "\f5b8"; } - -.fa-flag-checkered { - --fa: "\f11e"; } - -.fa-football { - --fa: "\f44e"; } - -.fa-football-ball { - --fa: "\f44e"; } - -.fa-school-circle-exclamation { - --fa: "\e56c"; } - -.fa-crop { - --fa: "\f125"; } - -.fa-angles-down { - --fa: "\f103"; } - -.fa-angle-double-down { - --fa: "\f103"; } - -.fa-users-rectangle { - --fa: "\e594"; } - -.fa-people-roof { - --fa: "\e537"; } - -.fa-people-line { - --fa: "\e534"; } - -.fa-beer-mug-empty { - --fa: "\f0fc"; } - -.fa-beer { - --fa: "\f0fc"; } - -.fa-diagram-predecessor { - --fa: "\e477"; } - -.fa-arrow-up-long { - --fa: "\f176"; } - -.fa-long-arrow-up { - --fa: "\f176"; } - -.fa-fire-flame-simple { - --fa: "\f46a"; } - -.fa-burn { - --fa: "\f46a"; } - -.fa-person { - --fa: "\f183"; } - -.fa-male { - --fa: "\f183"; } - -.fa-laptop { - --fa: "\f109"; } - -.fa-file-csv { - --fa: "\f6dd"; } - -.fa-menorah { - --fa: "\f676"; } - -.fa-truck-plane { - --fa: "\e58f"; } - -.fa-record-vinyl { - --fa: "\f8d9"; } - -.fa-face-grin-stars { - --fa: "\f587"; } - -.fa-grin-stars { - --fa: "\f587"; } - -.fa-bong { - --fa: "\f55c"; } - -.fa-spaghetti-monster-flying { - --fa: "\f67b"; } - -.fa-pastafarianism { - --fa: "\f67b"; } - -.fa-arrow-down-up-across-line { - --fa: "\e4af"; } - -.fa-spoon { - --fa: "\f2e5"; } - -.fa-utensil-spoon { - --fa: "\f2e5"; } - -.fa-jar-wheat { - --fa: "\e517"; } - -.fa-envelopes-bulk { - --fa: "\f674"; } - -.fa-mail-bulk { - --fa: "\f674"; } - -.fa-file-circle-exclamation { - --fa: "\e4eb"; } - -.fa-circle-h { - --fa: "\f47e"; } - -.fa-hospital-symbol { - --fa: "\f47e"; } - -.fa-pager { - --fa: "\f815"; } - -.fa-address-book { - --fa: "\f2b9"; } - -.fa-contact-book { - --fa: "\f2b9"; } - -.fa-strikethrough { - --fa: "\f0cc"; } - -.fa-k { - --fa: "\4b"; } - -.fa-landmark-flag { - --fa: "\e51c"; } - -.fa-pencil { - --fa: "\f303"; } - -.fa-pencil-alt { - --fa: "\f303"; } - -.fa-backward { - --fa: "\f04a"; } - -.fa-caret-right { - --fa: "\f0da"; } - -.fa-comments { - --fa: "\f086"; } - -.fa-paste { - --fa: "\f0ea"; } - -.fa-file-clipboard { - --fa: "\f0ea"; } - -.fa-code-pull-request { - --fa: "\e13c"; } - -.fa-clipboard-list { - --fa: "\f46d"; } - -.fa-truck-ramp-box { - --fa: "\f4de"; } - -.fa-truck-loading { - --fa: "\f4de"; } - -.fa-user-check { - --fa: "\f4fc"; } - -.fa-vial-virus { - --fa: "\e597"; } - -.fa-sheet-plastic { - --fa: "\e571"; } - -.fa-blog { - --fa: "\f781"; } - -.fa-user-ninja { - --fa: "\f504"; } - -.fa-person-arrow-up-from-line { - --fa: "\e539"; } - -.fa-scroll-torah { - --fa: "\f6a0"; } - -.fa-torah { - --fa: "\f6a0"; } - -.fa-broom-ball { - --fa: "\f458"; } - -.fa-quidditch { - --fa: "\f458"; } - -.fa-quidditch-broom-ball { - --fa: "\f458"; } - -.fa-toggle-off { - --fa: "\f204"; } - -.fa-box-archive { - --fa: "\f187"; } - -.fa-archive { - --fa: "\f187"; } - -.fa-person-drowning { - --fa: "\e545"; } - -.fa-arrow-down-9-1 { - --fa: "\f886"; } - -.fa-sort-numeric-desc { - --fa: "\f886"; } - -.fa-sort-numeric-down-alt { - --fa: "\f886"; } - -.fa-face-grin-tongue-squint { - --fa: "\f58a"; } - -.fa-grin-tongue-squint { - --fa: "\f58a"; } - -.fa-spray-can { - --fa: "\f5bd"; } - -.fa-truck-monster { - --fa: "\f63b"; } - -.fa-w { - --fa: "\57"; } - -.fa-earth-africa { - --fa: "\f57c"; } - -.fa-globe-africa { - --fa: "\f57c"; } - -.fa-rainbow { - --fa: "\f75b"; } - -.fa-circle-notch { - --fa: "\f1ce"; } - -.fa-tablet-screen-button { - --fa: "\f3fa"; } - -.fa-tablet-alt { - --fa: "\f3fa"; } - -.fa-paw { - --fa: "\f1b0"; } - -.fa-cloud { - --fa: "\f0c2"; } - -.fa-trowel-bricks { - --fa: "\e58a"; } - -.fa-face-flushed { - --fa: "\f579"; } - -.fa-flushed { - --fa: "\f579"; } - -.fa-hospital-user { - --fa: "\f80d"; } - -.fa-tent-arrow-left-right { - --fa: "\e57f"; } - -.fa-gavel { - --fa: "\f0e3"; } - -.fa-legal { - --fa: "\f0e3"; } - -.fa-binoculars { - --fa: "\f1e5"; } - -.fa-microphone-slash { - --fa: "\f131"; } - -.fa-box-tissue { - --fa: "\e05b"; } - -.fa-motorcycle { - --fa: "\f21c"; } - -.fa-bell-concierge { - --fa: "\f562"; } - -.fa-concierge-bell { - --fa: "\f562"; } - -.fa-pen-ruler { - --fa: "\f5ae"; } - -.fa-pencil-ruler { - --fa: "\f5ae"; } - -.fa-people-arrows { - --fa: "\e068"; } - -.fa-people-arrows-left-right { - --fa: "\e068"; } - -.fa-mars-and-venus-burst { - --fa: "\e523"; } - -.fa-square-caret-right { - --fa: "\f152"; } - -.fa-caret-square-right { - --fa: "\f152"; } - -.fa-scissors { - --fa: "\f0c4"; } - -.fa-cut { - --fa: "\f0c4"; } - -.fa-sun-plant-wilt { - --fa: "\e57a"; } - -.fa-toilets-portable { - --fa: "\e584"; } - -.fa-hockey-puck { - --fa: "\f453"; } - -.fa-table { - --fa: "\f0ce"; } - -.fa-magnifying-glass-arrow-right { - --fa: "\e521"; } - -.fa-tachograph-digital { - --fa: "\f566"; } - -.fa-digital-tachograph { - --fa: "\f566"; } - -.fa-users-slash { - --fa: "\e073"; } - -.fa-clover { - --fa: "\e139"; } - -.fa-reply { - --fa: "\f3e5"; } - -.fa-mail-reply { - --fa: "\f3e5"; } - -.fa-star-and-crescent { - --fa: "\f699"; } - -.fa-house-fire { - --fa: "\e50c"; } - -.fa-square-minus { - --fa: "\f146"; } - -.fa-minus-square { - --fa: "\f146"; } - -.fa-helicopter { - --fa: "\f533"; } - -.fa-compass { - --fa: "\f14e"; } - -.fa-square-caret-down { - --fa: "\f150"; } - -.fa-caret-square-down { - --fa: "\f150"; } - -.fa-file-circle-question { - --fa: "\e4ef"; } - -.fa-laptop-code { - --fa: "\f5fc"; } - -.fa-swatchbook { - --fa: "\f5c3"; } - -.fa-prescription-bottle { - --fa: "\f485"; } - -.fa-bars { - --fa: "\f0c9"; } - -.fa-navicon { - --fa: "\f0c9"; } - -.fa-people-group { - --fa: "\e533"; } - -.fa-hourglass-end { - --fa: "\f253"; } - -.fa-hourglass-3 { - --fa: "\f253"; } - -.fa-heart-crack { - --fa: "\f7a9"; } - -.fa-heart-broken { - --fa: "\f7a9"; } - -.fa-square-up-right { - --fa: "\f360"; } - -.fa-external-link-square-alt { - --fa: "\f360"; } - -.fa-face-kiss-beam { - --fa: "\f597"; } - -.fa-kiss-beam { - --fa: "\f597"; } - -.fa-film { - --fa: "\f008"; } - -.fa-ruler-horizontal { - --fa: "\f547"; } - -.fa-people-robbery { - --fa: "\e536"; } - -.fa-lightbulb { - --fa: "\f0eb"; } - -.fa-caret-left { - --fa: "\f0d9"; } - -.fa-circle-exclamation { - --fa: "\f06a"; } - -.fa-exclamation-circle { - --fa: "\f06a"; } - -.fa-school-circle-xmark { - --fa: "\e56d"; } - -.fa-arrow-right-from-bracket { - --fa: "\f08b"; } - -.fa-sign-out { - --fa: "\f08b"; } - -.fa-circle-chevron-down { - --fa: "\f13a"; } - -.fa-chevron-circle-down { - --fa: "\f13a"; } - -.fa-unlock-keyhole { - --fa: "\f13e"; } - -.fa-unlock-alt { - --fa: "\f13e"; } - -.fa-cloud-showers-heavy { - --fa: "\f740"; } - -.fa-headphones-simple { - --fa: "\f58f"; } - -.fa-headphones-alt { - --fa: "\f58f"; } - -.fa-sitemap { - --fa: "\f0e8"; } - -.fa-circle-dollar-to-slot { - --fa: "\f4b9"; } - -.fa-donate { - --fa: "\f4b9"; } - -.fa-memory { - --fa: "\f538"; } - -.fa-road-spikes { - --fa: "\e568"; } - -.fa-fire-burner { - --fa: "\e4f1"; } - -.fa-flag { - --fa: "\f024"; } - -.fa-hanukiah { - --fa: "\f6e6"; } - -.fa-feather { - --fa: "\f52d"; } - -.fa-volume-low { - --fa: "\f027"; } - -.fa-volume-down { - --fa: "\f027"; } - -.fa-comment-slash { - --fa: "\f4b3"; } - -.fa-cloud-sun-rain { - --fa: "\f743"; } - -.fa-compress { - --fa: "\f066"; } - -.fa-wheat-awn { - --fa: "\e2cd"; } - -.fa-wheat-alt { - --fa: "\e2cd"; } - -.fa-ankh { - --fa: "\f644"; } - -.fa-hands-holding-child { - --fa: "\e4fa"; } - -.fa-asterisk { - --fa: "\2a"; } - -.fa-square-check { - --fa: "\f14a"; } - -.fa-check-square { - --fa: "\f14a"; } - -.fa-peseta-sign { - --fa: "\e221"; } - -.fa-heading { - --fa: "\f1dc"; } - -.fa-header { - --fa: "\f1dc"; } - -.fa-ghost { - --fa: "\f6e2"; } - -.fa-list { - --fa: "\f03a"; } - -.fa-list-squares { - --fa: "\f03a"; } - -.fa-square-phone-flip { - --fa: "\f87b"; } - -.fa-phone-square-alt { - --fa: "\f87b"; } - -.fa-cart-plus { - --fa: "\f217"; } - -.fa-gamepad { - --fa: "\f11b"; } - -.fa-circle-dot { - --fa: "\f192"; } - -.fa-dot-circle { - --fa: "\f192"; } - -.fa-face-dizzy { - --fa: "\f567"; } - -.fa-dizzy { - --fa: "\f567"; } - -.fa-egg { - --fa: "\f7fb"; } - -.fa-house-medical-circle-xmark { - --fa: "\e513"; } - -.fa-campground { - --fa: "\f6bb"; } - -.fa-folder-plus { - --fa: "\f65e"; } - -.fa-futbol { - --fa: "\f1e3"; } - -.fa-futbol-ball { - --fa: "\f1e3"; } - -.fa-soccer-ball { - --fa: "\f1e3"; } - -.fa-paintbrush { - --fa: "\f1fc"; } - -.fa-paint-brush { - --fa: "\f1fc"; } - -.fa-lock { - --fa: "\f023"; } - -.fa-gas-pump { - --fa: "\f52f"; } - -.fa-hot-tub-person { - --fa: "\f593"; } - -.fa-hot-tub { - --fa: "\f593"; } - -.fa-map-location { - --fa: "\f59f"; } - -.fa-map-marked { - --fa: "\f59f"; } - -.fa-house-flood-water { - --fa: "\e50e"; } - -.fa-tree { - --fa: "\f1bb"; } - -.fa-bridge-lock { - --fa: "\e4cc"; } - -.fa-sack-dollar { - --fa: "\f81d"; } - -.fa-pen-to-square { - --fa: "\f044"; } - -.fa-edit { - --fa: "\f044"; } - -.fa-car-side { - --fa: "\f5e4"; } - -.fa-share-nodes { - --fa: "\f1e0"; } - -.fa-share-alt { - --fa: "\f1e0"; } - -.fa-heart-circle-minus { - --fa: "\e4ff"; } - -.fa-hourglass-half { - --fa: "\f252"; } - -.fa-hourglass-2 { - --fa: "\f252"; } - -.fa-microscope { - --fa: "\f610"; } - -.fa-sink { - --fa: "\e06d"; } - -.fa-bag-shopping { - --fa: "\f290"; } - -.fa-shopping-bag { - --fa: "\f290"; } - -.fa-arrow-down-z-a { - --fa: "\f881"; } - -.fa-sort-alpha-desc { - --fa: "\f881"; } - -.fa-sort-alpha-down-alt { - --fa: "\f881"; } - -.fa-mitten { - --fa: "\f7b5"; } - -.fa-person-rays { - --fa: "\e54d"; } - -.fa-users { - --fa: "\f0c0"; } - -.fa-eye-slash { - --fa: "\f070"; } - -.fa-flask-vial { - --fa: "\e4f3"; } - -.fa-hand { - --fa: "\f256"; } - -.fa-hand-paper { - --fa: "\f256"; } - -.fa-om { - --fa: "\f679"; } - -.fa-worm { - --fa: "\e599"; } - -.fa-house-circle-xmark { - --fa: "\e50b"; } - -.fa-plug { - --fa: "\f1e6"; } - -.fa-chevron-up { - --fa: "\f077"; } - -.fa-hand-spock { - --fa: "\f259"; } - -.fa-stopwatch { - --fa: "\f2f2"; } - -.fa-face-kiss { - --fa: "\f596"; } - -.fa-kiss { - --fa: "\f596"; } - -.fa-bridge-circle-xmark { - --fa: "\e4cb"; } - -.fa-face-grin-tongue { - --fa: "\f589"; } - -.fa-grin-tongue { - --fa: "\f589"; } - -.fa-chess-bishop { - --fa: "\f43a"; } - -.fa-face-grin-wink { - --fa: "\f58c"; } - -.fa-grin-wink { - --fa: "\f58c"; } - -.fa-ear-deaf { - --fa: "\f2a4"; } - -.fa-deaf { - --fa: "\f2a4"; } - -.fa-deafness { - --fa: "\f2a4"; } - -.fa-hard-of-hearing { - --fa: "\f2a4"; } - -.fa-road-circle-check { - --fa: "\e564"; } - -.fa-dice-five { - --fa: "\f523"; } - -.fa-square-rss { - --fa: "\f143"; } - -.fa-rss-square { - --fa: "\f143"; } - -.fa-land-mine-on { - --fa: "\e51b"; } - -.fa-i-cursor { - --fa: "\f246"; } - -.fa-stamp { - --fa: "\f5bf"; } - -.fa-stairs { - --fa: "\e289"; } - -.fa-i { - --fa: "\49"; } - -.fa-hryvnia-sign { - --fa: "\f6f2"; } - -.fa-hryvnia { - --fa: "\f6f2"; } - -.fa-pills { - --fa: "\f484"; } - -.fa-face-grin-wide { - --fa: "\f581"; } - -.fa-grin-alt { - --fa: "\f581"; } - -.fa-tooth { - --fa: "\f5c9"; } - -.fa-v { - --fa: "\56"; } - -.fa-bangladeshi-taka-sign { - --fa: "\e2e6"; } - -.fa-bicycle { - --fa: "\f206"; } - -.fa-staff-snake { - --fa: "\e579"; } - -.fa-rod-asclepius { - --fa: "\e579"; } - -.fa-rod-snake { - --fa: "\e579"; } - -.fa-staff-aesculapius { - --fa: "\e579"; } - -.fa-head-side-cough-slash { - --fa: "\e062"; } - -.fa-truck-medical { - --fa: "\f0f9"; } - -.fa-ambulance { - --fa: "\f0f9"; } - -.fa-wheat-awn-circle-exclamation { - --fa: "\e598"; } - -.fa-snowman { - --fa: "\f7d0"; } - -.fa-mortar-pestle { - --fa: "\f5a7"; } - -.fa-road-barrier { - --fa: "\e562"; } - -.fa-school { - --fa: "\f549"; } - -.fa-igloo { - --fa: "\f7ae"; } - -.fa-joint { - --fa: "\f595"; } - -.fa-angle-right { - --fa: "\f105"; } - -.fa-horse { - --fa: "\f6f0"; } - -.fa-q { - --fa: "\51"; } - -.fa-g { - --fa: "\47"; } - -.fa-notes-medical { - --fa: "\f481"; } - -.fa-temperature-half { - --fa: "\f2c9"; } - -.fa-temperature-2 { - --fa: "\f2c9"; } - -.fa-thermometer-2 { - --fa: "\f2c9"; } - -.fa-thermometer-half { - --fa: "\f2c9"; } - -.fa-dong-sign { - --fa: "\e169"; } - -.fa-capsules { - --fa: "\f46b"; } - -.fa-poo-storm { - --fa: "\f75a"; } - -.fa-poo-bolt { - --fa: "\f75a"; } - -.fa-face-frown-open { - --fa: "\f57a"; } - -.fa-frown-open { - --fa: "\f57a"; } - -.fa-hand-point-up { - --fa: "\f0a6"; } - -.fa-money-bill { - --fa: "\f0d6"; } - -.fa-bookmark { - --fa: "\f02e"; } - -.fa-align-justify { - --fa: "\f039"; } - -.fa-umbrella-beach { - --fa: "\f5ca"; } - -.fa-helmet-un { - --fa: "\e503"; } - -.fa-bullseye { - --fa: "\f140"; } - -.fa-bacon { - --fa: "\f7e5"; } - -.fa-hand-point-down { - --fa: "\f0a7"; } - -.fa-arrow-up-from-bracket { - --fa: "\e09a"; } - -.fa-folder { - --fa: "\f07b"; } - -.fa-folder-blank { - --fa: "\f07b"; } - -.fa-file-waveform { - --fa: "\f478"; } - -.fa-file-medical-alt { - --fa: "\f478"; } - -.fa-radiation { - --fa: "\f7b9"; } - -.fa-chart-simple { - --fa: "\e473"; } - -.fa-mars-stroke { - --fa: "\f229"; } - -.fa-vial { - --fa: "\f492"; } - -.fa-gauge { - --fa: "\f624"; } - -.fa-dashboard { - --fa: "\f624"; } - -.fa-gauge-med { - --fa: "\f624"; } - -.fa-tachometer-alt-average { - --fa: "\f624"; } - -.fa-wand-magic-sparkles { - --fa: "\e2ca"; } - -.fa-magic-wand-sparkles { - --fa: "\e2ca"; } - -.fa-e { - --fa: "\45"; } - -.fa-pen-clip { - --fa: "\f305"; } - -.fa-pen-alt { - --fa: "\f305"; } - -.fa-bridge-circle-exclamation { - --fa: "\e4ca"; } - -.fa-user { - --fa: "\f007"; } - -.fa-school-circle-check { - --fa: "\e56b"; } - -.fa-dumpster { - --fa: "\f793"; } - -.fa-van-shuttle { - --fa: "\f5b6"; } - -.fa-shuttle-van { - --fa: "\f5b6"; } - -.fa-building-user { - --fa: "\e4da"; } - -.fa-square-caret-left { - --fa: "\f191"; } - -.fa-caret-square-left { - --fa: "\f191"; } - -.fa-highlighter { - --fa: "\f591"; } - -.fa-key { - --fa: "\f084"; } - -.fa-bullhorn { - --fa: "\f0a1"; } - -.fa-globe { - --fa: "\f0ac"; } - -.fa-synagogue { - --fa: "\f69b"; } - -.fa-person-half-dress { - --fa: "\e548"; } - -.fa-road-bridge { - --fa: "\e563"; } - -.fa-location-arrow { - --fa: "\f124"; } - -.fa-c { - --fa: "\43"; } - -.fa-tablet-button { - --fa: "\f10a"; } - -.fa-building-lock { - --fa: "\e4d6"; } - -.fa-pizza-slice { - --fa: "\f818"; } - -.fa-money-bill-wave { - --fa: "\f53a"; } - -.fa-chart-area { - --fa: "\f1fe"; } - -.fa-area-chart { - --fa: "\f1fe"; } - -.fa-house-flag { - --fa: "\e50d"; } - -.fa-person-circle-minus { - --fa: "\e540"; } - -.fa-ban { - --fa: "\f05e"; } - -.fa-cancel { - --fa: "\f05e"; } - -.fa-camera-rotate { - --fa: "\e0d8"; } - -.fa-spray-can-sparkles { - --fa: "\f5d0"; } - -.fa-air-freshener { - --fa: "\f5d0"; } - -.fa-star { - --fa: "\f005"; } - -.fa-repeat { - --fa: "\f363"; } - -.fa-cross { - --fa: "\f654"; } - -.fa-box { - --fa: "\f466"; } - -.fa-venus-mars { - --fa: "\f228"; } - -.fa-arrow-pointer { - --fa: "\f245"; } - -.fa-mouse-pointer { - --fa: "\f245"; } - -.fa-maximize { - --fa: "\f31e"; } - -.fa-expand-arrows-alt { - --fa: "\f31e"; } - -.fa-charging-station { - --fa: "\f5e7"; } - -.fa-shapes { - --fa: "\f61f"; } - -.fa-triangle-circle-square { - --fa: "\f61f"; } - -.fa-shuffle { - --fa: "\f074"; } - -.fa-random { - --fa: "\f074"; } - -.fa-person-running { - --fa: "\f70c"; } - -.fa-running { - --fa: "\f70c"; } - -.fa-mobile-retro { - --fa: "\e527"; } - -.fa-grip-lines-vertical { - --fa: "\f7a5"; } - -.fa-spider { - --fa: "\f717"; } - -.fa-hands-bound { - --fa: "\e4f9"; } - -.fa-file-invoice-dollar { - --fa: "\f571"; } - -.fa-plane-circle-exclamation { - --fa: "\e556"; } - -.fa-x-ray { - --fa: "\f497"; } - -.fa-spell-check { - --fa: "\f891"; } - -.fa-slash { - --fa: "\f715"; } - -.fa-computer-mouse { - --fa: "\f8cc"; } - -.fa-mouse { - --fa: "\f8cc"; } - -.fa-arrow-right-to-bracket { - --fa: "\f090"; } - -.fa-sign-in { - --fa: "\f090"; } - -.fa-shop-slash { - --fa: "\e070"; } - -.fa-store-alt-slash { - --fa: "\e070"; } - -.fa-server { - --fa: "\f233"; } - -.fa-virus-covid-slash { - --fa: "\e4a9"; } - -.fa-shop-lock { - --fa: "\e4a5"; } - -.fa-hourglass-start { - --fa: "\f251"; } - -.fa-hourglass-1 { - --fa: "\f251"; } - -.fa-blender-phone { - --fa: "\f6b6"; } - -.fa-building-wheat { - --fa: "\e4db"; } - -.fa-person-breastfeeding { - --fa: "\e53a"; } - -.fa-right-to-bracket { - --fa: "\f2f6"; } - -.fa-sign-in-alt { - --fa: "\f2f6"; } - -.fa-venus { - --fa: "\f221"; } - -.fa-passport { - --fa: "\f5ab"; } - -.fa-thumbtack-slash { - --fa: "\e68f"; } - -.fa-thumb-tack-slash { - --fa: "\e68f"; } - -.fa-heart-pulse { - --fa: "\f21e"; } - -.fa-heartbeat { - --fa: "\f21e"; } - -.fa-people-carry-box { - --fa: "\f4ce"; } - -.fa-people-carry { - --fa: "\f4ce"; } - -.fa-temperature-high { - --fa: "\f769"; } - -.fa-microchip { - --fa: "\f2db"; } - -.fa-crown { - --fa: "\f521"; } - -.fa-weight-hanging { - --fa: "\f5cd"; } - -.fa-xmarks-lines { - --fa: "\e59a"; } - -.fa-file-prescription { - --fa: "\f572"; } - -.fa-weight-scale { - --fa: "\f496"; } - -.fa-weight { - --fa: "\f496"; } - -.fa-user-group { - --fa: "\f500"; } - -.fa-user-friends { - --fa: "\f500"; } - -.fa-arrow-up-a-z { - --fa: "\f15e"; } - -.fa-sort-alpha-up { - --fa: "\f15e"; } - -.fa-chess-knight { - --fa: "\f441"; } - -.fa-face-laugh-squint { - --fa: "\f59b"; } - -.fa-laugh-squint { - --fa: "\f59b"; } - -.fa-wheelchair { - --fa: "\f193"; } - -.fa-circle-arrow-up { - --fa: "\f0aa"; } - -.fa-arrow-circle-up { - --fa: "\f0aa"; } - -.fa-toggle-on { - --fa: "\f205"; } - -.fa-person-walking { - --fa: "\f554"; } - -.fa-walking { - --fa: "\f554"; } - -.fa-l { - --fa: "\4c"; } - -.fa-fire { - --fa: "\f06d"; } - -.fa-bed-pulse { - --fa: "\f487"; } - -.fa-procedures { - --fa: "\f487"; } - -.fa-shuttle-space { - --fa: "\f197"; } - -.fa-space-shuttle { - --fa: "\f197"; } - -.fa-face-laugh { - --fa: "\f599"; } - -.fa-laugh { - --fa: "\f599"; } - -.fa-folder-open { - --fa: "\f07c"; } - -.fa-heart-circle-plus { - --fa: "\e500"; } - -.fa-code-fork { - --fa: "\e13b"; } - -.fa-city { - --fa: "\f64f"; } - -.fa-microphone-lines { - --fa: "\f3c9"; } - -.fa-microphone-alt { - --fa: "\f3c9"; } - -.fa-pepper-hot { - --fa: "\f816"; } - -.fa-unlock { - --fa: "\f09c"; } - -.fa-colon-sign { - --fa: "\e140"; } - -.fa-headset { - --fa: "\f590"; } - -.fa-store-slash { - --fa: "\e071"; } - -.fa-road-circle-xmark { - --fa: "\e566"; } - -.fa-user-minus { - --fa: "\f503"; } - -.fa-mars-stroke-up { - --fa: "\f22a"; } - -.fa-mars-stroke-v { - --fa: "\f22a"; } - -.fa-champagne-glasses { - --fa: "\f79f"; } - -.fa-glass-cheers { - --fa: "\f79f"; } - -.fa-clipboard { - --fa: "\f328"; } - -.fa-house-circle-exclamation { - --fa: "\e50a"; } - -.fa-file-arrow-up { - --fa: "\f574"; } - -.fa-file-upload { - --fa: "\f574"; } - -.fa-wifi { - --fa: "\f1eb"; } - -.fa-wifi-3 { - --fa: "\f1eb"; } - -.fa-wifi-strong { - --fa: "\f1eb"; } - -.fa-bath { - --fa: "\f2cd"; } - -.fa-bathtub { - --fa: "\f2cd"; } - -.fa-underline { - --fa: "\f0cd"; } - -.fa-user-pen { - --fa: "\f4ff"; } - -.fa-user-edit { - --fa: "\f4ff"; } - -.fa-signature { - --fa: "\f5b7"; } - -.fa-stroopwafel { - --fa: "\f551"; } - -.fa-bold { - --fa: "\f032"; } - -.fa-anchor-lock { - --fa: "\e4ad"; } - -.fa-building-ngo { - --fa: "\e4d7"; } - -.fa-manat-sign { - --fa: "\e1d5"; } - -.fa-not-equal { - --fa: "\f53e"; } - -.fa-border-top-left { - --fa: "\f853"; } - -.fa-border-style { - --fa: "\f853"; } - -.fa-map-location-dot { - --fa: "\f5a0"; } - -.fa-map-marked-alt { - --fa: "\f5a0"; } - -.fa-jedi { - --fa: "\f669"; } - -.fa-square-poll-vertical { - --fa: "\f681"; } - -.fa-poll { - --fa: "\f681"; } - -.fa-mug-hot { - --fa: "\f7b6"; } - -.fa-car-battery { - --fa: "\f5df"; } - -.fa-battery-car { - --fa: "\f5df"; } - -.fa-gift { - --fa: "\f06b"; } - -.fa-dice-two { - --fa: "\f528"; } - -.fa-chess-queen { - --fa: "\f445"; } - -.fa-glasses { - --fa: "\f530"; } - -.fa-chess-board { - --fa: "\f43c"; } - -.fa-building-circle-check { - --fa: "\e4d2"; } - -.fa-person-chalkboard { - --fa: "\e53d"; } - -.fa-mars-stroke-right { - --fa: "\f22b"; } - -.fa-mars-stroke-h { - --fa: "\f22b"; } - -.fa-hand-back-fist { - --fa: "\f255"; } - -.fa-hand-rock { - --fa: "\f255"; } - -.fa-square-caret-up { - --fa: "\f151"; } - -.fa-caret-square-up { - --fa: "\f151"; } - -.fa-cloud-showers-water { - --fa: "\e4e4"; } - -.fa-chart-bar { - --fa: "\f080"; } - -.fa-bar-chart { - --fa: "\f080"; } - -.fa-hands-bubbles { - --fa: "\e05e"; } - -.fa-hands-wash { - --fa: "\e05e"; } - -.fa-less-than-equal { - --fa: "\f537"; } - -.fa-train { - --fa: "\f238"; } - -.fa-eye-low-vision { - --fa: "\f2a8"; } - -.fa-low-vision { - --fa: "\f2a8"; } - -.fa-crow { - --fa: "\f520"; } - -.fa-sailboat { - --fa: "\e445"; } - -.fa-window-restore { - --fa: "\f2d2"; } - -.fa-square-plus { - --fa: "\f0fe"; } - -.fa-plus-square { - --fa: "\f0fe"; } - -.fa-torii-gate { - --fa: "\f6a1"; } - -.fa-frog { - --fa: "\f52e"; } - -.fa-bucket { - --fa: "\e4cf"; } - -.fa-image { - --fa: "\f03e"; } - -.fa-microphone { - --fa: "\f130"; } - -.fa-cow { - --fa: "\f6c8"; } - -.fa-caret-up { - --fa: "\f0d8"; } - -.fa-screwdriver { - --fa: "\f54a"; } - -.fa-folder-closed { - --fa: "\e185"; } - -.fa-house-tsunami { - --fa: "\e515"; } - -.fa-square-nfi { - --fa: "\e576"; } - -.fa-arrow-up-from-ground-water { - --fa: "\e4b5"; } - -.fa-martini-glass { - --fa: "\f57b"; } - -.fa-glass-martini-alt { - --fa: "\f57b"; } - -.fa-square-binary { - --fa: "\e69b"; } - -.fa-rotate-left { - --fa: "\f2ea"; } - -.fa-rotate-back { - --fa: "\f2ea"; } - -.fa-rotate-backward { - --fa: "\f2ea"; } - -.fa-undo-alt { - --fa: "\f2ea"; } - -.fa-table-columns { - --fa: "\f0db"; } - -.fa-columns { - --fa: "\f0db"; } - -.fa-lemon { - --fa: "\f094"; } - -.fa-head-side-mask { - --fa: "\e063"; } - -.fa-handshake { - --fa: "\f2b5"; } - -.fa-gem { - --fa: "\f3a5"; } - -.fa-dolly { - --fa: "\f472"; } - -.fa-dolly-box { - --fa: "\f472"; } - -.fa-smoking { - --fa: "\f48d"; } - -.fa-minimize { - --fa: "\f78c"; } - -.fa-compress-arrows-alt { - --fa: "\f78c"; } - -.fa-monument { - --fa: "\f5a6"; } - -.fa-snowplow { - --fa: "\f7d2"; } - -.fa-angles-right { - --fa: "\f101"; } - -.fa-angle-double-right { - --fa: "\f101"; } - -.fa-cannabis { - --fa: "\f55f"; } - -.fa-circle-play { - --fa: "\f144"; } - -.fa-play-circle { - --fa: "\f144"; } - -.fa-tablets { - --fa: "\f490"; } - -.fa-ethernet { - --fa: "\f796"; } - -.fa-euro-sign { - --fa: "\f153"; } - -.fa-eur { - --fa: "\f153"; } - -.fa-euro { - --fa: "\f153"; } - -.fa-chair { - --fa: "\f6c0"; } - -.fa-circle-check { - --fa: "\f058"; } - -.fa-check-circle { - --fa: "\f058"; } - -.fa-circle-stop { - --fa: "\f28d"; } - -.fa-stop-circle { - --fa: "\f28d"; } - -.fa-compass-drafting { - --fa: "\f568"; } - -.fa-drafting-compass { - --fa: "\f568"; } - -.fa-plate-wheat { - --fa: "\e55a"; } - -.fa-icicles { - --fa: "\f7ad"; } - -.fa-person-shelter { - --fa: "\e54f"; } - -.fa-neuter { - --fa: "\f22c"; } - -.fa-id-badge { - --fa: "\f2c1"; } - -.fa-marker { - --fa: "\f5a1"; } - -.fa-face-laugh-beam { - --fa: "\f59a"; } - -.fa-laugh-beam { - --fa: "\f59a"; } - -.fa-helicopter-symbol { - --fa: "\e502"; } - -.fa-universal-access { - --fa: "\f29a"; } - -.fa-circle-chevron-up { - --fa: "\f139"; } - -.fa-chevron-circle-up { - --fa: "\f139"; } - -.fa-lari-sign { - --fa: "\e1c8"; } - -.fa-volcano { - --fa: "\f770"; } - -.fa-person-walking-dashed-line-arrow-right { - --fa: "\e553"; } - -.fa-sterling-sign { - --fa: "\f154"; } - -.fa-gbp { - --fa: "\f154"; } - -.fa-pound-sign { - --fa: "\f154"; } - -.fa-viruses { - --fa: "\e076"; } - -.fa-square-person-confined { - --fa: "\e577"; } - -.fa-user-tie { - --fa: "\f508"; } - -.fa-arrow-down-long { - --fa: "\f175"; } - -.fa-long-arrow-down { - --fa: "\f175"; } - -.fa-tent-arrow-down-to-line { - --fa: "\e57e"; } - -.fa-certificate { - --fa: "\f0a3"; } - -.fa-reply-all { - --fa: "\f122"; } - -.fa-mail-reply-all { - --fa: "\f122"; } - -.fa-suitcase { - --fa: "\f0f2"; } - -.fa-person-skating { - --fa: "\f7c5"; } - -.fa-skating { - --fa: "\f7c5"; } - -.fa-filter-circle-dollar { - --fa: "\f662"; } - -.fa-funnel-dollar { - --fa: "\f662"; } - -.fa-camera-retro { - --fa: "\f083"; } - -.fa-circle-arrow-down { - --fa: "\f0ab"; } - -.fa-arrow-circle-down { - --fa: "\f0ab"; } - -.fa-file-import { - --fa: "\f56f"; } - -.fa-arrow-right-to-file { - --fa: "\f56f"; } - -.fa-square-arrow-up-right { - --fa: "\f14c"; } - -.fa-external-link-square { - --fa: "\f14c"; } - -.fa-box-open { - --fa: "\f49e"; } - -.fa-scroll { - --fa: "\f70e"; } - -.fa-spa { - --fa: "\f5bb"; } - -.fa-location-pin-lock { - --fa: "\e51f"; } - -.fa-pause { - --fa: "\f04c"; } - -.fa-hill-avalanche { - --fa: "\e507"; } - -.fa-temperature-empty { - --fa: "\f2cb"; } - -.fa-temperature-0 { - --fa: "\f2cb"; } - -.fa-thermometer-0 { - --fa: "\f2cb"; } - -.fa-thermometer-empty { - --fa: "\f2cb"; } - -.fa-bomb { - --fa: "\f1e2"; } - -.fa-registered { - --fa: "\f25d"; } - -.fa-address-card { - --fa: "\f2bb"; } - -.fa-contact-card { - --fa: "\f2bb"; } - -.fa-vcard { - --fa: "\f2bb"; } - -.fa-scale-unbalanced-flip { - --fa: "\f516"; } - -.fa-balance-scale-right { - --fa: "\f516"; } - -.fa-subscript { - --fa: "\f12c"; } - -.fa-diamond-turn-right { - --fa: "\f5eb"; } - -.fa-directions { - --fa: "\f5eb"; } - -.fa-burst { - --fa: "\e4dc"; } - -.fa-house-laptop { - --fa: "\e066"; } - -.fa-laptop-house { - --fa: "\e066"; } - -.fa-face-tired { - --fa: "\f5c8"; } - -.fa-tired { - --fa: "\f5c8"; } - -.fa-money-bills { - --fa: "\e1f3"; } - -.fa-smog { - --fa: "\f75f"; } - -.fa-crutch { - --fa: "\f7f7"; } - -.fa-cloud-arrow-up { - --fa: "\f0ee"; } - -.fa-cloud-upload { - --fa: "\f0ee"; } - -.fa-cloud-upload-alt { - --fa: "\f0ee"; } - -.fa-palette { - --fa: "\f53f"; } - -.fa-arrows-turn-right { - --fa: "\e4c0"; } - -.fa-vest { - --fa: "\e085"; } - -.fa-ferry { - --fa: "\e4ea"; } - -.fa-arrows-down-to-people { - --fa: "\e4b9"; } - -.fa-seedling { - --fa: "\f4d8"; } - -.fa-sprout { - --fa: "\f4d8"; } - -.fa-left-right { - --fa: "\f337"; } - -.fa-arrows-alt-h { - --fa: "\f337"; } - -.fa-boxes-packing { - --fa: "\e4c7"; } - -.fa-circle-arrow-left { - --fa: "\f0a8"; } - -.fa-arrow-circle-left { - --fa: "\f0a8"; } - -.fa-group-arrows-rotate { - --fa: "\e4f6"; } - -.fa-bowl-food { - --fa: "\e4c6"; } - -.fa-candy-cane { - --fa: "\f786"; } - -.fa-arrow-down-wide-short { - --fa: "\f160"; } - -.fa-sort-amount-asc { - --fa: "\f160"; } - -.fa-sort-amount-down { - --fa: "\f160"; } - -.fa-cloud-bolt { - --fa: "\f76c"; } - -.fa-thunderstorm { - --fa: "\f76c"; } - -.fa-text-slash { - --fa: "\f87d"; } - -.fa-remove-format { - --fa: "\f87d"; } - -.fa-face-smile-wink { - --fa: "\f4da"; } - -.fa-smile-wink { - --fa: "\f4da"; } - -.fa-file-word { - --fa: "\f1c2"; } - -.fa-file-powerpoint { - --fa: "\f1c4"; } - -.fa-arrows-left-right { - --fa: "\f07e"; } - -.fa-arrows-h { - --fa: "\f07e"; } - -.fa-house-lock { - --fa: "\e510"; } - -.fa-cloud-arrow-down { - --fa: "\f0ed"; } - -.fa-cloud-download { - --fa: "\f0ed"; } - -.fa-cloud-download-alt { - --fa: "\f0ed"; } - -.fa-children { - --fa: "\e4e1"; } - -.fa-chalkboard { - --fa: "\f51b"; } - -.fa-blackboard { - --fa: "\f51b"; } - -.fa-user-large-slash { - --fa: "\f4fa"; } - -.fa-user-alt-slash { - --fa: "\f4fa"; } - -.fa-envelope-open { - --fa: "\f2b6"; } - -.fa-handshake-simple-slash { - --fa: "\e05f"; } - -.fa-handshake-alt-slash { - --fa: "\e05f"; } - -.fa-mattress-pillow { - --fa: "\e525"; } - -.fa-guarani-sign { - --fa: "\e19a"; } - -.fa-arrows-rotate { - --fa: "\f021"; } - -.fa-refresh { - --fa: "\f021"; } - -.fa-sync { - --fa: "\f021"; } - -.fa-fire-extinguisher { - --fa: "\f134"; } - -.fa-cruzeiro-sign { - --fa: "\e152"; } - -.fa-greater-than-equal { - --fa: "\f532"; } - -.fa-shield-halved { - --fa: "\f3ed"; } - -.fa-shield-alt { - --fa: "\f3ed"; } - -.fa-book-atlas { - --fa: "\f558"; } - -.fa-atlas { - --fa: "\f558"; } - -.fa-virus { - --fa: "\e074"; } - -.fa-envelope-circle-check { - --fa: "\e4e8"; } - -.fa-layer-group { - --fa: "\f5fd"; } - -.fa-arrows-to-dot { - --fa: "\e4be"; } - -.fa-archway { - --fa: "\f557"; } - -.fa-heart-circle-check { - --fa: "\e4fd"; } - -.fa-house-chimney-crack { - --fa: "\f6f1"; } - -.fa-house-damage { - --fa: "\f6f1"; } - -.fa-file-zipper { - --fa: "\f1c6"; } - -.fa-file-archive { - --fa: "\f1c6"; } - -.fa-square { - --fa: "\f0c8"; } - -.fa-martini-glass-empty { - --fa: "\f000"; } - -.fa-glass-martini { - --fa: "\f000"; } - -.fa-couch { - --fa: "\f4b8"; } - -.fa-cedi-sign { - --fa: "\e0df"; } - -.fa-italic { - --fa: "\f033"; } - -.fa-table-cells-column-lock { - --fa: "\e678"; } - -.fa-church { - --fa: "\f51d"; } - -.fa-comments-dollar { - --fa: "\f653"; } - -.fa-democrat { - --fa: "\f747"; } - -.fa-z { - --fa: "\5a"; } - -.fa-person-skiing { - --fa: "\f7c9"; } - -.fa-skiing { - --fa: "\f7c9"; } - -.fa-road-lock { - --fa: "\e567"; } - -.fa-a { - --fa: "\41"; } - -.fa-temperature-arrow-down { - --fa: "\e03f"; } - -.fa-temperature-down { - --fa: "\e03f"; } - -.fa-feather-pointed { - --fa: "\f56b"; } - -.fa-feather-alt { - --fa: "\f56b"; } - -.fa-p { - --fa: "\50"; } - -.fa-snowflake { - --fa: "\f2dc"; } - -.fa-newspaper { - --fa: "\f1ea"; } - -.fa-rectangle-ad { - --fa: "\f641"; } - -.fa-ad { - --fa: "\f641"; } - -.fa-circle-arrow-right { - --fa: "\f0a9"; } - -.fa-arrow-circle-right { - --fa: "\f0a9"; } - -.fa-filter-circle-xmark { - --fa: "\e17b"; } - -.fa-locust { - --fa: "\e520"; } - -.fa-sort { - --fa: "\f0dc"; } - -.fa-unsorted { - --fa: "\f0dc"; } - -.fa-list-ol { - --fa: "\f0cb"; } - -.fa-list-1-2 { - --fa: "\f0cb"; } - -.fa-list-numeric { - --fa: "\f0cb"; } - -.fa-person-dress-burst { - --fa: "\e544"; } - -.fa-money-check-dollar { - --fa: "\f53d"; } - -.fa-money-check-alt { - --fa: "\f53d"; } - -.fa-vector-square { - --fa: "\f5cb"; } - -.fa-bread-slice { - --fa: "\f7ec"; } - -.fa-language { - --fa: "\f1ab"; } - -.fa-face-kiss-wink-heart { - --fa: "\f598"; } - -.fa-kiss-wink-heart { - --fa: "\f598"; } - -.fa-filter { - --fa: "\f0b0"; } - -.fa-question { - --fa: "\3f"; } - -.fa-file-signature { - --fa: "\f573"; } - -.fa-up-down-left-right { - --fa: "\f0b2"; } - -.fa-arrows-alt { - --fa: "\f0b2"; } - -.fa-house-chimney-user { - --fa: "\e065"; } - -.fa-hand-holding-heart { - --fa: "\f4be"; } - -.fa-puzzle-piece { - --fa: "\f12e"; } - -.fa-money-check { - --fa: "\f53c"; } - -.fa-star-half-stroke { - --fa: "\f5c0"; } - -.fa-star-half-alt { - --fa: "\f5c0"; } - -.fa-code { - --fa: "\f121"; } - -.fa-whiskey-glass { - --fa: "\f7a0"; } - -.fa-glass-whiskey { - --fa: "\f7a0"; } - -.fa-building-circle-exclamation { - --fa: "\e4d3"; } - -.fa-magnifying-glass-chart { - --fa: "\e522"; } - -.fa-arrow-up-right-from-square { - --fa: "\f08e"; } - -.fa-external-link { - --fa: "\f08e"; } - -.fa-cubes-stacked { - --fa: "\e4e6"; } - -.fa-won-sign { - --fa: "\f159"; } - -.fa-krw { - --fa: "\f159"; } - -.fa-won { - --fa: "\f159"; } - -.fa-virus-covid { - --fa: "\e4a8"; } - -.fa-austral-sign { - --fa: "\e0a9"; } - -.fa-f { - --fa: "\46"; } - -.fa-leaf { - --fa: "\f06c"; } - -.fa-road { - --fa: "\f018"; } - -.fa-taxi { - --fa: "\f1ba"; } - -.fa-cab { - --fa: "\f1ba"; } - -.fa-person-circle-plus { - --fa: "\e541"; } - -.fa-chart-pie { - --fa: "\f200"; } - -.fa-pie-chart { - --fa: "\f200"; } - -.fa-bolt-lightning { - --fa: "\e0b7"; } - -.fa-sack-xmark { - --fa: "\e56a"; } - -.fa-file-excel { - --fa: "\f1c3"; } - -.fa-file-contract { - --fa: "\f56c"; } - -.fa-fish-fins { - --fa: "\e4f2"; } - -.fa-building-flag { - --fa: "\e4d5"; } - -.fa-face-grin-beam { - --fa: "\f582"; } - -.fa-grin-beam { - --fa: "\f582"; } - -.fa-object-ungroup { - --fa: "\f248"; } - -.fa-poop { - --fa: "\f619"; } - -.fa-location-pin { - --fa: "\f041"; } - -.fa-map-marker { - --fa: "\f041"; } - -.fa-kaaba { - --fa: "\f66b"; } - -.fa-toilet-paper { - --fa: "\f71e"; } - -.fa-helmet-safety { - --fa: "\f807"; } - -.fa-hard-hat { - --fa: "\f807"; } - -.fa-hat-hard { - --fa: "\f807"; } - -.fa-eject { - --fa: "\f052"; } - -.fa-circle-right { - --fa: "\f35a"; } - -.fa-arrow-alt-circle-right { - --fa: "\f35a"; } - -.fa-plane-circle-check { - --fa: "\e555"; } - -.fa-face-rolling-eyes { - --fa: "\f5a5"; } - -.fa-meh-rolling-eyes { - --fa: "\f5a5"; } - -.fa-object-group { - --fa: "\f247"; } - -.fa-chart-line { - --fa: "\f201"; } - -.fa-line-chart { - --fa: "\f201"; } - -.fa-mask-ventilator { - --fa: "\e524"; } - -.fa-arrow-right { - --fa: "\f061"; } - -.fa-signs-post { - --fa: "\f277"; } - -.fa-map-signs { - --fa: "\f277"; } - -.fa-cash-register { - --fa: "\f788"; } - -.fa-person-circle-question { - --fa: "\e542"; } - -.fa-h { - --fa: "\48"; } - -.fa-tarp { - --fa: "\e57b"; } - -.fa-screwdriver-wrench { - --fa: "\f7d9"; } - -.fa-tools { - --fa: "\f7d9"; } - -.fa-arrows-to-eye { - --fa: "\e4bf"; } - -.fa-plug-circle-bolt { - --fa: "\e55b"; } - -.fa-heart { - --fa: "\f004"; } - -.fa-mars-and-venus { - --fa: "\f224"; } - -.fa-house-user { - --fa: "\e1b0"; } - -.fa-home-user { - --fa: "\e1b0"; } - -.fa-dumpster-fire { - --fa: "\f794"; } - -.fa-house-crack { - --fa: "\e3b1"; } - -.fa-martini-glass-citrus { - --fa: "\f561"; } - -.fa-cocktail { - --fa: "\f561"; } - -.fa-face-surprise { - --fa: "\f5c2"; } - -.fa-surprise { - --fa: "\f5c2"; } - -.fa-bottle-water { - --fa: "\e4c5"; } - -.fa-circle-pause { - --fa: "\f28b"; } - -.fa-pause-circle { - --fa: "\f28b"; } - -.fa-toilet-paper-slash { - --fa: "\e072"; } - -.fa-apple-whole { - --fa: "\f5d1"; } - -.fa-apple-alt { - --fa: "\f5d1"; } - -.fa-kitchen-set { - --fa: "\e51a"; } - -.fa-r { - --fa: "\52"; } - -.fa-temperature-quarter { - --fa: "\f2ca"; } - -.fa-temperature-1 { - --fa: "\f2ca"; } - -.fa-thermometer-1 { - --fa: "\f2ca"; } - -.fa-thermometer-quarter { - --fa: "\f2ca"; } - -.fa-cube { - --fa: "\f1b2"; } - -.fa-bitcoin-sign { - --fa: "\e0b4"; } - -.fa-shield-dog { - --fa: "\e573"; } - -.fa-solar-panel { - --fa: "\f5ba"; } - -.fa-lock-open { - --fa: "\f3c1"; } - -.fa-elevator { - --fa: "\e16d"; } - -.fa-money-bill-transfer { - --fa: "\e528"; } - -.fa-money-bill-trend-up { - --fa: "\e529"; } - -.fa-house-flood-water-circle-arrow-right { - --fa: "\e50f"; } - -.fa-square-poll-horizontal { - --fa: "\f682"; } - -.fa-poll-h { - --fa: "\f682"; } - -.fa-circle { - --fa: "\f111"; } - -.fa-backward-fast { - --fa: "\f049"; } - -.fa-fast-backward { - --fa: "\f049"; } - -.fa-recycle { - --fa: "\f1b8"; } - -.fa-user-astronaut { - --fa: "\f4fb"; } - -.fa-plane-slash { - --fa: "\e069"; } - -.fa-trademark { - --fa: "\f25c"; } - -.fa-basketball { - --fa: "\f434"; } - -.fa-basketball-ball { - --fa: "\f434"; } - -.fa-satellite-dish { - --fa: "\f7c0"; } - -.fa-circle-up { - --fa: "\f35b"; } - -.fa-arrow-alt-circle-up { - --fa: "\f35b"; } - -.fa-mobile-screen-button { - --fa: "\f3cd"; } - -.fa-mobile-alt { - --fa: "\f3cd"; } - -.fa-volume-high { - --fa: "\f028"; } - -.fa-volume-up { - --fa: "\f028"; } - -.fa-users-rays { - --fa: "\e593"; } - -.fa-wallet { - --fa: "\f555"; } - -.fa-clipboard-check { - --fa: "\f46c"; } - -.fa-file-audio { - --fa: "\f1c7"; } - -.fa-burger { - --fa: "\f805"; } - -.fa-hamburger { - --fa: "\f805"; } - -.fa-wrench { - --fa: "\f0ad"; } - -.fa-bugs { - --fa: "\e4d0"; } - -.fa-rupee-sign { - --fa: "\f156"; } - -.fa-rupee { - --fa: "\f156"; } - -.fa-file-image { - --fa: "\f1c5"; } - -.fa-circle-question { - --fa: "\f059"; } - -.fa-question-circle { - --fa: "\f059"; } - -.fa-plane-departure { - --fa: "\f5b0"; } - -.fa-handshake-slash { - --fa: "\e060"; } - -.fa-book-bookmark { - --fa: "\e0bb"; } - -.fa-code-branch { - --fa: "\f126"; } - -.fa-hat-cowboy { - --fa: "\f8c0"; } - -.fa-bridge { - --fa: "\e4c8"; } - -.fa-phone-flip { - --fa: "\f879"; } - -.fa-phone-alt { - --fa: "\f879"; } - -.fa-truck-front { - --fa: "\e2b7"; } - -.fa-cat { - --fa: "\f6be"; } - -.fa-anchor-circle-exclamation { - --fa: "\e4ab"; } - -.fa-truck-field { - --fa: "\e58d"; } - -.fa-route { - --fa: "\f4d7"; } - -.fa-clipboard-question { - --fa: "\e4e3"; } - -.fa-panorama { - --fa: "\e209"; } - -.fa-comment-medical { - --fa: "\f7f5"; } - -.fa-teeth-open { - --fa: "\f62f"; } - -.fa-file-circle-minus { - --fa: "\e4ed"; } - -.fa-tags { - --fa: "\f02c"; } - -.fa-wine-glass { - --fa: "\f4e3"; } - -.fa-forward-fast { - --fa: "\f050"; } - -.fa-fast-forward { - --fa: "\f050"; } - -.fa-face-meh-blank { - --fa: "\f5a4"; } - -.fa-meh-blank { - --fa: "\f5a4"; } - -.fa-square-parking { - --fa: "\f540"; } - -.fa-parking { - --fa: "\f540"; } - -.fa-house-signal { - --fa: "\e012"; } - -.fa-bars-progress { - --fa: "\f828"; } - -.fa-tasks-alt { - --fa: "\f828"; } - -.fa-faucet-drip { - --fa: "\e006"; } - -.fa-cart-flatbed { - --fa: "\f474"; } - -.fa-dolly-flatbed { - --fa: "\f474"; } - -.fa-ban-smoking { - --fa: "\f54d"; } - -.fa-smoking-ban { - --fa: "\f54d"; } - -.fa-terminal { - --fa: "\f120"; } - -.fa-mobile-button { - --fa: "\f10b"; } - -.fa-house-medical-flag { - --fa: "\e514"; } - -.fa-basket-shopping { - --fa: "\f291"; } - -.fa-shopping-basket { - --fa: "\f291"; } - -.fa-tape { - --fa: "\f4db"; } - -.fa-bus-simple { - --fa: "\f55e"; } - -.fa-bus-alt { - --fa: "\f55e"; } - -.fa-eye { - --fa: "\f06e"; } - -.fa-face-sad-cry { - --fa: "\f5b3"; } - -.fa-sad-cry { - --fa: "\f5b3"; } - -.fa-audio-description { - --fa: "\f29e"; } - -.fa-person-military-to-person { - --fa: "\e54c"; } - -.fa-file-shield { - --fa: "\e4f0"; } - -.fa-user-slash { - --fa: "\f506"; } - -.fa-pen { - --fa: "\f304"; } - -.fa-tower-observation { - --fa: "\e586"; } - -.fa-file-code { - --fa: "\f1c9"; } - -.fa-signal { - --fa: "\f012"; } - -.fa-signal-5 { - --fa: "\f012"; } - -.fa-signal-perfect { - --fa: "\f012"; } - -.fa-bus { - --fa: "\f207"; } - -.fa-heart-circle-xmark { - --fa: "\e501"; } - -.fa-house-chimney { - --fa: "\e3af"; } - -.fa-home-lg { - --fa: "\e3af"; } - -.fa-window-maximize { - --fa: "\f2d0"; } - -.fa-face-frown { - --fa: "\f119"; } - -.fa-frown { - --fa: "\f119"; } - -.fa-prescription { - --fa: "\f5b1"; } - -.fa-shop { - --fa: "\f54f"; } - -.fa-store-alt { - --fa: "\f54f"; } - -.fa-floppy-disk { - --fa: "\f0c7"; } - -.fa-save { - --fa: "\f0c7"; } - -.fa-vihara { - --fa: "\f6a7"; } - -.fa-scale-unbalanced { - --fa: "\f515"; } - -.fa-balance-scale-left { - --fa: "\f515"; } - -.fa-sort-up { - --fa: "\f0de"; } - -.fa-sort-asc { - --fa: "\f0de"; } - -.fa-comment-dots { - --fa: "\f4ad"; } - -.fa-commenting { - --fa: "\f4ad"; } - -.fa-plant-wilt { - --fa: "\e5aa"; } - -.fa-diamond { - --fa: "\f219"; } - -.fa-face-grin-squint { - --fa: "\f585"; } - -.fa-grin-squint { - --fa: "\f585"; } - -.fa-hand-holding-dollar { - --fa: "\f4c0"; } - -.fa-hand-holding-usd { - --fa: "\f4c0"; } - -.fa-chart-diagram { - --fa: "\e695"; } - -.fa-bacterium { - --fa: "\e05a"; } - -.fa-hand-pointer { - --fa: "\f25a"; } - -.fa-drum-steelpan { - --fa: "\f56a"; } - -.fa-hand-scissors { - --fa: "\f257"; } - -.fa-hands-praying { - --fa: "\f684"; } - -.fa-praying-hands { - --fa: "\f684"; } - -.fa-arrow-rotate-right { - --fa: "\f01e"; } - -.fa-arrow-right-rotate { - --fa: "\f01e"; } - -.fa-arrow-rotate-forward { - --fa: "\f01e"; } - -.fa-redo { - --fa: "\f01e"; } - -.fa-biohazard { - --fa: "\f780"; } - -.fa-location-crosshairs { - --fa: "\f601"; } - -.fa-location { - --fa: "\f601"; } - -.fa-mars-double { - --fa: "\f227"; } - -.fa-child-dress { - --fa: "\e59c"; } - -.fa-users-between-lines { - --fa: "\e591"; } - -.fa-lungs-virus { - --fa: "\e067"; } - -.fa-face-grin-tears { - --fa: "\f588"; } - -.fa-grin-tears { - --fa: "\f588"; } - -.fa-phone { - --fa: "\f095"; } - -.fa-calendar-xmark { - --fa: "\f273"; } - -.fa-calendar-times { - --fa: "\f273"; } - -.fa-child-reaching { - --fa: "\e59d"; } - -.fa-head-side-virus { - --fa: "\e064"; } - -.fa-user-gear { - --fa: "\f4fe"; } - -.fa-user-cog { - --fa: "\f4fe"; } - -.fa-arrow-up-1-9 { - --fa: "\f163"; } - -.fa-sort-numeric-up { - --fa: "\f163"; } - -.fa-door-closed { - --fa: "\f52a"; } - -.fa-shield-virus { - --fa: "\e06c"; } - -.fa-dice-six { - --fa: "\f526"; } - -.fa-mosquito-net { - --fa: "\e52c"; } - -.fa-file-fragment { - --fa: "\e697"; } - -.fa-bridge-water { - --fa: "\e4ce"; } - -.fa-person-booth { - --fa: "\f756"; } - -.fa-text-width { - --fa: "\f035"; } - -.fa-hat-wizard { - --fa: "\f6e8"; } - -.fa-pen-fancy { - --fa: "\f5ac"; } - -.fa-person-digging { - --fa: "\f85e"; } - -.fa-digging { - --fa: "\f85e"; } - -.fa-trash { - --fa: "\f1f8"; } - -.fa-gauge-simple { - --fa: "\f629"; } - -.fa-gauge-simple-med { - --fa: "\f629"; } - -.fa-tachometer-average { - --fa: "\f629"; } - -.fa-book-medical { - --fa: "\f7e6"; } - -.fa-poo { - --fa: "\f2fe"; } - -.fa-quote-right { - --fa: "\f10e"; } - -.fa-quote-right-alt { - --fa: "\f10e"; } - -.fa-shirt { - --fa: "\f553"; } - -.fa-t-shirt { - --fa: "\f553"; } - -.fa-tshirt { - --fa: "\f553"; } - -.fa-cubes { - --fa: "\f1b3"; } - -.fa-divide { - --fa: "\f529"; } - -.fa-tenge-sign { - --fa: "\f7d7"; } - -.fa-tenge { - --fa: "\f7d7"; } - -.fa-headphones { - --fa: "\f025"; } - -.fa-hands-holding { - --fa: "\f4c2"; } - -.fa-hands-clapping { - --fa: "\e1a8"; } - -.fa-republican { - --fa: "\f75e"; } - -.fa-arrow-left { - --fa: "\f060"; } - -.fa-person-circle-xmark { - --fa: "\e543"; } - -.fa-ruler { - --fa: "\f545"; } - -.fa-align-left { - --fa: "\f036"; } - -.fa-dice-d6 { - --fa: "\f6d1"; } - -.fa-restroom { - --fa: "\f7bd"; } - -.fa-j { - --fa: "\4a"; } - -.fa-users-viewfinder { - --fa: "\e595"; } - -.fa-file-video { - --fa: "\f1c8"; } - -.fa-up-right-from-square { - --fa: "\f35d"; } - -.fa-external-link-alt { - --fa: "\f35d"; } - -.fa-table-cells { - --fa: "\f00a"; } - -.fa-th { - --fa: "\f00a"; } - -.fa-file-pdf { - --fa: "\f1c1"; } - -.fa-book-bible { - --fa: "\f647"; } - -.fa-bible { - --fa: "\f647"; } - -.fa-o { - --fa: "\4f"; } - -.fa-suitcase-medical { - --fa: "\f0fa"; } - -.fa-medkit { - --fa: "\f0fa"; } - -.fa-user-secret { - --fa: "\f21b"; } - -.fa-otter { - --fa: "\f700"; } - -.fa-person-dress { - --fa: "\f182"; } - -.fa-female { - --fa: "\f182"; } - -.fa-comment-dollar { - --fa: "\f651"; } - -.fa-business-time { - --fa: "\f64a"; } - -.fa-briefcase-clock { - --fa: "\f64a"; } - -.fa-table-cells-large { - --fa: "\f009"; } - -.fa-th-large { - --fa: "\f009"; } - -.fa-book-tanakh { - --fa: "\f827"; } - -.fa-tanakh { - --fa: "\f827"; } - -.fa-phone-volume { - --fa: "\f2a0"; } - -.fa-volume-control-phone { - --fa: "\f2a0"; } - -.fa-hat-cowboy-side { - --fa: "\f8c1"; } - -.fa-clipboard-user { - --fa: "\f7f3"; } - -.fa-child { - --fa: "\f1ae"; } - -.fa-lira-sign { - --fa: "\f195"; } - -.fa-satellite { - --fa: "\f7bf"; } - -.fa-plane-lock { - --fa: "\e558"; } - -.fa-tag { - --fa: "\f02b"; } - -.fa-comment { - --fa: "\f075"; } - -.fa-cake-candles { - --fa: "\f1fd"; } - -.fa-birthday-cake { - --fa: "\f1fd"; } - -.fa-cake { - --fa: "\f1fd"; } - -.fa-envelope { - --fa: "\f0e0"; } - -.fa-angles-up { - --fa: "\f102"; } - -.fa-angle-double-up { - --fa: "\f102"; } - -.fa-paperclip { - --fa: "\f0c6"; } - -.fa-arrow-right-to-city { - --fa: "\e4b3"; } - -.fa-ribbon { - --fa: "\f4d6"; } - -.fa-lungs { - --fa: "\f604"; } - -.fa-arrow-up-9-1 { - --fa: "\f887"; } - -.fa-sort-numeric-up-alt { - --fa: "\f887"; } - -.fa-litecoin-sign { - --fa: "\e1d3"; } - -.fa-border-none { - --fa: "\f850"; } - -.fa-circle-nodes { - --fa: "\e4e2"; } - -.fa-parachute-box { - --fa: "\f4cd"; } - -.fa-indent { - --fa: "\f03c"; } - -.fa-truck-field-un { - --fa: "\e58e"; } - -.fa-hourglass { - --fa: "\f254"; } - -.fa-hourglass-empty { - --fa: "\f254"; } - -.fa-mountain { - --fa: "\f6fc"; } - -.fa-user-doctor { - --fa: "\f0f0"; } - -.fa-user-md { - --fa: "\f0f0"; } - -.fa-circle-info { - --fa: "\f05a"; } - -.fa-info-circle { - --fa: "\f05a"; } - -.fa-cloud-meatball { - --fa: "\f73b"; } - -.fa-camera { - --fa: "\f030"; } - -.fa-camera-alt { - --fa: "\f030"; } - -.fa-square-virus { - --fa: "\e578"; } - -.fa-meteor { - --fa: "\f753"; } - -.fa-car-on { - --fa: "\e4dd"; } - -.fa-sleigh { - --fa: "\f7cc"; } - -.fa-arrow-down-1-9 { - --fa: "\f162"; } - -.fa-sort-numeric-asc { - --fa: "\f162"; } - -.fa-sort-numeric-down { - --fa: "\f162"; } - -.fa-hand-holding-droplet { - --fa: "\f4c1"; } - -.fa-hand-holding-water { - --fa: "\f4c1"; } - -.fa-water { - --fa: "\f773"; } - -.fa-calendar-check { - --fa: "\f274"; } - -.fa-braille { - --fa: "\f2a1"; } - -.fa-prescription-bottle-medical { - --fa: "\f486"; } - -.fa-prescription-bottle-alt { - --fa: "\f486"; } - -.fa-landmark { - --fa: "\f66f"; } - -.fa-truck { - --fa: "\f0d1"; } - -.fa-crosshairs { - --fa: "\f05b"; } - -.fa-person-cane { - --fa: "\e53c"; } - -.fa-tent { - --fa: "\e57d"; } - -.fa-vest-patches { - --fa: "\e086"; } - -.fa-check-double { - --fa: "\f560"; } - -.fa-arrow-down-a-z { - --fa: "\f15d"; } - -.fa-sort-alpha-asc { - --fa: "\f15d"; } - -.fa-sort-alpha-down { - --fa: "\f15d"; } - -.fa-money-bill-wheat { - --fa: "\e52a"; } - -.fa-cookie { - --fa: "\f563"; } - -.fa-arrow-rotate-left { - --fa: "\f0e2"; } - -.fa-arrow-left-rotate { - --fa: "\f0e2"; } - -.fa-arrow-rotate-back { - --fa: "\f0e2"; } - -.fa-arrow-rotate-backward { - --fa: "\f0e2"; } - -.fa-undo { - --fa: "\f0e2"; } - -.fa-hard-drive { - --fa: "\f0a0"; } - -.fa-hdd { - --fa: "\f0a0"; } - -.fa-face-grin-squint-tears { - --fa: "\f586"; } - -.fa-grin-squint-tears { - --fa: "\f586"; } - -.fa-dumbbell { - --fa: "\f44b"; } - -.fa-rectangle-list { - --fa: "\f022"; } - -.fa-list-alt { - --fa: "\f022"; } - -.fa-tarp-droplet { - --fa: "\e57c"; } - -.fa-house-medical-circle-check { - --fa: "\e511"; } - -.fa-person-skiing-nordic { - --fa: "\f7ca"; } - -.fa-skiing-nordic { - --fa: "\f7ca"; } - -.fa-calendar-plus { - --fa: "\f271"; } - -.fa-plane-arrival { - --fa: "\f5af"; } - -.fa-circle-left { - --fa: "\f359"; } - -.fa-arrow-alt-circle-left { - --fa: "\f359"; } - -.fa-train-subway { - --fa: "\f239"; } - -.fa-subway { - --fa: "\f239"; } - -.fa-chart-gantt { - --fa: "\e0e4"; } - -.fa-indian-rupee-sign { - --fa: "\e1bc"; } - -.fa-indian-rupee { - --fa: "\e1bc"; } - -.fa-inr { - --fa: "\e1bc"; } - -.fa-crop-simple { - --fa: "\f565"; } - -.fa-crop-alt { - --fa: "\f565"; } - -.fa-money-bill-1 { - --fa: "\f3d1"; } - -.fa-money-bill-alt { - --fa: "\f3d1"; } - -.fa-left-long { - --fa: "\f30a"; } - -.fa-long-arrow-alt-left { - --fa: "\f30a"; } - -.fa-dna { - --fa: "\f471"; } - -.fa-virus-slash { - --fa: "\e075"; } - -.fa-minus { - --fa: "\f068"; } - -.fa-subtract { - --fa: "\f068"; } - -.fa-chess { - --fa: "\f439"; } - -.fa-arrow-left-long { - --fa: "\f177"; } - -.fa-long-arrow-left { - --fa: "\f177"; } - -.fa-plug-circle-check { - --fa: "\e55c"; } - -.fa-street-view { - --fa: "\f21d"; } - -.fa-franc-sign { - --fa: "\e18f"; } - -.fa-volume-off { - --fa: "\f026"; } - -.fa-hands-asl-interpreting { - --fa: "\f2a3"; } - -.fa-american-sign-language-interpreting { - --fa: "\f2a3"; } - -.fa-asl-interpreting { - --fa: "\f2a3"; } - -.fa-hands-american-sign-language-interpreting { - --fa: "\f2a3"; } - -.fa-gear { - --fa: "\f013"; } - -.fa-cog { - --fa: "\f013"; } - -.fa-droplet-slash { - --fa: "\f5c7"; } - -.fa-tint-slash { - --fa: "\f5c7"; } - -.fa-mosque { - --fa: "\f678"; } - -.fa-mosquito { - --fa: "\e52b"; } - -.fa-star-of-david { - --fa: "\f69a"; } - -.fa-person-military-rifle { - --fa: "\e54b"; } - -.fa-cart-shopping { - --fa: "\f07a"; } - -.fa-shopping-cart { - --fa: "\f07a"; } - -.fa-vials { - --fa: "\f493"; } - -.fa-plug-circle-plus { - --fa: "\e55f"; } - -.fa-place-of-worship { - --fa: "\f67f"; } - -.fa-grip-vertical { - --fa: "\f58e"; } - -.fa-hexagon-nodes { - --fa: "\e699"; } - -.fa-arrow-turn-up { - --fa: "\f148"; } - -.fa-level-up { - --fa: "\f148"; } - -.fa-u { - --fa: "\55"; } - -.fa-square-root-variable { - --fa: "\f698"; } - -.fa-square-root-alt { - --fa: "\f698"; } - -.fa-clock { - --fa: "\f017"; } - -.fa-clock-four { - --fa: "\f017"; } - -.fa-backward-step { - --fa: "\f048"; } - -.fa-step-backward { - --fa: "\f048"; } - -.fa-pallet { - --fa: "\f482"; } - -.fa-faucet { - --fa: "\e005"; } - -.fa-baseball-bat-ball { - --fa: "\f432"; } - -.fa-s { - --fa: "\53"; } - -.fa-timeline { - --fa: "\e29c"; } - -.fa-keyboard { - --fa: "\f11c"; } - -.fa-caret-down { - --fa: "\f0d7"; } - -.fa-house-chimney-medical { - --fa: "\f7f2"; } - -.fa-clinic-medical { - --fa: "\f7f2"; } - -.fa-temperature-three-quarters { - --fa: "\f2c8"; } - -.fa-temperature-3 { - --fa: "\f2c8"; } - -.fa-thermometer-3 { - --fa: "\f2c8"; } - -.fa-thermometer-three-quarters { - --fa: "\f2c8"; } - -.fa-mobile-screen { - --fa: "\f3cf"; } - -.fa-mobile-android-alt { - --fa: "\f3cf"; } - -.fa-plane-up { - --fa: "\e22d"; } - -.fa-piggy-bank { - --fa: "\f4d3"; } - -.fa-battery-half { - --fa: "\f242"; } - -.fa-battery-3 { - --fa: "\f242"; } - -.fa-mountain-city { - --fa: "\e52e"; } - -.fa-coins { - --fa: "\f51e"; } - -.fa-khanda { - --fa: "\f66d"; } - -.fa-sliders { - --fa: "\f1de"; } - -.fa-sliders-h { - --fa: "\f1de"; } - -.fa-folder-tree { - --fa: "\f802"; } - -.fa-network-wired { - --fa: "\f6ff"; } - -.fa-map-pin { - --fa: "\f276"; } - -.fa-hamsa { - --fa: "\f665"; } - -.fa-cent-sign { - --fa: "\e3f5"; } - -.fa-flask { - --fa: "\f0c3"; } - -.fa-person-pregnant { - --fa: "\e31e"; } - -.fa-wand-sparkles { - --fa: "\f72b"; } - -.fa-ellipsis-vertical { - --fa: "\f142"; } - -.fa-ellipsis-v { - --fa: "\f142"; } - -.fa-ticket { - --fa: "\f145"; } - -.fa-power-off { - --fa: "\f011"; } - -.fa-right-long { - --fa: "\f30b"; } - -.fa-long-arrow-alt-right { - --fa: "\f30b"; } - -.fa-flag-usa { - --fa: "\f74d"; } - -.fa-laptop-file { - --fa: "\e51d"; } - -.fa-tty { - --fa: "\f1e4"; } - -.fa-teletype { - --fa: "\f1e4"; } - -.fa-diagram-next { - --fa: "\e476"; } - -.fa-person-rifle { - --fa: "\e54e"; } - -.fa-house-medical-circle-exclamation { - --fa: "\e512"; } - -.fa-closed-captioning { - --fa: "\f20a"; } - -.fa-person-hiking { - --fa: "\f6ec"; } - -.fa-hiking { - --fa: "\f6ec"; } - -.fa-venus-double { - --fa: "\f226"; } - -.fa-images { - --fa: "\f302"; } - -.fa-calculator { - --fa: "\f1ec"; } - -.fa-people-pulling { - --fa: "\e535"; } - -.fa-n { - --fa: "\4e"; } - -.fa-cable-car { - --fa: "\f7da"; } - -.fa-tram { - --fa: "\f7da"; } - -.fa-cloud-rain { - --fa: "\f73d"; } - -.fa-building-circle-xmark { - --fa: "\e4d4"; } - -.fa-ship { - --fa: "\f21a"; } - -.fa-arrows-down-to-line { - --fa: "\e4b8"; } - -.fa-download { - --fa: "\f019"; } - -.fa-face-grin { - --fa: "\f580"; } - -.fa-grin { - --fa: "\f580"; } - -.fa-delete-left { - --fa: "\f55a"; } - -.fa-backspace { - --fa: "\f55a"; } - -.fa-eye-dropper { - --fa: "\f1fb"; } - -.fa-eye-dropper-empty { - --fa: "\f1fb"; } - -.fa-eyedropper { - --fa: "\f1fb"; } - -.fa-file-circle-check { - --fa: "\e5a0"; } - -.fa-forward { - --fa: "\f04e"; } - -.fa-mobile { - --fa: "\f3ce"; } - -.fa-mobile-android { - --fa: "\f3ce"; } - -.fa-mobile-phone { - --fa: "\f3ce"; } - -.fa-face-meh { - --fa: "\f11a"; } - -.fa-meh { - --fa: "\f11a"; } - -.fa-align-center { - --fa: "\f037"; } - -.fa-book-skull { - --fa: "\f6b7"; } - -.fa-book-dead { - --fa: "\f6b7"; } - -.fa-id-card { - --fa: "\f2c2"; } - -.fa-drivers-license { - --fa: "\f2c2"; } - -.fa-outdent { - --fa: "\f03b"; } - -.fa-dedent { - --fa: "\f03b"; } - -.fa-heart-circle-exclamation { - --fa: "\e4fe"; } - -.fa-house { - --fa: "\f015"; } - -.fa-home { - --fa: "\f015"; } - -.fa-home-alt { - --fa: "\f015"; } - -.fa-home-lg-alt { - --fa: "\f015"; } - -.fa-calendar-week { - --fa: "\f784"; } - -.fa-laptop-medical { - --fa: "\f812"; } - -.fa-b { - --fa: "\42"; } - -.fa-file-medical { - --fa: "\f477"; } - -.fa-dice-one { - --fa: "\f525"; } - -.fa-kiwi-bird { - --fa: "\f535"; } - -.fa-arrow-right-arrow-left { - --fa: "\f0ec"; } - -.fa-exchange { - --fa: "\f0ec"; } - -.fa-rotate-right { - --fa: "\f2f9"; } - -.fa-redo-alt { - --fa: "\f2f9"; } - -.fa-rotate-forward { - --fa: "\f2f9"; } - -.fa-utensils { - --fa: "\f2e7"; } - -.fa-cutlery { - --fa: "\f2e7"; } - -.fa-arrow-up-wide-short { - --fa: "\f161"; } - -.fa-sort-amount-up { - --fa: "\f161"; } - -.fa-mill-sign { - --fa: "\e1ed"; } - -.fa-bowl-rice { - --fa: "\e2eb"; } - -.fa-skull { - --fa: "\f54c"; } - -.fa-tower-broadcast { - --fa: "\f519"; } - -.fa-broadcast-tower { - --fa: "\f519"; } - -.fa-truck-pickup { - --fa: "\f63c"; } - -.fa-up-long { - --fa: "\f30c"; } - -.fa-long-arrow-alt-up { - --fa: "\f30c"; } - -.fa-stop { - --fa: "\f04d"; } - -.fa-code-merge { - --fa: "\f387"; } - -.fa-upload { - --fa: "\f093"; } - -.fa-hurricane { - --fa: "\f751"; } - -.fa-mound { - --fa: "\e52d"; } - -.fa-toilet-portable { - --fa: "\e583"; } - -.fa-compact-disc { - --fa: "\f51f"; } - -.fa-file-arrow-down { - --fa: "\f56d"; } - -.fa-file-download { - --fa: "\f56d"; } - -.fa-caravan { - --fa: "\f8ff"; } - -.fa-shield-cat { - --fa: "\e572"; } - -.fa-bolt { - --fa: "\f0e7"; } - -.fa-zap { - --fa: "\f0e7"; } - -.fa-glass-water { - --fa: "\e4f4"; } - -.fa-oil-well { - --fa: "\e532"; } - -.fa-vault { - --fa: "\e2c5"; } - -.fa-mars { - --fa: "\f222"; } - -.fa-toilet { - --fa: "\f7d8"; } - -.fa-plane-circle-xmark { - --fa: "\e557"; } - -.fa-yen-sign { - --fa: "\f157"; } - -.fa-cny { - --fa: "\f157"; } - -.fa-jpy { - --fa: "\f157"; } - -.fa-rmb { - --fa: "\f157"; } - -.fa-yen { - --fa: "\f157"; } - -.fa-ruble-sign { - --fa: "\f158"; } - -.fa-rouble { - --fa: "\f158"; } - -.fa-rub { - --fa: "\f158"; } - -.fa-ruble { - --fa: "\f158"; } - -.fa-sun { - --fa: "\f185"; } - -.fa-guitar { - --fa: "\f7a6"; } - -.fa-face-laugh-wink { - --fa: "\f59c"; } - -.fa-laugh-wink { - --fa: "\f59c"; } - -.fa-horse-head { - --fa: "\f7ab"; } - -.fa-bore-hole { - --fa: "\e4c3"; } - -.fa-industry { - --fa: "\f275"; } - -.fa-circle-down { - --fa: "\f358"; } - -.fa-arrow-alt-circle-down { - --fa: "\f358"; } - -.fa-arrows-turn-to-dots { - --fa: "\e4c1"; } - -.fa-florin-sign { - --fa: "\e184"; } - -.fa-arrow-down-short-wide { - --fa: "\f884"; } - -.fa-sort-amount-desc { - --fa: "\f884"; } - -.fa-sort-amount-down-alt { - --fa: "\f884"; } - -.fa-less-than { - --fa: "\3c"; } - -.fa-angle-down { - --fa: "\f107"; } - -.fa-car-tunnel { - --fa: "\e4de"; } - -.fa-head-side-cough { - --fa: "\e061"; } - -.fa-grip-lines { - --fa: "\f7a4"; } - -.fa-thumbs-down { - --fa: "\f165"; } - -.fa-user-lock { - --fa: "\f502"; } - -.fa-arrow-right-long { - --fa: "\f178"; } - -.fa-long-arrow-right { - --fa: "\f178"; } - -.fa-anchor-circle-xmark { - --fa: "\e4ac"; } - -.fa-ellipsis { - --fa: "\f141"; } - -.fa-ellipsis-h { - --fa: "\f141"; } - -.fa-chess-pawn { - --fa: "\f443"; } - -.fa-kit-medical { - --fa: "\f479"; } - -.fa-first-aid { - --fa: "\f479"; } - -.fa-person-through-window { - --fa: "\e5a9"; } - -.fa-toolbox { - --fa: "\f552"; } - -.fa-hands-holding-circle { - --fa: "\e4fb"; } - -.fa-bug { - --fa: "\f188"; } - -.fa-credit-card { - --fa: "\f09d"; } - -.fa-credit-card-alt { - --fa: "\f09d"; } - -.fa-car { - --fa: "\f1b9"; } - -.fa-automobile { - --fa: "\f1b9"; } - -.fa-hand-holding-hand { - --fa: "\e4f7"; } - -.fa-book-open-reader { - --fa: "\f5da"; } - -.fa-book-reader { - --fa: "\f5da"; } - -.fa-mountain-sun { - --fa: "\e52f"; } - -.fa-arrows-left-right-to-line { - --fa: "\e4ba"; } - -.fa-dice-d20 { - --fa: "\f6cf"; } - -.fa-truck-droplet { - --fa: "\e58c"; } - -.fa-file-circle-xmark { - --fa: "\e5a1"; } - -.fa-temperature-arrow-up { - --fa: "\e040"; } - -.fa-temperature-up { - --fa: "\e040"; } - -.fa-medal { - --fa: "\f5a2"; } - -.fa-bed { - --fa: "\f236"; } - -.fa-square-h { - --fa: "\f0fd"; } - -.fa-h-square { - --fa: "\f0fd"; } - -.fa-podcast { - --fa: "\f2ce"; } - -.fa-temperature-full { - --fa: "\f2c7"; } - -.fa-temperature-4 { - --fa: "\f2c7"; } - -.fa-thermometer-4 { - --fa: "\f2c7"; } - -.fa-thermometer-full { - --fa: "\f2c7"; } - -.fa-bell { - --fa: "\f0f3"; } - -.fa-superscript { - --fa: "\f12b"; } - -.fa-plug-circle-xmark { - --fa: "\e560"; } - -.fa-star-of-life { - --fa: "\f621"; } - -.fa-phone-slash { - --fa: "\f3dd"; } - -.fa-paint-roller { - --fa: "\f5aa"; } - -.fa-handshake-angle { - --fa: "\f4c4"; } - -.fa-hands-helping { - --fa: "\f4c4"; } - -.fa-location-dot { - --fa: "\f3c5"; } - -.fa-map-marker-alt { - --fa: "\f3c5"; } - -.fa-file { - --fa: "\f15b"; } - -.fa-greater-than { - --fa: "\3e"; } - -.fa-person-swimming { - --fa: "\f5c4"; } - -.fa-swimmer { - --fa: "\f5c4"; } - -.fa-arrow-down { - --fa: "\f063"; } - -.fa-droplet { - --fa: "\f043"; } - -.fa-tint { - --fa: "\f043"; } - -.fa-eraser { - --fa: "\f12d"; } - -.fa-earth-americas { - --fa: "\f57d"; } - -.fa-earth { - --fa: "\f57d"; } - -.fa-earth-america { - --fa: "\f57d"; } - -.fa-globe-americas { - --fa: "\f57d"; } - -.fa-person-burst { - --fa: "\e53b"; } - -.fa-dove { - --fa: "\f4ba"; } - -.fa-battery-empty { - --fa: "\f244"; } - -.fa-battery-0 { - --fa: "\f244"; } - -.fa-socks { - --fa: "\f696"; } - -.fa-inbox { - --fa: "\f01c"; } - -.fa-section { - --fa: "\e447"; } - -.fa-gauge-high { - --fa: "\f625"; } - -.fa-tachometer-alt { - --fa: "\f625"; } - -.fa-tachometer-alt-fast { - --fa: "\f625"; } - -.fa-envelope-open-text { - --fa: "\f658"; } - -.fa-hospital { - --fa: "\f0f8"; } - -.fa-hospital-alt { - --fa: "\f0f8"; } - -.fa-hospital-wide { - --fa: "\f0f8"; } - -.fa-wine-bottle { - --fa: "\f72f"; } - -.fa-chess-rook { - --fa: "\f447"; } - -.fa-bars-staggered { - --fa: "\f550"; } - -.fa-reorder { - --fa: "\f550"; } - -.fa-stream { - --fa: "\f550"; } - -.fa-dharmachakra { - --fa: "\f655"; } - -.fa-hotdog { - --fa: "\f80f"; } - -.fa-person-walking-with-cane { - --fa: "\f29d"; } - -.fa-blind { - --fa: "\f29d"; } - -.fa-drum { - --fa: "\f569"; } - -.fa-ice-cream { - --fa: "\f810"; } - -.fa-heart-circle-bolt { - --fa: "\e4fc"; } - -.fa-fax { - --fa: "\f1ac"; } - -.fa-paragraph { - --fa: "\f1dd"; } - -.fa-check-to-slot { - --fa: "\f772"; } - -.fa-vote-yea { - --fa: "\f772"; } - -.fa-star-half { - --fa: "\f089"; } - -.fa-boxes-stacked { - --fa: "\f468"; } - -.fa-boxes { - --fa: "\f468"; } - -.fa-boxes-alt { - --fa: "\f468"; } - -.fa-link { - --fa: "\f0c1"; } - -.fa-chain { - --fa: "\f0c1"; } - -.fa-ear-listen { - --fa: "\f2a2"; } - -.fa-assistive-listening-systems { - --fa: "\f2a2"; } - -.fa-tree-city { - --fa: "\e587"; } - -.fa-play { - --fa: "\f04b"; } - -.fa-font { - --fa: "\f031"; } - -.fa-table-cells-row-lock { - --fa: "\e67a"; } - -.fa-rupiah-sign { - --fa: "\e23d"; } - -.fa-magnifying-glass { - --fa: "\f002"; } - -.fa-search { - --fa: "\f002"; } - -.fa-table-tennis-paddle-ball { - --fa: "\f45d"; } - -.fa-ping-pong-paddle-ball { - --fa: "\f45d"; } - -.fa-table-tennis { - --fa: "\f45d"; } - -.fa-person-dots-from-line { - --fa: "\f470"; } - -.fa-diagnoses { - --fa: "\f470"; } - -.fa-trash-can-arrow-up { - --fa: "\f82a"; } - -.fa-trash-restore-alt { - --fa: "\f82a"; } - -.fa-naira-sign { - --fa: "\e1f6"; } - -.fa-cart-arrow-down { - --fa: "\f218"; } - -.fa-walkie-talkie { - --fa: "\f8ef"; } - -.fa-file-pen { - --fa: "\f31c"; } - -.fa-file-edit { - --fa: "\f31c"; } - -.fa-receipt { - --fa: "\f543"; } - -.fa-square-pen { - --fa: "\f14b"; } - -.fa-pen-square { - --fa: "\f14b"; } - -.fa-pencil-square { - --fa: "\f14b"; } - -.fa-suitcase-rolling { - --fa: "\f5c1"; } - -.fa-person-circle-exclamation { - --fa: "\e53f"; } - -.fa-chevron-down { - --fa: "\f078"; } - -.fa-battery-full { - --fa: "\f240"; } - -.fa-battery { - --fa: "\f240"; } - -.fa-battery-5 { - --fa: "\f240"; } - -.fa-skull-crossbones { - --fa: "\f714"; } - -.fa-code-compare { - --fa: "\e13a"; } - -.fa-list-ul { - --fa: "\f0ca"; } - -.fa-list-dots { - --fa: "\f0ca"; } - -.fa-school-lock { - --fa: "\e56f"; } - -.fa-tower-cell { - --fa: "\e585"; } - -.fa-down-long { - --fa: "\f309"; } - -.fa-long-arrow-alt-down { - --fa: "\f309"; } - -.fa-ranking-star { - --fa: "\e561"; } - -.fa-chess-king { - --fa: "\f43f"; } - -.fa-person-harassing { - --fa: "\e549"; } - -.fa-brazilian-real-sign { - --fa: "\e46c"; } - -.fa-landmark-dome { - --fa: "\f752"; } - -.fa-landmark-alt { - --fa: "\f752"; } - -.fa-arrow-up { - --fa: "\f062"; } - -.fa-tv { - --fa: "\f26c"; } - -.fa-television { - --fa: "\f26c"; } - -.fa-tv-alt { - --fa: "\f26c"; } - -.fa-shrimp { - --fa: "\e448"; } - -.fa-list-check { - --fa: "\f0ae"; } - -.fa-tasks { - --fa: "\f0ae"; } - -.fa-jug-detergent { - --fa: "\e519"; } - -.fa-circle-user { - --fa: "\f2bd"; } - -.fa-user-circle { - --fa: "\f2bd"; } - -.fa-user-shield { - --fa: "\f505"; } - -.fa-wind { - --fa: "\f72e"; } - -.fa-car-burst { - --fa: "\f5e1"; } - -.fa-car-crash { - --fa: "\f5e1"; } - -.fa-y { - --fa: "\59"; } - -.fa-person-snowboarding { - --fa: "\f7ce"; } - -.fa-snowboarding { - --fa: "\f7ce"; } - -.fa-truck-fast { - --fa: "\f48b"; } - -.fa-shipping-fast { - --fa: "\f48b"; } - -.fa-fish { - --fa: "\f578"; } - -.fa-user-graduate { - --fa: "\f501"; } - -.fa-circle-half-stroke { - --fa: "\f042"; } - -.fa-adjust { - --fa: "\f042"; } - -.fa-clapperboard { - --fa: "\e131"; } - -.fa-circle-radiation { - --fa: "\f7ba"; } - -.fa-radiation-alt { - --fa: "\f7ba"; } - -.fa-baseball { - --fa: "\f433"; } - -.fa-baseball-ball { - --fa: "\f433"; } - -.fa-jet-fighter-up { - --fa: "\e518"; } - -.fa-diagram-project { - --fa: "\f542"; } - -.fa-project-diagram { - --fa: "\f542"; } - -.fa-copy { - --fa: "\f0c5"; } - -.fa-volume-xmark { - --fa: "\f6a9"; } - -.fa-volume-mute { - --fa: "\f6a9"; } - -.fa-volume-times { - --fa: "\f6a9"; } - -.fa-hand-sparkles { - --fa: "\e05d"; } - -.fa-grip { - --fa: "\f58d"; } - -.fa-grip-horizontal { - --fa: "\f58d"; } - -.fa-share-from-square { - --fa: "\f14d"; } - -.fa-share-square { - --fa: "\f14d"; } - -.fa-child-combatant { - --fa: "\e4e0"; } - -.fa-child-rifle { - --fa: "\e4e0"; } - -.fa-gun { - --fa: "\e19b"; } - -.fa-square-phone { - --fa: "\f098"; } - -.fa-phone-square { - --fa: "\f098"; } - -.fa-plus { - --fa: "\2b"; } - -.fa-add { - --fa: "\2b"; } - -.fa-expand { - --fa: "\f065"; } - -.fa-computer { - --fa: "\e4e5"; } - -.fa-xmark { - --fa: "\f00d"; } - -.fa-close { - --fa: "\f00d"; } - -.fa-multiply { - --fa: "\f00d"; } - -.fa-remove { - --fa: "\f00d"; } - -.fa-times { - --fa: "\f00d"; } - -.fa-arrows-up-down-left-right { - --fa: "\f047"; } - -.fa-arrows { - --fa: "\f047"; } - -.fa-chalkboard-user { - --fa: "\f51c"; } - -.fa-chalkboard-teacher { - --fa: "\f51c"; } - -.fa-peso-sign { - --fa: "\e222"; } - -.fa-building-shield { - --fa: "\e4d8"; } - -.fa-baby { - --fa: "\f77c"; } - -.fa-users-line { - --fa: "\e592"; } - -.fa-quote-left { - --fa: "\f10d"; } - -.fa-quote-left-alt { - --fa: "\f10d"; } - -.fa-tractor { - --fa: "\f722"; } - -.fa-trash-arrow-up { - --fa: "\f829"; } - -.fa-trash-restore { - --fa: "\f829"; } - -.fa-arrow-down-up-lock { - --fa: "\e4b0"; } - -.fa-lines-leaning { - --fa: "\e51e"; } - -.fa-ruler-combined { - --fa: "\f546"; } - -.fa-copyright { - --fa: "\f1f9"; } - -.fa-equals { - --fa: "\3d"; } - -.fa-blender { - --fa: "\f517"; } - -.fa-teeth { - --fa: "\f62e"; } - -.fa-shekel-sign { - --fa: "\f20b"; } - -.fa-ils { - --fa: "\f20b"; } - -.fa-shekel { - --fa: "\f20b"; } - -.fa-sheqel { - --fa: "\f20b"; } - -.fa-sheqel-sign { - --fa: "\f20b"; } - -.fa-map { - --fa: "\f279"; } - -.fa-rocket { - --fa: "\f135"; } - -.fa-photo-film { - --fa: "\f87c"; } - -.fa-photo-video { - --fa: "\f87c"; } - -.fa-folder-minus { - --fa: "\f65d"; } - -.fa-hexagon-nodes-bolt { - --fa: "\e69a"; } - -.fa-store { - --fa: "\f54e"; } - -.fa-arrow-trend-up { - --fa: "\e098"; } - -.fa-plug-circle-minus { - --fa: "\e55e"; } - -.fa-sign-hanging { - --fa: "\f4d9"; } - -.fa-sign { - --fa: "\f4d9"; } - -.fa-bezier-curve { - --fa: "\f55b"; } - -.fa-bell-slash { - --fa: "\f1f6"; } - -.fa-tablet { - --fa: "\f3fb"; } - -.fa-tablet-android { - --fa: "\f3fb"; } - -.fa-school-flag { - --fa: "\e56e"; } - -.fa-fill { - --fa: "\f575"; } - -.fa-angle-up { - --fa: "\f106"; } - -.fa-drumstick-bite { - --fa: "\f6d7"; } - -.fa-holly-berry { - --fa: "\f7aa"; } - -.fa-chevron-left { - --fa: "\f053"; } - -.fa-bacteria { - --fa: "\e059"; } - -.fa-hand-lizard { - --fa: "\f258"; } - -.fa-notdef { - --fa: "\e1fe"; } - -.fa-disease { - --fa: "\f7fa"; } - -.fa-briefcase-medical { - --fa: "\f469"; } - -.fa-genderless { - --fa: "\f22d"; } - -.fa-chevron-right { - --fa: "\f054"; } - -.fa-retweet { - --fa: "\f079"; } - -.fa-car-rear { - --fa: "\f5de"; } - -.fa-car-alt { - --fa: "\f5de"; } - -.fa-pump-soap { - --fa: "\e06b"; } - -.fa-video-slash { - --fa: "\f4e2"; } - -.fa-battery-quarter { - --fa: "\f243"; } - -.fa-battery-2 { - --fa: "\f243"; } - -.fa-radio { - --fa: "\f8d7"; } - -.fa-baby-carriage { - --fa: "\f77d"; } - -.fa-carriage-baby { - --fa: "\f77d"; } - -.fa-traffic-light { - --fa: "\f637"; } - -.fa-thermometer { - --fa: "\f491"; } - -.fa-vr-cardboard { - --fa: "\f729"; } - -.fa-hand-middle-finger { - --fa: "\f806"; } - -.fa-percent { - --fa: "\25"; } - -.fa-percentage { - --fa: "\25"; } - -.fa-truck-moving { - --fa: "\f4df"; } - -.fa-glass-water-droplet { - --fa: "\e4f5"; } - -.fa-display { - --fa: "\e163"; } - -.fa-face-smile { - --fa: "\f118"; } - -.fa-smile { - --fa: "\f118"; } - -.fa-thumbtack { - --fa: "\f08d"; } - -.fa-thumb-tack { - --fa: "\f08d"; } - -.fa-trophy { - --fa: "\f091"; } - -.fa-person-praying { - --fa: "\f683"; } - -.fa-pray { - --fa: "\f683"; } - -.fa-hammer { - --fa: "\f6e3"; } - -.fa-hand-peace { - --fa: "\f25b"; } - -.fa-rotate { - --fa: "\f2f1"; } - -.fa-sync-alt { - --fa: "\f2f1"; } - -.fa-spinner { - --fa: "\f110"; } - -.fa-robot { - --fa: "\f544"; } - -.fa-peace { - --fa: "\f67c"; } - -.fa-gears { - --fa: "\f085"; } - -.fa-cogs { - --fa: "\f085"; } - -.fa-warehouse { - --fa: "\f494"; } - -.fa-arrow-up-right-dots { - --fa: "\e4b7"; } - -.fa-splotch { - --fa: "\f5bc"; } - -.fa-face-grin-hearts { - --fa: "\f584"; } - -.fa-grin-hearts { - --fa: "\f584"; } - -.fa-dice-four { - --fa: "\f524"; } - -.fa-sim-card { - --fa: "\f7c4"; } - -.fa-transgender { - --fa: "\f225"; } - -.fa-transgender-alt { - --fa: "\f225"; } - -.fa-mercury { - --fa: "\f223"; } - -.fa-arrow-turn-down { - --fa: "\f149"; } - -.fa-level-down { - --fa: "\f149"; } - -.fa-person-falling-burst { - --fa: "\e547"; } - -.fa-award { - --fa: "\f559"; } - -.fa-ticket-simple { - --fa: "\f3ff"; } - -.fa-ticket-alt { - --fa: "\f3ff"; } - -.fa-building { - --fa: "\f1ad"; } - -.fa-angles-left { - --fa: "\f100"; } - -.fa-angle-double-left { - --fa: "\f100"; } - -.fa-qrcode { - --fa: "\f029"; } - -.fa-clock-rotate-left { - --fa: "\f1da"; } - -.fa-history { - --fa: "\f1da"; } - -.fa-face-grin-beam-sweat { - --fa: "\f583"; } - -.fa-grin-beam-sweat { - --fa: "\f583"; } - -.fa-file-export { - --fa: "\f56e"; } - -.fa-arrow-right-from-file { - --fa: "\f56e"; } - -.fa-shield { - --fa: "\f132"; } - -.fa-shield-blank { - --fa: "\f132"; } - -.fa-arrow-up-short-wide { - --fa: "\f885"; } - -.fa-sort-amount-up-alt { - --fa: "\f885"; } - -.fa-comment-nodes { - --fa: "\e696"; } - -.fa-house-medical { - --fa: "\e3b2"; } - -.fa-golf-ball-tee { - --fa: "\f450"; } - -.fa-golf-ball { - --fa: "\f450"; } - -.fa-circle-chevron-left { - --fa: "\f137"; } - -.fa-chevron-circle-left { - --fa: "\f137"; } - -.fa-house-chimney-window { - --fa: "\e00d"; } - -.fa-pen-nib { - --fa: "\f5ad"; } - -.fa-tent-arrow-turn-left { - --fa: "\e580"; } - -.fa-tents { - --fa: "\e582"; } - -.fa-wand-magic { - --fa: "\f0d0"; } - -.fa-magic { - --fa: "\f0d0"; } - -.fa-dog { - --fa: "\f6d3"; } - -.fa-carrot { - --fa: "\f787"; } - -.fa-moon { - --fa: "\f186"; } - -.fa-wine-glass-empty { - --fa: "\f5ce"; } - -.fa-wine-glass-alt { - --fa: "\f5ce"; } - -.fa-cheese { - --fa: "\f7ef"; } - -.fa-yin-yang { - --fa: "\f6ad"; } - -.fa-music { - --fa: "\f001"; } - -.fa-code-commit { - --fa: "\f386"; } - -.fa-temperature-low { - --fa: "\f76b"; } - -.fa-person-biking { - --fa: "\f84a"; } - -.fa-biking { - --fa: "\f84a"; } - -.fa-broom { - --fa: "\f51a"; } - -.fa-shield-heart { - --fa: "\e574"; } - -.fa-gopuram { - --fa: "\f664"; } - -.fa-earth-oceania { - --fa: "\e47b"; } - -.fa-globe-oceania { - --fa: "\e47b"; } - -.fa-square-xmark { - --fa: "\f2d3"; } - -.fa-times-square { - --fa: "\f2d3"; } - -.fa-xmark-square { - --fa: "\f2d3"; } - -.fa-hashtag { - --fa: "\23"; } - -.fa-up-right-and-down-left-from-center { - --fa: "\f424"; } - -.fa-expand-alt { - --fa: "\f424"; } - -.fa-oil-can { - --fa: "\f613"; } - -.fa-t { - --fa: "\54"; } - -.fa-hippo { - --fa: "\f6ed"; } - -.fa-chart-column { - --fa: "\e0e3"; } - -.fa-infinity { - --fa: "\f534"; } - -.fa-vial-circle-check { - --fa: "\e596"; } - -.fa-person-arrow-down-to-line { - --fa: "\e538"; } - -.fa-voicemail { - --fa: "\f897"; } - -.fa-fan { - --fa: "\f863"; } - -.fa-person-walking-luggage { - --fa: "\e554"; } - -.fa-up-down { - --fa: "\f338"; } - -.fa-arrows-alt-v { - --fa: "\f338"; } - -.fa-cloud-moon-rain { - --fa: "\f73c"; } - -.fa-calendar { - --fa: "\f133"; } - -.fa-trailer { - --fa: "\e041"; } - -.fa-bahai { - --fa: "\f666"; } - -.fa-haykal { - --fa: "\f666"; } - -.fa-sd-card { - --fa: "\f7c2"; } - -.fa-dragon { - --fa: "\f6d5"; } - -.fa-shoe-prints { - --fa: "\f54b"; } - -.fa-circle-plus { - --fa: "\f055"; } - -.fa-plus-circle { - --fa: "\f055"; } - -.fa-face-grin-tongue-wink { - --fa: "\f58b"; } - -.fa-grin-tongue-wink { - --fa: "\f58b"; } - -.fa-hand-holding { - --fa: "\f4bd"; } - -.fa-plug-circle-exclamation { - --fa: "\e55d"; } - -.fa-link-slash { - --fa: "\f127"; } - -.fa-chain-broken { - --fa: "\f127"; } - -.fa-chain-slash { - --fa: "\f127"; } - -.fa-unlink { - --fa: "\f127"; } - -.fa-clone { - --fa: "\f24d"; } - -.fa-person-walking-arrow-loop-left { - --fa: "\e551"; } - -.fa-arrow-up-z-a { - --fa: "\f882"; } - -.fa-sort-alpha-up-alt { - --fa: "\f882"; } - -.fa-fire-flame-curved { - --fa: "\f7e4"; } - -.fa-fire-alt { - --fa: "\f7e4"; } - -.fa-tornado { - --fa: "\f76f"; } - -.fa-file-circle-plus { - --fa: "\e494"; } - -.fa-book-quran { - --fa: "\f687"; } - -.fa-quran { - --fa: "\f687"; } - -.fa-anchor { - --fa: "\f13d"; } - -.fa-border-all { - --fa: "\f84c"; } - -.fa-face-angry { - --fa: "\f556"; } - -.fa-angry { - --fa: "\f556"; } - -.fa-cookie-bite { - --fa: "\f564"; } - -.fa-arrow-trend-down { - --fa: "\e097"; } - -.fa-rss { - --fa: "\f09e"; } - -.fa-feed { - --fa: "\f09e"; } - -.fa-draw-polygon { - --fa: "\f5ee"; } - -.fa-scale-balanced { - --fa: "\f24e"; } - -.fa-balance-scale { - --fa: "\f24e"; } - -.fa-gauge-simple-high { - --fa: "\f62a"; } - -.fa-tachometer { - --fa: "\f62a"; } - -.fa-tachometer-fast { - --fa: "\f62a"; } - -.fa-shower { - --fa: "\f2cc"; } - -.fa-desktop { - --fa: "\f390"; } - -.fa-desktop-alt { - --fa: "\f390"; } - -.fa-m { - --fa: "\4d"; } - -.fa-table-list { - --fa: "\f00b"; } - -.fa-th-list { - --fa: "\f00b"; } - -.fa-comment-sms { - --fa: "\f7cd"; } - -.fa-sms { - --fa: "\f7cd"; } - -.fa-book { - --fa: "\f02d"; } - -.fa-user-plus { - --fa: "\f234"; } - -.fa-check { - --fa: "\f00c"; } - -.fa-battery-three-quarters { - --fa: "\f241"; } - -.fa-battery-4 { - --fa: "\f241"; } - -.fa-house-circle-check { - --fa: "\e509"; } - -.fa-angle-left { - --fa: "\f104"; } - -.fa-diagram-successor { - --fa: "\e47a"; } - -.fa-truck-arrow-right { - --fa: "\e58b"; } - -.fa-arrows-split-up-and-left { - --fa: "\e4bc"; } - -.fa-hand-fist { - --fa: "\f6de"; } - -.fa-fist-raised { - --fa: "\f6de"; } - -.fa-cloud-moon { - --fa: "\f6c3"; } - -.fa-briefcase { - --fa: "\f0b1"; } - -.fa-person-falling { - --fa: "\e546"; } - -.fa-image-portrait { - --fa: "\f3e0"; } - -.fa-portrait { - --fa: "\f3e0"; } - -.fa-user-tag { - --fa: "\f507"; } - -.fa-rug { - --fa: "\e569"; } - -.fa-earth-europe { - --fa: "\f7a2"; } - -.fa-globe-europe { - --fa: "\f7a2"; } - -.fa-cart-flatbed-suitcase { - --fa: "\f59d"; } - -.fa-luggage-cart { - --fa: "\f59d"; } - -.fa-rectangle-xmark { - --fa: "\f410"; } - -.fa-rectangle-times { - --fa: "\f410"; } - -.fa-times-rectangle { - --fa: "\f410"; } - -.fa-window-close { - --fa: "\f410"; } - -.fa-baht-sign { - --fa: "\e0ac"; } - -.fa-book-open { - --fa: "\f518"; } - -.fa-book-journal-whills { - --fa: "\f66a"; } - -.fa-journal-whills { - --fa: "\f66a"; } - -.fa-handcuffs { - --fa: "\e4f8"; } - -.fa-triangle-exclamation { - --fa: "\f071"; } - -.fa-exclamation-triangle { - --fa: "\f071"; } - -.fa-warning { - --fa: "\f071"; } - -.fa-database { - --fa: "\f1c0"; } - -.fa-share { - --fa: "\f064"; } - -.fa-mail-forward { - --fa: "\f064"; } - -.fa-bottle-droplet { - --fa: "\e4c4"; } - -.fa-mask-face { - --fa: "\e1d7"; } - -.fa-hill-rockslide { - --fa: "\e508"; } - -.fa-right-left { - --fa: "\f362"; } - -.fa-exchange-alt { - --fa: "\f362"; } - -.fa-paper-plane { - --fa: "\f1d8"; } - -.fa-road-circle-exclamation { - --fa: "\e565"; } - -.fa-dungeon { - --fa: "\f6d9"; } - -.fa-align-right { - --fa: "\f038"; } - -.fa-money-bill-1-wave { - --fa: "\f53b"; } - -.fa-money-bill-wave-alt { - --fa: "\f53b"; } - -.fa-life-ring { - --fa: "\f1cd"; } - -.fa-hands { - --fa: "\f2a7"; } - -.fa-sign-language { - --fa: "\f2a7"; } - -.fa-signing { - --fa: "\f2a7"; } - -.fa-calendar-day { - --fa: "\f783"; } - -.fa-water-ladder { - --fa: "\f5c5"; } - -.fa-ladder-water { - --fa: "\f5c5"; } - -.fa-swimming-pool { - --fa: "\f5c5"; } - -.fa-arrows-up-down { - --fa: "\f07d"; } - -.fa-arrows-v { - --fa: "\f07d"; } - -.fa-face-grimace { - --fa: "\f57f"; } - -.fa-grimace { - --fa: "\f57f"; } - -.fa-wheelchair-move { - --fa: "\e2ce"; } - -.fa-wheelchair-alt { - --fa: "\e2ce"; } - -.fa-turn-down { - --fa: "\f3be"; } - -.fa-level-down-alt { - --fa: "\f3be"; } - -.fa-person-walking-arrow-right { - --fa: "\e552"; } - -.fa-square-envelope { - --fa: "\f199"; } - -.fa-envelope-square { - --fa: "\f199"; } - -.fa-dice { - --fa: "\f522"; } - -.fa-bowling-ball { - --fa: "\f436"; } - -.fa-brain { - --fa: "\f5dc"; } - -.fa-bandage { - --fa: "\f462"; } - -.fa-band-aid { - --fa: "\f462"; } - -.fa-calendar-minus { - --fa: "\f272"; } - -.fa-circle-xmark { - --fa: "\f057"; } - -.fa-times-circle { - --fa: "\f057"; } - -.fa-xmark-circle { - --fa: "\f057"; } - -.fa-gifts { - --fa: "\f79c"; } - -.fa-hotel { - --fa: "\f594"; } - -.fa-earth-asia { - --fa: "\f57e"; } - -.fa-globe-asia { - --fa: "\f57e"; } - -.fa-id-card-clip { - --fa: "\f47f"; } - -.fa-id-card-alt { - --fa: "\f47f"; } - -.fa-magnifying-glass-plus { - --fa: "\f00e"; } - -.fa-search-plus { - --fa: "\f00e"; } - -.fa-thumbs-up { - --fa: "\f164"; } - -.fa-user-clock { - --fa: "\f4fd"; } - -.fa-hand-dots { - --fa: "\f461"; } - -.fa-allergies { - --fa: "\f461"; } - -.fa-file-invoice { - --fa: "\f570"; } - -.fa-window-minimize { - --fa: "\f2d1"; } - -.fa-mug-saucer { - --fa: "\f0f4"; } - -.fa-coffee { - --fa: "\f0f4"; } - -.fa-brush { - --fa: "\f55d"; } - -.fa-file-half-dashed { - --fa: "\e698"; } - -.fa-mask { - --fa: "\f6fa"; } - -.fa-magnifying-glass-minus { - --fa: "\f010"; } - -.fa-search-minus { - --fa: "\f010"; } - -.fa-ruler-vertical { - --fa: "\f548"; } - -.fa-user-large { - --fa: "\f406"; } - -.fa-user-alt { - --fa: "\f406"; } - -.fa-train-tram { - --fa: "\e5b4"; } - -.fa-user-nurse { - --fa: "\f82f"; } - -.fa-syringe { - --fa: "\f48e"; } - -.fa-cloud-sun { - --fa: "\f6c4"; } - -.fa-stopwatch-20 { - --fa: "\e06f"; } - -.fa-square-full { - --fa: "\f45c"; } - -.fa-magnet { - --fa: "\f076"; } - -.fa-jar { - --fa: "\e516"; } - -.fa-note-sticky { - --fa: "\f249"; } - -.fa-sticky-note { - --fa: "\f249"; } - -.fa-bug-slash { - --fa: "\e490"; } - -.fa-arrow-up-from-water-pump { - --fa: "\e4b6"; } - -.fa-bone { - --fa: "\f5d7"; } - -.fa-table-cells-row-unlock { - --fa: "\e691"; } - -.fa-user-injured { - --fa: "\f728"; } - -.fa-face-sad-tear { - --fa: "\f5b4"; } - -.fa-sad-tear { - --fa: "\f5b4"; } - -.fa-plane { - --fa: "\f072"; } - -.fa-tent-arrows-down { - --fa: "\e581"; } - -.fa-exclamation { - --fa: "\21"; } - -.fa-arrows-spin { - --fa: "\e4bb"; } - -.fa-print { - --fa: "\f02f"; } - -.fa-turkish-lira-sign { - --fa: "\e2bb"; } - -.fa-try { - --fa: "\e2bb"; } - -.fa-turkish-lira { - --fa: "\e2bb"; } - -.fa-dollar-sign { - --fa: "\24"; } - -.fa-dollar { - --fa: "\24"; } - -.fa-usd { - --fa: "\24"; } - -.fa-x { - --fa: "\58"; } - -.fa-magnifying-glass-dollar { - --fa: "\f688"; } - -.fa-search-dollar { - --fa: "\f688"; } - -.fa-users-gear { - --fa: "\f509"; } - -.fa-users-cog { - --fa: "\f509"; } - -.fa-person-military-pointing { - --fa: "\e54a"; } - -.fa-building-columns { - --fa: "\f19c"; } - -.fa-bank { - --fa: "\f19c"; } - -.fa-institution { - --fa: "\f19c"; } - -.fa-museum { - --fa: "\f19c"; } - -.fa-university { - --fa: "\f19c"; } - -.fa-umbrella { - --fa: "\f0e9"; } - -.fa-trowel { - --fa: "\e589"; } - -.fa-d { - --fa: "\44"; } - -.fa-stapler { - --fa: "\e5af"; } - -.fa-masks-theater { - --fa: "\f630"; } - -.fa-theater-masks { - --fa: "\f630"; } - -.fa-kip-sign { - --fa: "\e1c4"; } - -.fa-hand-point-left { - --fa: "\f0a5"; } - -.fa-handshake-simple { - --fa: "\f4c6"; } - -.fa-handshake-alt { - --fa: "\f4c6"; } - -.fa-jet-fighter { - --fa: "\f0fb"; } - -.fa-fighter-jet { - --fa: "\f0fb"; } - -.fa-square-share-nodes { - --fa: "\f1e1"; } - -.fa-share-alt-square { - --fa: "\f1e1"; } - -.fa-barcode { - --fa: "\f02a"; } - -.fa-plus-minus { - --fa: "\e43c"; } - -.fa-video { - --fa: "\f03d"; } - -.fa-video-camera { - --fa: "\f03d"; } - -.fa-graduation-cap { - --fa: "\f19d"; } - -.fa-mortar-board { - --fa: "\f19d"; } - -.fa-hand-holding-medical { - --fa: "\e05c"; } - -.fa-person-circle-check { - --fa: "\e53e"; } - -.fa-turn-up { - --fa: "\f3bf"; } - -.fa-level-up-alt { - --fa: "\f3bf"; } - -.sr-only, -.fa-sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } - -.sr-only-focusable:not(:focus), -.fa-sr-only-focusable:not(:focus) { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } -:root, :host { - --fa-style-family-brands: 'Font Awesome 6 Brands'; - --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } - -@font-face { - font-family: 'Font Awesome 6 Brands'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -.fab, -.fa-brands { - font-weight: 400; } - -.fa-monero { - --fa: "\f3d0"; } - -.fa-hooli { - --fa: "\f427"; } - -.fa-yelp { - --fa: "\f1e9"; } - -.fa-cc-visa { - --fa: "\f1f0"; } - -.fa-lastfm { - --fa: "\f202"; } - -.fa-shopware { - --fa: "\f5b5"; } - -.fa-creative-commons-nc { - --fa: "\f4e8"; } - -.fa-aws { - --fa: "\f375"; } - -.fa-redhat { - --fa: "\f7bc"; } - -.fa-yoast { - --fa: "\f2b1"; } - -.fa-cloudflare { - --fa: "\e07d"; } - -.fa-ups { - --fa: "\f7e0"; } - -.fa-pixiv { - --fa: "\e640"; } - -.fa-wpexplorer { - --fa: "\f2de"; } - -.fa-dyalog { - --fa: "\f399"; } - -.fa-bity { - --fa: "\f37a"; } - -.fa-stackpath { - --fa: "\f842"; } - -.fa-buysellads { - --fa: "\f20d"; } - -.fa-first-order { - --fa: "\f2b0"; } - -.fa-modx { - --fa: "\f285"; } - -.fa-guilded { - --fa: "\e07e"; } - -.fa-vnv { - --fa: "\f40b"; } - -.fa-square-js { - --fa: "\f3b9"; } - -.fa-js-square { - --fa: "\f3b9"; } - -.fa-microsoft { - --fa: "\f3ca"; } - -.fa-qq { - --fa: "\f1d6"; } - -.fa-orcid { - --fa: "\f8d2"; } - -.fa-java { - --fa: "\f4e4"; } - -.fa-invision { - --fa: "\f7b0"; } - -.fa-creative-commons-pd-alt { - --fa: "\f4ed"; } - -.fa-centercode { - --fa: "\f380"; } - -.fa-glide-g { - --fa: "\f2a6"; } - -.fa-drupal { - --fa: "\f1a9"; } - -.fa-jxl { - --fa: "\e67b"; } - -.fa-dart-lang { - --fa: "\e693"; } - -.fa-hire-a-helper { - --fa: "\f3b0"; } - -.fa-creative-commons-by { - --fa: "\f4e7"; } - -.fa-unity { - --fa: "\e049"; } - -.fa-whmcs { - --fa: "\f40d"; } - -.fa-rocketchat { - --fa: "\f3e8"; } - -.fa-vk { - --fa: "\f189"; } - -.fa-untappd { - --fa: "\f405"; } - -.fa-mailchimp { - --fa: "\f59e"; } - -.fa-css3-alt { - --fa: "\f38b"; } - -.fa-square-reddit { - --fa: "\f1a2"; } - -.fa-reddit-square { - --fa: "\f1a2"; } - -.fa-vimeo-v { - --fa: "\f27d"; } - -.fa-contao { - --fa: "\f26d"; } - -.fa-square-font-awesome { - --fa: "\e5ad"; } - -.fa-deskpro { - --fa: "\f38f"; } - -.fa-brave { - --fa: "\e63c"; } - -.fa-sistrix { - --fa: "\f3ee"; } - -.fa-square-instagram { - --fa: "\e055"; } - -.fa-instagram-square { - --fa: "\e055"; } - -.fa-battle-net { - --fa: "\f835"; } - -.fa-the-red-yeti { - --fa: "\f69d"; } - -.fa-square-hacker-news { - --fa: "\f3af"; } - -.fa-hacker-news-square { - --fa: "\f3af"; } - -.fa-edge { - --fa: "\f282"; } - -.fa-threads { - --fa: "\e618"; } - -.fa-napster { - --fa: "\f3d2"; } - -.fa-square-snapchat { - --fa: "\f2ad"; } - -.fa-snapchat-square { - --fa: "\f2ad"; } - -.fa-google-plus-g { - --fa: "\f0d5"; } - -.fa-artstation { - --fa: "\f77a"; } - -.fa-markdown { - --fa: "\f60f"; } - -.fa-sourcetree { - --fa: "\f7d3"; } - -.fa-google-plus { - --fa: "\f2b3"; } - -.fa-diaspora { - --fa: "\f791"; } - -.fa-foursquare { - --fa: "\f180"; } - -.fa-stack-overflow { - --fa: "\f16c"; } - -.fa-github-alt { - --fa: "\f113"; } - -.fa-phoenix-squadron { - --fa: "\f511"; } - -.fa-pagelines { - --fa: "\f18c"; } - -.fa-algolia { - --fa: "\f36c"; } - -.fa-red-river { - --fa: "\f3e3"; } - -.fa-creative-commons-sa { - --fa: "\f4ef"; } - -.fa-safari { - --fa: "\f267"; } - -.fa-google { - --fa: "\f1a0"; } - -.fa-square-font-awesome-stroke { - --fa: "\f35c"; } - -.fa-font-awesome-alt { - --fa: "\f35c"; } - -.fa-atlassian { - --fa: "\f77b"; } - -.fa-linkedin-in { - --fa: "\f0e1"; } - -.fa-digital-ocean { - --fa: "\f391"; } - -.fa-nimblr { - --fa: "\f5a8"; } - -.fa-chromecast { - --fa: "\f838"; } - -.fa-evernote { - --fa: "\f839"; } - -.fa-hacker-news { - --fa: "\f1d4"; } - -.fa-creative-commons-sampling { - --fa: "\f4f0"; } - -.fa-adversal { - --fa: "\f36a"; } - -.fa-creative-commons { - --fa: "\f25e"; } - -.fa-watchman-monitoring { - --fa: "\e087"; } - -.fa-fonticons { - --fa: "\f280"; } - -.fa-weixin { - --fa: "\f1d7"; } - -.fa-shirtsinbulk { - --fa: "\f214"; } - -.fa-codepen { - --fa: "\f1cb"; } - -.fa-git-alt { - --fa: "\f841"; } - -.fa-lyft { - --fa: "\f3c3"; } - -.fa-rev { - --fa: "\f5b2"; } - -.fa-windows { - --fa: "\f17a"; } - -.fa-wizards-of-the-coast { - --fa: "\f730"; } - -.fa-square-viadeo { - --fa: "\f2aa"; } - -.fa-viadeo-square { - --fa: "\f2aa"; } - -.fa-meetup { - --fa: "\f2e0"; } - -.fa-centos { - --fa: "\f789"; } - -.fa-adn { - --fa: "\f170"; } - -.fa-cloudsmith { - --fa: "\f384"; } - -.fa-opensuse { - --fa: "\e62b"; } - -.fa-pied-piper-alt { - --fa: "\f1a8"; } - -.fa-square-dribbble { - --fa: "\f397"; } - -.fa-dribbble-square { - --fa: "\f397"; } - -.fa-codiepie { - --fa: "\f284"; } - -.fa-node { - --fa: "\f419"; } - -.fa-mix { - --fa: "\f3cb"; } - -.fa-steam { - --fa: "\f1b6"; } - -.fa-cc-apple-pay { - --fa: "\f416"; } - -.fa-scribd { - --fa: "\f28a"; } - -.fa-debian { - --fa: "\e60b"; } - -.fa-openid { - --fa: "\f19b"; } - -.fa-instalod { - --fa: "\e081"; } - -.fa-files-pinwheel { - --fa: "\e69f"; } - -.fa-expeditedssl { - --fa: "\f23e"; } - -.fa-sellcast { - --fa: "\f2da"; } - -.fa-square-twitter { - --fa: "\f081"; } - -.fa-twitter-square { - --fa: "\f081"; } - -.fa-r-project { - --fa: "\f4f7"; } - -.fa-delicious { - --fa: "\f1a5"; } - -.fa-freebsd { - --fa: "\f3a4"; } - -.fa-vuejs { - --fa: "\f41f"; } - -.fa-accusoft { - --fa: "\f369"; } - -.fa-ioxhost { - --fa: "\f208"; } - -.fa-fonticons-fi { - --fa: "\f3a2"; } - -.fa-app-store { - --fa: "\f36f"; } - -.fa-cc-mastercard { - --fa: "\f1f1"; } - -.fa-itunes-note { - --fa: "\f3b5"; } - -.fa-golang { - --fa: "\e40f"; } - -.fa-kickstarter { - --fa: "\f3bb"; } - -.fa-square-kickstarter { - --fa: "\f3bb"; } - -.fa-grav { - --fa: "\f2d6"; } - -.fa-weibo { - --fa: "\f18a"; } - -.fa-uncharted { - --fa: "\e084"; } - -.fa-firstdraft { - --fa: "\f3a1"; } - -.fa-square-youtube { - --fa: "\f431"; } - -.fa-youtube-square { - --fa: "\f431"; } - -.fa-wikipedia-w { - --fa: "\f266"; } - -.fa-wpressr { - --fa: "\f3e4"; } - -.fa-rendact { - --fa: "\f3e4"; } - -.fa-angellist { - --fa: "\f209"; } - -.fa-galactic-republic { - --fa: "\f50c"; } - -.fa-nfc-directional { - --fa: "\e530"; } - -.fa-skype { - --fa: "\f17e"; } - -.fa-joget { - --fa: "\f3b7"; } - -.fa-fedora { - --fa: "\f798"; } - -.fa-stripe-s { - --fa: "\f42a"; } - -.fa-meta { - --fa: "\e49b"; } - -.fa-laravel { - --fa: "\f3bd"; } - -.fa-hotjar { - --fa: "\f3b1"; } - -.fa-bluetooth-b { - --fa: "\f294"; } - -.fa-square-letterboxd { - --fa: "\e62e"; } - -.fa-sticker-mule { - --fa: "\f3f7"; } - -.fa-creative-commons-zero { - --fa: "\f4f3"; } - -.fa-hips { - --fa: "\f452"; } - -.fa-css { - --fa: "\e6a2"; } - -.fa-behance { - --fa: "\f1b4"; } - -.fa-reddit { - --fa: "\f1a1"; } - -.fa-discord { - --fa: "\f392"; } - -.fa-chrome { - --fa: "\f268"; } - -.fa-app-store-ios { - --fa: "\f370"; } - -.fa-cc-discover { - --fa: "\f1f2"; } - -.fa-wpbeginner { - --fa: "\f297"; } - -.fa-confluence { - --fa: "\f78d"; } - -.fa-shoelace { - --fa: "\e60c"; } - -.fa-mdb { - --fa: "\f8ca"; } - -.fa-dochub { - --fa: "\f394"; } - -.fa-accessible-icon { - --fa: "\f368"; } - -.fa-ebay { - --fa: "\f4f4"; } - -.fa-amazon { - --fa: "\f270"; } - -.fa-unsplash { - --fa: "\e07c"; } - -.fa-yarn { - --fa: "\f7e3"; } - -.fa-square-steam { - --fa: "\f1b7"; } - -.fa-steam-square { - --fa: "\f1b7"; } - -.fa-500px { - --fa: "\f26e"; } - -.fa-square-vimeo { - --fa: "\f194"; } - -.fa-vimeo-square { - --fa: "\f194"; } - -.fa-asymmetrik { - --fa: "\f372"; } - -.fa-font-awesome { - --fa: "\f2b4"; } - -.fa-font-awesome-flag { - --fa: "\f2b4"; } - -.fa-font-awesome-logo-full { - --fa: "\f2b4"; } - -.fa-gratipay { - --fa: "\f184"; } - -.fa-apple { - --fa: "\f179"; } - -.fa-hive { - --fa: "\e07f"; } - -.fa-gitkraken { - --fa: "\f3a6"; } - -.fa-keybase { - --fa: "\f4f5"; } - -.fa-apple-pay { - --fa: "\f415"; } - -.fa-padlet { - --fa: "\e4a0"; } - -.fa-amazon-pay { - --fa: "\f42c"; } - -.fa-square-github { - --fa: "\f092"; } - -.fa-github-square { - --fa: "\f092"; } - -.fa-stumbleupon { - --fa: "\f1a4"; } - -.fa-fedex { - --fa: "\f797"; } - -.fa-phoenix-framework { - --fa: "\f3dc"; } - -.fa-shopify { - --fa: "\e057"; } - -.fa-neos { - --fa: "\f612"; } - -.fa-square-threads { - --fa: "\e619"; } - -.fa-hackerrank { - --fa: "\f5f7"; } - -.fa-researchgate { - --fa: "\f4f8"; } - -.fa-swift { - --fa: "\f8e1"; } - -.fa-angular { - --fa: "\f420"; } - -.fa-speakap { - --fa: "\f3f3"; } - -.fa-angrycreative { - --fa: "\f36e"; } - -.fa-y-combinator { - --fa: "\f23b"; } - -.fa-empire { - --fa: "\f1d1"; } - -.fa-envira { - --fa: "\f299"; } - -.fa-google-scholar { - --fa: "\e63b"; } - -.fa-square-gitlab { - --fa: "\e5ae"; } - -.fa-gitlab-square { - --fa: "\e5ae"; } - -.fa-studiovinari { - --fa: "\f3f8"; } - -.fa-pied-piper { - --fa: "\f2ae"; } - -.fa-wordpress { - --fa: "\f19a"; } - -.fa-product-hunt { - --fa: "\f288"; } - -.fa-firefox { - --fa: "\f269"; } - -.fa-linode { - --fa: "\f2b8"; } - -.fa-goodreads { - --fa: "\f3a8"; } - -.fa-square-odnoklassniki { - --fa: "\f264"; } - -.fa-odnoklassniki-square { - --fa: "\f264"; } - -.fa-jsfiddle { - --fa: "\f1cc"; } - -.fa-sith { - --fa: "\f512"; } - -.fa-themeisle { - --fa: "\f2b2"; } - -.fa-page4 { - --fa: "\f3d7"; } - -.fa-hashnode { - --fa: "\e499"; } - -.fa-react { - --fa: "\f41b"; } - -.fa-cc-paypal { - --fa: "\f1f4"; } - -.fa-squarespace { - --fa: "\f5be"; } - -.fa-cc-stripe { - --fa: "\f1f5"; } - -.fa-creative-commons-share { - --fa: "\f4f2"; } - -.fa-bitcoin { - --fa: "\f379"; } - -.fa-keycdn { - --fa: "\f3ba"; } - -.fa-opera { - --fa: "\f26a"; } - -.fa-itch-io { - --fa: "\f83a"; } - -.fa-umbraco { - --fa: "\f8e8"; } - -.fa-galactic-senate { - --fa: "\f50d"; } - -.fa-ubuntu { - --fa: "\f7df"; } - -.fa-draft2digital { - --fa: "\f396"; } - -.fa-stripe { - --fa: "\f429"; } - -.fa-houzz { - --fa: "\f27c"; } - -.fa-gg { - --fa: "\f260"; } - -.fa-dhl { - --fa: "\f790"; } - -.fa-square-pinterest { - --fa: "\f0d3"; } - -.fa-pinterest-square { - --fa: "\f0d3"; } - -.fa-xing { - --fa: "\f168"; } - -.fa-blackberry { - --fa: "\f37b"; } - -.fa-creative-commons-pd { - --fa: "\f4ec"; } - -.fa-playstation { - --fa: "\f3df"; } - -.fa-quinscape { - --fa: "\f459"; } - -.fa-less { - --fa: "\f41d"; } - -.fa-blogger-b { - --fa: "\f37d"; } - -.fa-opencart { - --fa: "\f23d"; } - -.fa-vine { - --fa: "\f1ca"; } - -.fa-signal-messenger { - --fa: "\e663"; } - -.fa-paypal { - --fa: "\f1ed"; } - -.fa-gitlab { - --fa: "\f296"; } - -.fa-typo3 { - --fa: "\f42b"; } - -.fa-reddit-alien { - --fa: "\f281"; } - -.fa-yahoo { - --fa: "\f19e"; } - -.fa-dailymotion { - --fa: "\e052"; } - -.fa-affiliatetheme { - --fa: "\f36b"; } - -.fa-pied-piper-pp { - --fa: "\f1a7"; } - -.fa-bootstrap { - --fa: "\f836"; } - -.fa-odnoklassniki { - --fa: "\f263"; } - -.fa-nfc-symbol { - --fa: "\e531"; } - -.fa-mintbit { - --fa: "\e62f"; } - -.fa-ethereum { - --fa: "\f42e"; } - -.fa-speaker-deck { - --fa: "\f83c"; } - -.fa-creative-commons-nc-eu { - --fa: "\f4e9"; } - -.fa-patreon { - --fa: "\f3d9"; } - -.fa-avianex { - --fa: "\f374"; } - -.fa-ello { - --fa: "\f5f1"; } - -.fa-gofore { - --fa: "\f3a7"; } - -.fa-bimobject { - --fa: "\f378"; } - -.fa-brave-reverse { - --fa: "\e63d"; } - -.fa-facebook-f { - --fa: "\f39e"; } - -.fa-square-google-plus { - --fa: "\f0d4"; } - -.fa-google-plus-square { - --fa: "\f0d4"; } - -.fa-web-awesome { - --fa: "\e682"; } - -.fa-mandalorian { - --fa: "\f50f"; } - -.fa-first-order-alt { - --fa: "\f50a"; } - -.fa-osi { - --fa: "\f41a"; } - -.fa-google-wallet { - --fa: "\f1ee"; } - -.fa-d-and-d-beyond { - --fa: "\f6ca"; } - -.fa-periscope { - --fa: "\f3da"; } - -.fa-fulcrum { - --fa: "\f50b"; } - -.fa-cloudscale { - --fa: "\f383"; } - -.fa-forumbee { - --fa: "\f211"; } - -.fa-mizuni { - --fa: "\f3cc"; } - -.fa-schlix { - --fa: "\f3ea"; } - -.fa-square-xing { - --fa: "\f169"; } - -.fa-xing-square { - --fa: "\f169"; } - -.fa-bandcamp { - --fa: "\f2d5"; } - -.fa-wpforms { - --fa: "\f298"; } - -.fa-cloudversify { - --fa: "\f385"; } - -.fa-usps { - --fa: "\f7e1"; } - -.fa-megaport { - --fa: "\f5a3"; } - -.fa-magento { - --fa: "\f3c4"; } - -.fa-spotify { - --fa: "\f1bc"; } - -.fa-optin-monster { - --fa: "\f23c"; } - -.fa-fly { - --fa: "\f417"; } - -.fa-square-bluesky { - --fa: "\e6a3"; } - -.fa-aviato { - --fa: "\f421"; } - -.fa-itunes { - --fa: "\f3b4"; } - -.fa-cuttlefish { - --fa: "\f38c"; } - -.fa-blogger { - --fa: "\f37c"; } - -.fa-flickr { - --fa: "\f16e"; } - -.fa-viber { - --fa: "\f409"; } - -.fa-soundcloud { - --fa: "\f1be"; } - -.fa-digg { - --fa: "\f1a6"; } - -.fa-tencent-weibo { - --fa: "\f1d5"; } - -.fa-letterboxd { - --fa: "\e62d"; } - -.fa-symfony { - --fa: "\f83d"; } - -.fa-maxcdn { - --fa: "\f136"; } - -.fa-etsy { - --fa: "\f2d7"; } - -.fa-facebook-messenger { - --fa: "\f39f"; } - -.fa-audible { - --fa: "\f373"; } - -.fa-think-peaks { - --fa: "\f731"; } - -.fa-bilibili { - --fa: "\e3d9"; } - -.fa-erlang { - --fa: "\f39d"; } - -.fa-x-twitter { - --fa: "\e61b"; } - -.fa-cotton-bureau { - --fa: "\f89e"; } - -.fa-dashcube { - --fa: "\f210"; } - -.fa-42-group { - --fa: "\e080"; } - -.fa-innosoft { - --fa: "\e080"; } - -.fa-stack-exchange { - --fa: "\f18d"; } - -.fa-elementor { - --fa: "\f430"; } - -.fa-square-pied-piper { - --fa: "\e01e"; } - -.fa-pied-piper-square { - --fa: "\e01e"; } - -.fa-creative-commons-nd { - --fa: "\f4eb"; } - -.fa-palfed { - --fa: "\f3d8"; } - -.fa-superpowers { - --fa: "\f2dd"; } - -.fa-resolving { - --fa: "\f3e7"; } - -.fa-xbox { - --fa: "\f412"; } - -.fa-square-web-awesome-stroke { - --fa: "\e684"; } - -.fa-searchengin { - --fa: "\f3eb"; } - -.fa-tiktok { - --fa: "\e07b"; } - -.fa-square-facebook { - --fa: "\f082"; } - -.fa-facebook-square { - --fa: "\f082"; } - -.fa-renren { - --fa: "\f18b"; } - -.fa-linux { - --fa: "\f17c"; } - -.fa-glide { - --fa: "\f2a5"; } - -.fa-linkedin { - --fa: "\f08c"; } - -.fa-hubspot { - --fa: "\f3b2"; } - -.fa-deploydog { - --fa: "\f38e"; } - -.fa-twitch { - --fa: "\f1e8"; } - -.fa-flutter { - --fa: "\e694"; } - -.fa-ravelry { - --fa: "\f2d9"; } - -.fa-mixer { - --fa: "\e056"; } - -.fa-square-lastfm { - --fa: "\f203"; } - -.fa-lastfm-square { - --fa: "\f203"; } - -.fa-vimeo { - --fa: "\f40a"; } - -.fa-mendeley { - --fa: "\f7b3"; } - -.fa-uniregistry { - --fa: "\f404"; } - -.fa-figma { - --fa: "\f799"; } - -.fa-creative-commons-remix { - --fa: "\f4ee"; } - -.fa-cc-amazon-pay { - --fa: "\f42d"; } - -.fa-dropbox { - --fa: "\f16b"; } - -.fa-instagram { - --fa: "\f16d"; } - -.fa-cmplid { - --fa: "\e360"; } - -.fa-upwork { - --fa: "\e641"; } - -.fa-facebook { - --fa: "\f09a"; } - -.fa-gripfire { - --fa: "\f3ac"; } - -.fa-jedi-order { - --fa: "\f50e"; } - -.fa-uikit { - --fa: "\f403"; } - -.fa-fort-awesome-alt { - --fa: "\f3a3"; } - -.fa-phabricator { - --fa: "\f3db"; } - -.fa-ussunnah { - --fa: "\f407"; } - -.fa-earlybirds { - --fa: "\f39a"; } - -.fa-trade-federation { - --fa: "\f513"; } - -.fa-autoprefixer { - --fa: "\f41c"; } - -.fa-whatsapp { - --fa: "\f232"; } - -.fa-square-upwork { - --fa: "\e67c"; } - -.fa-slideshare { - --fa: "\f1e7"; } - -.fa-google-play { - --fa: "\f3ab"; } - -.fa-viadeo { - --fa: "\f2a9"; } - -.fa-line { - --fa: "\f3c0"; } - -.fa-google-drive { - --fa: "\f3aa"; } - -.fa-servicestack { - --fa: "\f3ec"; } - -.fa-simplybuilt { - --fa: "\f215"; } - -.fa-bitbucket { - --fa: "\f171"; } - -.fa-imdb { - --fa: "\f2d8"; } - -.fa-deezer { - --fa: "\e077"; } - -.fa-raspberry-pi { - --fa: "\f7bb"; } - -.fa-jira { - --fa: "\f7b1"; } - -.fa-docker { - --fa: "\f395"; } - -.fa-screenpal { - --fa: "\e570"; } - -.fa-bluetooth { - --fa: "\f293"; } - -.fa-gitter { - --fa: "\f426"; } - -.fa-d-and-d { - --fa: "\f38d"; } - -.fa-microblog { - --fa: "\e01a"; } - -.fa-cc-diners-club { - --fa: "\f24c"; } - -.fa-gg-circle { - --fa: "\f261"; } - -.fa-pied-piper-hat { - --fa: "\f4e5"; } - -.fa-kickstarter-k { - --fa: "\f3bc"; } - -.fa-yandex { - --fa: "\f413"; } - -.fa-readme { - --fa: "\f4d5"; } - -.fa-html5 { - --fa: "\f13b"; } - -.fa-sellsy { - --fa: "\f213"; } - -.fa-square-web-awesome { - --fa: "\e683"; } - -.fa-sass { - --fa: "\f41e"; } - -.fa-wirsindhandwerk { - --fa: "\e2d0"; } - -.fa-wsh { - --fa: "\e2d0"; } - -.fa-buromobelexperte { - --fa: "\f37f"; } - -.fa-salesforce { - --fa: "\f83b"; } - -.fa-octopus-deploy { - --fa: "\e082"; } - -.fa-medapps { - --fa: "\f3c6"; } - -.fa-ns8 { - --fa: "\f3d5"; } - -.fa-pinterest-p { - --fa: "\f231"; } - -.fa-apper { - --fa: "\f371"; } - -.fa-fort-awesome { - --fa: "\f286"; } - -.fa-waze { - --fa: "\f83f"; } - -.fa-bluesky { - --fa: "\e671"; } - -.fa-cc-jcb { - --fa: "\f24b"; } - -.fa-snapchat { - --fa: "\f2ab"; } - -.fa-snapchat-ghost { - --fa: "\f2ab"; } - -.fa-fantasy-flight-games { - --fa: "\f6dc"; } - -.fa-rust { - --fa: "\e07a"; } - -.fa-wix { - --fa: "\f5cf"; } - -.fa-square-behance { - --fa: "\f1b5"; } - -.fa-behance-square { - --fa: "\f1b5"; } - -.fa-supple { - --fa: "\f3f9"; } - -.fa-webflow { - --fa: "\e65c"; } - -.fa-rebel { - --fa: "\f1d0"; } - -.fa-css3 { - --fa: "\f13c"; } - -.fa-staylinked { - --fa: "\f3f5"; } - -.fa-kaggle { - --fa: "\f5fa"; } - -.fa-space-awesome { - --fa: "\e5ac"; } - -.fa-deviantart { - --fa: "\f1bd"; } - -.fa-cpanel { - --fa: "\f388"; } - -.fa-goodreads-g { - --fa: "\f3a9"; } - -.fa-square-git { - --fa: "\f1d2"; } - -.fa-git-square { - --fa: "\f1d2"; } - -.fa-square-tumblr { - --fa: "\f174"; } - -.fa-tumblr-square { - --fa: "\f174"; } - -.fa-trello { - --fa: "\f181"; } - -.fa-creative-commons-nc-jp { - --fa: "\f4ea"; } - -.fa-get-pocket { - --fa: "\f265"; } - -.fa-perbyte { - --fa: "\e083"; } - -.fa-grunt { - --fa: "\f3ad"; } - -.fa-weebly { - --fa: "\f5cc"; } - -.fa-connectdevelop { - --fa: "\f20e"; } - -.fa-leanpub { - --fa: "\f212"; } - -.fa-black-tie { - --fa: "\f27e"; } - -.fa-themeco { - --fa: "\f5c6"; } - -.fa-python { - --fa: "\f3e2"; } - -.fa-android { - --fa: "\f17b"; } - -.fa-bots { - --fa: "\e340"; } - -.fa-free-code-camp { - --fa: "\f2c5"; } - -.fa-hornbill { - --fa: "\f592"; } - -.fa-js { - --fa: "\f3b8"; } - -.fa-ideal { - --fa: "\e013"; } - -.fa-git { - --fa: "\f1d3"; } - -.fa-dev { - --fa: "\f6cc"; } - -.fa-sketch { - --fa: "\f7c6"; } - -.fa-yandex-international { - --fa: "\f414"; } - -.fa-cc-amex { - --fa: "\f1f3"; } - -.fa-uber { - --fa: "\f402"; } - -.fa-github { - --fa: "\f09b"; } - -.fa-php { - --fa: "\f457"; } - -.fa-alipay { - --fa: "\f642"; } - -.fa-youtube { - --fa: "\f167"; } - -.fa-skyatlas { - --fa: "\f216"; } - -.fa-firefox-browser { - --fa: "\e007"; } - -.fa-replyd { - --fa: "\f3e6"; } - -.fa-suse { - --fa: "\f7d6"; } - -.fa-jenkins { - --fa: "\f3b6"; } - -.fa-twitter { - --fa: "\f099"; } - -.fa-rockrms { - --fa: "\f3e9"; } - -.fa-pinterest { - --fa: "\f0d2"; } - -.fa-buffer { - --fa: "\f837"; } - -.fa-npm { - --fa: "\f3d4"; } - -.fa-yammer { - --fa: "\f840"; } - -.fa-btc { - --fa: "\f15a"; } - -.fa-dribbble { - --fa: "\f17d"; } - -.fa-stumbleupon-circle { - --fa: "\f1a3"; } - -.fa-internet-explorer { - --fa: "\f26b"; } - -.fa-stubber { - --fa: "\e5c7"; } - -.fa-telegram { - --fa: "\f2c6"; } - -.fa-telegram-plane { - --fa: "\f2c6"; } - -.fa-old-republic { - --fa: "\f510"; } - -.fa-odysee { - --fa: "\e5c6"; } - -.fa-square-whatsapp { - --fa: "\f40c"; } - -.fa-whatsapp-square { - --fa: "\f40c"; } - -.fa-node-js { - --fa: "\f3d3"; } - -.fa-edge-legacy { - --fa: "\e078"; } - -.fa-slack { - --fa: "\f198"; } - -.fa-slack-hash { - --fa: "\f198"; } - -.fa-medrt { - --fa: "\f3c8"; } - -.fa-usb { - --fa: "\f287"; } - -.fa-tumblr { - --fa: "\f173"; } - -.fa-vaadin { - --fa: "\f408"; } - -.fa-quora { - --fa: "\f2c4"; } - -.fa-square-x-twitter { - --fa: "\e61a"; } - -.fa-reacteurope { - --fa: "\f75d"; } - -.fa-medium { - --fa: "\f23a"; } - -.fa-medium-m { - --fa: "\f23a"; } - -.fa-amilia { - --fa: "\f36d"; } - -.fa-mixcloud { - --fa: "\f289"; } - -.fa-flipboard { - --fa: "\f44d"; } - -.fa-viacoin { - --fa: "\f237"; } - -.fa-critical-role { - --fa: "\f6c9"; } - -.fa-sitrox { - --fa: "\e44a"; } - -.fa-discourse { - --fa: "\f393"; } - -.fa-joomla { - --fa: "\f1aa"; } - -.fa-mastodon { - --fa: "\f4f6"; } - -.fa-airbnb { - --fa: "\f834"; } - -.fa-wolf-pack-battalion { - --fa: "\f514"; } - -.fa-buy-n-large { - --fa: "\f8a6"; } - -.fa-gulp { - --fa: "\f3ae"; } - -.fa-creative-commons-sampling-plus { - --fa: "\f4f1"; } - -.fa-strava { - --fa: "\f428"; } - -.fa-ember { - --fa: "\f423"; } - -.fa-canadian-maple-leaf { - --fa: "\f785"; } - -.fa-teamspeak { - --fa: "\f4f9"; } - -.fa-pushed { - --fa: "\f3e1"; } - -.fa-wordpress-simple { - --fa: "\f411"; } - -.fa-nutritionix { - --fa: "\f3d6"; } - -.fa-wodu { - --fa: "\e088"; } - -.fa-google-pay { - --fa: "\e079"; } - -.fa-intercom { - --fa: "\f7af"; } - -.fa-zhihu { - --fa: "\f63f"; } - -.fa-korvue { - --fa: "\f42f"; } - -.fa-pix { - --fa: "\e43a"; } - -.fa-steam-symbol { - --fa: "\f3f6"; } -:root, :host { - --fa-style-family-classic: 'Font Awesome 6 Free'; - --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } - -@font-face { - font-family: 'Font Awesome 6 Free'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } - -.far, -.fa-regular { - font-weight: 400; } -:root, :host { - --fa-style-family-classic: 'Font Awesome 6 Free'; - --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } - -@font-face { - font-family: 'Font Awesome 6 Free'; - font-style: normal; - font-weight: 900; - font-display: block; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -.fas, -.fa-solid { - font-weight: 900; } -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-display: block; - font-weight: 400; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-display: block; - font-weight: 900; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-display: block; - font-weight: 400; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); - unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); - unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; } diff --git a/files/fontawesome/css/all.min.css b/files/fontawesome/css/all.min.css deleted file mode 100644 index 29542ac5e2..0000000000 --- a/files/fontawesome/css/all.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/files/fontawesome/css/brands.css b/files/fontawesome/css/brands.css deleted file mode 100644 index 8ae2f76285..0000000000 --- a/files/fontawesome/css/brands.css +++ /dev/null @@ -1,1609 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:root, :host { - --fa-style-family-brands: 'Font Awesome 6 Brands'; - --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; } - -@font-face { - font-family: 'Font Awesome 6 Brands'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -.fab, -.fa-brands { - font-weight: 400; } - -.fa-monero { - --fa: "\f3d0"; } - -.fa-hooli { - --fa: "\f427"; } - -.fa-yelp { - --fa: "\f1e9"; } - -.fa-cc-visa { - --fa: "\f1f0"; } - -.fa-lastfm { - --fa: "\f202"; } - -.fa-shopware { - --fa: "\f5b5"; } - -.fa-creative-commons-nc { - --fa: "\f4e8"; } - -.fa-aws { - --fa: "\f375"; } - -.fa-redhat { - --fa: "\f7bc"; } - -.fa-yoast { - --fa: "\f2b1"; } - -.fa-cloudflare { - --fa: "\e07d"; } - -.fa-ups { - --fa: "\f7e0"; } - -.fa-pixiv { - --fa: "\e640"; } - -.fa-wpexplorer { - --fa: "\f2de"; } - -.fa-dyalog { - --fa: "\f399"; } - -.fa-bity { - --fa: "\f37a"; } - -.fa-stackpath { - --fa: "\f842"; } - -.fa-buysellads { - --fa: "\f20d"; } - -.fa-first-order { - --fa: "\f2b0"; } - -.fa-modx { - --fa: "\f285"; } - -.fa-guilded { - --fa: "\e07e"; } - -.fa-vnv { - --fa: "\f40b"; } - -.fa-square-js { - --fa: "\f3b9"; } - -.fa-js-square { - --fa: "\f3b9"; } - -.fa-microsoft { - --fa: "\f3ca"; } - -.fa-qq { - --fa: "\f1d6"; } - -.fa-orcid { - --fa: "\f8d2"; } - -.fa-java { - --fa: "\f4e4"; } - -.fa-invision { - --fa: "\f7b0"; } - -.fa-creative-commons-pd-alt { - --fa: "\f4ed"; } - -.fa-centercode { - --fa: "\f380"; } - -.fa-glide-g { - --fa: "\f2a6"; } - -.fa-drupal { - --fa: "\f1a9"; } - -.fa-jxl { - --fa: "\e67b"; } - -.fa-dart-lang { - --fa: "\e693"; } - -.fa-hire-a-helper { - --fa: "\f3b0"; } - -.fa-creative-commons-by { - --fa: "\f4e7"; } - -.fa-unity { - --fa: "\e049"; } - -.fa-whmcs { - --fa: "\f40d"; } - -.fa-rocketchat { - --fa: "\f3e8"; } - -.fa-vk { - --fa: "\f189"; } - -.fa-untappd { - --fa: "\f405"; } - -.fa-mailchimp { - --fa: "\f59e"; } - -.fa-css3-alt { - --fa: "\f38b"; } - -.fa-square-reddit { - --fa: "\f1a2"; } - -.fa-reddit-square { - --fa: "\f1a2"; } - -.fa-vimeo-v { - --fa: "\f27d"; } - -.fa-contao { - --fa: "\f26d"; } - -.fa-square-font-awesome { - --fa: "\e5ad"; } - -.fa-deskpro { - --fa: "\f38f"; } - -.fa-brave { - --fa: "\e63c"; } - -.fa-sistrix { - --fa: "\f3ee"; } - -.fa-square-instagram { - --fa: "\e055"; } - -.fa-instagram-square { - --fa: "\e055"; } - -.fa-battle-net { - --fa: "\f835"; } - -.fa-the-red-yeti { - --fa: "\f69d"; } - -.fa-square-hacker-news { - --fa: "\f3af"; } - -.fa-hacker-news-square { - --fa: "\f3af"; } - -.fa-edge { - --fa: "\f282"; } - -.fa-threads { - --fa: "\e618"; } - -.fa-napster { - --fa: "\f3d2"; } - -.fa-square-snapchat { - --fa: "\f2ad"; } - -.fa-snapchat-square { - --fa: "\f2ad"; } - -.fa-google-plus-g { - --fa: "\f0d5"; } - -.fa-artstation { - --fa: "\f77a"; } - -.fa-markdown { - --fa: "\f60f"; } - -.fa-sourcetree { - --fa: "\f7d3"; } - -.fa-google-plus { - --fa: "\f2b3"; } - -.fa-diaspora { - --fa: "\f791"; } - -.fa-foursquare { - --fa: "\f180"; } - -.fa-stack-overflow { - --fa: "\f16c"; } - -.fa-github-alt { - --fa: "\f113"; } - -.fa-phoenix-squadron { - --fa: "\f511"; } - -.fa-pagelines { - --fa: "\f18c"; } - -.fa-algolia { - --fa: "\f36c"; } - -.fa-red-river { - --fa: "\f3e3"; } - -.fa-creative-commons-sa { - --fa: "\f4ef"; } - -.fa-safari { - --fa: "\f267"; } - -.fa-google { - --fa: "\f1a0"; } - -.fa-square-font-awesome-stroke { - --fa: "\f35c"; } - -.fa-font-awesome-alt { - --fa: "\f35c"; } - -.fa-atlassian { - --fa: "\f77b"; } - -.fa-linkedin-in { - --fa: "\f0e1"; } - -.fa-digital-ocean { - --fa: "\f391"; } - -.fa-nimblr { - --fa: "\f5a8"; } - -.fa-chromecast { - --fa: "\f838"; } - -.fa-evernote { - --fa: "\f839"; } - -.fa-hacker-news { - --fa: "\f1d4"; } - -.fa-creative-commons-sampling { - --fa: "\f4f0"; } - -.fa-adversal { - --fa: "\f36a"; } - -.fa-creative-commons { - --fa: "\f25e"; } - -.fa-watchman-monitoring { - --fa: "\e087"; } - -.fa-fonticons { - --fa: "\f280"; } - -.fa-weixin { - --fa: "\f1d7"; } - -.fa-shirtsinbulk { - --fa: "\f214"; } - -.fa-codepen { - --fa: "\f1cb"; } - -.fa-git-alt { - --fa: "\f841"; } - -.fa-lyft { - --fa: "\f3c3"; } - -.fa-rev { - --fa: "\f5b2"; } - -.fa-windows { - --fa: "\f17a"; } - -.fa-wizards-of-the-coast { - --fa: "\f730"; } - -.fa-square-viadeo { - --fa: "\f2aa"; } - -.fa-viadeo-square { - --fa: "\f2aa"; } - -.fa-meetup { - --fa: "\f2e0"; } - -.fa-centos { - --fa: "\f789"; } - -.fa-adn { - --fa: "\f170"; } - -.fa-cloudsmith { - --fa: "\f384"; } - -.fa-opensuse { - --fa: "\e62b"; } - -.fa-pied-piper-alt { - --fa: "\f1a8"; } - -.fa-square-dribbble { - --fa: "\f397"; } - -.fa-dribbble-square { - --fa: "\f397"; } - -.fa-codiepie { - --fa: "\f284"; } - -.fa-node { - --fa: "\f419"; } - -.fa-mix { - --fa: "\f3cb"; } - -.fa-steam { - --fa: "\f1b6"; } - -.fa-cc-apple-pay { - --fa: "\f416"; } - -.fa-scribd { - --fa: "\f28a"; } - -.fa-debian { - --fa: "\e60b"; } - -.fa-openid { - --fa: "\f19b"; } - -.fa-instalod { - --fa: "\e081"; } - -.fa-files-pinwheel { - --fa: "\e69f"; } - -.fa-expeditedssl { - --fa: "\f23e"; } - -.fa-sellcast { - --fa: "\f2da"; } - -.fa-square-twitter { - --fa: "\f081"; } - -.fa-twitter-square { - --fa: "\f081"; } - -.fa-r-project { - --fa: "\f4f7"; } - -.fa-delicious { - --fa: "\f1a5"; } - -.fa-freebsd { - --fa: "\f3a4"; } - -.fa-vuejs { - --fa: "\f41f"; } - -.fa-accusoft { - --fa: "\f369"; } - -.fa-ioxhost { - --fa: "\f208"; } - -.fa-fonticons-fi { - --fa: "\f3a2"; } - -.fa-app-store { - --fa: "\f36f"; } - -.fa-cc-mastercard { - --fa: "\f1f1"; } - -.fa-itunes-note { - --fa: "\f3b5"; } - -.fa-golang { - --fa: "\e40f"; } - -.fa-kickstarter { - --fa: "\f3bb"; } - -.fa-square-kickstarter { - --fa: "\f3bb"; } - -.fa-grav { - --fa: "\f2d6"; } - -.fa-weibo { - --fa: "\f18a"; } - -.fa-uncharted { - --fa: "\e084"; } - -.fa-firstdraft { - --fa: "\f3a1"; } - -.fa-square-youtube { - --fa: "\f431"; } - -.fa-youtube-square { - --fa: "\f431"; } - -.fa-wikipedia-w { - --fa: "\f266"; } - -.fa-wpressr { - --fa: "\f3e4"; } - -.fa-rendact { - --fa: "\f3e4"; } - -.fa-angellist { - --fa: "\f209"; } - -.fa-galactic-republic { - --fa: "\f50c"; } - -.fa-nfc-directional { - --fa: "\e530"; } - -.fa-skype { - --fa: "\f17e"; } - -.fa-joget { - --fa: "\f3b7"; } - -.fa-fedora { - --fa: "\f798"; } - -.fa-stripe-s { - --fa: "\f42a"; } - -.fa-meta { - --fa: "\e49b"; } - -.fa-laravel { - --fa: "\f3bd"; } - -.fa-hotjar { - --fa: "\f3b1"; } - -.fa-bluetooth-b { - --fa: "\f294"; } - -.fa-square-letterboxd { - --fa: "\e62e"; } - -.fa-sticker-mule { - --fa: "\f3f7"; } - -.fa-creative-commons-zero { - --fa: "\f4f3"; } - -.fa-hips { - --fa: "\f452"; } - -.fa-css { - --fa: "\e6a2"; } - -.fa-behance { - --fa: "\f1b4"; } - -.fa-reddit { - --fa: "\f1a1"; } - -.fa-discord { - --fa: "\f392"; } - -.fa-chrome { - --fa: "\f268"; } - -.fa-app-store-ios { - --fa: "\f370"; } - -.fa-cc-discover { - --fa: "\f1f2"; } - -.fa-wpbeginner { - --fa: "\f297"; } - -.fa-confluence { - --fa: "\f78d"; } - -.fa-shoelace { - --fa: "\e60c"; } - -.fa-mdb { - --fa: "\f8ca"; } - -.fa-dochub { - --fa: "\f394"; } - -.fa-accessible-icon { - --fa: "\f368"; } - -.fa-ebay { - --fa: "\f4f4"; } - -.fa-amazon { - --fa: "\f270"; } - -.fa-unsplash { - --fa: "\e07c"; } - -.fa-yarn { - --fa: "\f7e3"; } - -.fa-square-steam { - --fa: "\f1b7"; } - -.fa-steam-square { - --fa: "\f1b7"; } - -.fa-500px { - --fa: "\f26e"; } - -.fa-square-vimeo { - --fa: "\f194"; } - -.fa-vimeo-square { - --fa: "\f194"; } - -.fa-asymmetrik { - --fa: "\f372"; } - -.fa-font-awesome { - --fa: "\f2b4"; } - -.fa-font-awesome-flag { - --fa: "\f2b4"; } - -.fa-font-awesome-logo-full { - --fa: "\f2b4"; } - -.fa-gratipay { - --fa: "\f184"; } - -.fa-apple { - --fa: "\f179"; } - -.fa-hive { - --fa: "\e07f"; } - -.fa-gitkraken { - --fa: "\f3a6"; } - -.fa-keybase { - --fa: "\f4f5"; } - -.fa-apple-pay { - --fa: "\f415"; } - -.fa-padlet { - --fa: "\e4a0"; } - -.fa-amazon-pay { - --fa: "\f42c"; } - -.fa-square-github { - --fa: "\f092"; } - -.fa-github-square { - --fa: "\f092"; } - -.fa-stumbleupon { - --fa: "\f1a4"; } - -.fa-fedex { - --fa: "\f797"; } - -.fa-phoenix-framework { - --fa: "\f3dc"; } - -.fa-shopify { - --fa: "\e057"; } - -.fa-neos { - --fa: "\f612"; } - -.fa-square-threads { - --fa: "\e619"; } - -.fa-hackerrank { - --fa: "\f5f7"; } - -.fa-researchgate { - --fa: "\f4f8"; } - -.fa-swift { - --fa: "\f8e1"; } - -.fa-angular { - --fa: "\f420"; } - -.fa-speakap { - --fa: "\f3f3"; } - -.fa-angrycreative { - --fa: "\f36e"; } - -.fa-y-combinator { - --fa: "\f23b"; } - -.fa-empire { - --fa: "\f1d1"; } - -.fa-envira { - --fa: "\f299"; } - -.fa-google-scholar { - --fa: "\e63b"; } - -.fa-square-gitlab { - --fa: "\e5ae"; } - -.fa-gitlab-square { - --fa: "\e5ae"; } - -.fa-studiovinari { - --fa: "\f3f8"; } - -.fa-pied-piper { - --fa: "\f2ae"; } - -.fa-wordpress { - --fa: "\f19a"; } - -.fa-product-hunt { - --fa: "\f288"; } - -.fa-firefox { - --fa: "\f269"; } - -.fa-linode { - --fa: "\f2b8"; } - -.fa-goodreads { - --fa: "\f3a8"; } - -.fa-square-odnoklassniki { - --fa: "\f264"; } - -.fa-odnoklassniki-square { - --fa: "\f264"; } - -.fa-jsfiddle { - --fa: "\f1cc"; } - -.fa-sith { - --fa: "\f512"; } - -.fa-themeisle { - --fa: "\f2b2"; } - -.fa-page4 { - --fa: "\f3d7"; } - -.fa-hashnode { - --fa: "\e499"; } - -.fa-react { - --fa: "\f41b"; } - -.fa-cc-paypal { - --fa: "\f1f4"; } - -.fa-squarespace { - --fa: "\f5be"; } - -.fa-cc-stripe { - --fa: "\f1f5"; } - -.fa-creative-commons-share { - --fa: "\f4f2"; } - -.fa-bitcoin { - --fa: "\f379"; } - -.fa-keycdn { - --fa: "\f3ba"; } - -.fa-opera { - --fa: "\f26a"; } - -.fa-itch-io { - --fa: "\f83a"; } - -.fa-umbraco { - --fa: "\f8e8"; } - -.fa-galactic-senate { - --fa: "\f50d"; } - -.fa-ubuntu { - --fa: "\f7df"; } - -.fa-draft2digital { - --fa: "\f396"; } - -.fa-stripe { - --fa: "\f429"; } - -.fa-houzz { - --fa: "\f27c"; } - -.fa-gg { - --fa: "\f260"; } - -.fa-dhl { - --fa: "\f790"; } - -.fa-square-pinterest { - --fa: "\f0d3"; } - -.fa-pinterest-square { - --fa: "\f0d3"; } - -.fa-xing { - --fa: "\f168"; } - -.fa-blackberry { - --fa: "\f37b"; } - -.fa-creative-commons-pd { - --fa: "\f4ec"; } - -.fa-playstation { - --fa: "\f3df"; } - -.fa-quinscape { - --fa: "\f459"; } - -.fa-less { - --fa: "\f41d"; } - -.fa-blogger-b { - --fa: "\f37d"; } - -.fa-opencart { - --fa: "\f23d"; } - -.fa-vine { - --fa: "\f1ca"; } - -.fa-signal-messenger { - --fa: "\e663"; } - -.fa-paypal { - --fa: "\f1ed"; } - -.fa-gitlab { - --fa: "\f296"; } - -.fa-typo3 { - --fa: "\f42b"; } - -.fa-reddit-alien { - --fa: "\f281"; } - -.fa-yahoo { - --fa: "\f19e"; } - -.fa-dailymotion { - --fa: "\e052"; } - -.fa-affiliatetheme { - --fa: "\f36b"; } - -.fa-pied-piper-pp { - --fa: "\f1a7"; } - -.fa-bootstrap { - --fa: "\f836"; } - -.fa-odnoklassniki { - --fa: "\f263"; } - -.fa-nfc-symbol { - --fa: "\e531"; } - -.fa-mintbit { - --fa: "\e62f"; } - -.fa-ethereum { - --fa: "\f42e"; } - -.fa-speaker-deck { - --fa: "\f83c"; } - -.fa-creative-commons-nc-eu { - --fa: "\f4e9"; } - -.fa-patreon { - --fa: "\f3d9"; } - -.fa-avianex { - --fa: "\f374"; } - -.fa-ello { - --fa: "\f5f1"; } - -.fa-gofore { - --fa: "\f3a7"; } - -.fa-bimobject { - --fa: "\f378"; } - -.fa-brave-reverse { - --fa: "\e63d"; } - -.fa-facebook-f { - --fa: "\f39e"; } - -.fa-square-google-plus { - --fa: "\f0d4"; } - -.fa-google-plus-square { - --fa: "\f0d4"; } - -.fa-web-awesome { - --fa: "\e682"; } - -.fa-mandalorian { - --fa: "\f50f"; } - -.fa-first-order-alt { - --fa: "\f50a"; } - -.fa-osi { - --fa: "\f41a"; } - -.fa-google-wallet { - --fa: "\f1ee"; } - -.fa-d-and-d-beyond { - --fa: "\f6ca"; } - -.fa-periscope { - --fa: "\f3da"; } - -.fa-fulcrum { - --fa: "\f50b"; } - -.fa-cloudscale { - --fa: "\f383"; } - -.fa-forumbee { - --fa: "\f211"; } - -.fa-mizuni { - --fa: "\f3cc"; } - -.fa-schlix { - --fa: "\f3ea"; } - -.fa-square-xing { - --fa: "\f169"; } - -.fa-xing-square { - --fa: "\f169"; } - -.fa-bandcamp { - --fa: "\f2d5"; } - -.fa-wpforms { - --fa: "\f298"; } - -.fa-cloudversify { - --fa: "\f385"; } - -.fa-usps { - --fa: "\f7e1"; } - -.fa-megaport { - --fa: "\f5a3"; } - -.fa-magento { - --fa: "\f3c4"; } - -.fa-spotify { - --fa: "\f1bc"; } - -.fa-optin-monster { - --fa: "\f23c"; } - -.fa-fly { - --fa: "\f417"; } - -.fa-square-bluesky { - --fa: "\e6a3"; } - -.fa-aviato { - --fa: "\f421"; } - -.fa-itunes { - --fa: "\f3b4"; } - -.fa-cuttlefish { - --fa: "\f38c"; } - -.fa-blogger { - --fa: "\f37c"; } - -.fa-flickr { - --fa: "\f16e"; } - -.fa-viber { - --fa: "\f409"; } - -.fa-soundcloud { - --fa: "\f1be"; } - -.fa-digg { - --fa: "\f1a6"; } - -.fa-tencent-weibo { - --fa: "\f1d5"; } - -.fa-letterboxd { - --fa: "\e62d"; } - -.fa-symfony { - --fa: "\f83d"; } - -.fa-maxcdn { - --fa: "\f136"; } - -.fa-etsy { - --fa: "\f2d7"; } - -.fa-facebook-messenger { - --fa: "\f39f"; } - -.fa-audible { - --fa: "\f373"; } - -.fa-think-peaks { - --fa: "\f731"; } - -.fa-bilibili { - --fa: "\e3d9"; } - -.fa-erlang { - --fa: "\f39d"; } - -.fa-x-twitter { - --fa: "\e61b"; } - -.fa-cotton-bureau { - --fa: "\f89e"; } - -.fa-dashcube { - --fa: "\f210"; } - -.fa-42-group { - --fa: "\e080"; } - -.fa-innosoft { - --fa: "\e080"; } - -.fa-stack-exchange { - --fa: "\f18d"; } - -.fa-elementor { - --fa: "\f430"; } - -.fa-square-pied-piper { - --fa: "\e01e"; } - -.fa-pied-piper-square { - --fa: "\e01e"; } - -.fa-creative-commons-nd { - --fa: "\f4eb"; } - -.fa-palfed { - --fa: "\f3d8"; } - -.fa-superpowers { - --fa: "\f2dd"; } - -.fa-resolving { - --fa: "\f3e7"; } - -.fa-xbox { - --fa: "\f412"; } - -.fa-square-web-awesome-stroke { - --fa: "\e684"; } - -.fa-searchengin { - --fa: "\f3eb"; } - -.fa-tiktok { - --fa: "\e07b"; } - -.fa-square-facebook { - --fa: "\f082"; } - -.fa-facebook-square { - --fa: "\f082"; } - -.fa-renren { - --fa: "\f18b"; } - -.fa-linux { - --fa: "\f17c"; } - -.fa-glide { - --fa: "\f2a5"; } - -.fa-linkedin { - --fa: "\f08c"; } - -.fa-hubspot { - --fa: "\f3b2"; } - -.fa-deploydog { - --fa: "\f38e"; } - -.fa-twitch { - --fa: "\f1e8"; } - -.fa-flutter { - --fa: "\e694"; } - -.fa-ravelry { - --fa: "\f2d9"; } - -.fa-mixer { - --fa: "\e056"; } - -.fa-square-lastfm { - --fa: "\f203"; } - -.fa-lastfm-square { - --fa: "\f203"; } - -.fa-vimeo { - --fa: "\f40a"; } - -.fa-mendeley { - --fa: "\f7b3"; } - -.fa-uniregistry { - --fa: "\f404"; } - -.fa-figma { - --fa: "\f799"; } - -.fa-creative-commons-remix { - --fa: "\f4ee"; } - -.fa-cc-amazon-pay { - --fa: "\f42d"; } - -.fa-dropbox { - --fa: "\f16b"; } - -.fa-instagram { - --fa: "\f16d"; } - -.fa-cmplid { - --fa: "\e360"; } - -.fa-upwork { - --fa: "\e641"; } - -.fa-facebook { - --fa: "\f09a"; } - -.fa-gripfire { - --fa: "\f3ac"; } - -.fa-jedi-order { - --fa: "\f50e"; } - -.fa-uikit { - --fa: "\f403"; } - -.fa-fort-awesome-alt { - --fa: "\f3a3"; } - -.fa-phabricator { - --fa: "\f3db"; } - -.fa-ussunnah { - --fa: "\f407"; } - -.fa-earlybirds { - --fa: "\f39a"; } - -.fa-trade-federation { - --fa: "\f513"; } - -.fa-autoprefixer { - --fa: "\f41c"; } - -.fa-whatsapp { - --fa: "\f232"; } - -.fa-square-upwork { - --fa: "\e67c"; } - -.fa-slideshare { - --fa: "\f1e7"; } - -.fa-google-play { - --fa: "\f3ab"; } - -.fa-viadeo { - --fa: "\f2a9"; } - -.fa-line { - --fa: "\f3c0"; } - -.fa-google-drive { - --fa: "\f3aa"; } - -.fa-servicestack { - --fa: "\f3ec"; } - -.fa-simplybuilt { - --fa: "\f215"; } - -.fa-bitbucket { - --fa: "\f171"; } - -.fa-imdb { - --fa: "\f2d8"; } - -.fa-deezer { - --fa: "\e077"; } - -.fa-raspberry-pi { - --fa: "\f7bb"; } - -.fa-jira { - --fa: "\f7b1"; } - -.fa-docker { - --fa: "\f395"; } - -.fa-screenpal { - --fa: "\e570"; } - -.fa-bluetooth { - --fa: "\f293"; } - -.fa-gitter { - --fa: "\f426"; } - -.fa-d-and-d { - --fa: "\f38d"; } - -.fa-microblog { - --fa: "\e01a"; } - -.fa-cc-diners-club { - --fa: "\f24c"; } - -.fa-gg-circle { - --fa: "\f261"; } - -.fa-pied-piper-hat { - --fa: "\f4e5"; } - -.fa-kickstarter-k { - --fa: "\f3bc"; } - -.fa-yandex { - --fa: "\f413"; } - -.fa-readme { - --fa: "\f4d5"; } - -.fa-html5 { - --fa: "\f13b"; } - -.fa-sellsy { - --fa: "\f213"; } - -.fa-square-web-awesome { - --fa: "\e683"; } - -.fa-sass { - --fa: "\f41e"; } - -.fa-wirsindhandwerk { - --fa: "\e2d0"; } - -.fa-wsh { - --fa: "\e2d0"; } - -.fa-buromobelexperte { - --fa: "\f37f"; } - -.fa-salesforce { - --fa: "\f83b"; } - -.fa-octopus-deploy { - --fa: "\e082"; } - -.fa-medapps { - --fa: "\f3c6"; } - -.fa-ns8 { - --fa: "\f3d5"; } - -.fa-pinterest-p { - --fa: "\f231"; } - -.fa-apper { - --fa: "\f371"; } - -.fa-fort-awesome { - --fa: "\f286"; } - -.fa-waze { - --fa: "\f83f"; } - -.fa-bluesky { - --fa: "\e671"; } - -.fa-cc-jcb { - --fa: "\f24b"; } - -.fa-snapchat { - --fa: "\f2ab"; } - -.fa-snapchat-ghost { - --fa: "\f2ab"; } - -.fa-fantasy-flight-games { - --fa: "\f6dc"; } - -.fa-rust { - --fa: "\e07a"; } - -.fa-wix { - --fa: "\f5cf"; } - -.fa-square-behance { - --fa: "\f1b5"; } - -.fa-behance-square { - --fa: "\f1b5"; } - -.fa-supple { - --fa: "\f3f9"; } - -.fa-webflow { - --fa: "\e65c"; } - -.fa-rebel { - --fa: "\f1d0"; } - -.fa-css3 { - --fa: "\f13c"; } - -.fa-staylinked { - --fa: "\f3f5"; } - -.fa-kaggle { - --fa: "\f5fa"; } - -.fa-space-awesome { - --fa: "\e5ac"; } - -.fa-deviantart { - --fa: "\f1bd"; } - -.fa-cpanel { - --fa: "\f388"; } - -.fa-goodreads-g { - --fa: "\f3a9"; } - -.fa-square-git { - --fa: "\f1d2"; } - -.fa-git-square { - --fa: "\f1d2"; } - -.fa-square-tumblr { - --fa: "\f174"; } - -.fa-tumblr-square { - --fa: "\f174"; } - -.fa-trello { - --fa: "\f181"; } - -.fa-creative-commons-nc-jp { - --fa: "\f4ea"; } - -.fa-get-pocket { - --fa: "\f265"; } - -.fa-perbyte { - --fa: "\e083"; } - -.fa-grunt { - --fa: "\f3ad"; } - -.fa-weebly { - --fa: "\f5cc"; } - -.fa-connectdevelop { - --fa: "\f20e"; } - -.fa-leanpub { - --fa: "\f212"; } - -.fa-black-tie { - --fa: "\f27e"; } - -.fa-themeco { - --fa: "\f5c6"; } - -.fa-python { - --fa: "\f3e2"; } - -.fa-android { - --fa: "\f17b"; } - -.fa-bots { - --fa: "\e340"; } - -.fa-free-code-camp { - --fa: "\f2c5"; } - -.fa-hornbill { - --fa: "\f592"; } - -.fa-js { - --fa: "\f3b8"; } - -.fa-ideal { - --fa: "\e013"; } - -.fa-git { - --fa: "\f1d3"; } - -.fa-dev { - --fa: "\f6cc"; } - -.fa-sketch { - --fa: "\f7c6"; } - -.fa-yandex-international { - --fa: "\f414"; } - -.fa-cc-amex { - --fa: "\f1f3"; } - -.fa-uber { - --fa: "\f402"; } - -.fa-github { - --fa: "\f09b"; } - -.fa-php { - --fa: "\f457"; } - -.fa-alipay { - --fa: "\f642"; } - -.fa-youtube { - --fa: "\f167"; } - -.fa-skyatlas { - --fa: "\f216"; } - -.fa-firefox-browser { - --fa: "\e007"; } - -.fa-replyd { - --fa: "\f3e6"; } - -.fa-suse { - --fa: "\f7d6"; } - -.fa-jenkins { - --fa: "\f3b6"; } - -.fa-twitter { - --fa: "\f099"; } - -.fa-rockrms { - --fa: "\f3e9"; } - -.fa-pinterest { - --fa: "\f0d2"; } - -.fa-buffer { - --fa: "\f837"; } - -.fa-npm { - --fa: "\f3d4"; } - -.fa-yammer { - --fa: "\f840"; } - -.fa-btc { - --fa: "\f15a"; } - -.fa-dribbble { - --fa: "\f17d"; } - -.fa-stumbleupon-circle { - --fa: "\f1a3"; } - -.fa-internet-explorer { - --fa: "\f26b"; } - -.fa-stubber { - --fa: "\e5c7"; } - -.fa-telegram { - --fa: "\f2c6"; } - -.fa-telegram-plane { - --fa: "\f2c6"; } - -.fa-old-republic { - --fa: "\f510"; } - -.fa-odysee { - --fa: "\e5c6"; } - -.fa-square-whatsapp { - --fa: "\f40c"; } - -.fa-whatsapp-square { - --fa: "\f40c"; } - -.fa-node-js { - --fa: "\f3d3"; } - -.fa-edge-legacy { - --fa: "\e078"; } - -.fa-slack { - --fa: "\f198"; } - -.fa-slack-hash { - --fa: "\f198"; } - -.fa-medrt { - --fa: "\f3c8"; } - -.fa-usb { - --fa: "\f287"; } - -.fa-tumblr { - --fa: "\f173"; } - -.fa-vaadin { - --fa: "\f408"; } - -.fa-quora { - --fa: "\f2c4"; } - -.fa-square-x-twitter { - --fa: "\e61a"; } - -.fa-reacteurope { - --fa: "\f75d"; } - -.fa-medium { - --fa: "\f23a"; } - -.fa-medium-m { - --fa: "\f23a"; } - -.fa-amilia { - --fa: "\f36d"; } - -.fa-mixcloud { - --fa: "\f289"; } - -.fa-flipboard { - --fa: "\f44d"; } - -.fa-viacoin { - --fa: "\f237"; } - -.fa-critical-role { - --fa: "\f6c9"; } - -.fa-sitrox { - --fa: "\e44a"; } - -.fa-discourse { - --fa: "\f393"; } - -.fa-joomla { - --fa: "\f1aa"; } - -.fa-mastodon { - --fa: "\f4f6"; } - -.fa-airbnb { - --fa: "\f834"; } - -.fa-wolf-pack-battalion { - --fa: "\f514"; } - -.fa-buy-n-large { - --fa: "\f8a6"; } - -.fa-gulp { - --fa: "\f3ae"; } - -.fa-creative-commons-sampling-plus { - --fa: "\f4f1"; } - -.fa-strava { - --fa: "\f428"; } - -.fa-ember { - --fa: "\f423"; } - -.fa-canadian-maple-leaf { - --fa: "\f785"; } - -.fa-teamspeak { - --fa: "\f4f9"; } - -.fa-pushed { - --fa: "\f3e1"; } - -.fa-wordpress-simple { - --fa: "\f411"; } - -.fa-nutritionix { - --fa: "\f3d6"; } - -.fa-wodu { - --fa: "\e088"; } - -.fa-google-pay { - --fa: "\e079"; } - -.fa-intercom { - --fa: "\f7af"; } - -.fa-zhihu { - --fa: "\f63f"; } - -.fa-korvue { - --fa: "\f42f"; } - -.fa-pix { - --fa: "\e43a"; } - -.fa-steam-symbol { - --fa: "\f3f6"; } diff --git a/files/fontawesome/css/brands.min.css b/files/fontawesome/css/brands.min.css deleted file mode 100644 index 7aa3689f59..0000000000 --- a/files/fontawesome/css/brands.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero{--fa:"\f3d0"}.fa-hooli{--fa:"\f427"}.fa-yelp{--fa:"\f1e9"}.fa-cc-visa{--fa:"\f1f0"}.fa-lastfm{--fa:"\f202"}.fa-shopware{--fa:"\f5b5"}.fa-creative-commons-nc{--fa:"\f4e8"}.fa-aws{--fa:"\f375"}.fa-redhat{--fa:"\f7bc"}.fa-yoast{--fa:"\f2b1"}.fa-cloudflare{--fa:"\e07d"}.fa-ups{--fa:"\f7e0"}.fa-pixiv{--fa:"\e640"}.fa-wpexplorer{--fa:"\f2de"}.fa-dyalog{--fa:"\f399"}.fa-bity{--fa:"\f37a"}.fa-stackpath{--fa:"\f842"}.fa-buysellads{--fa:"\f20d"}.fa-first-order{--fa:"\f2b0"}.fa-modx{--fa:"\f285"}.fa-guilded{--fa:"\e07e"}.fa-vnv{--fa:"\f40b"}.fa-js-square,.fa-square-js{--fa:"\f3b9"}.fa-microsoft{--fa:"\f3ca"}.fa-qq{--fa:"\f1d6"}.fa-orcid{--fa:"\f8d2"}.fa-java{--fa:"\f4e4"}.fa-invision{--fa:"\f7b0"}.fa-creative-commons-pd-alt{--fa:"\f4ed"}.fa-centercode{--fa:"\f380"}.fa-glide-g{--fa:"\f2a6"}.fa-drupal{--fa:"\f1a9"}.fa-jxl{--fa:"\e67b"}.fa-dart-lang{--fa:"\e693"}.fa-hire-a-helper{--fa:"\f3b0"}.fa-creative-commons-by{--fa:"\f4e7"}.fa-unity{--fa:"\e049"}.fa-whmcs{--fa:"\f40d"}.fa-rocketchat{--fa:"\f3e8"}.fa-vk{--fa:"\f189"}.fa-untappd{--fa:"\f405"}.fa-mailchimp{--fa:"\f59e"}.fa-css3-alt{--fa:"\f38b"}.fa-reddit-square,.fa-square-reddit{--fa:"\f1a2"}.fa-vimeo-v{--fa:"\f27d"}.fa-contao{--fa:"\f26d"}.fa-square-font-awesome{--fa:"\e5ad"}.fa-deskpro{--fa:"\f38f"}.fa-brave{--fa:"\e63c"}.fa-sistrix{--fa:"\f3ee"}.fa-instagram-square,.fa-square-instagram{--fa:"\e055"}.fa-battle-net{--fa:"\f835"}.fa-the-red-yeti{--fa:"\f69d"}.fa-hacker-news-square,.fa-square-hacker-news{--fa:"\f3af"}.fa-edge{--fa:"\f282"}.fa-threads{--fa:"\e618"}.fa-napster{--fa:"\f3d2"}.fa-snapchat-square,.fa-square-snapchat{--fa:"\f2ad"}.fa-google-plus-g{--fa:"\f0d5"}.fa-artstation{--fa:"\f77a"}.fa-markdown{--fa:"\f60f"}.fa-sourcetree{--fa:"\f7d3"}.fa-google-plus{--fa:"\f2b3"}.fa-diaspora{--fa:"\f791"}.fa-foursquare{--fa:"\f180"}.fa-stack-overflow{--fa:"\f16c"}.fa-github-alt{--fa:"\f113"}.fa-phoenix-squadron{--fa:"\f511"}.fa-pagelines{--fa:"\f18c"}.fa-algolia{--fa:"\f36c"}.fa-red-river{--fa:"\f3e3"}.fa-creative-commons-sa{--fa:"\f4ef"}.fa-safari{--fa:"\f267"}.fa-google{--fa:"\f1a0"}.fa-font-awesome-alt,.fa-square-font-awesome-stroke{--fa:"\f35c"}.fa-atlassian{--fa:"\f77b"}.fa-linkedin-in{--fa:"\f0e1"}.fa-digital-ocean{--fa:"\f391"}.fa-nimblr{--fa:"\f5a8"}.fa-chromecast{--fa:"\f838"}.fa-evernote{--fa:"\f839"}.fa-hacker-news{--fa:"\f1d4"}.fa-creative-commons-sampling{--fa:"\f4f0"}.fa-adversal{--fa:"\f36a"}.fa-creative-commons{--fa:"\f25e"}.fa-watchman-monitoring{--fa:"\e087"}.fa-fonticons{--fa:"\f280"}.fa-weixin{--fa:"\f1d7"}.fa-shirtsinbulk{--fa:"\f214"}.fa-codepen{--fa:"\f1cb"}.fa-git-alt{--fa:"\f841"}.fa-lyft{--fa:"\f3c3"}.fa-rev{--fa:"\f5b2"}.fa-windows{--fa:"\f17a"}.fa-wizards-of-the-coast{--fa:"\f730"}.fa-square-viadeo,.fa-viadeo-square{--fa:"\f2aa"}.fa-meetup{--fa:"\f2e0"}.fa-centos{--fa:"\f789"}.fa-adn{--fa:"\f170"}.fa-cloudsmith{--fa:"\f384"}.fa-opensuse{--fa:"\e62b"}.fa-pied-piper-alt{--fa:"\f1a8"}.fa-dribbble-square,.fa-square-dribbble{--fa:"\f397"}.fa-codiepie{--fa:"\f284"}.fa-node{--fa:"\f419"}.fa-mix{--fa:"\f3cb"}.fa-steam{--fa:"\f1b6"}.fa-cc-apple-pay{--fa:"\f416"}.fa-scribd{--fa:"\f28a"}.fa-debian{--fa:"\e60b"}.fa-openid{--fa:"\f19b"}.fa-instalod{--fa:"\e081"}.fa-files-pinwheel{--fa:"\e69f"}.fa-expeditedssl{--fa:"\f23e"}.fa-sellcast{--fa:"\f2da"}.fa-square-twitter,.fa-twitter-square{--fa:"\f081"}.fa-r-project{--fa:"\f4f7"}.fa-delicious{--fa:"\f1a5"}.fa-freebsd{--fa:"\f3a4"}.fa-vuejs{--fa:"\f41f"}.fa-accusoft{--fa:"\f369"}.fa-ioxhost{--fa:"\f208"}.fa-fonticons-fi{--fa:"\f3a2"}.fa-app-store{--fa:"\f36f"}.fa-cc-mastercard{--fa:"\f1f1"}.fa-itunes-note{--fa:"\f3b5"}.fa-golang{--fa:"\e40f"}.fa-kickstarter,.fa-square-kickstarter{--fa:"\f3bb"}.fa-grav{--fa:"\f2d6"}.fa-weibo{--fa:"\f18a"}.fa-uncharted{--fa:"\e084"}.fa-firstdraft{--fa:"\f3a1"}.fa-square-youtube,.fa-youtube-square{--fa:"\f431"}.fa-wikipedia-w{--fa:"\f266"}.fa-rendact,.fa-wpressr{--fa:"\f3e4"}.fa-angellist{--fa:"\f209"}.fa-galactic-republic{--fa:"\f50c"}.fa-nfc-directional{--fa:"\e530"}.fa-skype{--fa:"\f17e"}.fa-joget{--fa:"\f3b7"}.fa-fedora{--fa:"\f798"}.fa-stripe-s{--fa:"\f42a"}.fa-meta{--fa:"\e49b"}.fa-laravel{--fa:"\f3bd"}.fa-hotjar{--fa:"\f3b1"}.fa-bluetooth-b{--fa:"\f294"}.fa-square-letterboxd{--fa:"\e62e"}.fa-sticker-mule{--fa:"\f3f7"}.fa-creative-commons-zero{--fa:"\f4f3"}.fa-hips{--fa:"\f452"}.fa-css{--fa:"\e6a2"}.fa-behance{--fa:"\f1b4"}.fa-reddit{--fa:"\f1a1"}.fa-discord{--fa:"\f392"}.fa-chrome{--fa:"\f268"}.fa-app-store-ios{--fa:"\f370"}.fa-cc-discover{--fa:"\f1f2"}.fa-wpbeginner{--fa:"\f297"}.fa-confluence{--fa:"\f78d"}.fa-shoelace{--fa:"\e60c"}.fa-mdb{--fa:"\f8ca"}.fa-dochub{--fa:"\f394"}.fa-accessible-icon{--fa:"\f368"}.fa-ebay{--fa:"\f4f4"}.fa-amazon{--fa:"\f270"}.fa-unsplash{--fa:"\e07c"}.fa-yarn{--fa:"\f7e3"}.fa-square-steam,.fa-steam-square{--fa:"\f1b7"}.fa-500px{--fa:"\f26e"}.fa-square-vimeo,.fa-vimeo-square{--fa:"\f194"}.fa-asymmetrik{--fa:"\f372"}.fa-font-awesome,.fa-font-awesome-flag,.fa-font-awesome-logo-full{--fa:"\f2b4"}.fa-gratipay{--fa:"\f184"}.fa-apple{--fa:"\f179"}.fa-hive{--fa:"\e07f"}.fa-gitkraken{--fa:"\f3a6"}.fa-keybase{--fa:"\f4f5"}.fa-apple-pay{--fa:"\f415"}.fa-padlet{--fa:"\e4a0"}.fa-amazon-pay{--fa:"\f42c"}.fa-github-square,.fa-square-github{--fa:"\f092"}.fa-stumbleupon{--fa:"\f1a4"}.fa-fedex{--fa:"\f797"}.fa-phoenix-framework{--fa:"\f3dc"}.fa-shopify{--fa:"\e057"}.fa-neos{--fa:"\f612"}.fa-square-threads{--fa:"\e619"}.fa-hackerrank{--fa:"\f5f7"}.fa-researchgate{--fa:"\f4f8"}.fa-swift{--fa:"\f8e1"}.fa-angular{--fa:"\f420"}.fa-speakap{--fa:"\f3f3"}.fa-angrycreative{--fa:"\f36e"}.fa-y-combinator{--fa:"\f23b"}.fa-empire{--fa:"\f1d1"}.fa-envira{--fa:"\f299"}.fa-google-scholar{--fa:"\e63b"}.fa-gitlab-square,.fa-square-gitlab{--fa:"\e5ae"}.fa-studiovinari{--fa:"\f3f8"}.fa-pied-piper{--fa:"\f2ae"}.fa-wordpress{--fa:"\f19a"}.fa-product-hunt{--fa:"\f288"}.fa-firefox{--fa:"\f269"}.fa-linode{--fa:"\f2b8"}.fa-goodreads{--fa:"\f3a8"}.fa-odnoklassniki-square,.fa-square-odnoklassniki{--fa:"\f264"}.fa-jsfiddle{--fa:"\f1cc"}.fa-sith{--fa:"\f512"}.fa-themeisle{--fa:"\f2b2"}.fa-page4{--fa:"\f3d7"}.fa-hashnode{--fa:"\e499"}.fa-react{--fa:"\f41b"}.fa-cc-paypal{--fa:"\f1f4"}.fa-squarespace{--fa:"\f5be"}.fa-cc-stripe{--fa:"\f1f5"}.fa-creative-commons-share{--fa:"\f4f2"}.fa-bitcoin{--fa:"\f379"}.fa-keycdn{--fa:"\f3ba"}.fa-opera{--fa:"\f26a"}.fa-itch-io{--fa:"\f83a"}.fa-umbraco{--fa:"\f8e8"}.fa-galactic-senate{--fa:"\f50d"}.fa-ubuntu{--fa:"\f7df"}.fa-draft2digital{--fa:"\f396"}.fa-stripe{--fa:"\f429"}.fa-houzz{--fa:"\f27c"}.fa-gg{--fa:"\f260"}.fa-dhl{--fa:"\f790"}.fa-pinterest-square,.fa-square-pinterest{--fa:"\f0d3"}.fa-xing{--fa:"\f168"}.fa-blackberry{--fa:"\f37b"}.fa-creative-commons-pd{--fa:"\f4ec"}.fa-playstation{--fa:"\f3df"}.fa-quinscape{--fa:"\f459"}.fa-less{--fa:"\f41d"}.fa-blogger-b{--fa:"\f37d"}.fa-opencart{--fa:"\f23d"}.fa-vine{--fa:"\f1ca"}.fa-signal-messenger{--fa:"\e663"}.fa-paypal{--fa:"\f1ed"}.fa-gitlab{--fa:"\f296"}.fa-typo3{--fa:"\f42b"}.fa-reddit-alien{--fa:"\f281"}.fa-yahoo{--fa:"\f19e"}.fa-dailymotion{--fa:"\e052"}.fa-affiliatetheme{--fa:"\f36b"}.fa-pied-piper-pp{--fa:"\f1a7"}.fa-bootstrap{--fa:"\f836"}.fa-odnoklassniki{--fa:"\f263"}.fa-nfc-symbol{--fa:"\e531"}.fa-mintbit{--fa:"\e62f"}.fa-ethereum{--fa:"\f42e"}.fa-speaker-deck{--fa:"\f83c"}.fa-creative-commons-nc-eu{--fa:"\f4e9"}.fa-patreon{--fa:"\f3d9"}.fa-avianex{--fa:"\f374"}.fa-ello{--fa:"\f5f1"}.fa-gofore{--fa:"\f3a7"}.fa-bimobject{--fa:"\f378"}.fa-brave-reverse{--fa:"\e63d"}.fa-facebook-f{--fa:"\f39e"}.fa-google-plus-square,.fa-square-google-plus{--fa:"\f0d4"}.fa-web-awesome{--fa:"\e682"}.fa-mandalorian{--fa:"\f50f"}.fa-first-order-alt{--fa:"\f50a"}.fa-osi{--fa:"\f41a"}.fa-google-wallet{--fa:"\f1ee"}.fa-d-and-d-beyond{--fa:"\f6ca"}.fa-periscope{--fa:"\f3da"}.fa-fulcrum{--fa:"\f50b"}.fa-cloudscale{--fa:"\f383"}.fa-forumbee{--fa:"\f211"}.fa-mizuni{--fa:"\f3cc"}.fa-schlix{--fa:"\f3ea"}.fa-square-xing,.fa-xing-square{--fa:"\f169"}.fa-bandcamp{--fa:"\f2d5"}.fa-wpforms{--fa:"\f298"}.fa-cloudversify{--fa:"\f385"}.fa-usps{--fa:"\f7e1"}.fa-megaport{--fa:"\f5a3"}.fa-magento{--fa:"\f3c4"}.fa-spotify{--fa:"\f1bc"}.fa-optin-monster{--fa:"\f23c"}.fa-fly{--fa:"\f417"}.fa-square-bluesky{--fa:"\e6a3"}.fa-aviato{--fa:"\f421"}.fa-itunes{--fa:"\f3b4"}.fa-cuttlefish{--fa:"\f38c"}.fa-blogger{--fa:"\f37c"}.fa-flickr{--fa:"\f16e"}.fa-viber{--fa:"\f409"}.fa-soundcloud{--fa:"\f1be"}.fa-digg{--fa:"\f1a6"}.fa-tencent-weibo{--fa:"\f1d5"}.fa-letterboxd{--fa:"\e62d"}.fa-symfony{--fa:"\f83d"}.fa-maxcdn{--fa:"\f136"}.fa-etsy{--fa:"\f2d7"}.fa-facebook-messenger{--fa:"\f39f"}.fa-audible{--fa:"\f373"}.fa-think-peaks{--fa:"\f731"}.fa-bilibili{--fa:"\e3d9"}.fa-erlang{--fa:"\f39d"}.fa-x-twitter{--fa:"\e61b"}.fa-cotton-bureau{--fa:"\f89e"}.fa-dashcube{--fa:"\f210"}.fa-42-group,.fa-innosoft{--fa:"\e080"}.fa-stack-exchange{--fa:"\f18d"}.fa-elementor{--fa:"\f430"}.fa-pied-piper-square,.fa-square-pied-piper{--fa:"\e01e"}.fa-creative-commons-nd{--fa:"\f4eb"}.fa-palfed{--fa:"\f3d8"}.fa-superpowers{--fa:"\f2dd"}.fa-resolving{--fa:"\f3e7"}.fa-xbox{--fa:"\f412"}.fa-square-web-awesome-stroke{--fa:"\e684"}.fa-searchengin{--fa:"\f3eb"}.fa-tiktok{--fa:"\e07b"}.fa-facebook-square,.fa-square-facebook{--fa:"\f082"}.fa-renren{--fa:"\f18b"}.fa-linux{--fa:"\f17c"}.fa-glide{--fa:"\f2a5"}.fa-linkedin{--fa:"\f08c"}.fa-hubspot{--fa:"\f3b2"}.fa-deploydog{--fa:"\f38e"}.fa-twitch{--fa:"\f1e8"}.fa-flutter{--fa:"\e694"}.fa-ravelry{--fa:"\f2d9"}.fa-mixer{--fa:"\e056"}.fa-lastfm-square,.fa-square-lastfm{--fa:"\f203"}.fa-vimeo{--fa:"\f40a"}.fa-mendeley{--fa:"\f7b3"}.fa-uniregistry{--fa:"\f404"}.fa-figma{--fa:"\f799"}.fa-creative-commons-remix{--fa:"\f4ee"}.fa-cc-amazon-pay{--fa:"\f42d"}.fa-dropbox{--fa:"\f16b"}.fa-instagram{--fa:"\f16d"}.fa-cmplid{--fa:"\e360"}.fa-upwork{--fa:"\e641"}.fa-facebook{--fa:"\f09a"}.fa-gripfire{--fa:"\f3ac"}.fa-jedi-order{--fa:"\f50e"}.fa-uikit{--fa:"\f403"}.fa-fort-awesome-alt{--fa:"\f3a3"}.fa-phabricator{--fa:"\f3db"}.fa-ussunnah{--fa:"\f407"}.fa-earlybirds{--fa:"\f39a"}.fa-trade-federation{--fa:"\f513"}.fa-autoprefixer{--fa:"\f41c"}.fa-whatsapp{--fa:"\f232"}.fa-square-upwork{--fa:"\e67c"}.fa-slideshare{--fa:"\f1e7"}.fa-google-play{--fa:"\f3ab"}.fa-viadeo{--fa:"\f2a9"}.fa-line{--fa:"\f3c0"}.fa-google-drive{--fa:"\f3aa"}.fa-servicestack{--fa:"\f3ec"}.fa-simplybuilt{--fa:"\f215"}.fa-bitbucket{--fa:"\f171"}.fa-imdb{--fa:"\f2d8"}.fa-deezer{--fa:"\e077"}.fa-raspberry-pi{--fa:"\f7bb"}.fa-jira{--fa:"\f7b1"}.fa-docker{--fa:"\f395"}.fa-screenpal{--fa:"\e570"}.fa-bluetooth{--fa:"\f293"}.fa-gitter{--fa:"\f426"}.fa-d-and-d{--fa:"\f38d"}.fa-microblog{--fa:"\e01a"}.fa-cc-diners-club{--fa:"\f24c"}.fa-gg-circle{--fa:"\f261"}.fa-pied-piper-hat{--fa:"\f4e5"}.fa-kickstarter-k{--fa:"\f3bc"}.fa-yandex{--fa:"\f413"}.fa-readme{--fa:"\f4d5"}.fa-html5{--fa:"\f13b"}.fa-sellsy{--fa:"\f213"}.fa-square-web-awesome{--fa:"\e683"}.fa-sass{--fa:"\f41e"}.fa-wirsindhandwerk,.fa-wsh{--fa:"\e2d0"}.fa-buromobelexperte{--fa:"\f37f"}.fa-salesforce{--fa:"\f83b"}.fa-octopus-deploy{--fa:"\e082"}.fa-medapps{--fa:"\f3c6"}.fa-ns8{--fa:"\f3d5"}.fa-pinterest-p{--fa:"\f231"}.fa-apper{--fa:"\f371"}.fa-fort-awesome{--fa:"\f286"}.fa-waze{--fa:"\f83f"}.fa-bluesky{--fa:"\e671"}.fa-cc-jcb{--fa:"\f24b"}.fa-snapchat,.fa-snapchat-ghost{--fa:"\f2ab"}.fa-fantasy-flight-games{--fa:"\f6dc"}.fa-rust{--fa:"\e07a"}.fa-wix{--fa:"\f5cf"}.fa-behance-square,.fa-square-behance{--fa:"\f1b5"}.fa-supple{--fa:"\f3f9"}.fa-webflow{--fa:"\e65c"}.fa-rebel{--fa:"\f1d0"}.fa-css3{--fa:"\f13c"}.fa-staylinked{--fa:"\f3f5"}.fa-kaggle{--fa:"\f5fa"}.fa-space-awesome{--fa:"\e5ac"}.fa-deviantart{--fa:"\f1bd"}.fa-cpanel{--fa:"\f388"}.fa-goodreads-g{--fa:"\f3a9"}.fa-git-square,.fa-square-git{--fa:"\f1d2"}.fa-square-tumblr,.fa-tumblr-square{--fa:"\f174"}.fa-trello{--fa:"\f181"}.fa-creative-commons-nc-jp{--fa:"\f4ea"}.fa-get-pocket{--fa:"\f265"}.fa-perbyte{--fa:"\e083"}.fa-grunt{--fa:"\f3ad"}.fa-weebly{--fa:"\f5cc"}.fa-connectdevelop{--fa:"\f20e"}.fa-leanpub{--fa:"\f212"}.fa-black-tie{--fa:"\f27e"}.fa-themeco{--fa:"\f5c6"}.fa-python{--fa:"\f3e2"}.fa-android{--fa:"\f17b"}.fa-bots{--fa:"\e340"}.fa-free-code-camp{--fa:"\f2c5"}.fa-hornbill{--fa:"\f592"}.fa-js{--fa:"\f3b8"}.fa-ideal{--fa:"\e013"}.fa-git{--fa:"\f1d3"}.fa-dev{--fa:"\f6cc"}.fa-sketch{--fa:"\f7c6"}.fa-yandex-international{--fa:"\f414"}.fa-cc-amex{--fa:"\f1f3"}.fa-uber{--fa:"\f402"}.fa-github{--fa:"\f09b"}.fa-php{--fa:"\f457"}.fa-alipay{--fa:"\f642"}.fa-youtube{--fa:"\f167"}.fa-skyatlas{--fa:"\f216"}.fa-firefox-browser{--fa:"\e007"}.fa-replyd{--fa:"\f3e6"}.fa-suse{--fa:"\f7d6"}.fa-jenkins{--fa:"\f3b6"}.fa-twitter{--fa:"\f099"}.fa-rockrms{--fa:"\f3e9"}.fa-pinterest{--fa:"\f0d2"}.fa-buffer{--fa:"\f837"}.fa-npm{--fa:"\f3d4"}.fa-yammer{--fa:"\f840"}.fa-btc{--fa:"\f15a"}.fa-dribbble{--fa:"\f17d"}.fa-stumbleupon-circle{--fa:"\f1a3"}.fa-internet-explorer{--fa:"\f26b"}.fa-stubber{--fa:"\e5c7"}.fa-telegram,.fa-telegram-plane{--fa:"\f2c6"}.fa-old-republic{--fa:"\f510"}.fa-odysee{--fa:"\e5c6"}.fa-square-whatsapp,.fa-whatsapp-square{--fa:"\f40c"}.fa-node-js{--fa:"\f3d3"}.fa-edge-legacy{--fa:"\e078"}.fa-slack,.fa-slack-hash{--fa:"\f198"}.fa-medrt{--fa:"\f3c8"}.fa-usb{--fa:"\f287"}.fa-tumblr{--fa:"\f173"}.fa-vaadin{--fa:"\f408"}.fa-quora{--fa:"\f2c4"}.fa-square-x-twitter{--fa:"\e61a"}.fa-reacteurope{--fa:"\f75d"}.fa-medium,.fa-medium-m{--fa:"\f23a"}.fa-amilia{--fa:"\f36d"}.fa-mixcloud{--fa:"\f289"}.fa-flipboard{--fa:"\f44d"}.fa-viacoin{--fa:"\f237"}.fa-critical-role{--fa:"\f6c9"}.fa-sitrox{--fa:"\e44a"}.fa-discourse{--fa:"\f393"}.fa-joomla{--fa:"\f1aa"}.fa-mastodon{--fa:"\f4f6"}.fa-airbnb{--fa:"\f834"}.fa-wolf-pack-battalion{--fa:"\f514"}.fa-buy-n-large{--fa:"\f8a6"}.fa-gulp{--fa:"\f3ae"}.fa-creative-commons-sampling-plus{--fa:"\f4f1"}.fa-strava{--fa:"\f428"}.fa-ember{--fa:"\f423"}.fa-canadian-maple-leaf{--fa:"\f785"}.fa-teamspeak{--fa:"\f4f9"}.fa-pushed{--fa:"\f3e1"}.fa-wordpress-simple{--fa:"\f411"}.fa-nutritionix{--fa:"\f3d6"}.fa-wodu{--fa:"\e088"}.fa-google-pay{--fa:"\e079"}.fa-intercom{--fa:"\f7af"}.fa-zhihu{--fa:"\f63f"}.fa-korvue{--fa:"\f42f"}.fa-pix{--fa:"\e43a"}.fa-steam-symbol{--fa:"\f3f6"} \ No newline at end of file diff --git a/files/fontawesome/css/fontawesome.css b/files/fontawesome/css/fontawesome.css deleted file mode 100644 index a9b2ec89b2..0000000000 --- a/files/fontawesome/css/fontawesome.css +++ /dev/null @@ -1,6243 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa { - font-family: var(--fa-style-family, "Font Awesome 6 Free"); - font-weight: var(--fa-style, 900); } - -.fas, -.far, -.fab, -.fa-solid, -.fa-regular, -.fa-brands, -.fa { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: var(--fa-display, inline-block); - font-style: normal; - font-variant: normal; - line-height: 1; - text-rendering: auto; } - -.fas::before, -.far::before, -.fab::before, -.fa-solid::before, -.fa-regular::before, -.fa-brands::before, -.fa::before { - content: var(--fa); } - -.fa-classic, -.fas, -.fa-solid, -.far, -.fa-regular { - font-family: 'Font Awesome 6 Free'; } - -.fa-brands, -.fab { - font-family: 'Font Awesome 6 Brands'; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-2xs { - font-size: 0.625em; - line-height: 0.1em; - vertical-align: 0.225em; } - -.fa-xs { - font-size: 0.75em; - line-height: 0.08333em; - vertical-align: 0.125em; } - -.fa-sm { - font-size: 0.875em; - line-height: 0.07143em; - vertical-align: 0.05357em; } - -.fa-lg { - font-size: 1.25em; - line-height: 0.05em; - vertical-align: -0.075em; } - -.fa-xl { - font-size: 1.5em; - line-height: 0.04167em; - vertical-align: -0.125em; } - -.fa-2xl { - font-size: 2em; - line-height: 0.03125em; - vertical-align: -0.1875em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: var(--fa-li-margin, 2.5em); - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: calc(-1 * var(--fa-li-width, 2em)); - position: absolute; - text-align: center; - width: var(--fa-li-width, 2em); - line-height: inherit; } - -.fa-border { - border-color: var(--fa-border-color, #eee); - border-radius: var(--fa-border-radius, 0.1em); - border-style: var(--fa-border-style, solid); - border-width: var(--fa-border-width, 0.08em); - padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } - -.fa-pull-left { - float: left; - margin-right: var(--fa-pull-margin, 0.3em); } - -.fa-pull-right { - float: right; - margin-left: var(--fa-pull-margin, 0.3em); } - -.fa-beat { - animation-name: fa-beat; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-bounce { - animation-name: fa-bounce; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } - -.fa-fade { - animation-name: fa-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-beat-fade { - animation-name: fa-beat-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-flip { - animation-name: fa-flip; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-shake { - animation-name: fa-shake; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin { - animation-name: fa-spin; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 2s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin-reverse { - --fa-animation-direction: reverse; } - -.fa-pulse, -.fa-spin-pulse { - animation-name: fa-spin; - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, steps(8)); } - -@media (prefers-reduced-motion: reduce) { - .fa-beat, - .fa-bounce, - .fa-fade, - .fa-beat-fade, - .fa-flip, - .fa-pulse, - .fa-shake, - .fa-spin, - .fa-spin-pulse { - animation-delay: -1ms; - animation-duration: 1ms; - animation-iteration-count: 1; - transition-delay: 0s; - transition-duration: 0s; } } - -@keyframes fa-beat { - 0%, 90% { - transform: scale(1); } - 45% { - transform: scale(var(--fa-beat-scale, 1.25)); } } - -@keyframes fa-bounce { - 0% { - transform: scale(1, 1) translateY(0); } - 10% { - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } - 30% { - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } - 50% { - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } - 57% { - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } - 64% { - transform: scale(1, 1) translateY(0); } - 100% { - transform: scale(1, 1) translateY(0); } } - -@keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); } } - -@keyframes fa-beat-fade { - 0%, 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - transform: scale(1); } - 50% { - opacity: 1; - transform: scale(var(--fa-beat-fade-scale, 1.125)); } } - -@keyframes fa-flip { - 50% { - transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } - -@keyframes fa-shake { - 0% { - transform: rotate(-15deg); } - 4% { - transform: rotate(15deg); } - 8%, 24% { - transform: rotate(-18deg); } - 12%, 28% { - transform: rotate(18deg); } - 16% { - transform: rotate(-22deg); } - 20% { - transform: rotate(22deg); } - 32% { - transform: rotate(-12deg); } - 36% { - transform: rotate(12deg); } - 40%, 100% { - transform: rotate(0deg); } } - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); } - 100% { - transform: rotate(360deg); } } - -.fa-rotate-90 { - transform: rotate(90deg); } - -.fa-rotate-180 { - transform: rotate(180deg); } - -.fa-rotate-270 { - transform: rotate(270deg); } - -.fa-flip-horizontal { - transform: scale(-1, 1); } - -.fa-flip-vertical { - transform: scale(1, -1); } - -.fa-flip-both, -.fa-flip-horizontal.fa-flip-vertical { - transform: scale(-1, -1); } - -.fa-rotate-by { - transform: rotate(var(--fa-rotate-angle, 0)); } - -.fa-stack { - display: inline-block; - height: 2em; - line-height: 2em; - position: relative; - vertical-align: middle; - width: 2.5em; } - -.fa-stack-1x, -.fa-stack-2x { - left: 0; - position: absolute; - text-align: center; - width: 100%; - z-index: var(--fa-stack-z-index, auto); } - -.fa-stack-1x { - line-height: inherit; } - -.fa-stack-2x { - font-size: 2em; } - -.fa-inverse { - color: var(--fa-inverse, #fff); } - -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen -readers do not read off random characters that represent icons */ - -.fa-0 { - --fa: "\30"; } - -.fa-1 { - --fa: "\31"; } - -.fa-2 { - --fa: "\32"; } - -.fa-3 { - --fa: "\33"; } - -.fa-4 { - --fa: "\34"; } - -.fa-5 { - --fa: "\35"; } - -.fa-6 { - --fa: "\36"; } - -.fa-7 { - --fa: "\37"; } - -.fa-8 { - --fa: "\38"; } - -.fa-9 { - --fa: "\39"; } - -.fa-fill-drip { - --fa: "\f576"; } - -.fa-arrows-to-circle { - --fa: "\e4bd"; } - -.fa-circle-chevron-right { - --fa: "\f138"; } - -.fa-chevron-circle-right { - --fa: "\f138"; } - -.fa-at { - --fa: "\40"; } - -.fa-trash-can { - --fa: "\f2ed"; } - -.fa-trash-alt { - --fa: "\f2ed"; } - -.fa-text-height { - --fa: "\f034"; } - -.fa-user-xmark { - --fa: "\f235"; } - -.fa-user-times { - --fa: "\f235"; } - -.fa-stethoscope { - --fa: "\f0f1"; } - -.fa-message { - --fa: "\f27a"; } - -.fa-comment-alt { - --fa: "\f27a"; } - -.fa-info { - --fa: "\f129"; } - -.fa-down-left-and-up-right-to-center { - --fa: "\f422"; } - -.fa-compress-alt { - --fa: "\f422"; } - -.fa-explosion { - --fa: "\e4e9"; } - -.fa-file-lines { - --fa: "\f15c"; } - -.fa-file-alt { - --fa: "\f15c"; } - -.fa-file-text { - --fa: "\f15c"; } - -.fa-wave-square { - --fa: "\f83e"; } - -.fa-ring { - --fa: "\f70b"; } - -.fa-building-un { - --fa: "\e4d9"; } - -.fa-dice-three { - --fa: "\f527"; } - -.fa-calendar-days { - --fa: "\f073"; } - -.fa-calendar-alt { - --fa: "\f073"; } - -.fa-anchor-circle-check { - --fa: "\e4aa"; } - -.fa-building-circle-arrow-right { - --fa: "\e4d1"; } - -.fa-volleyball { - --fa: "\f45f"; } - -.fa-volleyball-ball { - --fa: "\f45f"; } - -.fa-arrows-up-to-line { - --fa: "\e4c2"; } - -.fa-sort-down { - --fa: "\f0dd"; } - -.fa-sort-desc { - --fa: "\f0dd"; } - -.fa-circle-minus { - --fa: "\f056"; } - -.fa-minus-circle { - --fa: "\f056"; } - -.fa-door-open { - --fa: "\f52b"; } - -.fa-right-from-bracket { - --fa: "\f2f5"; } - -.fa-sign-out-alt { - --fa: "\f2f5"; } - -.fa-atom { - --fa: "\f5d2"; } - -.fa-soap { - --fa: "\e06e"; } - -.fa-icons { - --fa: "\f86d"; } - -.fa-heart-music-camera-bolt { - --fa: "\f86d"; } - -.fa-microphone-lines-slash { - --fa: "\f539"; } - -.fa-microphone-alt-slash { - --fa: "\f539"; } - -.fa-bridge-circle-check { - --fa: "\e4c9"; } - -.fa-pump-medical { - --fa: "\e06a"; } - -.fa-fingerprint { - --fa: "\f577"; } - -.fa-hand-point-right { - --fa: "\f0a4"; } - -.fa-magnifying-glass-location { - --fa: "\f689"; } - -.fa-search-location { - --fa: "\f689"; } - -.fa-forward-step { - --fa: "\f051"; } - -.fa-step-forward { - --fa: "\f051"; } - -.fa-face-smile-beam { - --fa: "\f5b8"; } - -.fa-smile-beam { - --fa: "\f5b8"; } - -.fa-flag-checkered { - --fa: "\f11e"; } - -.fa-football { - --fa: "\f44e"; } - -.fa-football-ball { - --fa: "\f44e"; } - -.fa-school-circle-exclamation { - --fa: "\e56c"; } - -.fa-crop { - --fa: "\f125"; } - -.fa-angles-down { - --fa: "\f103"; } - -.fa-angle-double-down { - --fa: "\f103"; } - -.fa-users-rectangle { - --fa: "\e594"; } - -.fa-people-roof { - --fa: "\e537"; } - -.fa-people-line { - --fa: "\e534"; } - -.fa-beer-mug-empty { - --fa: "\f0fc"; } - -.fa-beer { - --fa: "\f0fc"; } - -.fa-diagram-predecessor { - --fa: "\e477"; } - -.fa-arrow-up-long { - --fa: "\f176"; } - -.fa-long-arrow-up { - --fa: "\f176"; } - -.fa-fire-flame-simple { - --fa: "\f46a"; } - -.fa-burn { - --fa: "\f46a"; } - -.fa-person { - --fa: "\f183"; } - -.fa-male { - --fa: "\f183"; } - -.fa-laptop { - --fa: "\f109"; } - -.fa-file-csv { - --fa: "\f6dd"; } - -.fa-menorah { - --fa: "\f676"; } - -.fa-truck-plane { - --fa: "\e58f"; } - -.fa-record-vinyl { - --fa: "\f8d9"; } - -.fa-face-grin-stars { - --fa: "\f587"; } - -.fa-grin-stars { - --fa: "\f587"; } - -.fa-bong { - --fa: "\f55c"; } - -.fa-spaghetti-monster-flying { - --fa: "\f67b"; } - -.fa-pastafarianism { - --fa: "\f67b"; } - -.fa-arrow-down-up-across-line { - --fa: "\e4af"; } - -.fa-spoon { - --fa: "\f2e5"; } - -.fa-utensil-spoon { - --fa: "\f2e5"; } - -.fa-jar-wheat { - --fa: "\e517"; } - -.fa-envelopes-bulk { - --fa: "\f674"; } - -.fa-mail-bulk { - --fa: "\f674"; } - -.fa-file-circle-exclamation { - --fa: "\e4eb"; } - -.fa-circle-h { - --fa: "\f47e"; } - -.fa-hospital-symbol { - --fa: "\f47e"; } - -.fa-pager { - --fa: "\f815"; } - -.fa-address-book { - --fa: "\f2b9"; } - -.fa-contact-book { - --fa: "\f2b9"; } - -.fa-strikethrough { - --fa: "\f0cc"; } - -.fa-k { - --fa: "\4b"; } - -.fa-landmark-flag { - --fa: "\e51c"; } - -.fa-pencil { - --fa: "\f303"; } - -.fa-pencil-alt { - --fa: "\f303"; } - -.fa-backward { - --fa: "\f04a"; } - -.fa-caret-right { - --fa: "\f0da"; } - -.fa-comments { - --fa: "\f086"; } - -.fa-paste { - --fa: "\f0ea"; } - -.fa-file-clipboard { - --fa: "\f0ea"; } - -.fa-code-pull-request { - --fa: "\e13c"; } - -.fa-clipboard-list { - --fa: "\f46d"; } - -.fa-truck-ramp-box { - --fa: "\f4de"; } - -.fa-truck-loading { - --fa: "\f4de"; } - -.fa-user-check { - --fa: "\f4fc"; } - -.fa-vial-virus { - --fa: "\e597"; } - -.fa-sheet-plastic { - --fa: "\e571"; } - -.fa-blog { - --fa: "\f781"; } - -.fa-user-ninja { - --fa: "\f504"; } - -.fa-person-arrow-up-from-line { - --fa: "\e539"; } - -.fa-scroll-torah { - --fa: "\f6a0"; } - -.fa-torah { - --fa: "\f6a0"; } - -.fa-broom-ball { - --fa: "\f458"; } - -.fa-quidditch { - --fa: "\f458"; } - -.fa-quidditch-broom-ball { - --fa: "\f458"; } - -.fa-toggle-off { - --fa: "\f204"; } - -.fa-box-archive { - --fa: "\f187"; } - -.fa-archive { - --fa: "\f187"; } - -.fa-person-drowning { - --fa: "\e545"; } - -.fa-arrow-down-9-1 { - --fa: "\f886"; } - -.fa-sort-numeric-desc { - --fa: "\f886"; } - -.fa-sort-numeric-down-alt { - --fa: "\f886"; } - -.fa-face-grin-tongue-squint { - --fa: "\f58a"; } - -.fa-grin-tongue-squint { - --fa: "\f58a"; } - -.fa-spray-can { - --fa: "\f5bd"; } - -.fa-truck-monster { - --fa: "\f63b"; } - -.fa-w { - --fa: "\57"; } - -.fa-earth-africa { - --fa: "\f57c"; } - -.fa-globe-africa { - --fa: "\f57c"; } - -.fa-rainbow { - --fa: "\f75b"; } - -.fa-circle-notch { - --fa: "\f1ce"; } - -.fa-tablet-screen-button { - --fa: "\f3fa"; } - -.fa-tablet-alt { - --fa: "\f3fa"; } - -.fa-paw { - --fa: "\f1b0"; } - -.fa-cloud { - --fa: "\f0c2"; } - -.fa-trowel-bricks { - --fa: "\e58a"; } - -.fa-face-flushed { - --fa: "\f579"; } - -.fa-flushed { - --fa: "\f579"; } - -.fa-hospital-user { - --fa: "\f80d"; } - -.fa-tent-arrow-left-right { - --fa: "\e57f"; } - -.fa-gavel { - --fa: "\f0e3"; } - -.fa-legal { - --fa: "\f0e3"; } - -.fa-binoculars { - --fa: "\f1e5"; } - -.fa-microphone-slash { - --fa: "\f131"; } - -.fa-box-tissue { - --fa: "\e05b"; } - -.fa-motorcycle { - --fa: "\f21c"; } - -.fa-bell-concierge { - --fa: "\f562"; } - -.fa-concierge-bell { - --fa: "\f562"; } - -.fa-pen-ruler { - --fa: "\f5ae"; } - -.fa-pencil-ruler { - --fa: "\f5ae"; } - -.fa-people-arrows { - --fa: "\e068"; } - -.fa-people-arrows-left-right { - --fa: "\e068"; } - -.fa-mars-and-venus-burst { - --fa: "\e523"; } - -.fa-square-caret-right { - --fa: "\f152"; } - -.fa-caret-square-right { - --fa: "\f152"; } - -.fa-scissors { - --fa: "\f0c4"; } - -.fa-cut { - --fa: "\f0c4"; } - -.fa-sun-plant-wilt { - --fa: "\e57a"; } - -.fa-toilets-portable { - --fa: "\e584"; } - -.fa-hockey-puck { - --fa: "\f453"; } - -.fa-table { - --fa: "\f0ce"; } - -.fa-magnifying-glass-arrow-right { - --fa: "\e521"; } - -.fa-tachograph-digital { - --fa: "\f566"; } - -.fa-digital-tachograph { - --fa: "\f566"; } - -.fa-users-slash { - --fa: "\e073"; } - -.fa-clover { - --fa: "\e139"; } - -.fa-reply { - --fa: "\f3e5"; } - -.fa-mail-reply { - --fa: "\f3e5"; } - -.fa-star-and-crescent { - --fa: "\f699"; } - -.fa-house-fire { - --fa: "\e50c"; } - -.fa-square-minus { - --fa: "\f146"; } - -.fa-minus-square { - --fa: "\f146"; } - -.fa-helicopter { - --fa: "\f533"; } - -.fa-compass { - --fa: "\f14e"; } - -.fa-square-caret-down { - --fa: "\f150"; } - -.fa-caret-square-down { - --fa: "\f150"; } - -.fa-file-circle-question { - --fa: "\e4ef"; } - -.fa-laptop-code { - --fa: "\f5fc"; } - -.fa-swatchbook { - --fa: "\f5c3"; } - -.fa-prescription-bottle { - --fa: "\f485"; } - -.fa-bars { - --fa: "\f0c9"; } - -.fa-navicon { - --fa: "\f0c9"; } - -.fa-people-group { - --fa: "\e533"; } - -.fa-hourglass-end { - --fa: "\f253"; } - -.fa-hourglass-3 { - --fa: "\f253"; } - -.fa-heart-crack { - --fa: "\f7a9"; } - -.fa-heart-broken { - --fa: "\f7a9"; } - -.fa-square-up-right { - --fa: "\f360"; } - -.fa-external-link-square-alt { - --fa: "\f360"; } - -.fa-face-kiss-beam { - --fa: "\f597"; } - -.fa-kiss-beam { - --fa: "\f597"; } - -.fa-film { - --fa: "\f008"; } - -.fa-ruler-horizontal { - --fa: "\f547"; } - -.fa-people-robbery { - --fa: "\e536"; } - -.fa-lightbulb { - --fa: "\f0eb"; } - -.fa-caret-left { - --fa: "\f0d9"; } - -.fa-circle-exclamation { - --fa: "\f06a"; } - -.fa-exclamation-circle { - --fa: "\f06a"; } - -.fa-school-circle-xmark { - --fa: "\e56d"; } - -.fa-arrow-right-from-bracket { - --fa: "\f08b"; } - -.fa-sign-out { - --fa: "\f08b"; } - -.fa-circle-chevron-down { - --fa: "\f13a"; } - -.fa-chevron-circle-down { - --fa: "\f13a"; } - -.fa-unlock-keyhole { - --fa: "\f13e"; } - -.fa-unlock-alt { - --fa: "\f13e"; } - -.fa-cloud-showers-heavy { - --fa: "\f740"; } - -.fa-headphones-simple { - --fa: "\f58f"; } - -.fa-headphones-alt { - --fa: "\f58f"; } - -.fa-sitemap { - --fa: "\f0e8"; } - -.fa-circle-dollar-to-slot { - --fa: "\f4b9"; } - -.fa-donate { - --fa: "\f4b9"; } - -.fa-memory { - --fa: "\f538"; } - -.fa-road-spikes { - --fa: "\e568"; } - -.fa-fire-burner { - --fa: "\e4f1"; } - -.fa-flag { - --fa: "\f024"; } - -.fa-hanukiah { - --fa: "\f6e6"; } - -.fa-feather { - --fa: "\f52d"; } - -.fa-volume-low { - --fa: "\f027"; } - -.fa-volume-down { - --fa: "\f027"; } - -.fa-comment-slash { - --fa: "\f4b3"; } - -.fa-cloud-sun-rain { - --fa: "\f743"; } - -.fa-compress { - --fa: "\f066"; } - -.fa-wheat-awn { - --fa: "\e2cd"; } - -.fa-wheat-alt { - --fa: "\e2cd"; } - -.fa-ankh { - --fa: "\f644"; } - -.fa-hands-holding-child { - --fa: "\e4fa"; } - -.fa-asterisk { - --fa: "\2a"; } - -.fa-square-check { - --fa: "\f14a"; } - -.fa-check-square { - --fa: "\f14a"; } - -.fa-peseta-sign { - --fa: "\e221"; } - -.fa-heading { - --fa: "\f1dc"; } - -.fa-header { - --fa: "\f1dc"; } - -.fa-ghost { - --fa: "\f6e2"; } - -.fa-list { - --fa: "\f03a"; } - -.fa-list-squares { - --fa: "\f03a"; } - -.fa-square-phone-flip { - --fa: "\f87b"; } - -.fa-phone-square-alt { - --fa: "\f87b"; } - -.fa-cart-plus { - --fa: "\f217"; } - -.fa-gamepad { - --fa: "\f11b"; } - -.fa-circle-dot { - --fa: "\f192"; } - -.fa-dot-circle { - --fa: "\f192"; } - -.fa-face-dizzy { - --fa: "\f567"; } - -.fa-dizzy { - --fa: "\f567"; } - -.fa-egg { - --fa: "\f7fb"; } - -.fa-house-medical-circle-xmark { - --fa: "\e513"; } - -.fa-campground { - --fa: "\f6bb"; } - -.fa-folder-plus { - --fa: "\f65e"; } - -.fa-futbol { - --fa: "\f1e3"; } - -.fa-futbol-ball { - --fa: "\f1e3"; } - -.fa-soccer-ball { - --fa: "\f1e3"; } - -.fa-paintbrush { - --fa: "\f1fc"; } - -.fa-paint-brush { - --fa: "\f1fc"; } - -.fa-lock { - --fa: "\f023"; } - -.fa-gas-pump { - --fa: "\f52f"; } - -.fa-hot-tub-person { - --fa: "\f593"; } - -.fa-hot-tub { - --fa: "\f593"; } - -.fa-map-location { - --fa: "\f59f"; } - -.fa-map-marked { - --fa: "\f59f"; } - -.fa-house-flood-water { - --fa: "\e50e"; } - -.fa-tree { - --fa: "\f1bb"; } - -.fa-bridge-lock { - --fa: "\e4cc"; } - -.fa-sack-dollar { - --fa: "\f81d"; } - -.fa-pen-to-square { - --fa: "\f044"; } - -.fa-edit { - --fa: "\f044"; } - -.fa-car-side { - --fa: "\f5e4"; } - -.fa-share-nodes { - --fa: "\f1e0"; } - -.fa-share-alt { - --fa: "\f1e0"; } - -.fa-heart-circle-minus { - --fa: "\e4ff"; } - -.fa-hourglass-half { - --fa: "\f252"; } - -.fa-hourglass-2 { - --fa: "\f252"; } - -.fa-microscope { - --fa: "\f610"; } - -.fa-sink { - --fa: "\e06d"; } - -.fa-bag-shopping { - --fa: "\f290"; } - -.fa-shopping-bag { - --fa: "\f290"; } - -.fa-arrow-down-z-a { - --fa: "\f881"; } - -.fa-sort-alpha-desc { - --fa: "\f881"; } - -.fa-sort-alpha-down-alt { - --fa: "\f881"; } - -.fa-mitten { - --fa: "\f7b5"; } - -.fa-person-rays { - --fa: "\e54d"; } - -.fa-users { - --fa: "\f0c0"; } - -.fa-eye-slash { - --fa: "\f070"; } - -.fa-flask-vial { - --fa: "\e4f3"; } - -.fa-hand { - --fa: "\f256"; } - -.fa-hand-paper { - --fa: "\f256"; } - -.fa-om { - --fa: "\f679"; } - -.fa-worm { - --fa: "\e599"; } - -.fa-house-circle-xmark { - --fa: "\e50b"; } - -.fa-plug { - --fa: "\f1e6"; } - -.fa-chevron-up { - --fa: "\f077"; } - -.fa-hand-spock { - --fa: "\f259"; } - -.fa-stopwatch { - --fa: "\f2f2"; } - -.fa-face-kiss { - --fa: "\f596"; } - -.fa-kiss { - --fa: "\f596"; } - -.fa-bridge-circle-xmark { - --fa: "\e4cb"; } - -.fa-face-grin-tongue { - --fa: "\f589"; } - -.fa-grin-tongue { - --fa: "\f589"; } - -.fa-chess-bishop { - --fa: "\f43a"; } - -.fa-face-grin-wink { - --fa: "\f58c"; } - -.fa-grin-wink { - --fa: "\f58c"; } - -.fa-ear-deaf { - --fa: "\f2a4"; } - -.fa-deaf { - --fa: "\f2a4"; } - -.fa-deafness { - --fa: "\f2a4"; } - -.fa-hard-of-hearing { - --fa: "\f2a4"; } - -.fa-road-circle-check { - --fa: "\e564"; } - -.fa-dice-five { - --fa: "\f523"; } - -.fa-square-rss { - --fa: "\f143"; } - -.fa-rss-square { - --fa: "\f143"; } - -.fa-land-mine-on { - --fa: "\e51b"; } - -.fa-i-cursor { - --fa: "\f246"; } - -.fa-stamp { - --fa: "\f5bf"; } - -.fa-stairs { - --fa: "\e289"; } - -.fa-i { - --fa: "\49"; } - -.fa-hryvnia-sign { - --fa: "\f6f2"; } - -.fa-hryvnia { - --fa: "\f6f2"; } - -.fa-pills { - --fa: "\f484"; } - -.fa-face-grin-wide { - --fa: "\f581"; } - -.fa-grin-alt { - --fa: "\f581"; } - -.fa-tooth { - --fa: "\f5c9"; } - -.fa-v { - --fa: "\56"; } - -.fa-bangladeshi-taka-sign { - --fa: "\e2e6"; } - -.fa-bicycle { - --fa: "\f206"; } - -.fa-staff-snake { - --fa: "\e579"; } - -.fa-rod-asclepius { - --fa: "\e579"; } - -.fa-rod-snake { - --fa: "\e579"; } - -.fa-staff-aesculapius { - --fa: "\e579"; } - -.fa-head-side-cough-slash { - --fa: "\e062"; } - -.fa-truck-medical { - --fa: "\f0f9"; } - -.fa-ambulance { - --fa: "\f0f9"; } - -.fa-wheat-awn-circle-exclamation { - --fa: "\e598"; } - -.fa-snowman { - --fa: "\f7d0"; } - -.fa-mortar-pestle { - --fa: "\f5a7"; } - -.fa-road-barrier { - --fa: "\e562"; } - -.fa-school { - --fa: "\f549"; } - -.fa-igloo { - --fa: "\f7ae"; } - -.fa-joint { - --fa: "\f595"; } - -.fa-angle-right { - --fa: "\f105"; } - -.fa-horse { - --fa: "\f6f0"; } - -.fa-q { - --fa: "\51"; } - -.fa-g { - --fa: "\47"; } - -.fa-notes-medical { - --fa: "\f481"; } - -.fa-temperature-half { - --fa: "\f2c9"; } - -.fa-temperature-2 { - --fa: "\f2c9"; } - -.fa-thermometer-2 { - --fa: "\f2c9"; } - -.fa-thermometer-half { - --fa: "\f2c9"; } - -.fa-dong-sign { - --fa: "\e169"; } - -.fa-capsules { - --fa: "\f46b"; } - -.fa-poo-storm { - --fa: "\f75a"; } - -.fa-poo-bolt { - --fa: "\f75a"; } - -.fa-face-frown-open { - --fa: "\f57a"; } - -.fa-frown-open { - --fa: "\f57a"; } - -.fa-hand-point-up { - --fa: "\f0a6"; } - -.fa-money-bill { - --fa: "\f0d6"; } - -.fa-bookmark { - --fa: "\f02e"; } - -.fa-align-justify { - --fa: "\f039"; } - -.fa-umbrella-beach { - --fa: "\f5ca"; } - -.fa-helmet-un { - --fa: "\e503"; } - -.fa-bullseye { - --fa: "\f140"; } - -.fa-bacon { - --fa: "\f7e5"; } - -.fa-hand-point-down { - --fa: "\f0a7"; } - -.fa-arrow-up-from-bracket { - --fa: "\e09a"; } - -.fa-folder { - --fa: "\f07b"; } - -.fa-folder-blank { - --fa: "\f07b"; } - -.fa-file-waveform { - --fa: "\f478"; } - -.fa-file-medical-alt { - --fa: "\f478"; } - -.fa-radiation { - --fa: "\f7b9"; } - -.fa-chart-simple { - --fa: "\e473"; } - -.fa-mars-stroke { - --fa: "\f229"; } - -.fa-vial { - --fa: "\f492"; } - -.fa-gauge { - --fa: "\f624"; } - -.fa-dashboard { - --fa: "\f624"; } - -.fa-gauge-med { - --fa: "\f624"; } - -.fa-tachometer-alt-average { - --fa: "\f624"; } - -.fa-wand-magic-sparkles { - --fa: "\e2ca"; } - -.fa-magic-wand-sparkles { - --fa: "\e2ca"; } - -.fa-e { - --fa: "\45"; } - -.fa-pen-clip { - --fa: "\f305"; } - -.fa-pen-alt { - --fa: "\f305"; } - -.fa-bridge-circle-exclamation { - --fa: "\e4ca"; } - -.fa-user { - --fa: "\f007"; } - -.fa-school-circle-check { - --fa: "\e56b"; } - -.fa-dumpster { - --fa: "\f793"; } - -.fa-van-shuttle { - --fa: "\f5b6"; } - -.fa-shuttle-van { - --fa: "\f5b6"; } - -.fa-building-user { - --fa: "\e4da"; } - -.fa-square-caret-left { - --fa: "\f191"; } - -.fa-caret-square-left { - --fa: "\f191"; } - -.fa-highlighter { - --fa: "\f591"; } - -.fa-key { - --fa: "\f084"; } - -.fa-bullhorn { - --fa: "\f0a1"; } - -.fa-globe { - --fa: "\f0ac"; } - -.fa-synagogue { - --fa: "\f69b"; } - -.fa-person-half-dress { - --fa: "\e548"; } - -.fa-road-bridge { - --fa: "\e563"; } - -.fa-location-arrow { - --fa: "\f124"; } - -.fa-c { - --fa: "\43"; } - -.fa-tablet-button { - --fa: "\f10a"; } - -.fa-building-lock { - --fa: "\e4d6"; } - -.fa-pizza-slice { - --fa: "\f818"; } - -.fa-money-bill-wave { - --fa: "\f53a"; } - -.fa-chart-area { - --fa: "\f1fe"; } - -.fa-area-chart { - --fa: "\f1fe"; } - -.fa-house-flag { - --fa: "\e50d"; } - -.fa-person-circle-minus { - --fa: "\e540"; } - -.fa-ban { - --fa: "\f05e"; } - -.fa-cancel { - --fa: "\f05e"; } - -.fa-camera-rotate { - --fa: "\e0d8"; } - -.fa-spray-can-sparkles { - --fa: "\f5d0"; } - -.fa-air-freshener { - --fa: "\f5d0"; } - -.fa-star { - --fa: "\f005"; } - -.fa-repeat { - --fa: "\f363"; } - -.fa-cross { - --fa: "\f654"; } - -.fa-box { - --fa: "\f466"; } - -.fa-venus-mars { - --fa: "\f228"; } - -.fa-arrow-pointer { - --fa: "\f245"; } - -.fa-mouse-pointer { - --fa: "\f245"; } - -.fa-maximize { - --fa: "\f31e"; } - -.fa-expand-arrows-alt { - --fa: "\f31e"; } - -.fa-charging-station { - --fa: "\f5e7"; } - -.fa-shapes { - --fa: "\f61f"; } - -.fa-triangle-circle-square { - --fa: "\f61f"; } - -.fa-shuffle { - --fa: "\f074"; } - -.fa-random { - --fa: "\f074"; } - -.fa-person-running { - --fa: "\f70c"; } - -.fa-running { - --fa: "\f70c"; } - -.fa-mobile-retro { - --fa: "\e527"; } - -.fa-grip-lines-vertical { - --fa: "\f7a5"; } - -.fa-spider { - --fa: "\f717"; } - -.fa-hands-bound { - --fa: "\e4f9"; } - -.fa-file-invoice-dollar { - --fa: "\f571"; } - -.fa-plane-circle-exclamation { - --fa: "\e556"; } - -.fa-x-ray { - --fa: "\f497"; } - -.fa-spell-check { - --fa: "\f891"; } - -.fa-slash { - --fa: "\f715"; } - -.fa-computer-mouse { - --fa: "\f8cc"; } - -.fa-mouse { - --fa: "\f8cc"; } - -.fa-arrow-right-to-bracket { - --fa: "\f090"; } - -.fa-sign-in { - --fa: "\f090"; } - -.fa-shop-slash { - --fa: "\e070"; } - -.fa-store-alt-slash { - --fa: "\e070"; } - -.fa-server { - --fa: "\f233"; } - -.fa-virus-covid-slash { - --fa: "\e4a9"; } - -.fa-shop-lock { - --fa: "\e4a5"; } - -.fa-hourglass-start { - --fa: "\f251"; } - -.fa-hourglass-1 { - --fa: "\f251"; } - -.fa-blender-phone { - --fa: "\f6b6"; } - -.fa-building-wheat { - --fa: "\e4db"; } - -.fa-person-breastfeeding { - --fa: "\e53a"; } - -.fa-right-to-bracket { - --fa: "\f2f6"; } - -.fa-sign-in-alt { - --fa: "\f2f6"; } - -.fa-venus { - --fa: "\f221"; } - -.fa-passport { - --fa: "\f5ab"; } - -.fa-thumbtack-slash { - --fa: "\e68f"; } - -.fa-thumb-tack-slash { - --fa: "\e68f"; } - -.fa-heart-pulse { - --fa: "\f21e"; } - -.fa-heartbeat { - --fa: "\f21e"; } - -.fa-people-carry-box { - --fa: "\f4ce"; } - -.fa-people-carry { - --fa: "\f4ce"; } - -.fa-temperature-high { - --fa: "\f769"; } - -.fa-microchip { - --fa: "\f2db"; } - -.fa-crown { - --fa: "\f521"; } - -.fa-weight-hanging { - --fa: "\f5cd"; } - -.fa-xmarks-lines { - --fa: "\e59a"; } - -.fa-file-prescription { - --fa: "\f572"; } - -.fa-weight-scale { - --fa: "\f496"; } - -.fa-weight { - --fa: "\f496"; } - -.fa-user-group { - --fa: "\f500"; } - -.fa-user-friends { - --fa: "\f500"; } - -.fa-arrow-up-a-z { - --fa: "\f15e"; } - -.fa-sort-alpha-up { - --fa: "\f15e"; } - -.fa-chess-knight { - --fa: "\f441"; } - -.fa-face-laugh-squint { - --fa: "\f59b"; } - -.fa-laugh-squint { - --fa: "\f59b"; } - -.fa-wheelchair { - --fa: "\f193"; } - -.fa-circle-arrow-up { - --fa: "\f0aa"; } - -.fa-arrow-circle-up { - --fa: "\f0aa"; } - -.fa-toggle-on { - --fa: "\f205"; } - -.fa-person-walking { - --fa: "\f554"; } - -.fa-walking { - --fa: "\f554"; } - -.fa-l { - --fa: "\4c"; } - -.fa-fire { - --fa: "\f06d"; } - -.fa-bed-pulse { - --fa: "\f487"; } - -.fa-procedures { - --fa: "\f487"; } - -.fa-shuttle-space { - --fa: "\f197"; } - -.fa-space-shuttle { - --fa: "\f197"; } - -.fa-face-laugh { - --fa: "\f599"; } - -.fa-laugh { - --fa: "\f599"; } - -.fa-folder-open { - --fa: "\f07c"; } - -.fa-heart-circle-plus { - --fa: "\e500"; } - -.fa-code-fork { - --fa: "\e13b"; } - -.fa-city { - --fa: "\f64f"; } - -.fa-microphone-lines { - --fa: "\f3c9"; } - -.fa-microphone-alt { - --fa: "\f3c9"; } - -.fa-pepper-hot { - --fa: "\f816"; } - -.fa-unlock { - --fa: "\f09c"; } - -.fa-colon-sign { - --fa: "\e140"; } - -.fa-headset { - --fa: "\f590"; } - -.fa-store-slash { - --fa: "\e071"; } - -.fa-road-circle-xmark { - --fa: "\e566"; } - -.fa-user-minus { - --fa: "\f503"; } - -.fa-mars-stroke-up { - --fa: "\f22a"; } - -.fa-mars-stroke-v { - --fa: "\f22a"; } - -.fa-champagne-glasses { - --fa: "\f79f"; } - -.fa-glass-cheers { - --fa: "\f79f"; } - -.fa-clipboard { - --fa: "\f328"; } - -.fa-house-circle-exclamation { - --fa: "\e50a"; } - -.fa-file-arrow-up { - --fa: "\f574"; } - -.fa-file-upload { - --fa: "\f574"; } - -.fa-wifi { - --fa: "\f1eb"; } - -.fa-wifi-3 { - --fa: "\f1eb"; } - -.fa-wifi-strong { - --fa: "\f1eb"; } - -.fa-bath { - --fa: "\f2cd"; } - -.fa-bathtub { - --fa: "\f2cd"; } - -.fa-underline { - --fa: "\f0cd"; } - -.fa-user-pen { - --fa: "\f4ff"; } - -.fa-user-edit { - --fa: "\f4ff"; } - -.fa-signature { - --fa: "\f5b7"; } - -.fa-stroopwafel { - --fa: "\f551"; } - -.fa-bold { - --fa: "\f032"; } - -.fa-anchor-lock { - --fa: "\e4ad"; } - -.fa-building-ngo { - --fa: "\e4d7"; } - -.fa-manat-sign { - --fa: "\e1d5"; } - -.fa-not-equal { - --fa: "\f53e"; } - -.fa-border-top-left { - --fa: "\f853"; } - -.fa-border-style { - --fa: "\f853"; } - -.fa-map-location-dot { - --fa: "\f5a0"; } - -.fa-map-marked-alt { - --fa: "\f5a0"; } - -.fa-jedi { - --fa: "\f669"; } - -.fa-square-poll-vertical { - --fa: "\f681"; } - -.fa-poll { - --fa: "\f681"; } - -.fa-mug-hot { - --fa: "\f7b6"; } - -.fa-car-battery { - --fa: "\f5df"; } - -.fa-battery-car { - --fa: "\f5df"; } - -.fa-gift { - --fa: "\f06b"; } - -.fa-dice-two { - --fa: "\f528"; } - -.fa-chess-queen { - --fa: "\f445"; } - -.fa-glasses { - --fa: "\f530"; } - -.fa-chess-board { - --fa: "\f43c"; } - -.fa-building-circle-check { - --fa: "\e4d2"; } - -.fa-person-chalkboard { - --fa: "\e53d"; } - -.fa-mars-stroke-right { - --fa: "\f22b"; } - -.fa-mars-stroke-h { - --fa: "\f22b"; } - -.fa-hand-back-fist { - --fa: "\f255"; } - -.fa-hand-rock { - --fa: "\f255"; } - -.fa-square-caret-up { - --fa: "\f151"; } - -.fa-caret-square-up { - --fa: "\f151"; } - -.fa-cloud-showers-water { - --fa: "\e4e4"; } - -.fa-chart-bar { - --fa: "\f080"; } - -.fa-bar-chart { - --fa: "\f080"; } - -.fa-hands-bubbles { - --fa: "\e05e"; } - -.fa-hands-wash { - --fa: "\e05e"; } - -.fa-less-than-equal { - --fa: "\f537"; } - -.fa-train { - --fa: "\f238"; } - -.fa-eye-low-vision { - --fa: "\f2a8"; } - -.fa-low-vision { - --fa: "\f2a8"; } - -.fa-crow { - --fa: "\f520"; } - -.fa-sailboat { - --fa: "\e445"; } - -.fa-window-restore { - --fa: "\f2d2"; } - -.fa-square-plus { - --fa: "\f0fe"; } - -.fa-plus-square { - --fa: "\f0fe"; } - -.fa-torii-gate { - --fa: "\f6a1"; } - -.fa-frog { - --fa: "\f52e"; } - -.fa-bucket { - --fa: "\e4cf"; } - -.fa-image { - --fa: "\f03e"; } - -.fa-microphone { - --fa: "\f130"; } - -.fa-cow { - --fa: "\f6c8"; } - -.fa-caret-up { - --fa: "\f0d8"; } - -.fa-screwdriver { - --fa: "\f54a"; } - -.fa-folder-closed { - --fa: "\e185"; } - -.fa-house-tsunami { - --fa: "\e515"; } - -.fa-square-nfi { - --fa: "\e576"; } - -.fa-arrow-up-from-ground-water { - --fa: "\e4b5"; } - -.fa-martini-glass { - --fa: "\f57b"; } - -.fa-glass-martini-alt { - --fa: "\f57b"; } - -.fa-square-binary { - --fa: "\e69b"; } - -.fa-rotate-left { - --fa: "\f2ea"; } - -.fa-rotate-back { - --fa: "\f2ea"; } - -.fa-rotate-backward { - --fa: "\f2ea"; } - -.fa-undo-alt { - --fa: "\f2ea"; } - -.fa-table-columns { - --fa: "\f0db"; } - -.fa-columns { - --fa: "\f0db"; } - -.fa-lemon { - --fa: "\f094"; } - -.fa-head-side-mask { - --fa: "\e063"; } - -.fa-handshake { - --fa: "\f2b5"; } - -.fa-gem { - --fa: "\f3a5"; } - -.fa-dolly { - --fa: "\f472"; } - -.fa-dolly-box { - --fa: "\f472"; } - -.fa-smoking { - --fa: "\f48d"; } - -.fa-minimize { - --fa: "\f78c"; } - -.fa-compress-arrows-alt { - --fa: "\f78c"; } - -.fa-monument { - --fa: "\f5a6"; } - -.fa-snowplow { - --fa: "\f7d2"; } - -.fa-angles-right { - --fa: "\f101"; } - -.fa-angle-double-right { - --fa: "\f101"; } - -.fa-cannabis { - --fa: "\f55f"; } - -.fa-circle-play { - --fa: "\f144"; } - -.fa-play-circle { - --fa: "\f144"; } - -.fa-tablets { - --fa: "\f490"; } - -.fa-ethernet { - --fa: "\f796"; } - -.fa-euro-sign { - --fa: "\f153"; } - -.fa-eur { - --fa: "\f153"; } - -.fa-euro { - --fa: "\f153"; } - -.fa-chair { - --fa: "\f6c0"; } - -.fa-circle-check { - --fa: "\f058"; } - -.fa-check-circle { - --fa: "\f058"; } - -.fa-circle-stop { - --fa: "\f28d"; } - -.fa-stop-circle { - --fa: "\f28d"; } - -.fa-compass-drafting { - --fa: "\f568"; } - -.fa-drafting-compass { - --fa: "\f568"; } - -.fa-plate-wheat { - --fa: "\e55a"; } - -.fa-icicles { - --fa: "\f7ad"; } - -.fa-person-shelter { - --fa: "\e54f"; } - -.fa-neuter { - --fa: "\f22c"; } - -.fa-id-badge { - --fa: "\f2c1"; } - -.fa-marker { - --fa: "\f5a1"; } - -.fa-face-laugh-beam { - --fa: "\f59a"; } - -.fa-laugh-beam { - --fa: "\f59a"; } - -.fa-helicopter-symbol { - --fa: "\e502"; } - -.fa-universal-access { - --fa: "\f29a"; } - -.fa-circle-chevron-up { - --fa: "\f139"; } - -.fa-chevron-circle-up { - --fa: "\f139"; } - -.fa-lari-sign { - --fa: "\e1c8"; } - -.fa-volcano { - --fa: "\f770"; } - -.fa-person-walking-dashed-line-arrow-right { - --fa: "\e553"; } - -.fa-sterling-sign { - --fa: "\f154"; } - -.fa-gbp { - --fa: "\f154"; } - -.fa-pound-sign { - --fa: "\f154"; } - -.fa-viruses { - --fa: "\e076"; } - -.fa-square-person-confined { - --fa: "\e577"; } - -.fa-user-tie { - --fa: "\f508"; } - -.fa-arrow-down-long { - --fa: "\f175"; } - -.fa-long-arrow-down { - --fa: "\f175"; } - -.fa-tent-arrow-down-to-line { - --fa: "\e57e"; } - -.fa-certificate { - --fa: "\f0a3"; } - -.fa-reply-all { - --fa: "\f122"; } - -.fa-mail-reply-all { - --fa: "\f122"; } - -.fa-suitcase { - --fa: "\f0f2"; } - -.fa-person-skating { - --fa: "\f7c5"; } - -.fa-skating { - --fa: "\f7c5"; } - -.fa-filter-circle-dollar { - --fa: "\f662"; } - -.fa-funnel-dollar { - --fa: "\f662"; } - -.fa-camera-retro { - --fa: "\f083"; } - -.fa-circle-arrow-down { - --fa: "\f0ab"; } - -.fa-arrow-circle-down { - --fa: "\f0ab"; } - -.fa-file-import { - --fa: "\f56f"; } - -.fa-arrow-right-to-file { - --fa: "\f56f"; } - -.fa-square-arrow-up-right { - --fa: "\f14c"; } - -.fa-external-link-square { - --fa: "\f14c"; } - -.fa-box-open { - --fa: "\f49e"; } - -.fa-scroll { - --fa: "\f70e"; } - -.fa-spa { - --fa: "\f5bb"; } - -.fa-location-pin-lock { - --fa: "\e51f"; } - -.fa-pause { - --fa: "\f04c"; } - -.fa-hill-avalanche { - --fa: "\e507"; } - -.fa-temperature-empty { - --fa: "\f2cb"; } - -.fa-temperature-0 { - --fa: "\f2cb"; } - -.fa-thermometer-0 { - --fa: "\f2cb"; } - -.fa-thermometer-empty { - --fa: "\f2cb"; } - -.fa-bomb { - --fa: "\f1e2"; } - -.fa-registered { - --fa: "\f25d"; } - -.fa-address-card { - --fa: "\f2bb"; } - -.fa-contact-card { - --fa: "\f2bb"; } - -.fa-vcard { - --fa: "\f2bb"; } - -.fa-scale-unbalanced-flip { - --fa: "\f516"; } - -.fa-balance-scale-right { - --fa: "\f516"; } - -.fa-subscript { - --fa: "\f12c"; } - -.fa-diamond-turn-right { - --fa: "\f5eb"; } - -.fa-directions { - --fa: "\f5eb"; } - -.fa-burst { - --fa: "\e4dc"; } - -.fa-house-laptop { - --fa: "\e066"; } - -.fa-laptop-house { - --fa: "\e066"; } - -.fa-face-tired { - --fa: "\f5c8"; } - -.fa-tired { - --fa: "\f5c8"; } - -.fa-money-bills { - --fa: "\e1f3"; } - -.fa-smog { - --fa: "\f75f"; } - -.fa-crutch { - --fa: "\f7f7"; } - -.fa-cloud-arrow-up { - --fa: "\f0ee"; } - -.fa-cloud-upload { - --fa: "\f0ee"; } - -.fa-cloud-upload-alt { - --fa: "\f0ee"; } - -.fa-palette { - --fa: "\f53f"; } - -.fa-arrows-turn-right { - --fa: "\e4c0"; } - -.fa-vest { - --fa: "\e085"; } - -.fa-ferry { - --fa: "\e4ea"; } - -.fa-arrows-down-to-people { - --fa: "\e4b9"; } - -.fa-seedling { - --fa: "\f4d8"; } - -.fa-sprout { - --fa: "\f4d8"; } - -.fa-left-right { - --fa: "\f337"; } - -.fa-arrows-alt-h { - --fa: "\f337"; } - -.fa-boxes-packing { - --fa: "\e4c7"; } - -.fa-circle-arrow-left { - --fa: "\f0a8"; } - -.fa-arrow-circle-left { - --fa: "\f0a8"; } - -.fa-group-arrows-rotate { - --fa: "\e4f6"; } - -.fa-bowl-food { - --fa: "\e4c6"; } - -.fa-candy-cane { - --fa: "\f786"; } - -.fa-arrow-down-wide-short { - --fa: "\f160"; } - -.fa-sort-amount-asc { - --fa: "\f160"; } - -.fa-sort-amount-down { - --fa: "\f160"; } - -.fa-cloud-bolt { - --fa: "\f76c"; } - -.fa-thunderstorm { - --fa: "\f76c"; } - -.fa-text-slash { - --fa: "\f87d"; } - -.fa-remove-format { - --fa: "\f87d"; } - -.fa-face-smile-wink { - --fa: "\f4da"; } - -.fa-smile-wink { - --fa: "\f4da"; } - -.fa-file-word { - --fa: "\f1c2"; } - -.fa-file-powerpoint { - --fa: "\f1c4"; } - -.fa-arrows-left-right { - --fa: "\f07e"; } - -.fa-arrows-h { - --fa: "\f07e"; } - -.fa-house-lock { - --fa: "\e510"; } - -.fa-cloud-arrow-down { - --fa: "\f0ed"; } - -.fa-cloud-download { - --fa: "\f0ed"; } - -.fa-cloud-download-alt { - --fa: "\f0ed"; } - -.fa-children { - --fa: "\e4e1"; } - -.fa-chalkboard { - --fa: "\f51b"; } - -.fa-blackboard { - --fa: "\f51b"; } - -.fa-user-large-slash { - --fa: "\f4fa"; } - -.fa-user-alt-slash { - --fa: "\f4fa"; } - -.fa-envelope-open { - --fa: "\f2b6"; } - -.fa-handshake-simple-slash { - --fa: "\e05f"; } - -.fa-handshake-alt-slash { - --fa: "\e05f"; } - -.fa-mattress-pillow { - --fa: "\e525"; } - -.fa-guarani-sign { - --fa: "\e19a"; } - -.fa-arrows-rotate { - --fa: "\f021"; } - -.fa-refresh { - --fa: "\f021"; } - -.fa-sync { - --fa: "\f021"; } - -.fa-fire-extinguisher { - --fa: "\f134"; } - -.fa-cruzeiro-sign { - --fa: "\e152"; } - -.fa-greater-than-equal { - --fa: "\f532"; } - -.fa-shield-halved { - --fa: "\f3ed"; } - -.fa-shield-alt { - --fa: "\f3ed"; } - -.fa-book-atlas { - --fa: "\f558"; } - -.fa-atlas { - --fa: "\f558"; } - -.fa-virus { - --fa: "\e074"; } - -.fa-envelope-circle-check { - --fa: "\e4e8"; } - -.fa-layer-group { - --fa: "\f5fd"; } - -.fa-arrows-to-dot { - --fa: "\e4be"; } - -.fa-archway { - --fa: "\f557"; } - -.fa-heart-circle-check { - --fa: "\e4fd"; } - -.fa-house-chimney-crack { - --fa: "\f6f1"; } - -.fa-house-damage { - --fa: "\f6f1"; } - -.fa-file-zipper { - --fa: "\f1c6"; } - -.fa-file-archive { - --fa: "\f1c6"; } - -.fa-square { - --fa: "\f0c8"; } - -.fa-martini-glass-empty { - --fa: "\f000"; } - -.fa-glass-martini { - --fa: "\f000"; } - -.fa-couch { - --fa: "\f4b8"; } - -.fa-cedi-sign { - --fa: "\e0df"; } - -.fa-italic { - --fa: "\f033"; } - -.fa-table-cells-column-lock { - --fa: "\e678"; } - -.fa-church { - --fa: "\f51d"; } - -.fa-comments-dollar { - --fa: "\f653"; } - -.fa-democrat { - --fa: "\f747"; } - -.fa-z { - --fa: "\5a"; } - -.fa-person-skiing { - --fa: "\f7c9"; } - -.fa-skiing { - --fa: "\f7c9"; } - -.fa-road-lock { - --fa: "\e567"; } - -.fa-a { - --fa: "\41"; } - -.fa-temperature-arrow-down { - --fa: "\e03f"; } - -.fa-temperature-down { - --fa: "\e03f"; } - -.fa-feather-pointed { - --fa: "\f56b"; } - -.fa-feather-alt { - --fa: "\f56b"; } - -.fa-p { - --fa: "\50"; } - -.fa-snowflake { - --fa: "\f2dc"; } - -.fa-newspaper { - --fa: "\f1ea"; } - -.fa-rectangle-ad { - --fa: "\f641"; } - -.fa-ad { - --fa: "\f641"; } - -.fa-circle-arrow-right { - --fa: "\f0a9"; } - -.fa-arrow-circle-right { - --fa: "\f0a9"; } - -.fa-filter-circle-xmark { - --fa: "\e17b"; } - -.fa-locust { - --fa: "\e520"; } - -.fa-sort { - --fa: "\f0dc"; } - -.fa-unsorted { - --fa: "\f0dc"; } - -.fa-list-ol { - --fa: "\f0cb"; } - -.fa-list-1-2 { - --fa: "\f0cb"; } - -.fa-list-numeric { - --fa: "\f0cb"; } - -.fa-person-dress-burst { - --fa: "\e544"; } - -.fa-money-check-dollar { - --fa: "\f53d"; } - -.fa-money-check-alt { - --fa: "\f53d"; } - -.fa-vector-square { - --fa: "\f5cb"; } - -.fa-bread-slice { - --fa: "\f7ec"; } - -.fa-language { - --fa: "\f1ab"; } - -.fa-face-kiss-wink-heart { - --fa: "\f598"; } - -.fa-kiss-wink-heart { - --fa: "\f598"; } - -.fa-filter { - --fa: "\f0b0"; } - -.fa-question { - --fa: "\3f"; } - -.fa-file-signature { - --fa: "\f573"; } - -.fa-up-down-left-right { - --fa: "\f0b2"; } - -.fa-arrows-alt { - --fa: "\f0b2"; } - -.fa-house-chimney-user { - --fa: "\e065"; } - -.fa-hand-holding-heart { - --fa: "\f4be"; } - -.fa-puzzle-piece { - --fa: "\f12e"; } - -.fa-money-check { - --fa: "\f53c"; } - -.fa-star-half-stroke { - --fa: "\f5c0"; } - -.fa-star-half-alt { - --fa: "\f5c0"; } - -.fa-code { - --fa: "\f121"; } - -.fa-whiskey-glass { - --fa: "\f7a0"; } - -.fa-glass-whiskey { - --fa: "\f7a0"; } - -.fa-building-circle-exclamation { - --fa: "\e4d3"; } - -.fa-magnifying-glass-chart { - --fa: "\e522"; } - -.fa-arrow-up-right-from-square { - --fa: "\f08e"; } - -.fa-external-link { - --fa: "\f08e"; } - -.fa-cubes-stacked { - --fa: "\e4e6"; } - -.fa-won-sign { - --fa: "\f159"; } - -.fa-krw { - --fa: "\f159"; } - -.fa-won { - --fa: "\f159"; } - -.fa-virus-covid { - --fa: "\e4a8"; } - -.fa-austral-sign { - --fa: "\e0a9"; } - -.fa-f { - --fa: "\46"; } - -.fa-leaf { - --fa: "\f06c"; } - -.fa-road { - --fa: "\f018"; } - -.fa-taxi { - --fa: "\f1ba"; } - -.fa-cab { - --fa: "\f1ba"; } - -.fa-person-circle-plus { - --fa: "\e541"; } - -.fa-chart-pie { - --fa: "\f200"; } - -.fa-pie-chart { - --fa: "\f200"; } - -.fa-bolt-lightning { - --fa: "\e0b7"; } - -.fa-sack-xmark { - --fa: "\e56a"; } - -.fa-file-excel { - --fa: "\f1c3"; } - -.fa-file-contract { - --fa: "\f56c"; } - -.fa-fish-fins { - --fa: "\e4f2"; } - -.fa-building-flag { - --fa: "\e4d5"; } - -.fa-face-grin-beam { - --fa: "\f582"; } - -.fa-grin-beam { - --fa: "\f582"; } - -.fa-object-ungroup { - --fa: "\f248"; } - -.fa-poop { - --fa: "\f619"; } - -.fa-location-pin { - --fa: "\f041"; } - -.fa-map-marker { - --fa: "\f041"; } - -.fa-kaaba { - --fa: "\f66b"; } - -.fa-toilet-paper { - --fa: "\f71e"; } - -.fa-helmet-safety { - --fa: "\f807"; } - -.fa-hard-hat { - --fa: "\f807"; } - -.fa-hat-hard { - --fa: "\f807"; } - -.fa-eject { - --fa: "\f052"; } - -.fa-circle-right { - --fa: "\f35a"; } - -.fa-arrow-alt-circle-right { - --fa: "\f35a"; } - -.fa-plane-circle-check { - --fa: "\e555"; } - -.fa-face-rolling-eyes { - --fa: "\f5a5"; } - -.fa-meh-rolling-eyes { - --fa: "\f5a5"; } - -.fa-object-group { - --fa: "\f247"; } - -.fa-chart-line { - --fa: "\f201"; } - -.fa-line-chart { - --fa: "\f201"; } - -.fa-mask-ventilator { - --fa: "\e524"; } - -.fa-arrow-right { - --fa: "\f061"; } - -.fa-signs-post { - --fa: "\f277"; } - -.fa-map-signs { - --fa: "\f277"; } - -.fa-cash-register { - --fa: "\f788"; } - -.fa-person-circle-question { - --fa: "\e542"; } - -.fa-h { - --fa: "\48"; } - -.fa-tarp { - --fa: "\e57b"; } - -.fa-screwdriver-wrench { - --fa: "\f7d9"; } - -.fa-tools { - --fa: "\f7d9"; } - -.fa-arrows-to-eye { - --fa: "\e4bf"; } - -.fa-plug-circle-bolt { - --fa: "\e55b"; } - -.fa-heart { - --fa: "\f004"; } - -.fa-mars-and-venus { - --fa: "\f224"; } - -.fa-house-user { - --fa: "\e1b0"; } - -.fa-home-user { - --fa: "\e1b0"; } - -.fa-dumpster-fire { - --fa: "\f794"; } - -.fa-house-crack { - --fa: "\e3b1"; } - -.fa-martini-glass-citrus { - --fa: "\f561"; } - -.fa-cocktail { - --fa: "\f561"; } - -.fa-face-surprise { - --fa: "\f5c2"; } - -.fa-surprise { - --fa: "\f5c2"; } - -.fa-bottle-water { - --fa: "\e4c5"; } - -.fa-circle-pause { - --fa: "\f28b"; } - -.fa-pause-circle { - --fa: "\f28b"; } - -.fa-toilet-paper-slash { - --fa: "\e072"; } - -.fa-apple-whole { - --fa: "\f5d1"; } - -.fa-apple-alt { - --fa: "\f5d1"; } - -.fa-kitchen-set { - --fa: "\e51a"; } - -.fa-r { - --fa: "\52"; } - -.fa-temperature-quarter { - --fa: "\f2ca"; } - -.fa-temperature-1 { - --fa: "\f2ca"; } - -.fa-thermometer-1 { - --fa: "\f2ca"; } - -.fa-thermometer-quarter { - --fa: "\f2ca"; } - -.fa-cube { - --fa: "\f1b2"; } - -.fa-bitcoin-sign { - --fa: "\e0b4"; } - -.fa-shield-dog { - --fa: "\e573"; } - -.fa-solar-panel { - --fa: "\f5ba"; } - -.fa-lock-open { - --fa: "\f3c1"; } - -.fa-elevator { - --fa: "\e16d"; } - -.fa-money-bill-transfer { - --fa: "\e528"; } - -.fa-money-bill-trend-up { - --fa: "\e529"; } - -.fa-house-flood-water-circle-arrow-right { - --fa: "\e50f"; } - -.fa-square-poll-horizontal { - --fa: "\f682"; } - -.fa-poll-h { - --fa: "\f682"; } - -.fa-circle { - --fa: "\f111"; } - -.fa-backward-fast { - --fa: "\f049"; } - -.fa-fast-backward { - --fa: "\f049"; } - -.fa-recycle { - --fa: "\f1b8"; } - -.fa-user-astronaut { - --fa: "\f4fb"; } - -.fa-plane-slash { - --fa: "\e069"; } - -.fa-trademark { - --fa: "\f25c"; } - -.fa-basketball { - --fa: "\f434"; } - -.fa-basketball-ball { - --fa: "\f434"; } - -.fa-satellite-dish { - --fa: "\f7c0"; } - -.fa-circle-up { - --fa: "\f35b"; } - -.fa-arrow-alt-circle-up { - --fa: "\f35b"; } - -.fa-mobile-screen-button { - --fa: "\f3cd"; } - -.fa-mobile-alt { - --fa: "\f3cd"; } - -.fa-volume-high { - --fa: "\f028"; } - -.fa-volume-up { - --fa: "\f028"; } - -.fa-users-rays { - --fa: "\e593"; } - -.fa-wallet { - --fa: "\f555"; } - -.fa-clipboard-check { - --fa: "\f46c"; } - -.fa-file-audio { - --fa: "\f1c7"; } - -.fa-burger { - --fa: "\f805"; } - -.fa-hamburger { - --fa: "\f805"; } - -.fa-wrench { - --fa: "\f0ad"; } - -.fa-bugs { - --fa: "\e4d0"; } - -.fa-rupee-sign { - --fa: "\f156"; } - -.fa-rupee { - --fa: "\f156"; } - -.fa-file-image { - --fa: "\f1c5"; } - -.fa-circle-question { - --fa: "\f059"; } - -.fa-question-circle { - --fa: "\f059"; } - -.fa-plane-departure { - --fa: "\f5b0"; } - -.fa-handshake-slash { - --fa: "\e060"; } - -.fa-book-bookmark { - --fa: "\e0bb"; } - -.fa-code-branch { - --fa: "\f126"; } - -.fa-hat-cowboy { - --fa: "\f8c0"; } - -.fa-bridge { - --fa: "\e4c8"; } - -.fa-phone-flip { - --fa: "\f879"; } - -.fa-phone-alt { - --fa: "\f879"; } - -.fa-truck-front { - --fa: "\e2b7"; } - -.fa-cat { - --fa: "\f6be"; } - -.fa-anchor-circle-exclamation { - --fa: "\e4ab"; } - -.fa-truck-field { - --fa: "\e58d"; } - -.fa-route { - --fa: "\f4d7"; } - -.fa-clipboard-question { - --fa: "\e4e3"; } - -.fa-panorama { - --fa: "\e209"; } - -.fa-comment-medical { - --fa: "\f7f5"; } - -.fa-teeth-open { - --fa: "\f62f"; } - -.fa-file-circle-minus { - --fa: "\e4ed"; } - -.fa-tags { - --fa: "\f02c"; } - -.fa-wine-glass { - --fa: "\f4e3"; } - -.fa-forward-fast { - --fa: "\f050"; } - -.fa-fast-forward { - --fa: "\f050"; } - -.fa-face-meh-blank { - --fa: "\f5a4"; } - -.fa-meh-blank { - --fa: "\f5a4"; } - -.fa-square-parking { - --fa: "\f540"; } - -.fa-parking { - --fa: "\f540"; } - -.fa-house-signal { - --fa: "\e012"; } - -.fa-bars-progress { - --fa: "\f828"; } - -.fa-tasks-alt { - --fa: "\f828"; } - -.fa-faucet-drip { - --fa: "\e006"; } - -.fa-cart-flatbed { - --fa: "\f474"; } - -.fa-dolly-flatbed { - --fa: "\f474"; } - -.fa-ban-smoking { - --fa: "\f54d"; } - -.fa-smoking-ban { - --fa: "\f54d"; } - -.fa-terminal { - --fa: "\f120"; } - -.fa-mobile-button { - --fa: "\f10b"; } - -.fa-house-medical-flag { - --fa: "\e514"; } - -.fa-basket-shopping { - --fa: "\f291"; } - -.fa-shopping-basket { - --fa: "\f291"; } - -.fa-tape { - --fa: "\f4db"; } - -.fa-bus-simple { - --fa: "\f55e"; } - -.fa-bus-alt { - --fa: "\f55e"; } - -.fa-eye { - --fa: "\f06e"; } - -.fa-face-sad-cry { - --fa: "\f5b3"; } - -.fa-sad-cry { - --fa: "\f5b3"; } - -.fa-audio-description { - --fa: "\f29e"; } - -.fa-person-military-to-person { - --fa: "\e54c"; } - -.fa-file-shield { - --fa: "\e4f0"; } - -.fa-user-slash { - --fa: "\f506"; } - -.fa-pen { - --fa: "\f304"; } - -.fa-tower-observation { - --fa: "\e586"; } - -.fa-file-code { - --fa: "\f1c9"; } - -.fa-signal { - --fa: "\f012"; } - -.fa-signal-5 { - --fa: "\f012"; } - -.fa-signal-perfect { - --fa: "\f012"; } - -.fa-bus { - --fa: "\f207"; } - -.fa-heart-circle-xmark { - --fa: "\e501"; } - -.fa-house-chimney { - --fa: "\e3af"; } - -.fa-home-lg { - --fa: "\e3af"; } - -.fa-window-maximize { - --fa: "\f2d0"; } - -.fa-face-frown { - --fa: "\f119"; } - -.fa-frown { - --fa: "\f119"; } - -.fa-prescription { - --fa: "\f5b1"; } - -.fa-shop { - --fa: "\f54f"; } - -.fa-store-alt { - --fa: "\f54f"; } - -.fa-floppy-disk { - --fa: "\f0c7"; } - -.fa-save { - --fa: "\f0c7"; } - -.fa-vihara { - --fa: "\f6a7"; } - -.fa-scale-unbalanced { - --fa: "\f515"; } - -.fa-balance-scale-left { - --fa: "\f515"; } - -.fa-sort-up { - --fa: "\f0de"; } - -.fa-sort-asc { - --fa: "\f0de"; } - -.fa-comment-dots { - --fa: "\f4ad"; } - -.fa-commenting { - --fa: "\f4ad"; } - -.fa-plant-wilt { - --fa: "\e5aa"; } - -.fa-diamond { - --fa: "\f219"; } - -.fa-face-grin-squint { - --fa: "\f585"; } - -.fa-grin-squint { - --fa: "\f585"; } - -.fa-hand-holding-dollar { - --fa: "\f4c0"; } - -.fa-hand-holding-usd { - --fa: "\f4c0"; } - -.fa-chart-diagram { - --fa: "\e695"; } - -.fa-bacterium { - --fa: "\e05a"; } - -.fa-hand-pointer { - --fa: "\f25a"; } - -.fa-drum-steelpan { - --fa: "\f56a"; } - -.fa-hand-scissors { - --fa: "\f257"; } - -.fa-hands-praying { - --fa: "\f684"; } - -.fa-praying-hands { - --fa: "\f684"; } - -.fa-arrow-rotate-right { - --fa: "\f01e"; } - -.fa-arrow-right-rotate { - --fa: "\f01e"; } - -.fa-arrow-rotate-forward { - --fa: "\f01e"; } - -.fa-redo { - --fa: "\f01e"; } - -.fa-biohazard { - --fa: "\f780"; } - -.fa-location-crosshairs { - --fa: "\f601"; } - -.fa-location { - --fa: "\f601"; } - -.fa-mars-double { - --fa: "\f227"; } - -.fa-child-dress { - --fa: "\e59c"; } - -.fa-users-between-lines { - --fa: "\e591"; } - -.fa-lungs-virus { - --fa: "\e067"; } - -.fa-face-grin-tears { - --fa: "\f588"; } - -.fa-grin-tears { - --fa: "\f588"; } - -.fa-phone { - --fa: "\f095"; } - -.fa-calendar-xmark { - --fa: "\f273"; } - -.fa-calendar-times { - --fa: "\f273"; } - -.fa-child-reaching { - --fa: "\e59d"; } - -.fa-head-side-virus { - --fa: "\e064"; } - -.fa-user-gear { - --fa: "\f4fe"; } - -.fa-user-cog { - --fa: "\f4fe"; } - -.fa-arrow-up-1-9 { - --fa: "\f163"; } - -.fa-sort-numeric-up { - --fa: "\f163"; } - -.fa-door-closed { - --fa: "\f52a"; } - -.fa-shield-virus { - --fa: "\e06c"; } - -.fa-dice-six { - --fa: "\f526"; } - -.fa-mosquito-net { - --fa: "\e52c"; } - -.fa-file-fragment { - --fa: "\e697"; } - -.fa-bridge-water { - --fa: "\e4ce"; } - -.fa-person-booth { - --fa: "\f756"; } - -.fa-text-width { - --fa: "\f035"; } - -.fa-hat-wizard { - --fa: "\f6e8"; } - -.fa-pen-fancy { - --fa: "\f5ac"; } - -.fa-person-digging { - --fa: "\f85e"; } - -.fa-digging { - --fa: "\f85e"; } - -.fa-trash { - --fa: "\f1f8"; } - -.fa-gauge-simple { - --fa: "\f629"; } - -.fa-gauge-simple-med { - --fa: "\f629"; } - -.fa-tachometer-average { - --fa: "\f629"; } - -.fa-book-medical { - --fa: "\f7e6"; } - -.fa-poo { - --fa: "\f2fe"; } - -.fa-quote-right { - --fa: "\f10e"; } - -.fa-quote-right-alt { - --fa: "\f10e"; } - -.fa-shirt { - --fa: "\f553"; } - -.fa-t-shirt { - --fa: "\f553"; } - -.fa-tshirt { - --fa: "\f553"; } - -.fa-cubes { - --fa: "\f1b3"; } - -.fa-divide { - --fa: "\f529"; } - -.fa-tenge-sign { - --fa: "\f7d7"; } - -.fa-tenge { - --fa: "\f7d7"; } - -.fa-headphones { - --fa: "\f025"; } - -.fa-hands-holding { - --fa: "\f4c2"; } - -.fa-hands-clapping { - --fa: "\e1a8"; } - -.fa-republican { - --fa: "\f75e"; } - -.fa-arrow-left { - --fa: "\f060"; } - -.fa-person-circle-xmark { - --fa: "\e543"; } - -.fa-ruler { - --fa: "\f545"; } - -.fa-align-left { - --fa: "\f036"; } - -.fa-dice-d6 { - --fa: "\f6d1"; } - -.fa-restroom { - --fa: "\f7bd"; } - -.fa-j { - --fa: "\4a"; } - -.fa-users-viewfinder { - --fa: "\e595"; } - -.fa-file-video { - --fa: "\f1c8"; } - -.fa-up-right-from-square { - --fa: "\f35d"; } - -.fa-external-link-alt { - --fa: "\f35d"; } - -.fa-table-cells { - --fa: "\f00a"; } - -.fa-th { - --fa: "\f00a"; } - -.fa-file-pdf { - --fa: "\f1c1"; } - -.fa-book-bible { - --fa: "\f647"; } - -.fa-bible { - --fa: "\f647"; } - -.fa-o { - --fa: "\4f"; } - -.fa-suitcase-medical { - --fa: "\f0fa"; } - -.fa-medkit { - --fa: "\f0fa"; } - -.fa-user-secret { - --fa: "\f21b"; } - -.fa-otter { - --fa: "\f700"; } - -.fa-person-dress { - --fa: "\f182"; } - -.fa-female { - --fa: "\f182"; } - -.fa-comment-dollar { - --fa: "\f651"; } - -.fa-business-time { - --fa: "\f64a"; } - -.fa-briefcase-clock { - --fa: "\f64a"; } - -.fa-table-cells-large { - --fa: "\f009"; } - -.fa-th-large { - --fa: "\f009"; } - -.fa-book-tanakh { - --fa: "\f827"; } - -.fa-tanakh { - --fa: "\f827"; } - -.fa-phone-volume { - --fa: "\f2a0"; } - -.fa-volume-control-phone { - --fa: "\f2a0"; } - -.fa-hat-cowboy-side { - --fa: "\f8c1"; } - -.fa-clipboard-user { - --fa: "\f7f3"; } - -.fa-child { - --fa: "\f1ae"; } - -.fa-lira-sign { - --fa: "\f195"; } - -.fa-satellite { - --fa: "\f7bf"; } - -.fa-plane-lock { - --fa: "\e558"; } - -.fa-tag { - --fa: "\f02b"; } - -.fa-comment { - --fa: "\f075"; } - -.fa-cake-candles { - --fa: "\f1fd"; } - -.fa-birthday-cake { - --fa: "\f1fd"; } - -.fa-cake { - --fa: "\f1fd"; } - -.fa-envelope { - --fa: "\f0e0"; } - -.fa-angles-up { - --fa: "\f102"; } - -.fa-angle-double-up { - --fa: "\f102"; } - -.fa-paperclip { - --fa: "\f0c6"; } - -.fa-arrow-right-to-city { - --fa: "\e4b3"; } - -.fa-ribbon { - --fa: "\f4d6"; } - -.fa-lungs { - --fa: "\f604"; } - -.fa-arrow-up-9-1 { - --fa: "\f887"; } - -.fa-sort-numeric-up-alt { - --fa: "\f887"; } - -.fa-litecoin-sign { - --fa: "\e1d3"; } - -.fa-border-none { - --fa: "\f850"; } - -.fa-circle-nodes { - --fa: "\e4e2"; } - -.fa-parachute-box { - --fa: "\f4cd"; } - -.fa-indent { - --fa: "\f03c"; } - -.fa-truck-field-un { - --fa: "\e58e"; } - -.fa-hourglass { - --fa: "\f254"; } - -.fa-hourglass-empty { - --fa: "\f254"; } - -.fa-mountain { - --fa: "\f6fc"; } - -.fa-user-doctor { - --fa: "\f0f0"; } - -.fa-user-md { - --fa: "\f0f0"; } - -.fa-circle-info { - --fa: "\f05a"; } - -.fa-info-circle { - --fa: "\f05a"; } - -.fa-cloud-meatball { - --fa: "\f73b"; } - -.fa-camera { - --fa: "\f030"; } - -.fa-camera-alt { - --fa: "\f030"; } - -.fa-square-virus { - --fa: "\e578"; } - -.fa-meteor { - --fa: "\f753"; } - -.fa-car-on { - --fa: "\e4dd"; } - -.fa-sleigh { - --fa: "\f7cc"; } - -.fa-arrow-down-1-9 { - --fa: "\f162"; } - -.fa-sort-numeric-asc { - --fa: "\f162"; } - -.fa-sort-numeric-down { - --fa: "\f162"; } - -.fa-hand-holding-droplet { - --fa: "\f4c1"; } - -.fa-hand-holding-water { - --fa: "\f4c1"; } - -.fa-water { - --fa: "\f773"; } - -.fa-calendar-check { - --fa: "\f274"; } - -.fa-braille { - --fa: "\f2a1"; } - -.fa-prescription-bottle-medical { - --fa: "\f486"; } - -.fa-prescription-bottle-alt { - --fa: "\f486"; } - -.fa-landmark { - --fa: "\f66f"; } - -.fa-truck { - --fa: "\f0d1"; } - -.fa-crosshairs { - --fa: "\f05b"; } - -.fa-person-cane { - --fa: "\e53c"; } - -.fa-tent { - --fa: "\e57d"; } - -.fa-vest-patches { - --fa: "\e086"; } - -.fa-check-double { - --fa: "\f560"; } - -.fa-arrow-down-a-z { - --fa: "\f15d"; } - -.fa-sort-alpha-asc { - --fa: "\f15d"; } - -.fa-sort-alpha-down { - --fa: "\f15d"; } - -.fa-money-bill-wheat { - --fa: "\e52a"; } - -.fa-cookie { - --fa: "\f563"; } - -.fa-arrow-rotate-left { - --fa: "\f0e2"; } - -.fa-arrow-left-rotate { - --fa: "\f0e2"; } - -.fa-arrow-rotate-back { - --fa: "\f0e2"; } - -.fa-arrow-rotate-backward { - --fa: "\f0e2"; } - -.fa-undo { - --fa: "\f0e2"; } - -.fa-hard-drive { - --fa: "\f0a0"; } - -.fa-hdd { - --fa: "\f0a0"; } - -.fa-face-grin-squint-tears { - --fa: "\f586"; } - -.fa-grin-squint-tears { - --fa: "\f586"; } - -.fa-dumbbell { - --fa: "\f44b"; } - -.fa-rectangle-list { - --fa: "\f022"; } - -.fa-list-alt { - --fa: "\f022"; } - -.fa-tarp-droplet { - --fa: "\e57c"; } - -.fa-house-medical-circle-check { - --fa: "\e511"; } - -.fa-person-skiing-nordic { - --fa: "\f7ca"; } - -.fa-skiing-nordic { - --fa: "\f7ca"; } - -.fa-calendar-plus { - --fa: "\f271"; } - -.fa-plane-arrival { - --fa: "\f5af"; } - -.fa-circle-left { - --fa: "\f359"; } - -.fa-arrow-alt-circle-left { - --fa: "\f359"; } - -.fa-train-subway { - --fa: "\f239"; } - -.fa-subway { - --fa: "\f239"; } - -.fa-chart-gantt { - --fa: "\e0e4"; } - -.fa-indian-rupee-sign { - --fa: "\e1bc"; } - -.fa-indian-rupee { - --fa: "\e1bc"; } - -.fa-inr { - --fa: "\e1bc"; } - -.fa-crop-simple { - --fa: "\f565"; } - -.fa-crop-alt { - --fa: "\f565"; } - -.fa-money-bill-1 { - --fa: "\f3d1"; } - -.fa-money-bill-alt { - --fa: "\f3d1"; } - -.fa-left-long { - --fa: "\f30a"; } - -.fa-long-arrow-alt-left { - --fa: "\f30a"; } - -.fa-dna { - --fa: "\f471"; } - -.fa-virus-slash { - --fa: "\e075"; } - -.fa-minus { - --fa: "\f068"; } - -.fa-subtract { - --fa: "\f068"; } - -.fa-chess { - --fa: "\f439"; } - -.fa-arrow-left-long { - --fa: "\f177"; } - -.fa-long-arrow-left { - --fa: "\f177"; } - -.fa-plug-circle-check { - --fa: "\e55c"; } - -.fa-street-view { - --fa: "\f21d"; } - -.fa-franc-sign { - --fa: "\e18f"; } - -.fa-volume-off { - --fa: "\f026"; } - -.fa-hands-asl-interpreting { - --fa: "\f2a3"; } - -.fa-american-sign-language-interpreting { - --fa: "\f2a3"; } - -.fa-asl-interpreting { - --fa: "\f2a3"; } - -.fa-hands-american-sign-language-interpreting { - --fa: "\f2a3"; } - -.fa-gear { - --fa: "\f013"; } - -.fa-cog { - --fa: "\f013"; } - -.fa-droplet-slash { - --fa: "\f5c7"; } - -.fa-tint-slash { - --fa: "\f5c7"; } - -.fa-mosque { - --fa: "\f678"; } - -.fa-mosquito { - --fa: "\e52b"; } - -.fa-star-of-david { - --fa: "\f69a"; } - -.fa-person-military-rifle { - --fa: "\e54b"; } - -.fa-cart-shopping { - --fa: "\f07a"; } - -.fa-shopping-cart { - --fa: "\f07a"; } - -.fa-vials { - --fa: "\f493"; } - -.fa-plug-circle-plus { - --fa: "\e55f"; } - -.fa-place-of-worship { - --fa: "\f67f"; } - -.fa-grip-vertical { - --fa: "\f58e"; } - -.fa-hexagon-nodes { - --fa: "\e699"; } - -.fa-arrow-turn-up { - --fa: "\f148"; } - -.fa-level-up { - --fa: "\f148"; } - -.fa-u { - --fa: "\55"; } - -.fa-square-root-variable { - --fa: "\f698"; } - -.fa-square-root-alt { - --fa: "\f698"; } - -.fa-clock { - --fa: "\f017"; } - -.fa-clock-four { - --fa: "\f017"; } - -.fa-backward-step { - --fa: "\f048"; } - -.fa-step-backward { - --fa: "\f048"; } - -.fa-pallet { - --fa: "\f482"; } - -.fa-faucet { - --fa: "\e005"; } - -.fa-baseball-bat-ball { - --fa: "\f432"; } - -.fa-s { - --fa: "\53"; } - -.fa-timeline { - --fa: "\e29c"; } - -.fa-keyboard { - --fa: "\f11c"; } - -.fa-caret-down { - --fa: "\f0d7"; } - -.fa-house-chimney-medical { - --fa: "\f7f2"; } - -.fa-clinic-medical { - --fa: "\f7f2"; } - -.fa-temperature-three-quarters { - --fa: "\f2c8"; } - -.fa-temperature-3 { - --fa: "\f2c8"; } - -.fa-thermometer-3 { - --fa: "\f2c8"; } - -.fa-thermometer-three-quarters { - --fa: "\f2c8"; } - -.fa-mobile-screen { - --fa: "\f3cf"; } - -.fa-mobile-android-alt { - --fa: "\f3cf"; } - -.fa-plane-up { - --fa: "\e22d"; } - -.fa-piggy-bank { - --fa: "\f4d3"; } - -.fa-battery-half { - --fa: "\f242"; } - -.fa-battery-3 { - --fa: "\f242"; } - -.fa-mountain-city { - --fa: "\e52e"; } - -.fa-coins { - --fa: "\f51e"; } - -.fa-khanda { - --fa: "\f66d"; } - -.fa-sliders { - --fa: "\f1de"; } - -.fa-sliders-h { - --fa: "\f1de"; } - -.fa-folder-tree { - --fa: "\f802"; } - -.fa-network-wired { - --fa: "\f6ff"; } - -.fa-map-pin { - --fa: "\f276"; } - -.fa-hamsa { - --fa: "\f665"; } - -.fa-cent-sign { - --fa: "\e3f5"; } - -.fa-flask { - --fa: "\f0c3"; } - -.fa-person-pregnant { - --fa: "\e31e"; } - -.fa-wand-sparkles { - --fa: "\f72b"; } - -.fa-ellipsis-vertical { - --fa: "\f142"; } - -.fa-ellipsis-v { - --fa: "\f142"; } - -.fa-ticket { - --fa: "\f145"; } - -.fa-power-off { - --fa: "\f011"; } - -.fa-right-long { - --fa: "\f30b"; } - -.fa-long-arrow-alt-right { - --fa: "\f30b"; } - -.fa-flag-usa { - --fa: "\f74d"; } - -.fa-laptop-file { - --fa: "\e51d"; } - -.fa-tty { - --fa: "\f1e4"; } - -.fa-teletype { - --fa: "\f1e4"; } - -.fa-diagram-next { - --fa: "\e476"; } - -.fa-person-rifle { - --fa: "\e54e"; } - -.fa-house-medical-circle-exclamation { - --fa: "\e512"; } - -.fa-closed-captioning { - --fa: "\f20a"; } - -.fa-person-hiking { - --fa: "\f6ec"; } - -.fa-hiking { - --fa: "\f6ec"; } - -.fa-venus-double { - --fa: "\f226"; } - -.fa-images { - --fa: "\f302"; } - -.fa-calculator { - --fa: "\f1ec"; } - -.fa-people-pulling { - --fa: "\e535"; } - -.fa-n { - --fa: "\4e"; } - -.fa-cable-car { - --fa: "\f7da"; } - -.fa-tram { - --fa: "\f7da"; } - -.fa-cloud-rain { - --fa: "\f73d"; } - -.fa-building-circle-xmark { - --fa: "\e4d4"; } - -.fa-ship { - --fa: "\f21a"; } - -.fa-arrows-down-to-line { - --fa: "\e4b8"; } - -.fa-download { - --fa: "\f019"; } - -.fa-face-grin { - --fa: "\f580"; } - -.fa-grin { - --fa: "\f580"; } - -.fa-delete-left { - --fa: "\f55a"; } - -.fa-backspace { - --fa: "\f55a"; } - -.fa-eye-dropper { - --fa: "\f1fb"; } - -.fa-eye-dropper-empty { - --fa: "\f1fb"; } - -.fa-eyedropper { - --fa: "\f1fb"; } - -.fa-file-circle-check { - --fa: "\e5a0"; } - -.fa-forward { - --fa: "\f04e"; } - -.fa-mobile { - --fa: "\f3ce"; } - -.fa-mobile-android { - --fa: "\f3ce"; } - -.fa-mobile-phone { - --fa: "\f3ce"; } - -.fa-face-meh { - --fa: "\f11a"; } - -.fa-meh { - --fa: "\f11a"; } - -.fa-align-center { - --fa: "\f037"; } - -.fa-book-skull { - --fa: "\f6b7"; } - -.fa-book-dead { - --fa: "\f6b7"; } - -.fa-id-card { - --fa: "\f2c2"; } - -.fa-drivers-license { - --fa: "\f2c2"; } - -.fa-outdent { - --fa: "\f03b"; } - -.fa-dedent { - --fa: "\f03b"; } - -.fa-heart-circle-exclamation { - --fa: "\e4fe"; } - -.fa-house { - --fa: "\f015"; } - -.fa-home { - --fa: "\f015"; } - -.fa-home-alt { - --fa: "\f015"; } - -.fa-home-lg-alt { - --fa: "\f015"; } - -.fa-calendar-week { - --fa: "\f784"; } - -.fa-laptop-medical { - --fa: "\f812"; } - -.fa-b { - --fa: "\42"; } - -.fa-file-medical { - --fa: "\f477"; } - -.fa-dice-one { - --fa: "\f525"; } - -.fa-kiwi-bird { - --fa: "\f535"; } - -.fa-arrow-right-arrow-left { - --fa: "\f0ec"; } - -.fa-exchange { - --fa: "\f0ec"; } - -.fa-rotate-right { - --fa: "\f2f9"; } - -.fa-redo-alt { - --fa: "\f2f9"; } - -.fa-rotate-forward { - --fa: "\f2f9"; } - -.fa-utensils { - --fa: "\f2e7"; } - -.fa-cutlery { - --fa: "\f2e7"; } - -.fa-arrow-up-wide-short { - --fa: "\f161"; } - -.fa-sort-amount-up { - --fa: "\f161"; } - -.fa-mill-sign { - --fa: "\e1ed"; } - -.fa-bowl-rice { - --fa: "\e2eb"; } - -.fa-skull { - --fa: "\f54c"; } - -.fa-tower-broadcast { - --fa: "\f519"; } - -.fa-broadcast-tower { - --fa: "\f519"; } - -.fa-truck-pickup { - --fa: "\f63c"; } - -.fa-up-long { - --fa: "\f30c"; } - -.fa-long-arrow-alt-up { - --fa: "\f30c"; } - -.fa-stop { - --fa: "\f04d"; } - -.fa-code-merge { - --fa: "\f387"; } - -.fa-upload { - --fa: "\f093"; } - -.fa-hurricane { - --fa: "\f751"; } - -.fa-mound { - --fa: "\e52d"; } - -.fa-toilet-portable { - --fa: "\e583"; } - -.fa-compact-disc { - --fa: "\f51f"; } - -.fa-file-arrow-down { - --fa: "\f56d"; } - -.fa-file-download { - --fa: "\f56d"; } - -.fa-caravan { - --fa: "\f8ff"; } - -.fa-shield-cat { - --fa: "\e572"; } - -.fa-bolt { - --fa: "\f0e7"; } - -.fa-zap { - --fa: "\f0e7"; } - -.fa-glass-water { - --fa: "\e4f4"; } - -.fa-oil-well { - --fa: "\e532"; } - -.fa-vault { - --fa: "\e2c5"; } - -.fa-mars { - --fa: "\f222"; } - -.fa-toilet { - --fa: "\f7d8"; } - -.fa-plane-circle-xmark { - --fa: "\e557"; } - -.fa-yen-sign { - --fa: "\f157"; } - -.fa-cny { - --fa: "\f157"; } - -.fa-jpy { - --fa: "\f157"; } - -.fa-rmb { - --fa: "\f157"; } - -.fa-yen { - --fa: "\f157"; } - -.fa-ruble-sign { - --fa: "\f158"; } - -.fa-rouble { - --fa: "\f158"; } - -.fa-rub { - --fa: "\f158"; } - -.fa-ruble { - --fa: "\f158"; } - -.fa-sun { - --fa: "\f185"; } - -.fa-guitar { - --fa: "\f7a6"; } - -.fa-face-laugh-wink { - --fa: "\f59c"; } - -.fa-laugh-wink { - --fa: "\f59c"; } - -.fa-horse-head { - --fa: "\f7ab"; } - -.fa-bore-hole { - --fa: "\e4c3"; } - -.fa-industry { - --fa: "\f275"; } - -.fa-circle-down { - --fa: "\f358"; } - -.fa-arrow-alt-circle-down { - --fa: "\f358"; } - -.fa-arrows-turn-to-dots { - --fa: "\e4c1"; } - -.fa-florin-sign { - --fa: "\e184"; } - -.fa-arrow-down-short-wide { - --fa: "\f884"; } - -.fa-sort-amount-desc { - --fa: "\f884"; } - -.fa-sort-amount-down-alt { - --fa: "\f884"; } - -.fa-less-than { - --fa: "\3c"; } - -.fa-angle-down { - --fa: "\f107"; } - -.fa-car-tunnel { - --fa: "\e4de"; } - -.fa-head-side-cough { - --fa: "\e061"; } - -.fa-grip-lines { - --fa: "\f7a4"; } - -.fa-thumbs-down { - --fa: "\f165"; } - -.fa-user-lock { - --fa: "\f502"; } - -.fa-arrow-right-long { - --fa: "\f178"; } - -.fa-long-arrow-right { - --fa: "\f178"; } - -.fa-anchor-circle-xmark { - --fa: "\e4ac"; } - -.fa-ellipsis { - --fa: "\f141"; } - -.fa-ellipsis-h { - --fa: "\f141"; } - -.fa-chess-pawn { - --fa: "\f443"; } - -.fa-kit-medical { - --fa: "\f479"; } - -.fa-first-aid { - --fa: "\f479"; } - -.fa-person-through-window { - --fa: "\e5a9"; } - -.fa-toolbox { - --fa: "\f552"; } - -.fa-hands-holding-circle { - --fa: "\e4fb"; } - -.fa-bug { - --fa: "\f188"; } - -.fa-credit-card { - --fa: "\f09d"; } - -.fa-credit-card-alt { - --fa: "\f09d"; } - -.fa-car { - --fa: "\f1b9"; } - -.fa-automobile { - --fa: "\f1b9"; } - -.fa-hand-holding-hand { - --fa: "\e4f7"; } - -.fa-book-open-reader { - --fa: "\f5da"; } - -.fa-book-reader { - --fa: "\f5da"; } - -.fa-mountain-sun { - --fa: "\e52f"; } - -.fa-arrows-left-right-to-line { - --fa: "\e4ba"; } - -.fa-dice-d20 { - --fa: "\f6cf"; } - -.fa-truck-droplet { - --fa: "\e58c"; } - -.fa-file-circle-xmark { - --fa: "\e5a1"; } - -.fa-temperature-arrow-up { - --fa: "\e040"; } - -.fa-temperature-up { - --fa: "\e040"; } - -.fa-medal { - --fa: "\f5a2"; } - -.fa-bed { - --fa: "\f236"; } - -.fa-square-h { - --fa: "\f0fd"; } - -.fa-h-square { - --fa: "\f0fd"; } - -.fa-podcast { - --fa: "\f2ce"; } - -.fa-temperature-full { - --fa: "\f2c7"; } - -.fa-temperature-4 { - --fa: "\f2c7"; } - -.fa-thermometer-4 { - --fa: "\f2c7"; } - -.fa-thermometer-full { - --fa: "\f2c7"; } - -.fa-bell { - --fa: "\f0f3"; } - -.fa-superscript { - --fa: "\f12b"; } - -.fa-plug-circle-xmark { - --fa: "\e560"; } - -.fa-star-of-life { - --fa: "\f621"; } - -.fa-phone-slash { - --fa: "\f3dd"; } - -.fa-paint-roller { - --fa: "\f5aa"; } - -.fa-handshake-angle { - --fa: "\f4c4"; } - -.fa-hands-helping { - --fa: "\f4c4"; } - -.fa-location-dot { - --fa: "\f3c5"; } - -.fa-map-marker-alt { - --fa: "\f3c5"; } - -.fa-file { - --fa: "\f15b"; } - -.fa-greater-than { - --fa: "\3e"; } - -.fa-person-swimming { - --fa: "\f5c4"; } - -.fa-swimmer { - --fa: "\f5c4"; } - -.fa-arrow-down { - --fa: "\f063"; } - -.fa-droplet { - --fa: "\f043"; } - -.fa-tint { - --fa: "\f043"; } - -.fa-eraser { - --fa: "\f12d"; } - -.fa-earth-americas { - --fa: "\f57d"; } - -.fa-earth { - --fa: "\f57d"; } - -.fa-earth-america { - --fa: "\f57d"; } - -.fa-globe-americas { - --fa: "\f57d"; } - -.fa-person-burst { - --fa: "\e53b"; } - -.fa-dove { - --fa: "\f4ba"; } - -.fa-battery-empty { - --fa: "\f244"; } - -.fa-battery-0 { - --fa: "\f244"; } - -.fa-socks { - --fa: "\f696"; } - -.fa-inbox { - --fa: "\f01c"; } - -.fa-section { - --fa: "\e447"; } - -.fa-gauge-high { - --fa: "\f625"; } - -.fa-tachometer-alt { - --fa: "\f625"; } - -.fa-tachometer-alt-fast { - --fa: "\f625"; } - -.fa-envelope-open-text { - --fa: "\f658"; } - -.fa-hospital { - --fa: "\f0f8"; } - -.fa-hospital-alt { - --fa: "\f0f8"; } - -.fa-hospital-wide { - --fa: "\f0f8"; } - -.fa-wine-bottle { - --fa: "\f72f"; } - -.fa-chess-rook { - --fa: "\f447"; } - -.fa-bars-staggered { - --fa: "\f550"; } - -.fa-reorder { - --fa: "\f550"; } - -.fa-stream { - --fa: "\f550"; } - -.fa-dharmachakra { - --fa: "\f655"; } - -.fa-hotdog { - --fa: "\f80f"; } - -.fa-person-walking-with-cane { - --fa: "\f29d"; } - -.fa-blind { - --fa: "\f29d"; } - -.fa-drum { - --fa: "\f569"; } - -.fa-ice-cream { - --fa: "\f810"; } - -.fa-heart-circle-bolt { - --fa: "\e4fc"; } - -.fa-fax { - --fa: "\f1ac"; } - -.fa-paragraph { - --fa: "\f1dd"; } - -.fa-check-to-slot { - --fa: "\f772"; } - -.fa-vote-yea { - --fa: "\f772"; } - -.fa-star-half { - --fa: "\f089"; } - -.fa-boxes-stacked { - --fa: "\f468"; } - -.fa-boxes { - --fa: "\f468"; } - -.fa-boxes-alt { - --fa: "\f468"; } - -.fa-link { - --fa: "\f0c1"; } - -.fa-chain { - --fa: "\f0c1"; } - -.fa-ear-listen { - --fa: "\f2a2"; } - -.fa-assistive-listening-systems { - --fa: "\f2a2"; } - -.fa-tree-city { - --fa: "\e587"; } - -.fa-play { - --fa: "\f04b"; } - -.fa-font { - --fa: "\f031"; } - -.fa-table-cells-row-lock { - --fa: "\e67a"; } - -.fa-rupiah-sign { - --fa: "\e23d"; } - -.fa-magnifying-glass { - --fa: "\f002"; } - -.fa-search { - --fa: "\f002"; } - -.fa-table-tennis-paddle-ball { - --fa: "\f45d"; } - -.fa-ping-pong-paddle-ball { - --fa: "\f45d"; } - -.fa-table-tennis { - --fa: "\f45d"; } - -.fa-person-dots-from-line { - --fa: "\f470"; } - -.fa-diagnoses { - --fa: "\f470"; } - -.fa-trash-can-arrow-up { - --fa: "\f82a"; } - -.fa-trash-restore-alt { - --fa: "\f82a"; } - -.fa-naira-sign { - --fa: "\e1f6"; } - -.fa-cart-arrow-down { - --fa: "\f218"; } - -.fa-walkie-talkie { - --fa: "\f8ef"; } - -.fa-file-pen { - --fa: "\f31c"; } - -.fa-file-edit { - --fa: "\f31c"; } - -.fa-receipt { - --fa: "\f543"; } - -.fa-square-pen { - --fa: "\f14b"; } - -.fa-pen-square { - --fa: "\f14b"; } - -.fa-pencil-square { - --fa: "\f14b"; } - -.fa-suitcase-rolling { - --fa: "\f5c1"; } - -.fa-person-circle-exclamation { - --fa: "\e53f"; } - -.fa-chevron-down { - --fa: "\f078"; } - -.fa-battery-full { - --fa: "\f240"; } - -.fa-battery { - --fa: "\f240"; } - -.fa-battery-5 { - --fa: "\f240"; } - -.fa-skull-crossbones { - --fa: "\f714"; } - -.fa-code-compare { - --fa: "\e13a"; } - -.fa-list-ul { - --fa: "\f0ca"; } - -.fa-list-dots { - --fa: "\f0ca"; } - -.fa-school-lock { - --fa: "\e56f"; } - -.fa-tower-cell { - --fa: "\e585"; } - -.fa-down-long { - --fa: "\f309"; } - -.fa-long-arrow-alt-down { - --fa: "\f309"; } - -.fa-ranking-star { - --fa: "\e561"; } - -.fa-chess-king { - --fa: "\f43f"; } - -.fa-person-harassing { - --fa: "\e549"; } - -.fa-brazilian-real-sign { - --fa: "\e46c"; } - -.fa-landmark-dome { - --fa: "\f752"; } - -.fa-landmark-alt { - --fa: "\f752"; } - -.fa-arrow-up { - --fa: "\f062"; } - -.fa-tv { - --fa: "\f26c"; } - -.fa-television { - --fa: "\f26c"; } - -.fa-tv-alt { - --fa: "\f26c"; } - -.fa-shrimp { - --fa: "\e448"; } - -.fa-list-check { - --fa: "\f0ae"; } - -.fa-tasks { - --fa: "\f0ae"; } - -.fa-jug-detergent { - --fa: "\e519"; } - -.fa-circle-user { - --fa: "\f2bd"; } - -.fa-user-circle { - --fa: "\f2bd"; } - -.fa-user-shield { - --fa: "\f505"; } - -.fa-wind { - --fa: "\f72e"; } - -.fa-car-burst { - --fa: "\f5e1"; } - -.fa-car-crash { - --fa: "\f5e1"; } - -.fa-y { - --fa: "\59"; } - -.fa-person-snowboarding { - --fa: "\f7ce"; } - -.fa-snowboarding { - --fa: "\f7ce"; } - -.fa-truck-fast { - --fa: "\f48b"; } - -.fa-shipping-fast { - --fa: "\f48b"; } - -.fa-fish { - --fa: "\f578"; } - -.fa-user-graduate { - --fa: "\f501"; } - -.fa-circle-half-stroke { - --fa: "\f042"; } - -.fa-adjust { - --fa: "\f042"; } - -.fa-clapperboard { - --fa: "\e131"; } - -.fa-circle-radiation { - --fa: "\f7ba"; } - -.fa-radiation-alt { - --fa: "\f7ba"; } - -.fa-baseball { - --fa: "\f433"; } - -.fa-baseball-ball { - --fa: "\f433"; } - -.fa-jet-fighter-up { - --fa: "\e518"; } - -.fa-diagram-project { - --fa: "\f542"; } - -.fa-project-diagram { - --fa: "\f542"; } - -.fa-copy { - --fa: "\f0c5"; } - -.fa-volume-xmark { - --fa: "\f6a9"; } - -.fa-volume-mute { - --fa: "\f6a9"; } - -.fa-volume-times { - --fa: "\f6a9"; } - -.fa-hand-sparkles { - --fa: "\e05d"; } - -.fa-grip { - --fa: "\f58d"; } - -.fa-grip-horizontal { - --fa: "\f58d"; } - -.fa-share-from-square { - --fa: "\f14d"; } - -.fa-share-square { - --fa: "\f14d"; } - -.fa-child-combatant { - --fa: "\e4e0"; } - -.fa-child-rifle { - --fa: "\e4e0"; } - -.fa-gun { - --fa: "\e19b"; } - -.fa-square-phone { - --fa: "\f098"; } - -.fa-phone-square { - --fa: "\f098"; } - -.fa-plus { - --fa: "\2b"; } - -.fa-add { - --fa: "\2b"; } - -.fa-expand { - --fa: "\f065"; } - -.fa-computer { - --fa: "\e4e5"; } - -.fa-xmark { - --fa: "\f00d"; } - -.fa-close { - --fa: "\f00d"; } - -.fa-multiply { - --fa: "\f00d"; } - -.fa-remove { - --fa: "\f00d"; } - -.fa-times { - --fa: "\f00d"; } - -.fa-arrows-up-down-left-right { - --fa: "\f047"; } - -.fa-arrows { - --fa: "\f047"; } - -.fa-chalkboard-user { - --fa: "\f51c"; } - -.fa-chalkboard-teacher { - --fa: "\f51c"; } - -.fa-peso-sign { - --fa: "\e222"; } - -.fa-building-shield { - --fa: "\e4d8"; } - -.fa-baby { - --fa: "\f77c"; } - -.fa-users-line { - --fa: "\e592"; } - -.fa-quote-left { - --fa: "\f10d"; } - -.fa-quote-left-alt { - --fa: "\f10d"; } - -.fa-tractor { - --fa: "\f722"; } - -.fa-trash-arrow-up { - --fa: "\f829"; } - -.fa-trash-restore { - --fa: "\f829"; } - -.fa-arrow-down-up-lock { - --fa: "\e4b0"; } - -.fa-lines-leaning { - --fa: "\e51e"; } - -.fa-ruler-combined { - --fa: "\f546"; } - -.fa-copyright { - --fa: "\f1f9"; } - -.fa-equals { - --fa: "\3d"; } - -.fa-blender { - --fa: "\f517"; } - -.fa-teeth { - --fa: "\f62e"; } - -.fa-shekel-sign { - --fa: "\f20b"; } - -.fa-ils { - --fa: "\f20b"; } - -.fa-shekel { - --fa: "\f20b"; } - -.fa-sheqel { - --fa: "\f20b"; } - -.fa-sheqel-sign { - --fa: "\f20b"; } - -.fa-map { - --fa: "\f279"; } - -.fa-rocket { - --fa: "\f135"; } - -.fa-photo-film { - --fa: "\f87c"; } - -.fa-photo-video { - --fa: "\f87c"; } - -.fa-folder-minus { - --fa: "\f65d"; } - -.fa-hexagon-nodes-bolt { - --fa: "\e69a"; } - -.fa-store { - --fa: "\f54e"; } - -.fa-arrow-trend-up { - --fa: "\e098"; } - -.fa-plug-circle-minus { - --fa: "\e55e"; } - -.fa-sign-hanging { - --fa: "\f4d9"; } - -.fa-sign { - --fa: "\f4d9"; } - -.fa-bezier-curve { - --fa: "\f55b"; } - -.fa-bell-slash { - --fa: "\f1f6"; } - -.fa-tablet { - --fa: "\f3fb"; } - -.fa-tablet-android { - --fa: "\f3fb"; } - -.fa-school-flag { - --fa: "\e56e"; } - -.fa-fill { - --fa: "\f575"; } - -.fa-angle-up { - --fa: "\f106"; } - -.fa-drumstick-bite { - --fa: "\f6d7"; } - -.fa-holly-berry { - --fa: "\f7aa"; } - -.fa-chevron-left { - --fa: "\f053"; } - -.fa-bacteria { - --fa: "\e059"; } - -.fa-hand-lizard { - --fa: "\f258"; } - -.fa-notdef { - --fa: "\e1fe"; } - -.fa-disease { - --fa: "\f7fa"; } - -.fa-briefcase-medical { - --fa: "\f469"; } - -.fa-genderless { - --fa: "\f22d"; } - -.fa-chevron-right { - --fa: "\f054"; } - -.fa-retweet { - --fa: "\f079"; } - -.fa-car-rear { - --fa: "\f5de"; } - -.fa-car-alt { - --fa: "\f5de"; } - -.fa-pump-soap { - --fa: "\e06b"; } - -.fa-video-slash { - --fa: "\f4e2"; } - -.fa-battery-quarter { - --fa: "\f243"; } - -.fa-battery-2 { - --fa: "\f243"; } - -.fa-radio { - --fa: "\f8d7"; } - -.fa-baby-carriage { - --fa: "\f77d"; } - -.fa-carriage-baby { - --fa: "\f77d"; } - -.fa-traffic-light { - --fa: "\f637"; } - -.fa-thermometer { - --fa: "\f491"; } - -.fa-vr-cardboard { - --fa: "\f729"; } - -.fa-hand-middle-finger { - --fa: "\f806"; } - -.fa-percent { - --fa: "\25"; } - -.fa-percentage { - --fa: "\25"; } - -.fa-truck-moving { - --fa: "\f4df"; } - -.fa-glass-water-droplet { - --fa: "\e4f5"; } - -.fa-display { - --fa: "\e163"; } - -.fa-face-smile { - --fa: "\f118"; } - -.fa-smile { - --fa: "\f118"; } - -.fa-thumbtack { - --fa: "\f08d"; } - -.fa-thumb-tack { - --fa: "\f08d"; } - -.fa-trophy { - --fa: "\f091"; } - -.fa-person-praying { - --fa: "\f683"; } - -.fa-pray { - --fa: "\f683"; } - -.fa-hammer { - --fa: "\f6e3"; } - -.fa-hand-peace { - --fa: "\f25b"; } - -.fa-rotate { - --fa: "\f2f1"; } - -.fa-sync-alt { - --fa: "\f2f1"; } - -.fa-spinner { - --fa: "\f110"; } - -.fa-robot { - --fa: "\f544"; } - -.fa-peace { - --fa: "\f67c"; } - -.fa-gears { - --fa: "\f085"; } - -.fa-cogs { - --fa: "\f085"; } - -.fa-warehouse { - --fa: "\f494"; } - -.fa-arrow-up-right-dots { - --fa: "\e4b7"; } - -.fa-splotch { - --fa: "\f5bc"; } - -.fa-face-grin-hearts { - --fa: "\f584"; } - -.fa-grin-hearts { - --fa: "\f584"; } - -.fa-dice-four { - --fa: "\f524"; } - -.fa-sim-card { - --fa: "\f7c4"; } - -.fa-transgender { - --fa: "\f225"; } - -.fa-transgender-alt { - --fa: "\f225"; } - -.fa-mercury { - --fa: "\f223"; } - -.fa-arrow-turn-down { - --fa: "\f149"; } - -.fa-level-down { - --fa: "\f149"; } - -.fa-person-falling-burst { - --fa: "\e547"; } - -.fa-award { - --fa: "\f559"; } - -.fa-ticket-simple { - --fa: "\f3ff"; } - -.fa-ticket-alt { - --fa: "\f3ff"; } - -.fa-building { - --fa: "\f1ad"; } - -.fa-angles-left { - --fa: "\f100"; } - -.fa-angle-double-left { - --fa: "\f100"; } - -.fa-qrcode { - --fa: "\f029"; } - -.fa-clock-rotate-left { - --fa: "\f1da"; } - -.fa-history { - --fa: "\f1da"; } - -.fa-face-grin-beam-sweat { - --fa: "\f583"; } - -.fa-grin-beam-sweat { - --fa: "\f583"; } - -.fa-file-export { - --fa: "\f56e"; } - -.fa-arrow-right-from-file { - --fa: "\f56e"; } - -.fa-shield { - --fa: "\f132"; } - -.fa-shield-blank { - --fa: "\f132"; } - -.fa-arrow-up-short-wide { - --fa: "\f885"; } - -.fa-sort-amount-up-alt { - --fa: "\f885"; } - -.fa-comment-nodes { - --fa: "\e696"; } - -.fa-house-medical { - --fa: "\e3b2"; } - -.fa-golf-ball-tee { - --fa: "\f450"; } - -.fa-golf-ball { - --fa: "\f450"; } - -.fa-circle-chevron-left { - --fa: "\f137"; } - -.fa-chevron-circle-left { - --fa: "\f137"; } - -.fa-house-chimney-window { - --fa: "\e00d"; } - -.fa-pen-nib { - --fa: "\f5ad"; } - -.fa-tent-arrow-turn-left { - --fa: "\e580"; } - -.fa-tents { - --fa: "\e582"; } - -.fa-wand-magic { - --fa: "\f0d0"; } - -.fa-magic { - --fa: "\f0d0"; } - -.fa-dog { - --fa: "\f6d3"; } - -.fa-carrot { - --fa: "\f787"; } - -.fa-moon { - --fa: "\f186"; } - -.fa-wine-glass-empty { - --fa: "\f5ce"; } - -.fa-wine-glass-alt { - --fa: "\f5ce"; } - -.fa-cheese { - --fa: "\f7ef"; } - -.fa-yin-yang { - --fa: "\f6ad"; } - -.fa-music { - --fa: "\f001"; } - -.fa-code-commit { - --fa: "\f386"; } - -.fa-temperature-low { - --fa: "\f76b"; } - -.fa-person-biking { - --fa: "\f84a"; } - -.fa-biking { - --fa: "\f84a"; } - -.fa-broom { - --fa: "\f51a"; } - -.fa-shield-heart { - --fa: "\e574"; } - -.fa-gopuram { - --fa: "\f664"; } - -.fa-earth-oceania { - --fa: "\e47b"; } - -.fa-globe-oceania { - --fa: "\e47b"; } - -.fa-square-xmark { - --fa: "\f2d3"; } - -.fa-times-square { - --fa: "\f2d3"; } - -.fa-xmark-square { - --fa: "\f2d3"; } - -.fa-hashtag { - --fa: "\23"; } - -.fa-up-right-and-down-left-from-center { - --fa: "\f424"; } - -.fa-expand-alt { - --fa: "\f424"; } - -.fa-oil-can { - --fa: "\f613"; } - -.fa-t { - --fa: "\54"; } - -.fa-hippo { - --fa: "\f6ed"; } - -.fa-chart-column { - --fa: "\e0e3"; } - -.fa-infinity { - --fa: "\f534"; } - -.fa-vial-circle-check { - --fa: "\e596"; } - -.fa-person-arrow-down-to-line { - --fa: "\e538"; } - -.fa-voicemail { - --fa: "\f897"; } - -.fa-fan { - --fa: "\f863"; } - -.fa-person-walking-luggage { - --fa: "\e554"; } - -.fa-up-down { - --fa: "\f338"; } - -.fa-arrows-alt-v { - --fa: "\f338"; } - -.fa-cloud-moon-rain { - --fa: "\f73c"; } - -.fa-calendar { - --fa: "\f133"; } - -.fa-trailer { - --fa: "\e041"; } - -.fa-bahai { - --fa: "\f666"; } - -.fa-haykal { - --fa: "\f666"; } - -.fa-sd-card { - --fa: "\f7c2"; } - -.fa-dragon { - --fa: "\f6d5"; } - -.fa-shoe-prints { - --fa: "\f54b"; } - -.fa-circle-plus { - --fa: "\f055"; } - -.fa-plus-circle { - --fa: "\f055"; } - -.fa-face-grin-tongue-wink { - --fa: "\f58b"; } - -.fa-grin-tongue-wink { - --fa: "\f58b"; } - -.fa-hand-holding { - --fa: "\f4bd"; } - -.fa-plug-circle-exclamation { - --fa: "\e55d"; } - -.fa-link-slash { - --fa: "\f127"; } - -.fa-chain-broken { - --fa: "\f127"; } - -.fa-chain-slash { - --fa: "\f127"; } - -.fa-unlink { - --fa: "\f127"; } - -.fa-clone { - --fa: "\f24d"; } - -.fa-person-walking-arrow-loop-left { - --fa: "\e551"; } - -.fa-arrow-up-z-a { - --fa: "\f882"; } - -.fa-sort-alpha-up-alt { - --fa: "\f882"; } - -.fa-fire-flame-curved { - --fa: "\f7e4"; } - -.fa-fire-alt { - --fa: "\f7e4"; } - -.fa-tornado { - --fa: "\f76f"; } - -.fa-file-circle-plus { - --fa: "\e494"; } - -.fa-book-quran { - --fa: "\f687"; } - -.fa-quran { - --fa: "\f687"; } - -.fa-anchor { - --fa: "\f13d"; } - -.fa-border-all { - --fa: "\f84c"; } - -.fa-face-angry { - --fa: "\f556"; } - -.fa-angry { - --fa: "\f556"; } - -.fa-cookie-bite { - --fa: "\f564"; } - -.fa-arrow-trend-down { - --fa: "\e097"; } - -.fa-rss { - --fa: "\f09e"; } - -.fa-feed { - --fa: "\f09e"; } - -.fa-draw-polygon { - --fa: "\f5ee"; } - -.fa-scale-balanced { - --fa: "\f24e"; } - -.fa-balance-scale { - --fa: "\f24e"; } - -.fa-gauge-simple-high { - --fa: "\f62a"; } - -.fa-tachometer { - --fa: "\f62a"; } - -.fa-tachometer-fast { - --fa: "\f62a"; } - -.fa-shower { - --fa: "\f2cc"; } - -.fa-desktop { - --fa: "\f390"; } - -.fa-desktop-alt { - --fa: "\f390"; } - -.fa-m { - --fa: "\4d"; } - -.fa-table-list { - --fa: "\f00b"; } - -.fa-th-list { - --fa: "\f00b"; } - -.fa-comment-sms { - --fa: "\f7cd"; } - -.fa-sms { - --fa: "\f7cd"; } - -.fa-book { - --fa: "\f02d"; } - -.fa-user-plus { - --fa: "\f234"; } - -.fa-check { - --fa: "\f00c"; } - -.fa-battery-three-quarters { - --fa: "\f241"; } - -.fa-battery-4 { - --fa: "\f241"; } - -.fa-house-circle-check { - --fa: "\e509"; } - -.fa-angle-left { - --fa: "\f104"; } - -.fa-diagram-successor { - --fa: "\e47a"; } - -.fa-truck-arrow-right { - --fa: "\e58b"; } - -.fa-arrows-split-up-and-left { - --fa: "\e4bc"; } - -.fa-hand-fist { - --fa: "\f6de"; } - -.fa-fist-raised { - --fa: "\f6de"; } - -.fa-cloud-moon { - --fa: "\f6c3"; } - -.fa-briefcase { - --fa: "\f0b1"; } - -.fa-person-falling { - --fa: "\e546"; } - -.fa-image-portrait { - --fa: "\f3e0"; } - -.fa-portrait { - --fa: "\f3e0"; } - -.fa-user-tag { - --fa: "\f507"; } - -.fa-rug { - --fa: "\e569"; } - -.fa-earth-europe { - --fa: "\f7a2"; } - -.fa-globe-europe { - --fa: "\f7a2"; } - -.fa-cart-flatbed-suitcase { - --fa: "\f59d"; } - -.fa-luggage-cart { - --fa: "\f59d"; } - -.fa-rectangle-xmark { - --fa: "\f410"; } - -.fa-rectangle-times { - --fa: "\f410"; } - -.fa-times-rectangle { - --fa: "\f410"; } - -.fa-window-close { - --fa: "\f410"; } - -.fa-baht-sign { - --fa: "\e0ac"; } - -.fa-book-open { - --fa: "\f518"; } - -.fa-book-journal-whills { - --fa: "\f66a"; } - -.fa-journal-whills { - --fa: "\f66a"; } - -.fa-handcuffs { - --fa: "\e4f8"; } - -.fa-triangle-exclamation { - --fa: "\f071"; } - -.fa-exclamation-triangle { - --fa: "\f071"; } - -.fa-warning { - --fa: "\f071"; } - -.fa-database { - --fa: "\f1c0"; } - -.fa-share { - --fa: "\f064"; } - -.fa-mail-forward { - --fa: "\f064"; } - -.fa-bottle-droplet { - --fa: "\e4c4"; } - -.fa-mask-face { - --fa: "\e1d7"; } - -.fa-hill-rockslide { - --fa: "\e508"; } - -.fa-right-left { - --fa: "\f362"; } - -.fa-exchange-alt { - --fa: "\f362"; } - -.fa-paper-plane { - --fa: "\f1d8"; } - -.fa-road-circle-exclamation { - --fa: "\e565"; } - -.fa-dungeon { - --fa: "\f6d9"; } - -.fa-align-right { - --fa: "\f038"; } - -.fa-money-bill-1-wave { - --fa: "\f53b"; } - -.fa-money-bill-wave-alt { - --fa: "\f53b"; } - -.fa-life-ring { - --fa: "\f1cd"; } - -.fa-hands { - --fa: "\f2a7"; } - -.fa-sign-language { - --fa: "\f2a7"; } - -.fa-signing { - --fa: "\f2a7"; } - -.fa-calendar-day { - --fa: "\f783"; } - -.fa-water-ladder { - --fa: "\f5c5"; } - -.fa-ladder-water { - --fa: "\f5c5"; } - -.fa-swimming-pool { - --fa: "\f5c5"; } - -.fa-arrows-up-down { - --fa: "\f07d"; } - -.fa-arrows-v { - --fa: "\f07d"; } - -.fa-face-grimace { - --fa: "\f57f"; } - -.fa-grimace { - --fa: "\f57f"; } - -.fa-wheelchair-move { - --fa: "\e2ce"; } - -.fa-wheelchair-alt { - --fa: "\e2ce"; } - -.fa-turn-down { - --fa: "\f3be"; } - -.fa-level-down-alt { - --fa: "\f3be"; } - -.fa-person-walking-arrow-right { - --fa: "\e552"; } - -.fa-square-envelope { - --fa: "\f199"; } - -.fa-envelope-square { - --fa: "\f199"; } - -.fa-dice { - --fa: "\f522"; } - -.fa-bowling-ball { - --fa: "\f436"; } - -.fa-brain { - --fa: "\f5dc"; } - -.fa-bandage { - --fa: "\f462"; } - -.fa-band-aid { - --fa: "\f462"; } - -.fa-calendar-minus { - --fa: "\f272"; } - -.fa-circle-xmark { - --fa: "\f057"; } - -.fa-times-circle { - --fa: "\f057"; } - -.fa-xmark-circle { - --fa: "\f057"; } - -.fa-gifts { - --fa: "\f79c"; } - -.fa-hotel { - --fa: "\f594"; } - -.fa-earth-asia { - --fa: "\f57e"; } - -.fa-globe-asia { - --fa: "\f57e"; } - -.fa-id-card-clip { - --fa: "\f47f"; } - -.fa-id-card-alt { - --fa: "\f47f"; } - -.fa-magnifying-glass-plus { - --fa: "\f00e"; } - -.fa-search-plus { - --fa: "\f00e"; } - -.fa-thumbs-up { - --fa: "\f164"; } - -.fa-user-clock { - --fa: "\f4fd"; } - -.fa-hand-dots { - --fa: "\f461"; } - -.fa-allergies { - --fa: "\f461"; } - -.fa-file-invoice { - --fa: "\f570"; } - -.fa-window-minimize { - --fa: "\f2d1"; } - -.fa-mug-saucer { - --fa: "\f0f4"; } - -.fa-coffee { - --fa: "\f0f4"; } - -.fa-brush { - --fa: "\f55d"; } - -.fa-file-half-dashed { - --fa: "\e698"; } - -.fa-mask { - --fa: "\f6fa"; } - -.fa-magnifying-glass-minus { - --fa: "\f010"; } - -.fa-search-minus { - --fa: "\f010"; } - -.fa-ruler-vertical { - --fa: "\f548"; } - -.fa-user-large { - --fa: "\f406"; } - -.fa-user-alt { - --fa: "\f406"; } - -.fa-train-tram { - --fa: "\e5b4"; } - -.fa-user-nurse { - --fa: "\f82f"; } - -.fa-syringe { - --fa: "\f48e"; } - -.fa-cloud-sun { - --fa: "\f6c4"; } - -.fa-stopwatch-20 { - --fa: "\e06f"; } - -.fa-square-full { - --fa: "\f45c"; } - -.fa-magnet { - --fa: "\f076"; } - -.fa-jar { - --fa: "\e516"; } - -.fa-note-sticky { - --fa: "\f249"; } - -.fa-sticky-note { - --fa: "\f249"; } - -.fa-bug-slash { - --fa: "\e490"; } - -.fa-arrow-up-from-water-pump { - --fa: "\e4b6"; } - -.fa-bone { - --fa: "\f5d7"; } - -.fa-table-cells-row-unlock { - --fa: "\e691"; } - -.fa-user-injured { - --fa: "\f728"; } - -.fa-face-sad-tear { - --fa: "\f5b4"; } - -.fa-sad-tear { - --fa: "\f5b4"; } - -.fa-plane { - --fa: "\f072"; } - -.fa-tent-arrows-down { - --fa: "\e581"; } - -.fa-exclamation { - --fa: "\21"; } - -.fa-arrows-spin { - --fa: "\e4bb"; } - -.fa-print { - --fa: "\f02f"; } - -.fa-turkish-lira-sign { - --fa: "\e2bb"; } - -.fa-try { - --fa: "\e2bb"; } - -.fa-turkish-lira { - --fa: "\e2bb"; } - -.fa-dollar-sign { - --fa: "\24"; } - -.fa-dollar { - --fa: "\24"; } - -.fa-usd { - --fa: "\24"; } - -.fa-x { - --fa: "\58"; } - -.fa-magnifying-glass-dollar { - --fa: "\f688"; } - -.fa-search-dollar { - --fa: "\f688"; } - -.fa-users-gear { - --fa: "\f509"; } - -.fa-users-cog { - --fa: "\f509"; } - -.fa-person-military-pointing { - --fa: "\e54a"; } - -.fa-building-columns { - --fa: "\f19c"; } - -.fa-bank { - --fa: "\f19c"; } - -.fa-institution { - --fa: "\f19c"; } - -.fa-museum { - --fa: "\f19c"; } - -.fa-university { - --fa: "\f19c"; } - -.fa-umbrella { - --fa: "\f0e9"; } - -.fa-trowel { - --fa: "\e589"; } - -.fa-d { - --fa: "\44"; } - -.fa-stapler { - --fa: "\e5af"; } - -.fa-masks-theater { - --fa: "\f630"; } - -.fa-theater-masks { - --fa: "\f630"; } - -.fa-kip-sign { - --fa: "\e1c4"; } - -.fa-hand-point-left { - --fa: "\f0a5"; } - -.fa-handshake-simple { - --fa: "\f4c6"; } - -.fa-handshake-alt { - --fa: "\f4c6"; } - -.fa-jet-fighter { - --fa: "\f0fb"; } - -.fa-fighter-jet { - --fa: "\f0fb"; } - -.fa-square-share-nodes { - --fa: "\f1e1"; } - -.fa-share-alt-square { - --fa: "\f1e1"; } - -.fa-barcode { - --fa: "\f02a"; } - -.fa-plus-minus { - --fa: "\e43c"; } - -.fa-video { - --fa: "\f03d"; } - -.fa-video-camera { - --fa: "\f03d"; } - -.fa-graduation-cap { - --fa: "\f19d"; } - -.fa-mortar-board { - --fa: "\f19d"; } - -.fa-hand-holding-medical { - --fa: "\e05c"; } - -.fa-person-circle-check { - --fa: "\e53e"; } - -.fa-turn-up { - --fa: "\f3bf"; } - -.fa-level-up-alt { - --fa: "\f3bf"; } - -.sr-only, -.fa-sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } - -.sr-only-focusable:not(:focus), -.fa-sr-only-focusable:not(:focus) { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } diff --git a/files/fontawesome/css/fontawesome.min.css b/files/fontawesome/css/fontawesome.min.css deleted file mode 100644 index 4e07e306c0..0000000000 --- a/files/fontawesome/css/fontawesome.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-regular,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-brands:before,.fa-regular:before,.fa-solid:before,.fa:before,.fab:before,.far:before,.fas:before{content:var(--fa)}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0{--fa:"\30"}.fa-1{--fa:"\31"}.fa-2{--fa:"\32"}.fa-3{--fa:"\33"}.fa-4{--fa:"\34"}.fa-5{--fa:"\35"}.fa-6{--fa:"\36"}.fa-7{--fa:"\37"}.fa-8{--fa:"\38"}.fa-9{--fa:"\39"}.fa-fill-drip{--fa:"\f576"}.fa-arrows-to-circle{--fa:"\e4bd"}.fa-chevron-circle-right,.fa-circle-chevron-right{--fa:"\f138"}.fa-at{--fa:"\40"}.fa-trash-alt,.fa-trash-can{--fa:"\f2ed"}.fa-text-height{--fa:"\f034"}.fa-user-times,.fa-user-xmark{--fa:"\f235"}.fa-stethoscope{--fa:"\f0f1"}.fa-comment-alt,.fa-message{--fa:"\f27a"}.fa-info{--fa:"\f129"}.fa-compress-alt,.fa-down-left-and-up-right-to-center{--fa:"\f422"}.fa-explosion{--fa:"\e4e9"}.fa-file-alt,.fa-file-lines,.fa-file-text{--fa:"\f15c"}.fa-wave-square{--fa:"\f83e"}.fa-ring{--fa:"\f70b"}.fa-building-un{--fa:"\e4d9"}.fa-dice-three{--fa:"\f527"}.fa-calendar-alt,.fa-calendar-days{--fa:"\f073"}.fa-anchor-circle-check{--fa:"\e4aa"}.fa-building-circle-arrow-right{--fa:"\e4d1"}.fa-volleyball,.fa-volleyball-ball{--fa:"\f45f"}.fa-arrows-up-to-line{--fa:"\e4c2"}.fa-sort-desc,.fa-sort-down{--fa:"\f0dd"}.fa-circle-minus,.fa-minus-circle{--fa:"\f056"}.fa-door-open{--fa:"\f52b"}.fa-right-from-bracket,.fa-sign-out-alt{--fa:"\f2f5"}.fa-atom{--fa:"\f5d2"}.fa-soap{--fa:"\e06e"}.fa-heart-music-camera-bolt,.fa-icons{--fa:"\f86d"}.fa-microphone-alt-slash,.fa-microphone-lines-slash{--fa:"\f539"}.fa-bridge-circle-check{--fa:"\e4c9"}.fa-pump-medical{--fa:"\e06a"}.fa-fingerprint{--fa:"\f577"}.fa-hand-point-right{--fa:"\f0a4"}.fa-magnifying-glass-location,.fa-search-location{--fa:"\f689"}.fa-forward-step,.fa-step-forward{--fa:"\f051"}.fa-face-smile-beam,.fa-smile-beam{--fa:"\f5b8"}.fa-flag-checkered{--fa:"\f11e"}.fa-football,.fa-football-ball{--fa:"\f44e"}.fa-school-circle-exclamation{--fa:"\e56c"}.fa-crop{--fa:"\f125"}.fa-angle-double-down,.fa-angles-down{--fa:"\f103"}.fa-users-rectangle{--fa:"\e594"}.fa-people-roof{--fa:"\e537"}.fa-people-line{--fa:"\e534"}.fa-beer,.fa-beer-mug-empty{--fa:"\f0fc"}.fa-diagram-predecessor{--fa:"\e477"}.fa-arrow-up-long,.fa-long-arrow-up{--fa:"\f176"}.fa-burn,.fa-fire-flame-simple{--fa:"\f46a"}.fa-male,.fa-person{--fa:"\f183"}.fa-laptop{--fa:"\f109"}.fa-file-csv{--fa:"\f6dd"}.fa-menorah{--fa:"\f676"}.fa-truck-plane{--fa:"\e58f"}.fa-record-vinyl{--fa:"\f8d9"}.fa-face-grin-stars,.fa-grin-stars{--fa:"\f587"}.fa-bong{--fa:"\f55c"}.fa-pastafarianism,.fa-spaghetti-monster-flying{--fa:"\f67b"}.fa-arrow-down-up-across-line{--fa:"\e4af"}.fa-spoon,.fa-utensil-spoon{--fa:"\f2e5"}.fa-jar-wheat{--fa:"\e517"}.fa-envelopes-bulk,.fa-mail-bulk{--fa:"\f674"}.fa-file-circle-exclamation{--fa:"\e4eb"}.fa-circle-h,.fa-hospital-symbol{--fa:"\f47e"}.fa-pager{--fa:"\f815"}.fa-address-book,.fa-contact-book{--fa:"\f2b9"}.fa-strikethrough{--fa:"\f0cc"}.fa-k{--fa:"\4b"}.fa-landmark-flag{--fa:"\e51c"}.fa-pencil,.fa-pencil-alt{--fa:"\f303"}.fa-backward{--fa:"\f04a"}.fa-caret-right{--fa:"\f0da"}.fa-comments{--fa:"\f086"}.fa-file-clipboard,.fa-paste{--fa:"\f0ea"}.fa-code-pull-request{--fa:"\e13c"}.fa-clipboard-list{--fa:"\f46d"}.fa-truck-loading,.fa-truck-ramp-box{--fa:"\f4de"}.fa-user-check{--fa:"\f4fc"}.fa-vial-virus{--fa:"\e597"}.fa-sheet-plastic{--fa:"\e571"}.fa-blog{--fa:"\f781"}.fa-user-ninja{--fa:"\f504"}.fa-person-arrow-up-from-line{--fa:"\e539"}.fa-scroll-torah,.fa-torah{--fa:"\f6a0"}.fa-broom-ball,.fa-quidditch,.fa-quidditch-broom-ball{--fa:"\f458"}.fa-toggle-off{--fa:"\f204"}.fa-archive,.fa-box-archive{--fa:"\f187"}.fa-person-drowning{--fa:"\e545"}.fa-arrow-down-9-1,.fa-sort-numeric-desc,.fa-sort-numeric-down-alt{--fa:"\f886"}.fa-face-grin-tongue-squint,.fa-grin-tongue-squint{--fa:"\f58a"}.fa-spray-can{--fa:"\f5bd"}.fa-truck-monster{--fa:"\f63b"}.fa-w{--fa:"\57"}.fa-earth-africa,.fa-globe-africa{--fa:"\f57c"}.fa-rainbow{--fa:"\f75b"}.fa-circle-notch{--fa:"\f1ce"}.fa-tablet-alt,.fa-tablet-screen-button{--fa:"\f3fa"}.fa-paw{--fa:"\f1b0"}.fa-cloud{--fa:"\f0c2"}.fa-trowel-bricks{--fa:"\e58a"}.fa-face-flushed,.fa-flushed{--fa:"\f579"}.fa-hospital-user{--fa:"\f80d"}.fa-tent-arrow-left-right{--fa:"\e57f"}.fa-gavel,.fa-legal{--fa:"\f0e3"}.fa-binoculars{--fa:"\f1e5"}.fa-microphone-slash{--fa:"\f131"}.fa-box-tissue{--fa:"\e05b"}.fa-motorcycle{--fa:"\f21c"}.fa-bell-concierge,.fa-concierge-bell{--fa:"\f562"}.fa-pen-ruler,.fa-pencil-ruler{--fa:"\f5ae"}.fa-people-arrows,.fa-people-arrows-left-right{--fa:"\e068"}.fa-mars-and-venus-burst{--fa:"\e523"}.fa-caret-square-right,.fa-square-caret-right{--fa:"\f152"}.fa-cut,.fa-scissors{--fa:"\f0c4"}.fa-sun-plant-wilt{--fa:"\e57a"}.fa-toilets-portable{--fa:"\e584"}.fa-hockey-puck{--fa:"\f453"}.fa-table{--fa:"\f0ce"}.fa-magnifying-glass-arrow-right{--fa:"\e521"}.fa-digital-tachograph,.fa-tachograph-digital{--fa:"\f566"}.fa-users-slash{--fa:"\e073"}.fa-clover{--fa:"\e139"}.fa-mail-reply,.fa-reply{--fa:"\f3e5"}.fa-star-and-crescent{--fa:"\f699"}.fa-house-fire{--fa:"\e50c"}.fa-minus-square,.fa-square-minus{--fa:"\f146"}.fa-helicopter{--fa:"\f533"}.fa-compass{--fa:"\f14e"}.fa-caret-square-down,.fa-square-caret-down{--fa:"\f150"}.fa-file-circle-question{--fa:"\e4ef"}.fa-laptop-code{--fa:"\f5fc"}.fa-swatchbook{--fa:"\f5c3"}.fa-prescription-bottle{--fa:"\f485"}.fa-bars,.fa-navicon{--fa:"\f0c9"}.fa-people-group{--fa:"\e533"}.fa-hourglass-3,.fa-hourglass-end{--fa:"\f253"}.fa-heart-broken,.fa-heart-crack{--fa:"\f7a9"}.fa-external-link-square-alt,.fa-square-up-right{--fa:"\f360"}.fa-face-kiss-beam,.fa-kiss-beam{--fa:"\f597"}.fa-film{--fa:"\f008"}.fa-ruler-horizontal{--fa:"\f547"}.fa-people-robbery{--fa:"\e536"}.fa-lightbulb{--fa:"\f0eb"}.fa-caret-left{--fa:"\f0d9"}.fa-circle-exclamation,.fa-exclamation-circle{--fa:"\f06a"}.fa-school-circle-xmark{--fa:"\e56d"}.fa-arrow-right-from-bracket,.fa-sign-out{--fa:"\f08b"}.fa-chevron-circle-down,.fa-circle-chevron-down{--fa:"\f13a"}.fa-unlock-alt,.fa-unlock-keyhole{--fa:"\f13e"}.fa-cloud-showers-heavy{--fa:"\f740"}.fa-headphones-alt,.fa-headphones-simple{--fa:"\f58f"}.fa-sitemap{--fa:"\f0e8"}.fa-circle-dollar-to-slot,.fa-donate{--fa:"\f4b9"}.fa-memory{--fa:"\f538"}.fa-road-spikes{--fa:"\e568"}.fa-fire-burner{--fa:"\e4f1"}.fa-flag{--fa:"\f024"}.fa-hanukiah{--fa:"\f6e6"}.fa-feather{--fa:"\f52d"}.fa-volume-down,.fa-volume-low{--fa:"\f027"}.fa-comment-slash{--fa:"\f4b3"}.fa-cloud-sun-rain{--fa:"\f743"}.fa-compress{--fa:"\f066"}.fa-wheat-alt,.fa-wheat-awn{--fa:"\e2cd"}.fa-ankh{--fa:"\f644"}.fa-hands-holding-child{--fa:"\e4fa"}.fa-asterisk{--fa:"\2a"}.fa-check-square,.fa-square-check{--fa:"\f14a"}.fa-peseta-sign{--fa:"\e221"}.fa-header,.fa-heading{--fa:"\f1dc"}.fa-ghost{--fa:"\f6e2"}.fa-list,.fa-list-squares{--fa:"\f03a"}.fa-phone-square-alt,.fa-square-phone-flip{--fa:"\f87b"}.fa-cart-plus{--fa:"\f217"}.fa-gamepad{--fa:"\f11b"}.fa-circle-dot,.fa-dot-circle{--fa:"\f192"}.fa-dizzy,.fa-face-dizzy{--fa:"\f567"}.fa-egg{--fa:"\f7fb"}.fa-house-medical-circle-xmark{--fa:"\e513"}.fa-campground{--fa:"\f6bb"}.fa-folder-plus{--fa:"\f65e"}.fa-futbol,.fa-futbol-ball,.fa-soccer-ball{--fa:"\f1e3"}.fa-paint-brush,.fa-paintbrush{--fa:"\f1fc"}.fa-lock{--fa:"\f023"}.fa-gas-pump{--fa:"\f52f"}.fa-hot-tub,.fa-hot-tub-person{--fa:"\f593"}.fa-map-location,.fa-map-marked{--fa:"\f59f"}.fa-house-flood-water{--fa:"\e50e"}.fa-tree{--fa:"\f1bb"}.fa-bridge-lock{--fa:"\e4cc"}.fa-sack-dollar{--fa:"\f81d"}.fa-edit,.fa-pen-to-square{--fa:"\f044"}.fa-car-side{--fa:"\f5e4"}.fa-share-alt,.fa-share-nodes{--fa:"\f1e0"}.fa-heart-circle-minus{--fa:"\e4ff"}.fa-hourglass-2,.fa-hourglass-half{--fa:"\f252"}.fa-microscope{--fa:"\f610"}.fa-sink{--fa:"\e06d"}.fa-bag-shopping,.fa-shopping-bag{--fa:"\f290"}.fa-arrow-down-z-a,.fa-sort-alpha-desc,.fa-sort-alpha-down-alt{--fa:"\f881"}.fa-mitten{--fa:"\f7b5"}.fa-person-rays{--fa:"\e54d"}.fa-users{--fa:"\f0c0"}.fa-eye-slash{--fa:"\f070"}.fa-flask-vial{--fa:"\e4f3"}.fa-hand,.fa-hand-paper{--fa:"\f256"}.fa-om{--fa:"\f679"}.fa-worm{--fa:"\e599"}.fa-house-circle-xmark{--fa:"\e50b"}.fa-plug{--fa:"\f1e6"}.fa-chevron-up{--fa:"\f077"}.fa-hand-spock{--fa:"\f259"}.fa-stopwatch{--fa:"\f2f2"}.fa-face-kiss,.fa-kiss{--fa:"\f596"}.fa-bridge-circle-xmark{--fa:"\e4cb"}.fa-face-grin-tongue,.fa-grin-tongue{--fa:"\f589"}.fa-chess-bishop{--fa:"\f43a"}.fa-face-grin-wink,.fa-grin-wink{--fa:"\f58c"}.fa-deaf,.fa-deafness,.fa-ear-deaf,.fa-hard-of-hearing{--fa:"\f2a4"}.fa-road-circle-check{--fa:"\e564"}.fa-dice-five{--fa:"\f523"}.fa-rss-square,.fa-square-rss{--fa:"\f143"}.fa-land-mine-on{--fa:"\e51b"}.fa-i-cursor{--fa:"\f246"}.fa-stamp{--fa:"\f5bf"}.fa-stairs{--fa:"\e289"}.fa-i{--fa:"\49"}.fa-hryvnia,.fa-hryvnia-sign{--fa:"\f6f2"}.fa-pills{--fa:"\f484"}.fa-face-grin-wide,.fa-grin-alt{--fa:"\f581"}.fa-tooth{--fa:"\f5c9"}.fa-v{--fa:"\56"}.fa-bangladeshi-taka-sign{--fa:"\e2e6"}.fa-bicycle{--fa:"\f206"}.fa-rod-asclepius,.fa-rod-snake,.fa-staff-aesculapius,.fa-staff-snake{--fa:"\e579"}.fa-head-side-cough-slash{--fa:"\e062"}.fa-ambulance,.fa-truck-medical{--fa:"\f0f9"}.fa-wheat-awn-circle-exclamation{--fa:"\e598"}.fa-snowman{--fa:"\f7d0"}.fa-mortar-pestle{--fa:"\f5a7"}.fa-road-barrier{--fa:"\e562"}.fa-school{--fa:"\f549"}.fa-igloo{--fa:"\f7ae"}.fa-joint{--fa:"\f595"}.fa-angle-right{--fa:"\f105"}.fa-horse{--fa:"\f6f0"}.fa-q{--fa:"\51"}.fa-g{--fa:"\47"}.fa-notes-medical{--fa:"\f481"}.fa-temperature-2,.fa-temperature-half,.fa-thermometer-2,.fa-thermometer-half{--fa:"\f2c9"}.fa-dong-sign{--fa:"\e169"}.fa-capsules{--fa:"\f46b"}.fa-poo-bolt,.fa-poo-storm{--fa:"\f75a"}.fa-face-frown-open,.fa-frown-open{--fa:"\f57a"}.fa-hand-point-up{--fa:"\f0a6"}.fa-money-bill{--fa:"\f0d6"}.fa-bookmark{--fa:"\f02e"}.fa-align-justify{--fa:"\f039"}.fa-umbrella-beach{--fa:"\f5ca"}.fa-helmet-un{--fa:"\e503"}.fa-bullseye{--fa:"\f140"}.fa-bacon{--fa:"\f7e5"}.fa-hand-point-down{--fa:"\f0a7"}.fa-arrow-up-from-bracket{--fa:"\e09a"}.fa-folder,.fa-folder-blank{--fa:"\f07b"}.fa-file-medical-alt,.fa-file-waveform{--fa:"\f478"}.fa-radiation{--fa:"\f7b9"}.fa-chart-simple{--fa:"\e473"}.fa-mars-stroke{--fa:"\f229"}.fa-vial{--fa:"\f492"}.fa-dashboard,.fa-gauge,.fa-gauge-med,.fa-tachometer-alt-average{--fa:"\f624"}.fa-magic-wand-sparkles,.fa-wand-magic-sparkles{--fa:"\e2ca"}.fa-e{--fa:"\45"}.fa-pen-alt,.fa-pen-clip{--fa:"\f305"}.fa-bridge-circle-exclamation{--fa:"\e4ca"}.fa-user{--fa:"\f007"}.fa-school-circle-check{--fa:"\e56b"}.fa-dumpster{--fa:"\f793"}.fa-shuttle-van,.fa-van-shuttle{--fa:"\f5b6"}.fa-building-user{--fa:"\e4da"}.fa-caret-square-left,.fa-square-caret-left{--fa:"\f191"}.fa-highlighter{--fa:"\f591"}.fa-key{--fa:"\f084"}.fa-bullhorn{--fa:"\f0a1"}.fa-globe{--fa:"\f0ac"}.fa-synagogue{--fa:"\f69b"}.fa-person-half-dress{--fa:"\e548"}.fa-road-bridge{--fa:"\e563"}.fa-location-arrow{--fa:"\f124"}.fa-c{--fa:"\43"}.fa-tablet-button{--fa:"\f10a"}.fa-building-lock{--fa:"\e4d6"}.fa-pizza-slice{--fa:"\f818"}.fa-money-bill-wave{--fa:"\f53a"}.fa-area-chart,.fa-chart-area{--fa:"\f1fe"}.fa-house-flag{--fa:"\e50d"}.fa-person-circle-minus{--fa:"\e540"}.fa-ban,.fa-cancel{--fa:"\f05e"}.fa-camera-rotate{--fa:"\e0d8"}.fa-air-freshener,.fa-spray-can-sparkles{--fa:"\f5d0"}.fa-star{--fa:"\f005"}.fa-repeat{--fa:"\f363"}.fa-cross{--fa:"\f654"}.fa-box{--fa:"\f466"}.fa-venus-mars{--fa:"\f228"}.fa-arrow-pointer,.fa-mouse-pointer{--fa:"\f245"}.fa-expand-arrows-alt,.fa-maximize{--fa:"\f31e"}.fa-charging-station{--fa:"\f5e7"}.fa-shapes,.fa-triangle-circle-square{--fa:"\f61f"}.fa-random,.fa-shuffle{--fa:"\f074"}.fa-person-running,.fa-running{--fa:"\f70c"}.fa-mobile-retro{--fa:"\e527"}.fa-grip-lines-vertical{--fa:"\f7a5"}.fa-spider{--fa:"\f717"}.fa-hands-bound{--fa:"\e4f9"}.fa-file-invoice-dollar{--fa:"\f571"}.fa-plane-circle-exclamation{--fa:"\e556"}.fa-x-ray{--fa:"\f497"}.fa-spell-check{--fa:"\f891"}.fa-slash{--fa:"\f715"}.fa-computer-mouse,.fa-mouse{--fa:"\f8cc"}.fa-arrow-right-to-bracket,.fa-sign-in{--fa:"\f090"}.fa-shop-slash,.fa-store-alt-slash{--fa:"\e070"}.fa-server{--fa:"\f233"}.fa-virus-covid-slash{--fa:"\e4a9"}.fa-shop-lock{--fa:"\e4a5"}.fa-hourglass-1,.fa-hourglass-start{--fa:"\f251"}.fa-blender-phone{--fa:"\f6b6"}.fa-building-wheat{--fa:"\e4db"}.fa-person-breastfeeding{--fa:"\e53a"}.fa-right-to-bracket,.fa-sign-in-alt{--fa:"\f2f6"}.fa-venus{--fa:"\f221"}.fa-passport{--fa:"\f5ab"}.fa-thumb-tack-slash,.fa-thumbtack-slash{--fa:"\e68f"}.fa-heart-pulse,.fa-heartbeat{--fa:"\f21e"}.fa-people-carry,.fa-people-carry-box{--fa:"\f4ce"}.fa-temperature-high{--fa:"\f769"}.fa-microchip{--fa:"\f2db"}.fa-crown{--fa:"\f521"}.fa-weight-hanging{--fa:"\f5cd"}.fa-xmarks-lines{--fa:"\e59a"}.fa-file-prescription{--fa:"\f572"}.fa-weight,.fa-weight-scale{--fa:"\f496"}.fa-user-friends,.fa-user-group{--fa:"\f500"}.fa-arrow-up-a-z,.fa-sort-alpha-up{--fa:"\f15e"}.fa-chess-knight{--fa:"\f441"}.fa-face-laugh-squint,.fa-laugh-squint{--fa:"\f59b"}.fa-wheelchair{--fa:"\f193"}.fa-arrow-circle-up,.fa-circle-arrow-up{--fa:"\f0aa"}.fa-toggle-on{--fa:"\f205"}.fa-person-walking,.fa-walking{--fa:"\f554"}.fa-l{--fa:"\4c"}.fa-fire{--fa:"\f06d"}.fa-bed-pulse,.fa-procedures{--fa:"\f487"}.fa-shuttle-space,.fa-space-shuttle{--fa:"\f197"}.fa-face-laugh,.fa-laugh{--fa:"\f599"}.fa-folder-open{--fa:"\f07c"}.fa-heart-circle-plus{--fa:"\e500"}.fa-code-fork{--fa:"\e13b"}.fa-city{--fa:"\f64f"}.fa-microphone-alt,.fa-microphone-lines{--fa:"\f3c9"}.fa-pepper-hot{--fa:"\f816"}.fa-unlock{--fa:"\f09c"}.fa-colon-sign{--fa:"\e140"}.fa-headset{--fa:"\f590"}.fa-store-slash{--fa:"\e071"}.fa-road-circle-xmark{--fa:"\e566"}.fa-user-minus{--fa:"\f503"}.fa-mars-stroke-up,.fa-mars-stroke-v{--fa:"\f22a"}.fa-champagne-glasses,.fa-glass-cheers{--fa:"\f79f"}.fa-clipboard{--fa:"\f328"}.fa-house-circle-exclamation{--fa:"\e50a"}.fa-file-arrow-up,.fa-file-upload{--fa:"\f574"}.fa-wifi,.fa-wifi-3,.fa-wifi-strong{--fa:"\f1eb"}.fa-bath,.fa-bathtub{--fa:"\f2cd"}.fa-underline{--fa:"\f0cd"}.fa-user-edit,.fa-user-pen{--fa:"\f4ff"}.fa-signature{--fa:"\f5b7"}.fa-stroopwafel{--fa:"\f551"}.fa-bold{--fa:"\f032"}.fa-anchor-lock{--fa:"\e4ad"}.fa-building-ngo{--fa:"\e4d7"}.fa-manat-sign{--fa:"\e1d5"}.fa-not-equal{--fa:"\f53e"}.fa-border-style,.fa-border-top-left{--fa:"\f853"}.fa-map-location-dot,.fa-map-marked-alt{--fa:"\f5a0"}.fa-jedi{--fa:"\f669"}.fa-poll,.fa-square-poll-vertical{--fa:"\f681"}.fa-mug-hot{--fa:"\f7b6"}.fa-battery-car,.fa-car-battery{--fa:"\f5df"}.fa-gift{--fa:"\f06b"}.fa-dice-two{--fa:"\f528"}.fa-chess-queen{--fa:"\f445"}.fa-glasses{--fa:"\f530"}.fa-chess-board{--fa:"\f43c"}.fa-building-circle-check{--fa:"\e4d2"}.fa-person-chalkboard{--fa:"\e53d"}.fa-mars-stroke-h,.fa-mars-stroke-right{--fa:"\f22b"}.fa-hand-back-fist,.fa-hand-rock{--fa:"\f255"}.fa-caret-square-up,.fa-square-caret-up{--fa:"\f151"}.fa-cloud-showers-water{--fa:"\e4e4"}.fa-bar-chart,.fa-chart-bar{--fa:"\f080"}.fa-hands-bubbles,.fa-hands-wash{--fa:"\e05e"}.fa-less-than-equal{--fa:"\f537"}.fa-train{--fa:"\f238"}.fa-eye-low-vision,.fa-low-vision{--fa:"\f2a8"}.fa-crow{--fa:"\f520"}.fa-sailboat{--fa:"\e445"}.fa-window-restore{--fa:"\f2d2"}.fa-plus-square,.fa-square-plus{--fa:"\f0fe"}.fa-torii-gate{--fa:"\f6a1"}.fa-frog{--fa:"\f52e"}.fa-bucket{--fa:"\e4cf"}.fa-image{--fa:"\f03e"}.fa-microphone{--fa:"\f130"}.fa-cow{--fa:"\f6c8"}.fa-caret-up{--fa:"\f0d8"}.fa-screwdriver{--fa:"\f54a"}.fa-folder-closed{--fa:"\e185"}.fa-house-tsunami{--fa:"\e515"}.fa-square-nfi{--fa:"\e576"}.fa-arrow-up-from-ground-water{--fa:"\e4b5"}.fa-glass-martini-alt,.fa-martini-glass{--fa:"\f57b"}.fa-square-binary{--fa:"\e69b"}.fa-rotate-back,.fa-rotate-backward,.fa-rotate-left,.fa-undo-alt{--fa:"\f2ea"}.fa-columns,.fa-table-columns{--fa:"\f0db"}.fa-lemon{--fa:"\f094"}.fa-head-side-mask{--fa:"\e063"}.fa-handshake{--fa:"\f2b5"}.fa-gem{--fa:"\f3a5"}.fa-dolly,.fa-dolly-box{--fa:"\f472"}.fa-smoking{--fa:"\f48d"}.fa-compress-arrows-alt,.fa-minimize{--fa:"\f78c"}.fa-monument{--fa:"\f5a6"}.fa-snowplow{--fa:"\f7d2"}.fa-angle-double-right,.fa-angles-right{--fa:"\f101"}.fa-cannabis{--fa:"\f55f"}.fa-circle-play,.fa-play-circle{--fa:"\f144"}.fa-tablets{--fa:"\f490"}.fa-ethernet{--fa:"\f796"}.fa-eur,.fa-euro,.fa-euro-sign{--fa:"\f153"}.fa-chair{--fa:"\f6c0"}.fa-check-circle,.fa-circle-check{--fa:"\f058"}.fa-circle-stop,.fa-stop-circle{--fa:"\f28d"}.fa-compass-drafting,.fa-drafting-compass{--fa:"\f568"}.fa-plate-wheat{--fa:"\e55a"}.fa-icicles{--fa:"\f7ad"}.fa-person-shelter{--fa:"\e54f"}.fa-neuter{--fa:"\f22c"}.fa-id-badge{--fa:"\f2c1"}.fa-marker{--fa:"\f5a1"}.fa-face-laugh-beam,.fa-laugh-beam{--fa:"\f59a"}.fa-helicopter-symbol{--fa:"\e502"}.fa-universal-access{--fa:"\f29a"}.fa-chevron-circle-up,.fa-circle-chevron-up{--fa:"\f139"}.fa-lari-sign{--fa:"\e1c8"}.fa-volcano{--fa:"\f770"}.fa-person-walking-dashed-line-arrow-right{--fa:"\e553"}.fa-gbp,.fa-pound-sign,.fa-sterling-sign{--fa:"\f154"}.fa-viruses{--fa:"\e076"}.fa-square-person-confined{--fa:"\e577"}.fa-user-tie{--fa:"\f508"}.fa-arrow-down-long,.fa-long-arrow-down{--fa:"\f175"}.fa-tent-arrow-down-to-line{--fa:"\e57e"}.fa-certificate{--fa:"\f0a3"}.fa-mail-reply-all,.fa-reply-all{--fa:"\f122"}.fa-suitcase{--fa:"\f0f2"}.fa-person-skating,.fa-skating{--fa:"\f7c5"}.fa-filter-circle-dollar,.fa-funnel-dollar{--fa:"\f662"}.fa-camera-retro{--fa:"\f083"}.fa-arrow-circle-down,.fa-circle-arrow-down{--fa:"\f0ab"}.fa-arrow-right-to-file,.fa-file-import{--fa:"\f56f"}.fa-external-link-square,.fa-square-arrow-up-right{--fa:"\f14c"}.fa-box-open{--fa:"\f49e"}.fa-scroll{--fa:"\f70e"}.fa-spa{--fa:"\f5bb"}.fa-location-pin-lock{--fa:"\e51f"}.fa-pause{--fa:"\f04c"}.fa-hill-avalanche{--fa:"\e507"}.fa-temperature-0,.fa-temperature-empty,.fa-thermometer-0,.fa-thermometer-empty{--fa:"\f2cb"}.fa-bomb{--fa:"\f1e2"}.fa-registered{--fa:"\f25d"}.fa-address-card,.fa-contact-card,.fa-vcard{--fa:"\f2bb"}.fa-balance-scale-right,.fa-scale-unbalanced-flip{--fa:"\f516"}.fa-subscript{--fa:"\f12c"}.fa-diamond-turn-right,.fa-directions{--fa:"\f5eb"}.fa-burst{--fa:"\e4dc"}.fa-house-laptop,.fa-laptop-house{--fa:"\e066"}.fa-face-tired,.fa-tired{--fa:"\f5c8"}.fa-money-bills{--fa:"\e1f3"}.fa-smog{--fa:"\f75f"}.fa-crutch{--fa:"\f7f7"}.fa-cloud-arrow-up,.fa-cloud-upload,.fa-cloud-upload-alt{--fa:"\f0ee"}.fa-palette{--fa:"\f53f"}.fa-arrows-turn-right{--fa:"\e4c0"}.fa-vest{--fa:"\e085"}.fa-ferry{--fa:"\e4ea"}.fa-arrows-down-to-people{--fa:"\e4b9"}.fa-seedling,.fa-sprout{--fa:"\f4d8"}.fa-arrows-alt-h,.fa-left-right{--fa:"\f337"}.fa-boxes-packing{--fa:"\e4c7"}.fa-arrow-circle-left,.fa-circle-arrow-left{--fa:"\f0a8"}.fa-group-arrows-rotate{--fa:"\e4f6"}.fa-bowl-food{--fa:"\e4c6"}.fa-candy-cane{--fa:"\f786"}.fa-arrow-down-wide-short,.fa-sort-amount-asc,.fa-sort-amount-down{--fa:"\f160"}.fa-cloud-bolt,.fa-thunderstorm{--fa:"\f76c"}.fa-remove-format,.fa-text-slash{--fa:"\f87d"}.fa-face-smile-wink,.fa-smile-wink{--fa:"\f4da"}.fa-file-word{--fa:"\f1c2"}.fa-file-powerpoint{--fa:"\f1c4"}.fa-arrows-h,.fa-arrows-left-right{--fa:"\f07e"}.fa-house-lock{--fa:"\e510"}.fa-cloud-arrow-down,.fa-cloud-download,.fa-cloud-download-alt{--fa:"\f0ed"}.fa-children{--fa:"\e4e1"}.fa-blackboard,.fa-chalkboard{--fa:"\f51b"}.fa-user-alt-slash,.fa-user-large-slash{--fa:"\f4fa"}.fa-envelope-open{--fa:"\f2b6"}.fa-handshake-alt-slash,.fa-handshake-simple-slash{--fa:"\e05f"}.fa-mattress-pillow{--fa:"\e525"}.fa-guarani-sign{--fa:"\e19a"}.fa-arrows-rotate,.fa-refresh,.fa-sync{--fa:"\f021"}.fa-fire-extinguisher{--fa:"\f134"}.fa-cruzeiro-sign{--fa:"\e152"}.fa-greater-than-equal{--fa:"\f532"}.fa-shield-alt,.fa-shield-halved{--fa:"\f3ed"}.fa-atlas,.fa-book-atlas{--fa:"\f558"}.fa-virus{--fa:"\e074"}.fa-envelope-circle-check{--fa:"\e4e8"}.fa-layer-group{--fa:"\f5fd"}.fa-arrows-to-dot{--fa:"\e4be"}.fa-archway{--fa:"\f557"}.fa-heart-circle-check{--fa:"\e4fd"}.fa-house-chimney-crack,.fa-house-damage{--fa:"\f6f1"}.fa-file-archive,.fa-file-zipper{--fa:"\f1c6"}.fa-square{--fa:"\f0c8"}.fa-glass-martini,.fa-martini-glass-empty{--fa:"\f000"}.fa-couch{--fa:"\f4b8"}.fa-cedi-sign{--fa:"\e0df"}.fa-italic{--fa:"\f033"}.fa-table-cells-column-lock{--fa:"\e678"}.fa-church{--fa:"\f51d"}.fa-comments-dollar{--fa:"\f653"}.fa-democrat{--fa:"\f747"}.fa-z{--fa:"\5a"}.fa-person-skiing,.fa-skiing{--fa:"\f7c9"}.fa-road-lock{--fa:"\e567"}.fa-a{--fa:"\41"}.fa-temperature-arrow-down,.fa-temperature-down{--fa:"\e03f"}.fa-feather-alt,.fa-feather-pointed{--fa:"\f56b"}.fa-p{--fa:"\50"}.fa-snowflake{--fa:"\f2dc"}.fa-newspaper{--fa:"\f1ea"}.fa-ad,.fa-rectangle-ad{--fa:"\f641"}.fa-arrow-circle-right,.fa-circle-arrow-right{--fa:"\f0a9"}.fa-filter-circle-xmark{--fa:"\e17b"}.fa-locust{--fa:"\e520"}.fa-sort,.fa-unsorted{--fa:"\f0dc"}.fa-list-1-2,.fa-list-numeric,.fa-list-ol{--fa:"\f0cb"}.fa-person-dress-burst{--fa:"\e544"}.fa-money-check-alt,.fa-money-check-dollar{--fa:"\f53d"}.fa-vector-square{--fa:"\f5cb"}.fa-bread-slice{--fa:"\f7ec"}.fa-language{--fa:"\f1ab"}.fa-face-kiss-wink-heart,.fa-kiss-wink-heart{--fa:"\f598"}.fa-filter{--fa:"\f0b0"}.fa-question{--fa:"\3f"}.fa-file-signature{--fa:"\f573"}.fa-arrows-alt,.fa-up-down-left-right{--fa:"\f0b2"}.fa-house-chimney-user{--fa:"\e065"}.fa-hand-holding-heart{--fa:"\f4be"}.fa-puzzle-piece{--fa:"\f12e"}.fa-money-check{--fa:"\f53c"}.fa-star-half-alt,.fa-star-half-stroke{--fa:"\f5c0"}.fa-code{--fa:"\f121"}.fa-glass-whiskey,.fa-whiskey-glass{--fa:"\f7a0"}.fa-building-circle-exclamation{--fa:"\e4d3"}.fa-magnifying-glass-chart{--fa:"\e522"}.fa-arrow-up-right-from-square,.fa-external-link{--fa:"\f08e"}.fa-cubes-stacked{--fa:"\e4e6"}.fa-krw,.fa-won,.fa-won-sign{--fa:"\f159"}.fa-virus-covid{--fa:"\e4a8"}.fa-austral-sign{--fa:"\e0a9"}.fa-f{--fa:"\46"}.fa-leaf{--fa:"\f06c"}.fa-road{--fa:"\f018"}.fa-cab,.fa-taxi{--fa:"\f1ba"}.fa-person-circle-plus{--fa:"\e541"}.fa-chart-pie,.fa-pie-chart{--fa:"\f200"}.fa-bolt-lightning{--fa:"\e0b7"}.fa-sack-xmark{--fa:"\e56a"}.fa-file-excel{--fa:"\f1c3"}.fa-file-contract{--fa:"\f56c"}.fa-fish-fins{--fa:"\e4f2"}.fa-building-flag{--fa:"\e4d5"}.fa-face-grin-beam,.fa-grin-beam{--fa:"\f582"}.fa-object-ungroup{--fa:"\f248"}.fa-poop{--fa:"\f619"}.fa-location-pin,.fa-map-marker{--fa:"\f041"}.fa-kaaba{--fa:"\f66b"}.fa-toilet-paper{--fa:"\f71e"}.fa-hard-hat,.fa-hat-hard,.fa-helmet-safety{--fa:"\f807"}.fa-eject{--fa:"\f052"}.fa-arrow-alt-circle-right,.fa-circle-right{--fa:"\f35a"}.fa-plane-circle-check{--fa:"\e555"}.fa-face-rolling-eyes,.fa-meh-rolling-eyes{--fa:"\f5a5"}.fa-object-group{--fa:"\f247"}.fa-chart-line,.fa-line-chart{--fa:"\f201"}.fa-mask-ventilator{--fa:"\e524"}.fa-arrow-right{--fa:"\f061"}.fa-map-signs,.fa-signs-post{--fa:"\f277"}.fa-cash-register{--fa:"\f788"}.fa-person-circle-question{--fa:"\e542"}.fa-h{--fa:"\48"}.fa-tarp{--fa:"\e57b"}.fa-screwdriver-wrench,.fa-tools{--fa:"\f7d9"}.fa-arrows-to-eye{--fa:"\e4bf"}.fa-plug-circle-bolt{--fa:"\e55b"}.fa-heart{--fa:"\f004"}.fa-mars-and-venus{--fa:"\f224"}.fa-home-user,.fa-house-user{--fa:"\e1b0"}.fa-dumpster-fire{--fa:"\f794"}.fa-house-crack{--fa:"\e3b1"}.fa-cocktail,.fa-martini-glass-citrus{--fa:"\f561"}.fa-face-surprise,.fa-surprise{--fa:"\f5c2"}.fa-bottle-water{--fa:"\e4c5"}.fa-circle-pause,.fa-pause-circle{--fa:"\f28b"}.fa-toilet-paper-slash{--fa:"\e072"}.fa-apple-alt,.fa-apple-whole{--fa:"\f5d1"}.fa-kitchen-set{--fa:"\e51a"}.fa-r{--fa:"\52"}.fa-temperature-1,.fa-temperature-quarter,.fa-thermometer-1,.fa-thermometer-quarter{--fa:"\f2ca"}.fa-cube{--fa:"\f1b2"}.fa-bitcoin-sign{--fa:"\e0b4"}.fa-shield-dog{--fa:"\e573"}.fa-solar-panel{--fa:"\f5ba"}.fa-lock-open{--fa:"\f3c1"}.fa-elevator{--fa:"\e16d"}.fa-money-bill-transfer{--fa:"\e528"}.fa-money-bill-trend-up{--fa:"\e529"}.fa-house-flood-water-circle-arrow-right{--fa:"\e50f"}.fa-poll-h,.fa-square-poll-horizontal{--fa:"\f682"}.fa-circle{--fa:"\f111"}.fa-backward-fast,.fa-fast-backward{--fa:"\f049"}.fa-recycle{--fa:"\f1b8"}.fa-user-astronaut{--fa:"\f4fb"}.fa-plane-slash{--fa:"\e069"}.fa-trademark{--fa:"\f25c"}.fa-basketball,.fa-basketball-ball{--fa:"\f434"}.fa-satellite-dish{--fa:"\f7c0"}.fa-arrow-alt-circle-up,.fa-circle-up{--fa:"\f35b"}.fa-mobile-alt,.fa-mobile-screen-button{--fa:"\f3cd"}.fa-volume-high,.fa-volume-up{--fa:"\f028"}.fa-users-rays{--fa:"\e593"}.fa-wallet{--fa:"\f555"}.fa-clipboard-check{--fa:"\f46c"}.fa-file-audio{--fa:"\f1c7"}.fa-burger,.fa-hamburger{--fa:"\f805"}.fa-wrench{--fa:"\f0ad"}.fa-bugs{--fa:"\e4d0"}.fa-rupee,.fa-rupee-sign{--fa:"\f156"}.fa-file-image{--fa:"\f1c5"}.fa-circle-question,.fa-question-circle{--fa:"\f059"}.fa-plane-departure{--fa:"\f5b0"}.fa-handshake-slash{--fa:"\e060"}.fa-book-bookmark{--fa:"\e0bb"}.fa-code-branch{--fa:"\f126"}.fa-hat-cowboy{--fa:"\f8c0"}.fa-bridge{--fa:"\e4c8"}.fa-phone-alt,.fa-phone-flip{--fa:"\f879"}.fa-truck-front{--fa:"\e2b7"}.fa-cat{--fa:"\f6be"}.fa-anchor-circle-exclamation{--fa:"\e4ab"}.fa-truck-field{--fa:"\e58d"}.fa-route{--fa:"\f4d7"}.fa-clipboard-question{--fa:"\e4e3"}.fa-panorama{--fa:"\e209"}.fa-comment-medical{--fa:"\f7f5"}.fa-teeth-open{--fa:"\f62f"}.fa-file-circle-minus{--fa:"\e4ed"}.fa-tags{--fa:"\f02c"}.fa-wine-glass{--fa:"\f4e3"}.fa-fast-forward,.fa-forward-fast{--fa:"\f050"}.fa-face-meh-blank,.fa-meh-blank{--fa:"\f5a4"}.fa-parking,.fa-square-parking{--fa:"\f540"}.fa-house-signal{--fa:"\e012"}.fa-bars-progress,.fa-tasks-alt{--fa:"\f828"}.fa-faucet-drip{--fa:"\e006"}.fa-cart-flatbed,.fa-dolly-flatbed{--fa:"\f474"}.fa-ban-smoking,.fa-smoking-ban{--fa:"\f54d"}.fa-terminal{--fa:"\f120"}.fa-mobile-button{--fa:"\f10b"}.fa-house-medical-flag{--fa:"\e514"}.fa-basket-shopping,.fa-shopping-basket{--fa:"\f291"}.fa-tape{--fa:"\f4db"}.fa-bus-alt,.fa-bus-simple{--fa:"\f55e"}.fa-eye{--fa:"\f06e"}.fa-face-sad-cry,.fa-sad-cry{--fa:"\f5b3"}.fa-audio-description{--fa:"\f29e"}.fa-person-military-to-person{--fa:"\e54c"}.fa-file-shield{--fa:"\e4f0"}.fa-user-slash{--fa:"\f506"}.fa-pen{--fa:"\f304"}.fa-tower-observation{--fa:"\e586"}.fa-file-code{--fa:"\f1c9"}.fa-signal,.fa-signal-5,.fa-signal-perfect{--fa:"\f012"}.fa-bus{--fa:"\f207"}.fa-heart-circle-xmark{--fa:"\e501"}.fa-home-lg,.fa-house-chimney{--fa:"\e3af"}.fa-window-maximize{--fa:"\f2d0"}.fa-face-frown,.fa-frown{--fa:"\f119"}.fa-prescription{--fa:"\f5b1"}.fa-shop,.fa-store-alt{--fa:"\f54f"}.fa-floppy-disk,.fa-save{--fa:"\f0c7"}.fa-vihara{--fa:"\f6a7"}.fa-balance-scale-left,.fa-scale-unbalanced{--fa:"\f515"}.fa-sort-asc,.fa-sort-up{--fa:"\f0de"}.fa-comment-dots,.fa-commenting{--fa:"\f4ad"}.fa-plant-wilt{--fa:"\e5aa"}.fa-diamond{--fa:"\f219"}.fa-face-grin-squint,.fa-grin-squint{--fa:"\f585"}.fa-hand-holding-dollar,.fa-hand-holding-usd{--fa:"\f4c0"}.fa-chart-diagram{--fa:"\e695"}.fa-bacterium{--fa:"\e05a"}.fa-hand-pointer{--fa:"\f25a"}.fa-drum-steelpan{--fa:"\f56a"}.fa-hand-scissors{--fa:"\f257"}.fa-hands-praying,.fa-praying-hands{--fa:"\f684"}.fa-arrow-right-rotate,.fa-arrow-rotate-forward,.fa-arrow-rotate-right,.fa-redo{--fa:"\f01e"}.fa-biohazard{--fa:"\f780"}.fa-location,.fa-location-crosshairs{--fa:"\f601"}.fa-mars-double{--fa:"\f227"}.fa-child-dress{--fa:"\e59c"}.fa-users-between-lines{--fa:"\e591"}.fa-lungs-virus{--fa:"\e067"}.fa-face-grin-tears,.fa-grin-tears{--fa:"\f588"}.fa-phone{--fa:"\f095"}.fa-calendar-times,.fa-calendar-xmark{--fa:"\f273"}.fa-child-reaching{--fa:"\e59d"}.fa-head-side-virus{--fa:"\e064"}.fa-user-cog,.fa-user-gear{--fa:"\f4fe"}.fa-arrow-up-1-9,.fa-sort-numeric-up{--fa:"\f163"}.fa-door-closed{--fa:"\f52a"}.fa-shield-virus{--fa:"\e06c"}.fa-dice-six{--fa:"\f526"}.fa-mosquito-net{--fa:"\e52c"}.fa-file-fragment{--fa:"\e697"}.fa-bridge-water{--fa:"\e4ce"}.fa-person-booth{--fa:"\f756"}.fa-text-width{--fa:"\f035"}.fa-hat-wizard{--fa:"\f6e8"}.fa-pen-fancy{--fa:"\f5ac"}.fa-digging,.fa-person-digging{--fa:"\f85e"}.fa-trash{--fa:"\f1f8"}.fa-gauge-simple,.fa-gauge-simple-med,.fa-tachometer-average{--fa:"\f629"}.fa-book-medical{--fa:"\f7e6"}.fa-poo{--fa:"\f2fe"}.fa-quote-right,.fa-quote-right-alt{--fa:"\f10e"}.fa-shirt,.fa-t-shirt,.fa-tshirt{--fa:"\f553"}.fa-cubes{--fa:"\f1b3"}.fa-divide{--fa:"\f529"}.fa-tenge,.fa-tenge-sign{--fa:"\f7d7"}.fa-headphones{--fa:"\f025"}.fa-hands-holding{--fa:"\f4c2"}.fa-hands-clapping{--fa:"\e1a8"}.fa-republican{--fa:"\f75e"}.fa-arrow-left{--fa:"\f060"}.fa-person-circle-xmark{--fa:"\e543"}.fa-ruler{--fa:"\f545"}.fa-align-left{--fa:"\f036"}.fa-dice-d6{--fa:"\f6d1"}.fa-restroom{--fa:"\f7bd"}.fa-j{--fa:"\4a"}.fa-users-viewfinder{--fa:"\e595"}.fa-file-video{--fa:"\f1c8"}.fa-external-link-alt,.fa-up-right-from-square{--fa:"\f35d"}.fa-table-cells,.fa-th{--fa:"\f00a"}.fa-file-pdf{--fa:"\f1c1"}.fa-bible,.fa-book-bible{--fa:"\f647"}.fa-o{--fa:"\4f"}.fa-medkit,.fa-suitcase-medical{--fa:"\f0fa"}.fa-user-secret{--fa:"\f21b"}.fa-otter{--fa:"\f700"}.fa-female,.fa-person-dress{--fa:"\f182"}.fa-comment-dollar{--fa:"\f651"}.fa-briefcase-clock,.fa-business-time{--fa:"\f64a"}.fa-table-cells-large,.fa-th-large{--fa:"\f009"}.fa-book-tanakh,.fa-tanakh{--fa:"\f827"}.fa-phone-volume,.fa-volume-control-phone{--fa:"\f2a0"}.fa-hat-cowboy-side{--fa:"\f8c1"}.fa-clipboard-user{--fa:"\f7f3"}.fa-child{--fa:"\f1ae"}.fa-lira-sign{--fa:"\f195"}.fa-satellite{--fa:"\f7bf"}.fa-plane-lock{--fa:"\e558"}.fa-tag{--fa:"\f02b"}.fa-comment{--fa:"\f075"}.fa-birthday-cake,.fa-cake,.fa-cake-candles{--fa:"\f1fd"}.fa-envelope{--fa:"\f0e0"}.fa-angle-double-up,.fa-angles-up{--fa:"\f102"}.fa-paperclip{--fa:"\f0c6"}.fa-arrow-right-to-city{--fa:"\e4b3"}.fa-ribbon{--fa:"\f4d6"}.fa-lungs{--fa:"\f604"}.fa-arrow-up-9-1,.fa-sort-numeric-up-alt{--fa:"\f887"}.fa-litecoin-sign{--fa:"\e1d3"}.fa-border-none{--fa:"\f850"}.fa-circle-nodes{--fa:"\e4e2"}.fa-parachute-box{--fa:"\f4cd"}.fa-indent{--fa:"\f03c"}.fa-truck-field-un{--fa:"\e58e"}.fa-hourglass,.fa-hourglass-empty{--fa:"\f254"}.fa-mountain{--fa:"\f6fc"}.fa-user-doctor,.fa-user-md{--fa:"\f0f0"}.fa-circle-info,.fa-info-circle{--fa:"\f05a"}.fa-cloud-meatball{--fa:"\f73b"}.fa-camera,.fa-camera-alt{--fa:"\f030"}.fa-square-virus{--fa:"\e578"}.fa-meteor{--fa:"\f753"}.fa-car-on{--fa:"\e4dd"}.fa-sleigh{--fa:"\f7cc"}.fa-arrow-down-1-9,.fa-sort-numeric-asc,.fa-sort-numeric-down{--fa:"\f162"}.fa-hand-holding-droplet,.fa-hand-holding-water{--fa:"\f4c1"}.fa-water{--fa:"\f773"}.fa-calendar-check{--fa:"\f274"}.fa-braille{--fa:"\f2a1"}.fa-prescription-bottle-alt,.fa-prescription-bottle-medical{--fa:"\f486"}.fa-landmark{--fa:"\f66f"}.fa-truck{--fa:"\f0d1"}.fa-crosshairs{--fa:"\f05b"}.fa-person-cane{--fa:"\e53c"}.fa-tent{--fa:"\e57d"}.fa-vest-patches{--fa:"\e086"}.fa-check-double{--fa:"\f560"}.fa-arrow-down-a-z,.fa-sort-alpha-asc,.fa-sort-alpha-down{--fa:"\f15d"}.fa-money-bill-wheat{--fa:"\e52a"}.fa-cookie{--fa:"\f563"}.fa-arrow-left-rotate,.fa-arrow-rotate-back,.fa-arrow-rotate-backward,.fa-arrow-rotate-left,.fa-undo{--fa:"\f0e2"}.fa-hard-drive,.fa-hdd{--fa:"\f0a0"}.fa-face-grin-squint-tears,.fa-grin-squint-tears{--fa:"\f586"}.fa-dumbbell{--fa:"\f44b"}.fa-list-alt,.fa-rectangle-list{--fa:"\f022"}.fa-tarp-droplet{--fa:"\e57c"}.fa-house-medical-circle-check{--fa:"\e511"}.fa-person-skiing-nordic,.fa-skiing-nordic{--fa:"\f7ca"}.fa-calendar-plus{--fa:"\f271"}.fa-plane-arrival{--fa:"\f5af"}.fa-arrow-alt-circle-left,.fa-circle-left{--fa:"\f359"}.fa-subway,.fa-train-subway{--fa:"\f239"}.fa-chart-gantt{--fa:"\e0e4"}.fa-indian-rupee,.fa-indian-rupee-sign,.fa-inr{--fa:"\e1bc"}.fa-crop-alt,.fa-crop-simple{--fa:"\f565"}.fa-money-bill-1,.fa-money-bill-alt{--fa:"\f3d1"}.fa-left-long,.fa-long-arrow-alt-left{--fa:"\f30a"}.fa-dna{--fa:"\f471"}.fa-virus-slash{--fa:"\e075"}.fa-minus,.fa-subtract{--fa:"\f068"}.fa-chess{--fa:"\f439"}.fa-arrow-left-long,.fa-long-arrow-left{--fa:"\f177"}.fa-plug-circle-check{--fa:"\e55c"}.fa-street-view{--fa:"\f21d"}.fa-franc-sign{--fa:"\e18f"}.fa-volume-off{--fa:"\f026"}.fa-american-sign-language-interpreting,.fa-asl-interpreting,.fa-hands-american-sign-language-interpreting,.fa-hands-asl-interpreting{--fa:"\f2a3"}.fa-cog,.fa-gear{--fa:"\f013"}.fa-droplet-slash,.fa-tint-slash{--fa:"\f5c7"}.fa-mosque{--fa:"\f678"}.fa-mosquito{--fa:"\e52b"}.fa-star-of-david{--fa:"\f69a"}.fa-person-military-rifle{--fa:"\e54b"}.fa-cart-shopping,.fa-shopping-cart{--fa:"\f07a"}.fa-vials{--fa:"\f493"}.fa-plug-circle-plus{--fa:"\e55f"}.fa-place-of-worship{--fa:"\f67f"}.fa-grip-vertical{--fa:"\f58e"}.fa-hexagon-nodes{--fa:"\e699"}.fa-arrow-turn-up,.fa-level-up{--fa:"\f148"}.fa-u{--fa:"\55"}.fa-square-root-alt,.fa-square-root-variable{--fa:"\f698"}.fa-clock,.fa-clock-four{--fa:"\f017"}.fa-backward-step,.fa-step-backward{--fa:"\f048"}.fa-pallet{--fa:"\f482"}.fa-faucet{--fa:"\e005"}.fa-baseball-bat-ball{--fa:"\f432"}.fa-s{--fa:"\53"}.fa-timeline{--fa:"\e29c"}.fa-keyboard{--fa:"\f11c"}.fa-caret-down{--fa:"\f0d7"}.fa-clinic-medical,.fa-house-chimney-medical{--fa:"\f7f2"}.fa-temperature-3,.fa-temperature-three-quarters,.fa-thermometer-3,.fa-thermometer-three-quarters{--fa:"\f2c8"}.fa-mobile-android-alt,.fa-mobile-screen{--fa:"\f3cf"}.fa-plane-up{--fa:"\e22d"}.fa-piggy-bank{--fa:"\f4d3"}.fa-battery-3,.fa-battery-half{--fa:"\f242"}.fa-mountain-city{--fa:"\e52e"}.fa-coins{--fa:"\f51e"}.fa-khanda{--fa:"\f66d"}.fa-sliders,.fa-sliders-h{--fa:"\f1de"}.fa-folder-tree{--fa:"\f802"}.fa-network-wired{--fa:"\f6ff"}.fa-map-pin{--fa:"\f276"}.fa-hamsa{--fa:"\f665"}.fa-cent-sign{--fa:"\e3f5"}.fa-flask{--fa:"\f0c3"}.fa-person-pregnant{--fa:"\e31e"}.fa-wand-sparkles{--fa:"\f72b"}.fa-ellipsis-v,.fa-ellipsis-vertical{--fa:"\f142"}.fa-ticket{--fa:"\f145"}.fa-power-off{--fa:"\f011"}.fa-long-arrow-alt-right,.fa-right-long{--fa:"\f30b"}.fa-flag-usa{--fa:"\f74d"}.fa-laptop-file{--fa:"\e51d"}.fa-teletype,.fa-tty{--fa:"\f1e4"}.fa-diagram-next{--fa:"\e476"}.fa-person-rifle{--fa:"\e54e"}.fa-house-medical-circle-exclamation{--fa:"\e512"}.fa-closed-captioning{--fa:"\f20a"}.fa-hiking,.fa-person-hiking{--fa:"\f6ec"}.fa-venus-double{--fa:"\f226"}.fa-images{--fa:"\f302"}.fa-calculator{--fa:"\f1ec"}.fa-people-pulling{--fa:"\e535"}.fa-n{--fa:"\4e"}.fa-cable-car,.fa-tram{--fa:"\f7da"}.fa-cloud-rain{--fa:"\f73d"}.fa-building-circle-xmark{--fa:"\e4d4"}.fa-ship{--fa:"\f21a"}.fa-arrows-down-to-line{--fa:"\e4b8"}.fa-download{--fa:"\f019"}.fa-face-grin,.fa-grin{--fa:"\f580"}.fa-backspace,.fa-delete-left{--fa:"\f55a"}.fa-eye-dropper,.fa-eye-dropper-empty,.fa-eyedropper{--fa:"\f1fb"}.fa-file-circle-check{--fa:"\e5a0"}.fa-forward{--fa:"\f04e"}.fa-mobile,.fa-mobile-android,.fa-mobile-phone{--fa:"\f3ce"}.fa-face-meh,.fa-meh{--fa:"\f11a"}.fa-align-center{--fa:"\f037"}.fa-book-dead,.fa-book-skull{--fa:"\f6b7"}.fa-drivers-license,.fa-id-card{--fa:"\f2c2"}.fa-dedent,.fa-outdent{--fa:"\f03b"}.fa-heart-circle-exclamation{--fa:"\e4fe"}.fa-home,.fa-home-alt,.fa-home-lg-alt,.fa-house{--fa:"\f015"}.fa-calendar-week{--fa:"\f784"}.fa-laptop-medical{--fa:"\f812"}.fa-b{--fa:"\42"}.fa-file-medical{--fa:"\f477"}.fa-dice-one{--fa:"\f525"}.fa-kiwi-bird{--fa:"\f535"}.fa-arrow-right-arrow-left,.fa-exchange{--fa:"\f0ec"}.fa-redo-alt,.fa-rotate-forward,.fa-rotate-right{--fa:"\f2f9"}.fa-cutlery,.fa-utensils{--fa:"\f2e7"}.fa-arrow-up-wide-short,.fa-sort-amount-up{--fa:"\f161"}.fa-mill-sign{--fa:"\e1ed"}.fa-bowl-rice{--fa:"\e2eb"}.fa-skull{--fa:"\f54c"}.fa-broadcast-tower,.fa-tower-broadcast{--fa:"\f519"}.fa-truck-pickup{--fa:"\f63c"}.fa-long-arrow-alt-up,.fa-up-long{--fa:"\f30c"}.fa-stop{--fa:"\f04d"}.fa-code-merge{--fa:"\f387"}.fa-upload{--fa:"\f093"}.fa-hurricane{--fa:"\f751"}.fa-mound{--fa:"\e52d"}.fa-toilet-portable{--fa:"\e583"}.fa-compact-disc{--fa:"\f51f"}.fa-file-arrow-down,.fa-file-download{--fa:"\f56d"}.fa-caravan{--fa:"\f8ff"}.fa-shield-cat{--fa:"\e572"}.fa-bolt,.fa-zap{--fa:"\f0e7"}.fa-glass-water{--fa:"\e4f4"}.fa-oil-well{--fa:"\e532"}.fa-vault{--fa:"\e2c5"}.fa-mars{--fa:"\f222"}.fa-toilet{--fa:"\f7d8"}.fa-plane-circle-xmark{--fa:"\e557"}.fa-cny,.fa-jpy,.fa-rmb,.fa-yen,.fa-yen-sign{--fa:"\f157"}.fa-rouble,.fa-rub,.fa-ruble,.fa-ruble-sign{--fa:"\f158"}.fa-sun{--fa:"\f185"}.fa-guitar{--fa:"\f7a6"}.fa-face-laugh-wink,.fa-laugh-wink{--fa:"\f59c"}.fa-horse-head{--fa:"\f7ab"}.fa-bore-hole{--fa:"\e4c3"}.fa-industry{--fa:"\f275"}.fa-arrow-alt-circle-down,.fa-circle-down{--fa:"\f358"}.fa-arrows-turn-to-dots{--fa:"\e4c1"}.fa-florin-sign{--fa:"\e184"}.fa-arrow-down-short-wide,.fa-sort-amount-desc,.fa-sort-amount-down-alt{--fa:"\f884"}.fa-less-than{--fa:"\3c"}.fa-angle-down{--fa:"\f107"}.fa-car-tunnel{--fa:"\e4de"}.fa-head-side-cough{--fa:"\e061"}.fa-grip-lines{--fa:"\f7a4"}.fa-thumbs-down{--fa:"\f165"}.fa-user-lock{--fa:"\f502"}.fa-arrow-right-long,.fa-long-arrow-right{--fa:"\f178"}.fa-anchor-circle-xmark{--fa:"\e4ac"}.fa-ellipsis,.fa-ellipsis-h{--fa:"\f141"}.fa-chess-pawn{--fa:"\f443"}.fa-first-aid,.fa-kit-medical{--fa:"\f479"}.fa-person-through-window{--fa:"\e5a9"}.fa-toolbox{--fa:"\f552"}.fa-hands-holding-circle{--fa:"\e4fb"}.fa-bug{--fa:"\f188"}.fa-credit-card,.fa-credit-card-alt{--fa:"\f09d"}.fa-automobile,.fa-car{--fa:"\f1b9"}.fa-hand-holding-hand{--fa:"\e4f7"}.fa-book-open-reader,.fa-book-reader{--fa:"\f5da"}.fa-mountain-sun{--fa:"\e52f"}.fa-arrows-left-right-to-line{--fa:"\e4ba"}.fa-dice-d20{--fa:"\f6cf"}.fa-truck-droplet{--fa:"\e58c"}.fa-file-circle-xmark{--fa:"\e5a1"}.fa-temperature-arrow-up,.fa-temperature-up{--fa:"\e040"}.fa-medal{--fa:"\f5a2"}.fa-bed{--fa:"\f236"}.fa-h-square,.fa-square-h{--fa:"\f0fd"}.fa-podcast{--fa:"\f2ce"}.fa-temperature-4,.fa-temperature-full,.fa-thermometer-4,.fa-thermometer-full{--fa:"\f2c7"}.fa-bell{--fa:"\f0f3"}.fa-superscript{--fa:"\f12b"}.fa-plug-circle-xmark{--fa:"\e560"}.fa-star-of-life{--fa:"\f621"}.fa-phone-slash{--fa:"\f3dd"}.fa-paint-roller{--fa:"\f5aa"}.fa-hands-helping,.fa-handshake-angle{--fa:"\f4c4"}.fa-location-dot,.fa-map-marker-alt{--fa:"\f3c5"}.fa-file{--fa:"\f15b"}.fa-greater-than{--fa:"\3e"}.fa-person-swimming,.fa-swimmer{--fa:"\f5c4"}.fa-arrow-down{--fa:"\f063"}.fa-droplet,.fa-tint{--fa:"\f043"}.fa-eraser{--fa:"\f12d"}.fa-earth,.fa-earth-america,.fa-earth-americas,.fa-globe-americas{--fa:"\f57d"}.fa-person-burst{--fa:"\e53b"}.fa-dove{--fa:"\f4ba"}.fa-battery-0,.fa-battery-empty{--fa:"\f244"}.fa-socks{--fa:"\f696"}.fa-inbox{--fa:"\f01c"}.fa-section{--fa:"\e447"}.fa-gauge-high,.fa-tachometer-alt,.fa-tachometer-alt-fast{--fa:"\f625"}.fa-envelope-open-text{--fa:"\f658"}.fa-hospital,.fa-hospital-alt,.fa-hospital-wide{--fa:"\f0f8"}.fa-wine-bottle{--fa:"\f72f"}.fa-chess-rook{--fa:"\f447"}.fa-bars-staggered,.fa-reorder,.fa-stream{--fa:"\f550"}.fa-dharmachakra{--fa:"\f655"}.fa-hotdog{--fa:"\f80f"}.fa-blind,.fa-person-walking-with-cane{--fa:"\f29d"}.fa-drum{--fa:"\f569"}.fa-ice-cream{--fa:"\f810"}.fa-heart-circle-bolt{--fa:"\e4fc"}.fa-fax{--fa:"\f1ac"}.fa-paragraph{--fa:"\f1dd"}.fa-check-to-slot,.fa-vote-yea{--fa:"\f772"}.fa-star-half{--fa:"\f089"}.fa-boxes,.fa-boxes-alt,.fa-boxes-stacked{--fa:"\f468"}.fa-chain,.fa-link{--fa:"\f0c1"}.fa-assistive-listening-systems,.fa-ear-listen{--fa:"\f2a2"}.fa-tree-city{--fa:"\e587"}.fa-play{--fa:"\f04b"}.fa-font{--fa:"\f031"}.fa-table-cells-row-lock{--fa:"\e67a"}.fa-rupiah-sign{--fa:"\e23d"}.fa-magnifying-glass,.fa-search{--fa:"\f002"}.fa-ping-pong-paddle-ball,.fa-table-tennis,.fa-table-tennis-paddle-ball{--fa:"\f45d"}.fa-diagnoses,.fa-person-dots-from-line{--fa:"\f470"}.fa-trash-can-arrow-up,.fa-trash-restore-alt{--fa:"\f82a"}.fa-naira-sign{--fa:"\e1f6"}.fa-cart-arrow-down{--fa:"\f218"}.fa-walkie-talkie{--fa:"\f8ef"}.fa-file-edit,.fa-file-pen{--fa:"\f31c"}.fa-receipt{--fa:"\f543"}.fa-pen-square,.fa-pencil-square,.fa-square-pen{--fa:"\f14b"}.fa-suitcase-rolling{--fa:"\f5c1"}.fa-person-circle-exclamation{--fa:"\e53f"}.fa-chevron-down{--fa:"\f078"}.fa-battery,.fa-battery-5,.fa-battery-full{--fa:"\f240"}.fa-skull-crossbones{--fa:"\f714"}.fa-code-compare{--fa:"\e13a"}.fa-list-dots,.fa-list-ul{--fa:"\f0ca"}.fa-school-lock{--fa:"\e56f"}.fa-tower-cell{--fa:"\e585"}.fa-down-long,.fa-long-arrow-alt-down{--fa:"\f309"}.fa-ranking-star{--fa:"\e561"}.fa-chess-king{--fa:"\f43f"}.fa-person-harassing{--fa:"\e549"}.fa-brazilian-real-sign{--fa:"\e46c"}.fa-landmark-alt,.fa-landmark-dome{--fa:"\f752"}.fa-arrow-up{--fa:"\f062"}.fa-television,.fa-tv,.fa-tv-alt{--fa:"\f26c"}.fa-shrimp{--fa:"\e448"}.fa-list-check,.fa-tasks{--fa:"\f0ae"}.fa-jug-detergent{--fa:"\e519"}.fa-circle-user,.fa-user-circle{--fa:"\f2bd"}.fa-user-shield{--fa:"\f505"}.fa-wind{--fa:"\f72e"}.fa-car-burst,.fa-car-crash{--fa:"\f5e1"}.fa-y{--fa:"\59"}.fa-person-snowboarding,.fa-snowboarding{--fa:"\f7ce"}.fa-shipping-fast,.fa-truck-fast{--fa:"\f48b"}.fa-fish{--fa:"\f578"}.fa-user-graduate{--fa:"\f501"}.fa-adjust,.fa-circle-half-stroke{--fa:"\f042"}.fa-clapperboard{--fa:"\e131"}.fa-circle-radiation,.fa-radiation-alt{--fa:"\f7ba"}.fa-baseball,.fa-baseball-ball{--fa:"\f433"}.fa-jet-fighter-up{--fa:"\e518"}.fa-diagram-project,.fa-project-diagram{--fa:"\f542"}.fa-copy{--fa:"\f0c5"}.fa-volume-mute,.fa-volume-times,.fa-volume-xmark{--fa:"\f6a9"}.fa-hand-sparkles{--fa:"\e05d"}.fa-grip,.fa-grip-horizontal{--fa:"\f58d"}.fa-share-from-square,.fa-share-square{--fa:"\f14d"}.fa-child-combatant,.fa-child-rifle{--fa:"\e4e0"}.fa-gun{--fa:"\e19b"}.fa-phone-square,.fa-square-phone{--fa:"\f098"}.fa-add,.fa-plus{--fa:"\2b"}.fa-expand{--fa:"\f065"}.fa-computer{--fa:"\e4e5"}.fa-close,.fa-multiply,.fa-remove,.fa-times,.fa-xmark{--fa:"\f00d"}.fa-arrows,.fa-arrows-up-down-left-right{--fa:"\f047"}.fa-chalkboard-teacher,.fa-chalkboard-user{--fa:"\f51c"}.fa-peso-sign{--fa:"\e222"}.fa-building-shield{--fa:"\e4d8"}.fa-baby{--fa:"\f77c"}.fa-users-line{--fa:"\e592"}.fa-quote-left,.fa-quote-left-alt{--fa:"\f10d"}.fa-tractor{--fa:"\f722"}.fa-trash-arrow-up,.fa-trash-restore{--fa:"\f829"}.fa-arrow-down-up-lock{--fa:"\e4b0"}.fa-lines-leaning{--fa:"\e51e"}.fa-ruler-combined{--fa:"\f546"}.fa-copyright{--fa:"\f1f9"}.fa-equals{--fa:"\3d"}.fa-blender{--fa:"\f517"}.fa-teeth{--fa:"\f62e"}.fa-ils,.fa-shekel,.fa-shekel-sign,.fa-sheqel,.fa-sheqel-sign{--fa:"\f20b"}.fa-map{--fa:"\f279"}.fa-rocket{--fa:"\f135"}.fa-photo-film,.fa-photo-video{--fa:"\f87c"}.fa-folder-minus{--fa:"\f65d"}.fa-hexagon-nodes-bolt{--fa:"\e69a"}.fa-store{--fa:"\f54e"}.fa-arrow-trend-up{--fa:"\e098"}.fa-plug-circle-minus{--fa:"\e55e"}.fa-sign,.fa-sign-hanging{--fa:"\f4d9"}.fa-bezier-curve{--fa:"\f55b"}.fa-bell-slash{--fa:"\f1f6"}.fa-tablet,.fa-tablet-android{--fa:"\f3fb"}.fa-school-flag{--fa:"\e56e"}.fa-fill{--fa:"\f575"}.fa-angle-up{--fa:"\f106"}.fa-drumstick-bite{--fa:"\f6d7"}.fa-holly-berry{--fa:"\f7aa"}.fa-chevron-left{--fa:"\f053"}.fa-bacteria{--fa:"\e059"}.fa-hand-lizard{--fa:"\f258"}.fa-notdef{--fa:"\e1fe"}.fa-disease{--fa:"\f7fa"}.fa-briefcase-medical{--fa:"\f469"}.fa-genderless{--fa:"\f22d"}.fa-chevron-right{--fa:"\f054"}.fa-retweet{--fa:"\f079"}.fa-car-alt,.fa-car-rear{--fa:"\f5de"}.fa-pump-soap{--fa:"\e06b"}.fa-video-slash{--fa:"\f4e2"}.fa-battery-2,.fa-battery-quarter{--fa:"\f243"}.fa-radio{--fa:"\f8d7"}.fa-baby-carriage,.fa-carriage-baby{--fa:"\f77d"}.fa-traffic-light{--fa:"\f637"}.fa-thermometer{--fa:"\f491"}.fa-vr-cardboard{--fa:"\f729"}.fa-hand-middle-finger{--fa:"\f806"}.fa-percent,.fa-percentage{--fa:"\25"}.fa-truck-moving{--fa:"\f4df"}.fa-glass-water-droplet{--fa:"\e4f5"}.fa-display{--fa:"\e163"}.fa-face-smile,.fa-smile{--fa:"\f118"}.fa-thumb-tack,.fa-thumbtack{--fa:"\f08d"}.fa-trophy{--fa:"\f091"}.fa-person-praying,.fa-pray{--fa:"\f683"}.fa-hammer{--fa:"\f6e3"}.fa-hand-peace{--fa:"\f25b"}.fa-rotate,.fa-sync-alt{--fa:"\f2f1"}.fa-spinner{--fa:"\f110"}.fa-robot{--fa:"\f544"}.fa-peace{--fa:"\f67c"}.fa-cogs,.fa-gears{--fa:"\f085"}.fa-warehouse{--fa:"\f494"}.fa-arrow-up-right-dots{--fa:"\e4b7"}.fa-splotch{--fa:"\f5bc"}.fa-face-grin-hearts,.fa-grin-hearts{--fa:"\f584"}.fa-dice-four{--fa:"\f524"}.fa-sim-card{--fa:"\f7c4"}.fa-transgender,.fa-transgender-alt{--fa:"\f225"}.fa-mercury{--fa:"\f223"}.fa-arrow-turn-down,.fa-level-down{--fa:"\f149"}.fa-person-falling-burst{--fa:"\e547"}.fa-award{--fa:"\f559"}.fa-ticket-alt,.fa-ticket-simple{--fa:"\f3ff"}.fa-building{--fa:"\f1ad"}.fa-angle-double-left,.fa-angles-left{--fa:"\f100"}.fa-qrcode{--fa:"\f029"}.fa-clock-rotate-left,.fa-history{--fa:"\f1da"}.fa-face-grin-beam-sweat,.fa-grin-beam-sweat{--fa:"\f583"}.fa-arrow-right-from-file,.fa-file-export{--fa:"\f56e"}.fa-shield,.fa-shield-blank{--fa:"\f132"}.fa-arrow-up-short-wide,.fa-sort-amount-up-alt{--fa:"\f885"}.fa-comment-nodes{--fa:"\e696"}.fa-house-medical{--fa:"\e3b2"}.fa-golf-ball,.fa-golf-ball-tee{--fa:"\f450"}.fa-chevron-circle-left,.fa-circle-chevron-left{--fa:"\f137"}.fa-house-chimney-window{--fa:"\e00d"}.fa-pen-nib{--fa:"\f5ad"}.fa-tent-arrow-turn-left{--fa:"\e580"}.fa-tents{--fa:"\e582"}.fa-magic,.fa-wand-magic{--fa:"\f0d0"}.fa-dog{--fa:"\f6d3"}.fa-carrot{--fa:"\f787"}.fa-moon{--fa:"\f186"}.fa-wine-glass-alt,.fa-wine-glass-empty{--fa:"\f5ce"}.fa-cheese{--fa:"\f7ef"}.fa-yin-yang{--fa:"\f6ad"}.fa-music{--fa:"\f001"}.fa-code-commit{--fa:"\f386"}.fa-temperature-low{--fa:"\f76b"}.fa-biking,.fa-person-biking{--fa:"\f84a"}.fa-broom{--fa:"\f51a"}.fa-shield-heart{--fa:"\e574"}.fa-gopuram{--fa:"\f664"}.fa-earth-oceania,.fa-globe-oceania{--fa:"\e47b"}.fa-square-xmark,.fa-times-square,.fa-xmark-square{--fa:"\f2d3"}.fa-hashtag{--fa:"\23"}.fa-expand-alt,.fa-up-right-and-down-left-from-center{--fa:"\f424"}.fa-oil-can{--fa:"\f613"}.fa-t{--fa:"\54"}.fa-hippo{--fa:"\f6ed"}.fa-chart-column{--fa:"\e0e3"}.fa-infinity{--fa:"\f534"}.fa-vial-circle-check{--fa:"\e596"}.fa-person-arrow-down-to-line{--fa:"\e538"}.fa-voicemail{--fa:"\f897"}.fa-fan{--fa:"\f863"}.fa-person-walking-luggage{--fa:"\e554"}.fa-arrows-alt-v,.fa-up-down{--fa:"\f338"}.fa-cloud-moon-rain{--fa:"\f73c"}.fa-calendar{--fa:"\f133"}.fa-trailer{--fa:"\e041"}.fa-bahai,.fa-haykal{--fa:"\f666"}.fa-sd-card{--fa:"\f7c2"}.fa-dragon{--fa:"\f6d5"}.fa-shoe-prints{--fa:"\f54b"}.fa-circle-plus,.fa-plus-circle{--fa:"\f055"}.fa-face-grin-tongue-wink,.fa-grin-tongue-wink{--fa:"\f58b"}.fa-hand-holding{--fa:"\f4bd"}.fa-plug-circle-exclamation{--fa:"\e55d"}.fa-chain-broken,.fa-chain-slash,.fa-link-slash,.fa-unlink{--fa:"\f127"}.fa-clone{--fa:"\f24d"}.fa-person-walking-arrow-loop-left{--fa:"\e551"}.fa-arrow-up-z-a,.fa-sort-alpha-up-alt{--fa:"\f882"}.fa-fire-alt,.fa-fire-flame-curved{--fa:"\f7e4"}.fa-tornado{--fa:"\f76f"}.fa-file-circle-plus{--fa:"\e494"}.fa-book-quran,.fa-quran{--fa:"\f687"}.fa-anchor{--fa:"\f13d"}.fa-border-all{--fa:"\f84c"}.fa-angry,.fa-face-angry{--fa:"\f556"}.fa-cookie-bite{--fa:"\f564"}.fa-arrow-trend-down{--fa:"\e097"}.fa-feed,.fa-rss{--fa:"\f09e"}.fa-draw-polygon{--fa:"\f5ee"}.fa-balance-scale,.fa-scale-balanced{--fa:"\f24e"}.fa-gauge-simple-high,.fa-tachometer,.fa-tachometer-fast{--fa:"\f62a"}.fa-shower{--fa:"\f2cc"}.fa-desktop,.fa-desktop-alt{--fa:"\f390"}.fa-m{--fa:"\4d"}.fa-table-list,.fa-th-list{--fa:"\f00b"}.fa-comment-sms,.fa-sms{--fa:"\f7cd"}.fa-book{--fa:"\f02d"}.fa-user-plus{--fa:"\f234"}.fa-check{--fa:"\f00c"}.fa-battery-4,.fa-battery-three-quarters{--fa:"\f241"}.fa-house-circle-check{--fa:"\e509"}.fa-angle-left{--fa:"\f104"}.fa-diagram-successor{--fa:"\e47a"}.fa-truck-arrow-right{--fa:"\e58b"}.fa-arrows-split-up-and-left{--fa:"\e4bc"}.fa-fist-raised,.fa-hand-fist{--fa:"\f6de"}.fa-cloud-moon{--fa:"\f6c3"}.fa-briefcase{--fa:"\f0b1"}.fa-person-falling{--fa:"\e546"}.fa-image-portrait,.fa-portrait{--fa:"\f3e0"}.fa-user-tag{--fa:"\f507"}.fa-rug{--fa:"\e569"}.fa-earth-europe,.fa-globe-europe{--fa:"\f7a2"}.fa-cart-flatbed-suitcase,.fa-luggage-cart{--fa:"\f59d"}.fa-rectangle-times,.fa-rectangle-xmark,.fa-times-rectangle,.fa-window-close{--fa:"\f410"}.fa-baht-sign{--fa:"\e0ac"}.fa-book-open{--fa:"\f518"}.fa-book-journal-whills,.fa-journal-whills{--fa:"\f66a"}.fa-handcuffs{--fa:"\e4f8"}.fa-exclamation-triangle,.fa-triangle-exclamation,.fa-warning{--fa:"\f071"}.fa-database{--fa:"\f1c0"}.fa-mail-forward,.fa-share{--fa:"\f064"}.fa-bottle-droplet{--fa:"\e4c4"}.fa-mask-face{--fa:"\e1d7"}.fa-hill-rockslide{--fa:"\e508"}.fa-exchange-alt,.fa-right-left{--fa:"\f362"}.fa-paper-plane{--fa:"\f1d8"}.fa-road-circle-exclamation{--fa:"\e565"}.fa-dungeon{--fa:"\f6d9"}.fa-align-right{--fa:"\f038"}.fa-money-bill-1-wave,.fa-money-bill-wave-alt{--fa:"\f53b"}.fa-life-ring{--fa:"\f1cd"}.fa-hands,.fa-sign-language,.fa-signing{--fa:"\f2a7"}.fa-calendar-day{--fa:"\f783"}.fa-ladder-water,.fa-swimming-pool,.fa-water-ladder{--fa:"\f5c5"}.fa-arrows-up-down,.fa-arrows-v{--fa:"\f07d"}.fa-face-grimace,.fa-grimace{--fa:"\f57f"}.fa-wheelchair-alt,.fa-wheelchair-move{--fa:"\e2ce"}.fa-level-down-alt,.fa-turn-down{--fa:"\f3be"}.fa-person-walking-arrow-right{--fa:"\e552"}.fa-envelope-square,.fa-square-envelope{--fa:"\f199"}.fa-dice{--fa:"\f522"}.fa-bowling-ball{--fa:"\f436"}.fa-brain{--fa:"\f5dc"}.fa-band-aid,.fa-bandage{--fa:"\f462"}.fa-calendar-minus{--fa:"\f272"}.fa-circle-xmark,.fa-times-circle,.fa-xmark-circle{--fa:"\f057"}.fa-gifts{--fa:"\f79c"}.fa-hotel{--fa:"\f594"}.fa-earth-asia,.fa-globe-asia{--fa:"\f57e"}.fa-id-card-alt,.fa-id-card-clip{--fa:"\f47f"}.fa-magnifying-glass-plus,.fa-search-plus{--fa:"\f00e"}.fa-thumbs-up{--fa:"\f164"}.fa-user-clock{--fa:"\f4fd"}.fa-allergies,.fa-hand-dots{--fa:"\f461"}.fa-file-invoice{--fa:"\f570"}.fa-window-minimize{--fa:"\f2d1"}.fa-coffee,.fa-mug-saucer{--fa:"\f0f4"}.fa-brush{--fa:"\f55d"}.fa-file-half-dashed{--fa:"\e698"}.fa-mask{--fa:"\f6fa"}.fa-magnifying-glass-minus,.fa-search-minus{--fa:"\f010"}.fa-ruler-vertical{--fa:"\f548"}.fa-user-alt,.fa-user-large{--fa:"\f406"}.fa-train-tram{--fa:"\e5b4"}.fa-user-nurse{--fa:"\f82f"}.fa-syringe{--fa:"\f48e"}.fa-cloud-sun{--fa:"\f6c4"}.fa-stopwatch-20{--fa:"\e06f"}.fa-square-full{--fa:"\f45c"}.fa-magnet{--fa:"\f076"}.fa-jar{--fa:"\e516"}.fa-note-sticky,.fa-sticky-note{--fa:"\f249"}.fa-bug-slash{--fa:"\e490"}.fa-arrow-up-from-water-pump{--fa:"\e4b6"}.fa-bone{--fa:"\f5d7"}.fa-table-cells-row-unlock{--fa:"\e691"}.fa-user-injured{--fa:"\f728"}.fa-face-sad-tear,.fa-sad-tear{--fa:"\f5b4"}.fa-plane{--fa:"\f072"}.fa-tent-arrows-down{--fa:"\e581"}.fa-exclamation{--fa:"\21"}.fa-arrows-spin{--fa:"\e4bb"}.fa-print{--fa:"\f02f"}.fa-try,.fa-turkish-lira,.fa-turkish-lira-sign{--fa:"\e2bb"}.fa-dollar,.fa-dollar-sign,.fa-usd{--fa:"\24"}.fa-x{--fa:"\58"}.fa-magnifying-glass-dollar,.fa-search-dollar{--fa:"\f688"}.fa-users-cog,.fa-users-gear{--fa:"\f509"}.fa-person-military-pointing{--fa:"\e54a"}.fa-bank,.fa-building-columns,.fa-institution,.fa-museum,.fa-university{--fa:"\f19c"}.fa-umbrella{--fa:"\f0e9"}.fa-trowel{--fa:"\e589"}.fa-d{--fa:"\44"}.fa-stapler{--fa:"\e5af"}.fa-masks-theater,.fa-theater-masks{--fa:"\f630"}.fa-kip-sign{--fa:"\e1c4"}.fa-hand-point-left{--fa:"\f0a5"}.fa-handshake-alt,.fa-handshake-simple{--fa:"\f4c6"}.fa-fighter-jet,.fa-jet-fighter{--fa:"\f0fb"}.fa-share-alt-square,.fa-square-share-nodes{--fa:"\f1e1"}.fa-barcode{--fa:"\f02a"}.fa-plus-minus{--fa:"\e43c"}.fa-video,.fa-video-camera{--fa:"\f03d"}.fa-graduation-cap,.fa-mortar-board{--fa:"\f19d"}.fa-hand-holding-medical{--fa:"\e05c"}.fa-person-circle-check{--fa:"\e53e"}.fa-level-up-alt,.fa-turn-up{--fa:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/files/fontawesome/css/regular.css b/files/fontawesome/css/regular.css deleted file mode 100644 index be1e468fcd..0000000000 --- a/files/fontawesome/css/regular.css +++ /dev/null @@ -1,19 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:root, :host { - --fa-style-family-classic: 'Font Awesome 6 Free'; - --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; } - -@font-face { - font-family: 'Font Awesome 6 Free'; - font-style: normal; - font-weight: 400; - font-display: block; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } - -.far, -.fa-regular { - font-weight: 400; } diff --git a/files/fontawesome/css/regular.min.css b/files/fontawesome/css/regular.min.css deleted file mode 100644 index 31256ee536..0000000000 --- a/files/fontawesome/css/regular.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400} \ No newline at end of file diff --git a/files/fontawesome/css/solid.css b/files/fontawesome/css/solid.css deleted file mode 100644 index 6742be3363..0000000000 --- a/files/fontawesome/css/solid.css +++ /dev/null @@ -1,19 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:root, :host { - --fa-style-family-classic: 'Font Awesome 6 Free'; - --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; } - -@font-face { - font-family: 'Font Awesome 6 Free'; - font-style: normal; - font-weight: 900; - font-display: block; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -.fas, -.fa-solid { - font-weight: 900; } diff --git a/files/fontawesome/css/solid.min.css b/files/fontawesome/css/solid.min.css deleted file mode 100644 index 8dc01128f1..0000000000 --- a/files/fontawesome/css/solid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/files/fontawesome/css/svg-with-js.css b/files/fontawesome/css/svg-with-js.css deleted file mode 100644 index d780146d8e..0000000000 --- a/files/fontawesome/css/svg-with-js.css +++ /dev/null @@ -1,461 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:root, :host { - --fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; - --fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; - --fa-font-light: normal 300 1em/1 'Font Awesome 6 Pro'; - --fa-font-thin: normal 100 1em/1 'Font Awesome 6 Pro'; - --fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone'; - --fa-font-duotone-regular: normal 400 1em/1 'Font Awesome 6 Duotone'; - --fa-font-duotone-light: normal 300 1em/1 'Font Awesome 6 Duotone'; - --fa-font-duotone-thin: normal 100 1em/1 'Font Awesome 6 Duotone'; - --fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; - --fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp'; - --fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp'; - --fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp'; - --fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp'; - --fa-font-sharp-duotone-solid: normal 900 1em/1 'Font Awesome 6 Sharp Duotone'; - --fa-font-sharp-duotone-regular: normal 400 1em/1 'Font Awesome 6 Sharp Duotone'; - --fa-font-sharp-duotone-light: normal 300 1em/1 'Font Awesome 6 Sharp Duotone'; - --fa-font-sharp-duotone-thin: normal 100 1em/1 'Font Awesome 6 Sharp Duotone'; } - -svg.svg-inline--fa:not(:root), svg.svg-inline--fa:not(:host) { - overflow: visible; - box-sizing: content-box; } - -.svg-inline--fa { - display: var(--fa-display, inline-block); - height: 1em; - overflow: visible; - vertical-align: -.125em; } - .svg-inline--fa.fa-2xs { - vertical-align: 0.1em; } - .svg-inline--fa.fa-xs { - vertical-align: 0em; } - .svg-inline--fa.fa-sm { - vertical-align: -0.07143em; } - .svg-inline--fa.fa-lg { - vertical-align: -0.2em; } - .svg-inline--fa.fa-xl { - vertical-align: -0.25em; } - .svg-inline--fa.fa-2xl { - vertical-align: -0.3125em; } - .svg-inline--fa.fa-pull-left { - margin-right: var(--fa-pull-margin, 0.3em); - width: auto; } - .svg-inline--fa.fa-pull-right { - margin-left: var(--fa-pull-margin, 0.3em); - width: auto; } - .svg-inline--fa.fa-li { - width: var(--fa-li-width, 2em); - top: 0.25em; } - .svg-inline--fa.fa-fw { - width: var(--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-counter, .fa-layers-text { - display: inline-block; - position: absolute; - text-align: center; } - -.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-text { - left: 50%; - top: 50%; - transform: translate(-50%, -50%); - transform-origin: center center; } - -.fa-layers-counter { - background-color: var(--fa-counter-background-color, #ff253a); - border-radius: var(--fa-counter-border-radius, 1em); - box-sizing: border-box; - color: var(--fa-inverse, #fff); - line-height: var(--fa-counter-line-height, 1); - max-width: var(--fa-counter-max-width, 5em); - min-width: var(--fa-counter-min-width, 1.5em); - overflow: hidden; - padding: var(--fa-counter-padding, 0.25em 0.5em); - right: var(--fa-right, 0); - text-overflow: ellipsis; - top: var(--fa-top, 0); - transform: scale(var(--fa-counter-scale, 0.25)); - transform-origin: top right; } - -.fa-layers-bottom-right { - bottom: var(--fa-bottom, 0); - right: var(--fa-right, 0); - top: auto; - transform: scale(var(--fa-layers-scale, 0.25)); - transform-origin: bottom right; } - -.fa-layers-bottom-left { - bottom: var(--fa-bottom, 0); - left: var(--fa-left, 0); - right: auto; - top: auto; - transform: scale(var(--fa-layers-scale, 0.25)); - transform-origin: bottom left; } - -.fa-layers-top-right { - top: var(--fa-top, 0); - right: var(--fa-right, 0); - transform: scale(var(--fa-layers-scale, 0.25)); - transform-origin: top right; } - -.fa-layers-top-left { - left: var(--fa-left, 0); - right: auto; - top: var(--fa-top, 0); - transform: scale(var(--fa-layers-scale, 0.25)); - transform-origin: top left; } - -.fa-1x { - font-size: 1em; } - -.fa-2x { - font-size: 2em; } - -.fa-3x { - font-size: 3em; } - -.fa-4x { - font-size: 4em; } - -.fa-5x { - font-size: 5em; } - -.fa-6x { - font-size: 6em; } - -.fa-7x { - font-size: 7em; } - -.fa-8x { - font-size: 8em; } - -.fa-9x { - font-size: 9em; } - -.fa-10x { - font-size: 10em; } - -.fa-2xs { - font-size: 0.625em; - line-height: 0.1em; - vertical-align: 0.225em; } - -.fa-xs { - font-size: 0.75em; - line-height: 0.08333em; - vertical-align: 0.125em; } - -.fa-sm { - font-size: 0.875em; - line-height: 0.07143em; - vertical-align: 0.05357em; } - -.fa-lg { - font-size: 1.25em; - line-height: 0.05em; - vertical-align: -0.075em; } - -.fa-xl { - font-size: 1.5em; - line-height: 0.04167em; - vertical-align: -0.125em; } - -.fa-2xl { - font-size: 2em; - line-height: 0.03125em; - vertical-align: -0.1875em; } - -.fa-fw { - text-align: center; - width: 1.25em; } - -.fa-ul { - list-style-type: none; - margin-left: var(--fa-li-margin, 2.5em); - padding-left: 0; } - .fa-ul > li { - position: relative; } - -.fa-li { - left: calc(-1 * var(--fa-li-width, 2em)); - position: absolute; - text-align: center; - width: var(--fa-li-width, 2em); - line-height: inherit; } - -.fa-border { - border-color: var(--fa-border-color, #eee); - border-radius: var(--fa-border-radius, 0.1em); - border-style: var(--fa-border-style, solid); - border-width: var(--fa-border-width, 0.08em); - padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); } - -.fa-pull-left { - float: left; - margin-right: var(--fa-pull-margin, 0.3em); } - -.fa-pull-right { - float: right; - margin-left: var(--fa-pull-margin, 0.3em); } - -.fa-beat { - animation-name: fa-beat; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-bounce { - animation-name: fa-bounce; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); } - -.fa-fade { - animation-name: fa-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-beat-fade { - animation-name: fa-beat-fade; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); } - -.fa-flip { - animation-name: fa-flip; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, ease-in-out); } - -.fa-shake { - animation-name: fa-shake; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin { - animation-name: fa-spin; - animation-delay: var(--fa-animation-delay, 0s); - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 2s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, linear); } - -.fa-spin-reverse { - --fa-animation-direction: reverse; } - -.fa-pulse, -.fa-spin-pulse { - animation-name: fa-spin; - animation-direction: var(--fa-animation-direction, normal); - animation-duration: var(--fa-animation-duration, 1s); - animation-iteration-count: var(--fa-animation-iteration-count, infinite); - animation-timing-function: var(--fa-animation-timing, steps(8)); } - -@media (prefers-reduced-motion: reduce) { - .fa-beat, - .fa-bounce, - .fa-fade, - .fa-beat-fade, - .fa-flip, - .fa-pulse, - .fa-shake, - .fa-spin, - .fa-spin-pulse { - animation-delay: -1ms; - animation-duration: 1ms; - animation-iteration-count: 1; - transition-delay: 0s; - transition-duration: 0s; } } - -@keyframes fa-beat { - 0%, 90% { - transform: scale(1); } - 45% { - transform: scale(var(--fa-beat-scale, 1.25)); } } - -@keyframes fa-bounce { - 0% { - transform: scale(1, 1) translateY(0); } - 10% { - transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); } - 30% { - transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); } - 50% { - transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); } - 57% { - transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); } - 64% { - transform: scale(1, 1) translateY(0); } - 100% { - transform: scale(1, 1) translateY(0); } } - -@keyframes fa-fade { - 50% { - opacity: var(--fa-fade-opacity, 0.4); } } - -@keyframes fa-beat-fade { - 0%, 100% { - opacity: var(--fa-beat-fade-opacity, 0.4); - transform: scale(1); } - 50% { - opacity: 1; - transform: scale(var(--fa-beat-fade-scale, 1.125)); } } - -@keyframes fa-flip { - 50% { - transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } } - -@keyframes fa-shake { - 0% { - transform: rotate(-15deg); } - 4% { - transform: rotate(15deg); } - 8%, 24% { - transform: rotate(-18deg); } - 12%, 28% { - transform: rotate(18deg); } - 16% { - transform: rotate(-22deg); } - 20% { - transform: rotate(22deg); } - 32% { - transform: rotate(-12deg); } - 36% { - transform: rotate(12deg); } - 40%, 100% { - transform: rotate(0deg); } } - -@keyframes fa-spin { - 0% { - transform: rotate(0deg); } - 100% { - transform: rotate(360deg); } } - -.fa-rotate-90 { - transform: rotate(90deg); } - -.fa-rotate-180 { - transform: rotate(180deg); } - -.fa-rotate-270 { - transform: rotate(270deg); } - -.fa-flip-horizontal { - transform: scale(-1, 1); } - -.fa-flip-vertical { - transform: scale(1, -1); } - -.fa-flip-both, -.fa-flip-horizontal.fa-flip-vertical { - transform: scale(-1, -1); } - -.fa-rotate-by { - transform: rotate(var(--fa-rotate-angle, 0)); } - -.fa-stack { - display: inline-block; - vertical-align: middle; - 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; - z-index: var(--fa-stack-z-index, auto); } - -.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: var(--fa-inverse, #fff); } - -.sr-only, -.fa-sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } - -.sr-only-focusable:not(:focus), -.fa-sr-only-focusable:not(:focus) { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - white-space: nowrap; - border-width: 0; } - -.svg-inline--fa .fa-primary { - fill: var(--fa-primary-color, currentColor); - opacity: var(--fa-primary-opacity, 1); } - -.svg-inline--fa .fa-secondary { - fill: var(--fa-secondary-color, currentColor); - opacity: var(--fa-secondary-opacity, 0.4); } - -.svg-inline--fa.fa-swap-opacity .fa-primary { - opacity: var(--fa-secondary-opacity, 0.4); } - -.svg-inline--fa.fa-swap-opacity .fa-secondary { - opacity: var(--fa-primary-opacity, 1); } - -.svg-inline--fa mask .fa-primary, -.svg-inline--fa mask .fa-secondary { - fill: black; } diff --git a/files/fontawesome/css/svg-with-js.min.css b/files/fontawesome/css/svg-with-js.min.css deleted file mode 100644 index cb091a6e25..0000000000 --- a/files/fontawesome/css/svg-with-js.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -:host,:root{--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free";--fa-font-light:normal 300 1em/1 "Font Awesome 6 Pro";--fa-font-thin:normal 100 1em/1 "Font Awesome 6 Pro";--fa-font-duotone:normal 900 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-regular:normal 400 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-light:normal 300 1em/1 "Font Awesome 6 Duotone";--fa-font-duotone-thin:normal 100 1em/1 "Font Awesome 6 Duotone";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands";--fa-font-sharp-solid:normal 900 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-regular:normal 400 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-light:normal 300 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-thin:normal 100 1em/1 "Font Awesome 6 Sharp";--fa-font-sharp-duotone-solid:normal 900 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-regular:normal 400 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-light:normal 300 1em/1 "Font Awesome 6 Sharp Duotone";--fa-font-sharp-duotone-thin:normal 100 1em/1 "Font Awesome 6 Sharp Duotone"}svg.svg-inline--fa:not(:host),svg.svg-inline--fa:not(:root){overflow:visible;box-sizing:initial}.svg-inline--fa{display:var(--fa-display,inline-block);height:1em;overflow:visible;vertical-align:-.125em}.svg-inline--fa.fa-2xs{vertical-align:.1em}.svg-inline--fa.fa-xs{vertical-align:0}.svg-inline--fa.fa-sm{vertical-align:-.07143em}.svg-inline--fa.fa-lg{vertical-align:-.2em}.svg-inline--fa.fa-xl{vertical-align:-.25em}.svg-inline--fa.fa-2xl{vertical-align:-.3125em}.svg-inline--fa.fa-pull-left{margin-right:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-pull-right{margin-left:var(--fa-pull-margin,.3em);width:auto}.svg-inline--fa.fa-li{width:var(--fa-li-width,2em);top:.25em}.svg-inline--fa.fa-fw{width:var(--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-counter,.fa-layers-text{display:inline-block;position:absolute;text-align:center}.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-text{left:50%;top:50%;transform:translate(-50%,-50%);transform-origin:center center}.fa-layers-counter{background-color:var(--fa-counter-background-color,#ff253a);border-radius:var(--fa-counter-border-radius,1em);box-sizing:border-box;color:var(--fa-inverse,#fff);line-height:var(--fa-counter-line-height,1);max-width:var(--fa-counter-max-width,5em);min-width:var(--fa-counter-min-width,1.5em);overflow:hidden;padding:var(--fa-counter-padding,.25em .5em);right:var(--fa-right,0);text-overflow:ellipsis;top:var(--fa-top,0);transform:scale(var(--fa-counter-scale,.25));transform-origin:top right}.fa-layers-bottom-right{bottom:var(--fa-bottom,0);right:var(--fa-right,0);top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom right}.fa-layers-bottom-left{bottom:var(--fa-bottom,0);left:var(--fa-left,0);right:auto;top:auto;transform:scale(var(--fa-layers-scale,.25));transform-origin:bottom left}.fa-layers-top-right{top:var(--fa-top,0);right:var(--fa-right,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top right}.fa-layers-top-left{left:var(--fa-left,0);right:auto;top:var(--fa-top,0);transform:scale(var(--fa-layers-scale,.25));transform-origin:top left}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{animation-name:fa-beat;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{animation-name:fa-bounce;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{animation-name:fa-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{animation-name:fa-beat-fade;animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{animation-name:fa-flip;animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{animation-name:fa-shake;animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{animation-delay:var(--fa-animation-delay,0s);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{animation-name:fa-spin;animation-duration:var(--fa-animation-duration,2s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{animation-name:fa-spin;animation-direction:var(--fa-animation-direction,normal);animation-duration:var(--fa-animation-duration,1s);animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{animation-delay:-1ms;animation-duration:1ms;animation-iteration-count:1;transition-delay:0s;transition-duration:0s}}@keyframes fa-beat{0%,90%{transform:scale(1)}45%{transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-bounce{0%{transform:scale(1) translateY(0)}10%{transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{transform:scale(1) translateY(0)}to{transform:scale(1) translateY(0)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);transform:scale(1)}50%{opacity:1;transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-flip{50%{transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-shake{0%{transform:rotate(-15deg)}4%{transform:rotate(15deg)}8%,24%{transform:rotate(-18deg)}12%,28%{transform:rotate(18deg)}16%{transform:rotate(-22deg)}20%{transform:rotate(22deg)}32%{transform:rotate(-12deg)}36%{transform:rotate(12deg)}40%,to{transform:rotate(0deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{transform:rotate(90deg)}.fa-rotate-180{transform:rotate(180deg)}.fa-rotate-270{transform:rotate(270deg)}.fa-flip-horizontal{transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}.fa-rotate-by{transform:rotate(var(--fa-rotate-angle,0))}.fa-stack{display:inline-block;vertical-align:middle;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;z-index:var(--fa-stack-z-index,auto)}.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:var(--fa-inverse,#fff)}.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.svg-inline--fa .fa-primary{fill:var(--fa-primary-color,currentColor);opacity:var(--fa-primary-opacity,1)}.svg-inline--fa .fa-secondary{fill:var(--fa-secondary-color,currentColor)}.svg-inline--fa .fa-secondary,.svg-inline--fa.fa-swap-opacity .fa-primary{opacity:var(--fa-secondary-opacity,.4)}.svg-inline--fa.fa-swap-opacity .fa-secondary{opacity:var(--fa-primary-opacity,1)}.svg-inline--fa mask .fa-primary,.svg-inline--fa mask .fa-secondary{fill:#000} \ No newline at end of file diff --git a/files/fontawesome/css/v4-font-face.css b/files/fontawesome/css/v4-font-face.css deleted file mode 100644 index c453a99dcc..0000000000 --- a/files/fontawesome/css/v4-font-face.css +++ /dev/null @@ -1,26 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); - unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; } - -@font-face { - font-family: 'FontAwesome'; - font-display: block; - src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype"); - unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; } diff --git a/files/fontawesome/css/v4-font-face.min.css b/files/fontawesome/css/v4-font-face.min.css deleted file mode 100644 index fa5810700d..0000000000 --- a/files/fontawesome/css/v4-font-face.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/files/fontawesome/css/v4-shims.css b/files/fontawesome/css/v4-shims.css deleted file mode 100644 index 7ed4af7d2a..0000000000 --- a/files/fontawesome/css/v4-shims.css +++ /dev/null @@ -1,2194 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa.fa-glass { - --fa: "\f000"; } - -.fa.fa-envelope-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-envelope-o { - --fa: "\f0e0"; } - -.fa.fa-star-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-star-o { - --fa: "\f005"; } - -.fa.fa-remove { - --fa: "\f00d"; } - -.fa.fa-close { - --fa: "\f00d"; } - -.fa.fa-gear { - --fa: "\f013"; } - -.fa.fa-trash-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-trash-o { - --fa: "\f2ed"; } - -.fa.fa-home { - --fa: "\f015"; } - -.fa.fa-file-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-o { - --fa: "\f15b"; } - -.fa.fa-clock-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-clock-o { - --fa: "\f017"; } - -.fa.fa-arrow-circle-o-down { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-down { - --fa: "\f358"; } - -.fa.fa-arrow-circle-o-up { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-up { - --fa: "\f35b"; } - -.fa.fa-play-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-play-circle-o { - --fa: "\f144"; } - -.fa.fa-repeat { - --fa: "\f01e"; } - -.fa.fa-rotate-right { - --fa: "\f01e"; } - -.fa.fa-refresh { - --fa: "\f021"; } - -.fa.fa-list-alt { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-list-alt { - --fa: "\f022"; } - -.fa.fa-dedent { - --fa: "\f03b"; } - -.fa.fa-video-camera { - --fa: "\f03d"; } - -.fa.fa-picture-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-picture-o { - --fa: "\f03e"; } - -.fa.fa-photo { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-photo { - --fa: "\f03e"; } - -.fa.fa-image { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-image { - --fa: "\f03e"; } - -.fa.fa-map-marker { - --fa: "\f3c5"; } - -.fa.fa-pencil-square-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-pencil-square-o { - --fa: "\f044"; } - -.fa.fa-edit { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-edit { - --fa: "\f044"; } - -.fa.fa-share-square-o { - --fa: "\f14d"; } - -.fa.fa-check-square-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-check-square-o { - --fa: "\f14a"; } - -.fa.fa-arrows { - --fa: "\f0b2"; } - -.fa.fa-times-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-times-circle-o { - --fa: "\f057"; } - -.fa.fa-check-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-check-circle-o { - --fa: "\f058"; } - -.fa.fa-mail-forward { - --fa: "\f064"; } - -.fa.fa-expand { - --fa: "\f424"; } - -.fa.fa-compress { - --fa: "\f422"; } - -.fa.fa-eye { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-eye-slash { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-warning { - --fa: "\f071"; } - -.fa.fa-calendar { - --fa: "\f073"; } - -.fa.fa-arrows-v { - --fa: "\f338"; } - -.fa.fa-arrows-h { - --fa: "\f337"; } - -.fa.fa-bar-chart { - --fa: "\e0e3"; } - -.fa.fa-bar-chart-o { - --fa: "\e0e3"; } - -.fa.fa-twitter-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-twitter-square { - --fa: "\f081"; } - -.fa.fa-facebook-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-facebook-square { - --fa: "\f082"; } - -.fa.fa-gears { - --fa: "\f085"; } - -.fa.fa-thumbs-o-up { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-thumbs-o-up { - --fa: "\f164"; } - -.fa.fa-thumbs-o-down { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-thumbs-o-down { - --fa: "\f165"; } - -.fa.fa-heart-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-heart-o { - --fa: "\f004"; } - -.fa.fa-sign-out { - --fa: "\f2f5"; } - -.fa.fa-linkedin-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-linkedin-square { - --fa: "\f08c"; } - -.fa.fa-thumb-tack { - --fa: "\f08d"; } - -.fa.fa-external-link { - --fa: "\f35d"; } - -.fa.fa-sign-in { - --fa: "\f2f6"; } - -.fa.fa-github-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-github-square { - --fa: "\f092"; } - -.fa.fa-lemon-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-lemon-o { - --fa: "\f094"; } - -.fa.fa-square-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-square-o { - --fa: "\f0c8"; } - -.fa.fa-bookmark-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-bookmark-o { - --fa: "\f02e"; } - -.fa.fa-twitter { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-facebook { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-facebook { - --fa: "\f39e"; } - -.fa.fa-facebook-f { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-facebook-f { - --fa: "\f39e"; } - -.fa.fa-github { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-credit-card { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-feed { - --fa: "\f09e"; } - -.fa.fa-hdd-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hdd-o { - --fa: "\f0a0"; } - -.fa.fa-hand-o-right { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-o-right { - --fa: "\f0a4"; } - -.fa.fa-hand-o-left { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-o-left { - --fa: "\f0a5"; } - -.fa.fa-hand-o-up { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-o-up { - --fa: "\f0a6"; } - -.fa.fa-hand-o-down { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-o-down { - --fa: "\f0a7"; } - -.fa.fa-globe { - --fa: "\f57d"; } - -.fa.fa-tasks { - --fa: "\f828"; } - -.fa.fa-arrows-alt { - --fa: "\f31e"; } - -.fa.fa-group { - --fa: "\f0c0"; } - -.fa.fa-chain { - --fa: "\f0c1"; } - -.fa.fa-cut { - --fa: "\f0c4"; } - -.fa.fa-files-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-files-o { - --fa: "\f0c5"; } - -.fa.fa-floppy-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-floppy-o { - --fa: "\f0c7"; } - -.fa.fa-save { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-save { - --fa: "\f0c7"; } - -.fa.fa-navicon { - --fa: "\f0c9"; } - -.fa.fa-reorder { - --fa: "\f0c9"; } - -.fa.fa-magic { - --fa: "\e2ca"; } - -.fa.fa-pinterest { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pinterest-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pinterest-square { - --fa: "\f0d3"; } - -.fa.fa-google-plus-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-square { - --fa: "\f0d4"; } - -.fa.fa-google-plus { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-plus { - --fa: "\f0d5"; } - -.fa.fa-money { - --fa: "\f3d1"; } - -.fa.fa-unsorted { - --fa: "\f0dc"; } - -.fa.fa-sort-desc { - --fa: "\f0dd"; } - -.fa.fa-sort-asc { - --fa: "\f0de"; } - -.fa.fa-linkedin { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-linkedin { - --fa: "\f0e1"; } - -.fa.fa-rotate-left { - --fa: "\f0e2"; } - -.fa.fa-legal { - --fa: "\f0e3"; } - -.fa.fa-tachometer { - --fa: "\f625"; } - -.fa.fa-dashboard { - --fa: "\f625"; } - -.fa.fa-comment-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-comment-o { - --fa: "\f075"; } - -.fa.fa-comments-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-comments-o { - --fa: "\f086"; } - -.fa.fa-flash { - --fa: "\f0e7"; } - -.fa.fa-clipboard { - --fa: "\f0ea"; } - -.fa.fa-lightbulb-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-lightbulb-o { - --fa: "\f0eb"; } - -.fa.fa-exchange { - --fa: "\f362"; } - -.fa.fa-cloud-download { - --fa: "\f0ed"; } - -.fa.fa-cloud-upload { - --fa: "\f0ee"; } - -.fa.fa-bell-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-bell-o { - --fa: "\f0f3"; } - -.fa.fa-cutlery { - --fa: "\f2e7"; } - -.fa.fa-file-text-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-text-o { - --fa: "\f15c"; } - -.fa.fa-building-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-building-o { - --fa: "\f1ad"; } - -.fa.fa-hospital-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hospital-o { - --fa: "\f0f8"; } - -.fa.fa-tablet { - --fa: "\f3fa"; } - -.fa.fa-mobile { - --fa: "\f3cd"; } - -.fa.fa-mobile-phone { - --fa: "\f3cd"; } - -.fa.fa-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-circle-o { - --fa: "\f111"; } - -.fa.fa-mail-reply { - --fa: "\f3e5"; } - -.fa.fa-github-alt { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-folder-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-folder-o { - --fa: "\f07b"; } - -.fa.fa-folder-open-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-folder-open-o { - --fa: "\f07c"; } - -.fa.fa-smile-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-smile-o { - --fa: "\f118"; } - -.fa.fa-frown-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-frown-o { - --fa: "\f119"; } - -.fa.fa-meh-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-meh-o { - --fa: "\f11a"; } - -.fa.fa-keyboard-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-keyboard-o { - --fa: "\f11c"; } - -.fa.fa-flag-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-flag-o { - --fa: "\f024"; } - -.fa.fa-mail-reply-all { - --fa: "\f122"; } - -.fa.fa-star-half-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-star-half-o { - --fa: "\f5c0"; } - -.fa.fa-star-half-empty { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-star-half-empty { - --fa: "\f5c0"; } - -.fa.fa-star-half-full { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-star-half-full { - --fa: "\f5c0"; } - -.fa.fa-code-fork { - --fa: "\f126"; } - -.fa.fa-chain-broken { - --fa: "\f127"; } - -.fa.fa-unlink { - --fa: "\f127"; } - -.fa.fa-calendar-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-calendar-o { - --fa: "\f133"; } - -.fa.fa-maxcdn { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-html5 { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-css3 { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-unlock-alt { - --fa: "\f09c"; } - -.fa.fa-minus-square-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-minus-square-o { - --fa: "\f146"; } - -.fa.fa-level-up { - --fa: "\f3bf"; } - -.fa.fa-level-down { - --fa: "\f3be"; } - -.fa.fa-pencil-square { - --fa: "\f14b"; } - -.fa.fa-external-link-square { - --fa: "\f360"; } - -.fa.fa-compass { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-down { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-down { - --fa: "\f150"; } - -.fa.fa-toggle-down { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-toggle-down { - --fa: "\f150"; } - -.fa.fa-caret-square-o-up { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-up { - --fa: "\f151"; } - -.fa.fa-toggle-up { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-toggle-up { - --fa: "\f151"; } - -.fa.fa-caret-square-o-right { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-right { - --fa: "\f152"; } - -.fa.fa-toggle-right { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-toggle-right { - --fa: "\f152"; } - -.fa.fa-eur { - --fa: "\f153"; } - -.fa.fa-euro { - --fa: "\f153"; } - -.fa.fa-gbp { - --fa: "\f154"; } - -.fa.fa-usd { - --fa: "\24"; } - -.fa.fa-dollar { - --fa: "\24"; } - -.fa.fa-inr { - --fa: "\e1bc"; } - -.fa.fa-rupee { - --fa: "\e1bc"; } - -.fa.fa-jpy { - --fa: "\f157"; } - -.fa.fa-cny { - --fa: "\f157"; } - -.fa.fa-rmb { - --fa: "\f157"; } - -.fa.fa-yen { - --fa: "\f157"; } - -.fa.fa-rub { - --fa: "\f158"; } - -.fa.fa-ruble { - --fa: "\f158"; } - -.fa.fa-rouble { - --fa: "\f158"; } - -.fa.fa-krw { - --fa: "\f159"; } - -.fa.fa-won { - --fa: "\f159"; } - -.fa.fa-btc { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bitcoin { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bitcoin { - --fa: "\f15a"; } - -.fa.fa-file-text { - --fa: "\f15c"; } - -.fa.fa-sort-alpha-asc { - --fa: "\f15d"; } - -.fa.fa-sort-alpha-desc { - --fa: "\f881"; } - -.fa.fa-sort-amount-asc { - --fa: "\f884"; } - -.fa.fa-sort-amount-desc { - --fa: "\f160"; } - -.fa.fa-sort-numeric-asc { - --fa: "\f162"; } - -.fa.fa-sort-numeric-desc { - --fa: "\f886"; } - -.fa.fa-youtube-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-youtube-square { - --fa: "\f431"; } - -.fa.fa-youtube { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-xing { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-xing-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-xing-square { - --fa: "\f169"; } - -.fa.fa-youtube-play { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-youtube-play { - --fa: "\f167"; } - -.fa.fa-dropbox { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-stack-overflow { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-instagram { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-flickr { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-adn { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bitbucket-square { - --fa: "\f171"; } - -.fa.fa-tumblr { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-tumblr-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-tumblr-square { - --fa: "\f174"; } - -.fa.fa-long-arrow-down { - --fa: "\f309"; } - -.fa.fa-long-arrow-up { - --fa: "\f30c"; } - -.fa.fa-long-arrow-left { - --fa: "\f30a"; } - -.fa.fa-long-arrow-right { - --fa: "\f30b"; } - -.fa.fa-apple { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-windows { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-android { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-linux { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-dribbble { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-skype { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-foursquare { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-trello { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gratipay { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gittip { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gittip { - --fa: "\f184"; } - -.fa.fa-sun-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-sun-o { - --fa: "\f185"; } - -.fa.fa-moon-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-moon-o { - --fa: "\f186"; } - -.fa.fa-vk { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-weibo { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-renren { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pagelines { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-stack-exchange { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-right { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-right { - --fa: "\f35a"; } - -.fa.fa-arrow-circle-o-left { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-arrow-circle-o-left { - --fa: "\f359"; } - -.fa.fa-caret-square-o-left { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-caret-square-o-left { - --fa: "\f191"; } - -.fa.fa-toggle-left { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-toggle-left { - --fa: "\f191"; } - -.fa.fa-dot-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-dot-circle-o { - --fa: "\f192"; } - -.fa.fa-vimeo-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-vimeo-square { - --fa: "\f194"; } - -.fa.fa-try { - --fa: "\e2bb"; } - -.fa.fa-turkish-lira { - --fa: "\e2bb"; } - -.fa.fa-plus-square-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-plus-square-o { - --fa: "\f0fe"; } - -.fa.fa-slack { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wordpress { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-openid { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-institution { - --fa: "\f19c"; } - -.fa.fa-bank { - --fa: "\f19c"; } - -.fa.fa-mortar-board { - --fa: "\f19d"; } - -.fa.fa-yahoo { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-reddit { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-reddit-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-reddit-square { - --fa: "\f1a2"; } - -.fa.fa-stumbleupon-circle { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-stumbleupon { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-delicious { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-digg { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pied-piper-pp { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pied-piper-alt { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-drupal { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-joomla { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-behance { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-behance-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-behance-square { - --fa: "\f1b5"; } - -.fa.fa-steam { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-steam-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-steam-square { - --fa: "\f1b7"; } - -.fa.fa-automobile { - --fa: "\f1b9"; } - -.fa.fa-cab { - --fa: "\f1ba"; } - -.fa.fa-spotify { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-deviantart { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-soundcloud { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-file-pdf-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-pdf-o { - --fa: "\f1c1"; } - -.fa.fa-file-word-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-word-o { - --fa: "\f1c2"; } - -.fa.fa-file-excel-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-excel-o { - --fa: "\f1c3"; } - -.fa.fa-file-powerpoint-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-powerpoint-o { - --fa: "\f1c4"; } - -.fa.fa-file-image-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-image-o { - --fa: "\f1c5"; } - -.fa.fa-file-photo-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-photo-o { - --fa: "\f1c5"; } - -.fa.fa-file-picture-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-picture-o { - --fa: "\f1c5"; } - -.fa.fa-file-archive-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-archive-o { - --fa: "\f1c6"; } - -.fa.fa-file-zip-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-zip-o { - --fa: "\f1c6"; } - -.fa.fa-file-audio-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-audio-o { - --fa: "\f1c7"; } - -.fa.fa-file-sound-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-sound-o { - --fa: "\f1c7"; } - -.fa.fa-file-video-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-video-o { - --fa: "\f1c8"; } - -.fa.fa-file-movie-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-movie-o { - --fa: "\f1c8"; } - -.fa.fa-file-code-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-file-code-o { - --fa: "\f1c9"; } - -.fa.fa-vine { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-codepen { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-jsfiddle { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-life-bouy { - --fa: "\f1cd"; } - -.fa.fa-life-buoy { - --fa: "\f1cd"; } - -.fa.fa-life-saver { - --fa: "\f1cd"; } - -.fa.fa-support { - --fa: "\f1cd"; } - -.fa.fa-circle-o-notch { - --fa: "\f1ce"; } - -.fa.fa-rebel { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-ra { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-ra { - --fa: "\f1d0"; } - -.fa.fa-resistance { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-resistance { - --fa: "\f1d0"; } - -.fa.fa-empire { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-ge { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-ge { - --fa: "\f1d1"; } - -.fa.fa-git-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-git-square { - --fa: "\f1d2"; } - -.fa.fa-git { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-hacker-news { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator-square { - --fa: "\f1d4"; } - -.fa.fa-yc-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-yc-square { - --fa: "\f1d4"; } - -.fa.fa-tencent-weibo { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-qq { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-weixin { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wechat { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wechat { - --fa: "\f1d7"; } - -.fa.fa-send { - --fa: "\f1d8"; } - -.fa.fa-paper-plane-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-paper-plane-o { - --fa: "\f1d8"; } - -.fa.fa-send-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-send-o { - --fa: "\f1d8"; } - -.fa.fa-circle-thin { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-circle-thin { - --fa: "\f111"; } - -.fa.fa-header { - --fa: "\f1dc"; } - -.fa.fa-futbol-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-futbol-o { - --fa: "\f1e3"; } - -.fa.fa-soccer-ball-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-soccer-ball-o { - --fa: "\f1e3"; } - -.fa.fa-slideshare { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-twitch { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-yelp { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-newspaper-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-newspaper-o { - --fa: "\f1ea"; } - -.fa.fa-paypal { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-wallet { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-visa { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-mastercard { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-discover { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-amex { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-paypal { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-stripe { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bell-slash-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-bell-slash-o { - --fa: "\f1f6"; } - -.fa.fa-trash { - --fa: "\f2ed"; } - -.fa.fa-copyright { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-eyedropper { - --fa: "\f1fb"; } - -.fa.fa-area-chart { - --fa: "\f1fe"; } - -.fa.fa-pie-chart { - --fa: "\f200"; } - -.fa.fa-line-chart { - --fa: "\f201"; } - -.fa.fa-lastfm { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-lastfm-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-lastfm-square { - --fa: "\f203"; } - -.fa.fa-ioxhost { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-angellist { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-cc { - --fa: "\f20a"; } - -.fa.fa-ils { - --fa: "\f20b"; } - -.fa.fa-shekel { - --fa: "\f20b"; } - -.fa.fa-sheqel { - --fa: "\f20b"; } - -.fa.fa-buysellads { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-connectdevelop { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-dashcube { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-forumbee { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-leanpub { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-sellsy { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-shirtsinbulk { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-simplybuilt { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-skyatlas { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-diamond { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-diamond { - --fa: "\f3a5"; } - -.fa.fa-transgender { - --fa: "\f224"; } - -.fa.fa-intersex { - --fa: "\f224"; } - -.fa.fa-transgender-alt { - --fa: "\f225"; } - -.fa.fa-facebook-official { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-facebook-official { - --fa: "\f09a"; } - -.fa.fa-pinterest-p { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-whatsapp { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-hotel { - --fa: "\f236"; } - -.fa.fa-viacoin { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-medium { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-y-combinator { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-yc { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-yc { - --fa: "\f23b"; } - -.fa.fa-optin-monster { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-opencart { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-expeditedssl { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-battery-4 { - --fa: "\f240"; } - -.fa.fa-battery { - --fa: "\f240"; } - -.fa.fa-battery-3 { - --fa: "\f241"; } - -.fa.fa-battery-2 { - --fa: "\f242"; } - -.fa.fa-battery-1 { - --fa: "\f243"; } - -.fa.fa-battery-0 { - --fa: "\f244"; } - -.fa.fa-object-group { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-object-ungroup { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-sticky-note-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-sticky-note-o { - --fa: "\f249"; } - -.fa.fa-cc-jcb { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-cc-diners-club { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-clone { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hourglass-o { - --fa: "\f254"; } - -.fa.fa-hourglass-1 { - --fa: "\f251"; } - -.fa.fa-hourglass-2 { - --fa: "\f252"; } - -.fa.fa-hourglass-3 { - --fa: "\f253"; } - -.fa.fa-hand-rock-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-rock-o { - --fa: "\f255"; } - -.fa.fa-hand-grab-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-grab-o { - --fa: "\f255"; } - -.fa.fa-hand-paper-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-paper-o { - --fa: "\f256"; } - -.fa.fa-hand-stop-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-stop-o { - --fa: "\f256"; } - -.fa.fa-hand-scissors-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-scissors-o { - --fa: "\f257"; } - -.fa.fa-hand-lizard-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-lizard-o { - --fa: "\f258"; } - -.fa.fa-hand-spock-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-spock-o { - --fa: "\f259"; } - -.fa.fa-hand-pointer-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-pointer-o { - --fa: "\f25a"; } - -.fa.fa-hand-peace-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-hand-peace-o { - --fa: "\f25b"; } - -.fa.fa-registered { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-creative-commons { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gg { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gg-circle { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-odnoklassniki { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-odnoklassniki-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-odnoklassniki-square { - --fa: "\f264"; } - -.fa.fa-get-pocket { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wikipedia-w { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-safari { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-chrome { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-firefox { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-opera { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-internet-explorer { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-television { - --fa: "\f26c"; } - -.fa.fa-contao { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-500px { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-amazon { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-calendar-plus-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-calendar-plus-o { - --fa: "\f271"; } - -.fa.fa-calendar-minus-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-calendar-minus-o { - --fa: "\f272"; } - -.fa.fa-calendar-times-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-calendar-times-o { - --fa: "\f273"; } - -.fa.fa-calendar-check-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-calendar-check-o { - --fa: "\f274"; } - -.fa.fa-map-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-map-o { - --fa: "\f279"; } - -.fa.fa-commenting { - --fa: "\f4ad"; } - -.fa.fa-commenting-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-commenting-o { - --fa: "\f4ad"; } - -.fa.fa-houzz { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-vimeo { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-vimeo { - --fa: "\f27d"; } - -.fa.fa-black-tie { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-fonticons { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-reddit-alien { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-edge { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-credit-card-alt { - --fa: "\f09d"; } - -.fa.fa-codiepie { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-modx { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-fort-awesome { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-usb { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-product-hunt { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-mixcloud { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-scribd { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-pause-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-pause-circle-o { - --fa: "\f28b"; } - -.fa.fa-stop-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-stop-circle-o { - --fa: "\f28d"; } - -.fa.fa-bluetooth { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-bluetooth-b { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-gitlab { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wpbeginner { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wpforms { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-envira { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wheelchair-alt { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wheelchair-alt { - --fa: "\f368"; } - -.fa.fa-question-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-question-circle-o { - --fa: "\f059"; } - -.fa.fa-volume-control-phone { - --fa: "\f2a0"; } - -.fa.fa-asl-interpreting { - --fa: "\f2a3"; } - -.fa.fa-deafness { - --fa: "\f2a4"; } - -.fa.fa-hard-of-hearing { - --fa: "\f2a4"; } - -.fa.fa-glide { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-glide-g { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-signing { - --fa: "\f2a7"; } - -.fa.fa-viadeo { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-viadeo-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-viadeo-square { - --fa: "\f2aa"; } - -.fa.fa-snapchat { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-snapchat-ghost { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-snapchat-ghost { - --fa: "\f2ab"; } - -.fa.fa-snapchat-square { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-snapchat-square { - --fa: "\f2ad"; } - -.fa.fa-pied-piper { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-first-order { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-yoast { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-themeisle { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-official { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-official { - --fa: "\f2b3"; } - -.fa.fa-google-plus-circle { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-google-plus-circle { - --fa: "\f2b3"; } - -.fa.fa-font-awesome { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-fa { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-fa { - --fa: "\f2b4"; } - -.fa.fa-handshake-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-handshake-o { - --fa: "\f2b5"; } - -.fa.fa-envelope-open-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-envelope-open-o { - --fa: "\f2b6"; } - -.fa.fa-linode { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-address-book-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-address-book-o { - --fa: "\f2b9"; } - -.fa.fa-vcard { - --fa: "\f2bb"; } - -.fa.fa-address-card-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-address-card-o { - --fa: "\f2bb"; } - -.fa.fa-vcard-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-vcard-o { - --fa: "\f2bb"; } - -.fa.fa-user-circle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-user-circle-o { - --fa: "\f2bd"; } - -.fa.fa-user-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-user-o { - --fa: "\f007"; } - -.fa.fa-id-badge { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-drivers-license { - --fa: "\f2c2"; } - -.fa.fa-id-card-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-id-card-o { - --fa: "\f2c2"; } - -.fa.fa-drivers-license-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-drivers-license-o { - --fa: "\f2c2"; } - -.fa.fa-quora { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-free-code-camp { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-telegram { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-thermometer-4 { - --fa: "\f2c7"; } - -.fa.fa-thermometer { - --fa: "\f2c7"; } - -.fa.fa-thermometer-3 { - --fa: "\f2c8"; } - -.fa.fa-thermometer-2 { - --fa: "\f2c9"; } - -.fa.fa-thermometer-1 { - --fa: "\f2ca"; } - -.fa.fa-thermometer-0 { - --fa: "\f2cb"; } - -.fa.fa-bathtub { - --fa: "\f2cd"; } - -.fa.fa-s15 { - --fa: "\f2cd"; } - -.fa.fa-window-maximize { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-window-restore { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-times-rectangle { - --fa: "\f410"; } - -.fa.fa-window-close-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-window-close-o { - --fa: "\f410"; } - -.fa.fa-times-rectangle-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-times-rectangle-o { - --fa: "\f410"; } - -.fa.fa-bandcamp { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-grav { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-etsy { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-imdb { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-ravelry { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-eercast { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-eercast { - --fa: "\f2da"; } - -.fa.fa-snowflake-o { - font-family: 'Font Awesome 6 Free'; - font-weight: 400; } - -.fa.fa-snowflake-o { - --fa: "\f2dc"; } - -.fa.fa-superpowers { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-wpexplorer { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } - -.fa.fa-meetup { - font-family: 'Font Awesome 6 Brands'; - font-weight: 400; } diff --git a/files/fontawesome/css/v4-shims.min.css b/files/fontawesome/css/v4-shims.min.css deleted file mode 100644 index 93685c8bfa..0000000000 --- a/files/fontawesome/css/v4-shims.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -.fa.fa-glass{--fa:"\f000"}.fa.fa-envelope-o{--fa:"\f0e0"}.fa.fa-envelope-o,.fa.fa-star-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-o{--fa:"\f005"}.fa.fa-close,.fa.fa-remove{--fa:"\f00d"}.fa.fa-gear{--fa:"\f013"}.fa.fa-trash-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2ed"}.fa.fa-home{--fa:"\f015"}.fa.fa-file-o{--fa:"\f15b"}.fa.fa-clock-o,.fa.fa-file-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-clock-o{--fa:"\f017"}.fa.fa-arrow-circle-o-down{--fa:"\f358"}.fa.fa-arrow-circle-o-down,.fa.fa-arrow-circle-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-up{--fa:"\f35b"}.fa.fa-play-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f144"}.fa.fa-repeat,.fa.fa-rotate-right{--fa:"\f01e"}.fa.fa-refresh{--fa:"\f021"}.fa.fa-list-alt{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f022"}.fa.fa-dedent{--fa:"\f03b"}.fa.fa-video-camera{--fa:"\f03d"}.fa.fa-picture-o{--fa:"\f03e"}.fa.fa-photo,.fa.fa-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-photo{--fa:"\f03e"}.fa.fa-image{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f03e"}.fa.fa-map-marker{--fa:"\f3c5"}.fa.fa-pencil-square-o{--fa:"\f044"}.fa.fa-edit,.fa.fa-pencil-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-edit{--fa:"\f044"}.fa.fa-share-square-o{--fa:"\f14d"}.fa.fa-check-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f14a"}.fa.fa-arrows{--fa:"\f0b2"}.fa.fa-times-circle-o{--fa:"\f057"}.fa.fa-check-circle-o,.fa.fa-times-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-check-circle-o{--fa:"\f058"}.fa.fa-mail-forward{--fa:"\f064"}.fa.fa-expand{--fa:"\f424"}.fa.fa-compress{--fa:"\f422"}.fa.fa-eye,.fa.fa-eye-slash{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-warning{--fa:"\f071"}.fa.fa-calendar{--fa:"\f073"}.fa.fa-arrows-v{--fa:"\f338"}.fa.fa-arrows-h{--fa:"\f337"}.fa.fa-bar-chart,.fa.fa-bar-chart-o{--fa:"\e0e3"}.fa.fa-twitter-square{--fa:"\f081"}.fa.fa-facebook-square,.fa.fa-twitter-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook-square{--fa:"\f082"}.fa.fa-gears{--fa:"\f085"}.fa.fa-thumbs-o-up{--fa:"\f164"}.fa.fa-thumbs-o-down,.fa.fa-thumbs-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-thumbs-o-down{--fa:"\f165"}.fa.fa-heart-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f004"}.fa.fa-sign-out{--fa:"\f2f5"}.fa.fa-linkedin-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f08c"}.fa.fa-thumb-tack{--fa:"\f08d"}.fa.fa-external-link{--fa:"\f35d"}.fa.fa-sign-in{--fa:"\f2f6"}.fa.fa-github-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f092"}.fa.fa-lemon-o{--fa:"\f094"}.fa.fa-lemon-o,.fa.fa-square-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-square-o{--fa:"\f0c8"}.fa.fa-bookmark-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f02e"}.fa.fa-facebook,.fa.fa-twitter{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-facebook{--fa:"\f39e"}.fa.fa-facebook-f{--fa:"\f39e"}.fa.fa-facebook-f,.fa.fa-github{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-feed{--fa:"\f09e"}.fa.fa-hdd-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0a0"}.fa.fa-hand-o-right{--fa:"\f0a4"}.fa.fa-hand-o-left,.fa.fa-hand-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-left{--fa:"\f0a5"}.fa.fa-hand-o-up{--fa:"\f0a6"}.fa.fa-hand-o-down,.fa.fa-hand-o-up{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-o-down{--fa:"\f0a7"}.fa.fa-globe{--fa:"\f57d"}.fa.fa-tasks{--fa:"\f828"}.fa.fa-arrows-alt{--fa:"\f31e"}.fa.fa-group{--fa:"\f0c0"}.fa.fa-chain{--fa:"\f0c1"}.fa.fa-cut{--fa:"\f0c4"}.fa.fa-files-o{--fa:"\f0c5"}.fa.fa-files-o,.fa.fa-floppy-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-floppy-o{--fa:"\f0c7"}.fa.fa-save{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0c7"}.fa.fa-navicon,.fa.fa-reorder{--fa:"\f0c9"}.fa.fa-magic{--fa:"\e2ca"}.fa.fa-pinterest,.fa.fa-pinterest-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-pinterest-square{--fa:"\f0d3"}.fa.fa-google-plus-square{--fa:"\f0d4"}.fa.fa-google-plus,.fa.fa-google-plus-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus{--fa:"\f0d5"}.fa.fa-money{--fa:"\f3d1"}.fa.fa-unsorted{--fa:"\f0dc"}.fa.fa-sort-desc{--fa:"\f0dd"}.fa.fa-sort-asc{--fa:"\f0de"}.fa.fa-linkedin{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f0e1"}.fa.fa-rotate-left{--fa:"\f0e2"}.fa.fa-legal{--fa:"\f0e3"}.fa.fa-dashboard,.fa.fa-tachometer{--fa:"\f625"}.fa.fa-comment-o{--fa:"\f075"}.fa.fa-comment-o,.fa.fa-comments-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-comments-o{--fa:"\f086"}.fa.fa-flash{--fa:"\f0e7"}.fa.fa-clipboard{--fa:"\f0ea"}.fa.fa-lightbulb-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0eb"}.fa.fa-exchange{--fa:"\f362"}.fa.fa-cloud-download{--fa:"\f0ed"}.fa.fa-cloud-upload{--fa:"\f0ee"}.fa.fa-bell-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0f3"}.fa.fa-cutlery{--fa:"\f2e7"}.fa.fa-file-text-o{--fa:"\f15c"}.fa.fa-building-o,.fa.fa-file-text-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-building-o{--fa:"\f1ad"}.fa.fa-hospital-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0f8"}.fa.fa-tablet{--fa:"\f3fa"}.fa.fa-mobile,.fa.fa-mobile-phone{--fa:"\f3cd"}.fa.fa-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f111"}.fa.fa-mail-reply{--fa:"\f3e5"}.fa.fa-github-alt{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-folder-o{--fa:"\f07b"}.fa.fa-folder-o,.fa.fa-folder-open-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-folder-open-o{--fa:"\f07c"}.fa.fa-smile-o{--fa:"\f118"}.fa.fa-frown-o,.fa.fa-smile-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-frown-o{--fa:"\f119"}.fa.fa-meh-o{--fa:"\f11a"}.fa.fa-keyboard-o,.fa.fa-meh-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-keyboard-o{--fa:"\f11c"}.fa.fa-flag-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f024"}.fa.fa-mail-reply-all{--fa:"\f122"}.fa.fa-star-half-o{--fa:"\f5c0"}.fa.fa-star-half-empty,.fa.fa-star-half-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-star-half-empty{--fa:"\f5c0"}.fa.fa-star-half-full{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f5c0"}.fa.fa-code-fork{--fa:"\f126"}.fa.fa-chain-broken,.fa.fa-unlink{--fa:"\f127"}.fa.fa-calendar-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f133"}.fa.fa-css3,.fa.fa-html5,.fa.fa-maxcdn{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-unlock-alt{--fa:"\f09c"}.fa.fa-minus-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f146"}.fa.fa-level-up{--fa:"\f3bf"}.fa.fa-level-down{--fa:"\f3be"}.fa.fa-pencil-square{--fa:"\f14b"}.fa.fa-external-link-square{--fa:"\f360"}.fa.fa-compass{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-caret-square-o-down{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f150"}.fa.fa-toggle-down{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f150"}.fa.fa-caret-square-o-up{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f151"}.fa.fa-toggle-up{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f151"}.fa.fa-caret-square-o-right{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f152"}.fa.fa-toggle-right{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f152"}.fa.fa-eur,.fa.fa-euro{--fa:"\f153"}.fa.fa-gbp{--fa:"\f154"}.fa.fa-dollar,.fa.fa-usd{--fa:"\24"}.fa.fa-inr,.fa.fa-rupee{--fa:"\e1bc"}.fa.fa-cny,.fa.fa-jpy,.fa.fa-rmb,.fa.fa-yen{--fa:"\f157"}.fa.fa-rouble,.fa.fa-rub,.fa.fa-ruble{--fa:"\f158"}.fa.fa-krw,.fa.fa-won{--fa:"\f159"}.fa.fa-bitcoin,.fa.fa-btc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitcoin{--fa:"\f15a"}.fa.fa-file-text{--fa:"\f15c"}.fa.fa-sort-alpha-asc{--fa:"\f15d"}.fa.fa-sort-alpha-desc{--fa:"\f881"}.fa.fa-sort-amount-asc{--fa:"\f884"}.fa.fa-sort-amount-desc{--fa:"\f160"}.fa.fa-sort-numeric-asc{--fa:"\f162"}.fa.fa-sort-numeric-desc{--fa:"\f886"}.fa.fa-youtube-square{--fa:"\f431"}.fa.fa-xing,.fa.fa-xing-square,.fa.fa-youtube,.fa.fa-youtube-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-xing-square{--fa:"\f169"}.fa.fa-youtube-play{--fa:"\f167"}.fa.fa-adn,.fa.fa-bitbucket,.fa.fa-bitbucket-square,.fa.fa-dropbox,.fa.fa-flickr,.fa.fa-instagram,.fa.fa-stack-overflow,.fa.fa-youtube-play{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bitbucket-square{--fa:"\f171"}.fa.fa-tumblr,.fa.fa-tumblr-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-tumblr-square{--fa:"\f174"}.fa.fa-long-arrow-down{--fa:"\f309"}.fa.fa-long-arrow-up{--fa:"\f30c"}.fa.fa-long-arrow-left{--fa:"\f30a"}.fa.fa-long-arrow-right{--fa:"\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 6 Brands";font-weight:400}.fa.fa-gittip{--fa:"\f184"}.fa.fa-sun-o{--fa:"\f185"}.fa.fa-moon-o,.fa.fa-sun-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-moon-o{--fa:"\f186"}.fa.fa-pagelines,.fa.fa-renren,.fa.fa-stack-exchange,.fa.fa-vk,.fa.fa-weibo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-arrow-circle-o-right{--fa:"\f35a"}.fa.fa-arrow-circle-o-left,.fa.fa-arrow-circle-o-right{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-arrow-circle-o-left{--fa:"\f359"}.fa.fa-caret-square-o-left{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f191"}.fa.fa-toggle-left{--fa:"\f191"}.fa.fa-dot-circle-o,.fa.fa-toggle-left{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-dot-circle-o{--fa:"\f192"}.fa.fa-vimeo-square{font-family:"Font Awesome 6 Brands";font-weight:400;--fa:"\f194"}.fa.fa-try,.fa.fa-turkish-lira{--fa:"\e2bb"}.fa.fa-plus-square-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f0fe"}.fa.fa-openid,.fa.fa-slack,.fa.fa-wordpress{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-bank,.fa.fa-institution{--fa:"\f19c"}.fa.fa-mortar-board{--fa:"\f19d"}.fa.fa-google,.fa.fa-reddit,.fa.fa-reddit-square,.fa.fa-yahoo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-reddit-square{--fa:"\f1a2"}.fa.fa-behance,.fa.fa-behance-square,.fa.fa-delicious,.fa.fa-digg,.fa.fa-drupal,.fa.fa-joomla,.fa.fa-pied-piper-alt,.fa.fa-pied-piper-pp,.fa.fa-stumbleupon,.fa.fa-stumbleupon-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-behance-square{--fa:"\f1b5"}.fa.fa-steam,.fa.fa-steam-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-steam-square{--fa:"\f1b7"}.fa.fa-automobile{--fa:"\f1b9"}.fa.fa-cab{--fa:"\f1ba"}.fa.fa-deviantart,.fa.fa-soundcloud,.fa.fa-spotify{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-file-pdf-o{--fa:"\f1c1"}.fa.fa-file-pdf-o,.fa.fa-file-word-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-word-o{--fa:"\f1c2"}.fa.fa-file-excel-o{--fa:"\f1c3"}.fa.fa-file-excel-o,.fa.fa-file-powerpoint-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-powerpoint-o{--fa:"\f1c4"}.fa.fa-file-image-o{--fa:"\f1c5"}.fa.fa-file-image-o,.fa.fa-file-photo-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-photo-o{--fa:"\f1c5"}.fa.fa-file-picture-o{--fa:"\f1c5"}.fa.fa-file-archive-o,.fa.fa-file-picture-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-archive-o{--fa:"\f1c6"}.fa.fa-file-zip-o{--fa:"\f1c6"}.fa.fa-file-audio-o,.fa.fa-file-zip-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-audio-o{--fa:"\f1c7"}.fa.fa-file-sound-o{--fa:"\f1c7"}.fa.fa-file-sound-o,.fa.fa-file-video-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-video-o{--fa:"\f1c8"}.fa.fa-file-movie-o{--fa:"\f1c8"}.fa.fa-file-code-o,.fa.fa-file-movie-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-file-code-o{--fa:"\f1c9"}.fa.fa-codepen,.fa.fa-jsfiddle,.fa.fa-vine{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-life-bouy,.fa.fa-life-buoy,.fa.fa-life-saver,.fa.fa-support{--fa:"\f1cd"}.fa.fa-circle-o-notch{--fa:"\f1ce"}.fa.fa-ra,.fa.fa-rebel{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ra{--fa:"\f1d0"}.fa.fa-resistance{--fa:"\f1d0"}.fa.fa-empire,.fa.fa-ge,.fa.fa-resistance{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-ge{--fa:"\f1d1"}.fa.fa-git-square{--fa:"\f1d2"}.fa.fa-git,.fa.fa-git-square,.fa.fa-hacker-news,.fa.fa-y-combinator-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-y-combinator-square{--fa:"\f1d4"}.fa.fa-yc-square{--fa:"\f1d4"}.fa.fa-qq,.fa.fa-tencent-weibo,.fa.fa-wechat,.fa.fa-weixin,.fa.fa-yc-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-wechat{--fa:"\f1d7"}.fa.fa-send{--fa:"\f1d8"}.fa.fa-paper-plane-o{--fa:"\f1d8"}.fa.fa-paper-plane-o,.fa.fa-send-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-send-o{--fa:"\f1d8"}.fa.fa-circle-thin{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f111"}.fa.fa-header{--fa:"\f1dc"}.fa.fa-futbol-o{--fa:"\f1e3"}.fa.fa-futbol-o,.fa.fa-soccer-ball-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-soccer-ball-o{--fa:"\f1e3"}.fa.fa-slideshare,.fa.fa-twitch,.fa.fa-yelp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-newspaper-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\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 6 Brands";font-weight:400}.fa.fa-bell-slash-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f1f6"}.fa.fa-trash{--fa:"\f2ed"}.fa.fa-copyright{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-eyedropper{--fa:"\f1fb"}.fa.fa-area-chart{--fa:"\f1fe"}.fa.fa-pie-chart{--fa:"\f200"}.fa.fa-line-chart{--fa:"\f201"}.fa.fa-lastfm,.fa.fa-lastfm-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-lastfm-square{--fa:"\f203"}.fa.fa-angellist,.fa.fa-ioxhost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-cc{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f20a"}.fa.fa-ils,.fa.fa-shekel,.fa.fa-sheqel{--fa:"\f20b"}.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 6 Brands";font-weight:400}.fa.fa-diamond{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f3a5"}.fa.fa-intersex,.fa.fa-transgender{--fa:"\f224"}.fa.fa-transgender-alt{--fa:"\f225"}.fa.fa-facebook-official{--fa:"\f09a"}.fa.fa-facebook-official,.fa.fa-pinterest-p,.fa.fa-whatsapp{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-hotel{--fa:"\f236"}.fa.fa-medium,.fa.fa-viacoin,.fa.fa-y-combinator,.fa.fa-yc{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-yc{--fa:"\f23b"}.fa.fa-expeditedssl,.fa.fa-opencart,.fa.fa-optin-monster{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-battery,.fa.fa-battery-4{--fa:"\f240"}.fa.fa-battery-3{--fa:"\f241"}.fa.fa-battery-2{--fa:"\f242"}.fa.fa-battery-1{--fa:"\f243"}.fa.fa-battery-0{--fa:"\f244"}.fa.fa-object-group,.fa.fa-object-ungroup,.fa.fa-sticky-note-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-sticky-note-o{--fa:"\f249"}.fa.fa-cc-diners-club,.fa.fa-cc-jcb{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-clone{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hourglass-o{--fa:"\f254"}.fa.fa-hourglass-1{--fa:"\f251"}.fa.fa-hourglass-2{--fa:"\f252"}.fa.fa-hourglass-3{--fa:"\f253"}.fa.fa-hand-rock-o{--fa:"\f255"}.fa.fa-hand-grab-o,.fa.fa-hand-rock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-grab-o{--fa:"\f255"}.fa.fa-hand-paper-o{--fa:"\f256"}.fa.fa-hand-paper-o,.fa.fa-hand-stop-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-stop-o{--fa:"\f256"}.fa.fa-hand-scissors-o{--fa:"\f257"}.fa.fa-hand-lizard-o,.fa.fa-hand-scissors-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-lizard-o{--fa:"\f258"}.fa.fa-hand-spock-o{--fa:"\f259"}.fa.fa-hand-pointer-o,.fa.fa-hand-spock-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-hand-pointer-o{--fa:"\f25a"}.fa.fa-hand-peace-o{--fa:"\f25b"}.fa.fa-hand-peace-o,.fa.fa-registered{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-creative-commons,.fa.fa-gg,.fa.fa-gg-circle,.fa.fa-odnoklassniki,.fa.fa-odnoklassniki-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-odnoklassniki-square{--fa:"\f264"}.fa.fa-chrome,.fa.fa-firefox,.fa.fa-get-pocket,.fa.fa-internet-explorer,.fa.fa-opera,.fa.fa-safari,.fa.fa-wikipedia-w{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-television{--fa:"\f26c"}.fa.fa-500px,.fa.fa-amazon,.fa.fa-contao{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-calendar-plus-o{--fa:"\f271"}.fa.fa-calendar-minus-o,.fa.fa-calendar-plus-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-minus-o{--fa:"\f272"}.fa.fa-calendar-times-o{--fa:"\f273"}.fa.fa-calendar-check-o,.fa.fa-calendar-times-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-calendar-check-o{--fa:"\f274"}.fa.fa-map-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f279"}.fa.fa-commenting{--fa:"\f4ad"}.fa.fa-commenting-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f4ad"}.fa.fa-houzz,.fa.fa-vimeo{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-vimeo{--fa:"\f27d"}.fa.fa-black-tie,.fa.fa-edge,.fa.fa-fonticons,.fa.fa-reddit-alien{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-credit-card-alt{--fa:"\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 6 Brands";font-weight:400}.fa.fa-pause-circle-o{--fa:"\f28b"}.fa.fa-pause-circle-o,.fa.fa-stop-circle-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-stop-circle-o{--fa:"\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 6 Brands";font-weight:400}.fa.fa-wheelchair-alt{--fa:"\f368"}.fa.fa-question-circle-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f059"}.fa.fa-volume-control-phone{--fa:"\f2a0"}.fa.fa-asl-interpreting{--fa:"\f2a3"}.fa.fa-deafness,.fa.fa-hard-of-hearing{--fa:"\f2a4"}.fa.fa-glide,.fa.fa-glide-g{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-signing{--fa:"\f2a7"}.fa.fa-viadeo,.fa.fa-viadeo-square{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-viadeo-square{--fa:"\f2aa"}.fa.fa-snapchat,.fa.fa-snapchat-ghost{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-snapchat-ghost{--fa:"\f2ab"}.fa.fa-snapchat-square{--fa:"\f2ad"}.fa.fa-first-order,.fa.fa-google-plus-official,.fa.fa-pied-piper,.fa.fa-snapchat-square,.fa.fa-themeisle,.fa.fa-yoast{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-google-plus-official{--fa:"\f2b3"}.fa.fa-google-plus-circle{--fa:"\f2b3"}.fa.fa-fa,.fa.fa-font-awesome,.fa.fa-google-plus-circle{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-fa{--fa:"\f2b4"}.fa.fa-handshake-o{--fa:"\f2b5"}.fa.fa-envelope-open-o,.fa.fa-handshake-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-envelope-open-o{--fa:"\f2b6"}.fa.fa-linode{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-address-book-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2b9"}.fa.fa-vcard{--fa:"\f2bb"}.fa.fa-address-card-o{--fa:"\f2bb"}.fa.fa-address-card-o,.fa.fa-vcard-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-vcard-o{--fa:"\f2bb"}.fa.fa-user-circle-o{--fa:"\f2bd"}.fa.fa-user-circle-o,.fa.fa-user-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-user-o{--fa:"\f007"}.fa.fa-id-badge{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license{--fa:"\f2c2"}.fa.fa-id-card-o{--fa:"\f2c2"}.fa.fa-drivers-license-o,.fa.fa-id-card-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-drivers-license-o{--fa:"\f2c2"}.fa.fa-free-code-camp,.fa.fa-quora,.fa.fa-telegram{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-thermometer,.fa.fa-thermometer-4{--fa:"\f2c7"}.fa.fa-thermometer-3{--fa:"\f2c8"}.fa.fa-thermometer-2{--fa:"\f2c9"}.fa.fa-thermometer-1{--fa:"\f2ca"}.fa.fa-thermometer-0{--fa:"\f2cb"}.fa.fa-bathtub,.fa.fa-s15{--fa:"\f2cd"}.fa.fa-window-maximize,.fa.fa-window-restore{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle{--fa:"\f410"}.fa.fa-window-close-o{--fa:"\f410"}.fa.fa-times-rectangle-o,.fa.fa-window-close-o{font-family:"Font Awesome 6 Free";font-weight:400}.fa.fa-times-rectangle-o{--fa:"\f410"}.fa.fa-bandcamp,.fa.fa-eercast,.fa.fa-etsy,.fa.fa-grav,.fa.fa-imdb,.fa.fa-ravelry{font-family:"Font Awesome 6 Brands";font-weight:400}.fa.fa-eercast{--fa:"\f2da"}.fa.fa-snowflake-o{font-family:"Font Awesome 6 Free";font-weight:400;--fa:"\f2dc"}.fa.fa-meetup,.fa.fa-superpowers,.fa.fa-wpexplorer{font-family:"Font Awesome 6 Brands";font-weight:400} \ No newline at end of file diff --git a/files/fontawesome/css/v5-font-face.css b/files/fontawesome/css/v5-font-face.css deleted file mode 100644 index 3c603d662b..0000000000 --- a/files/fontawesome/css/v5-font-face.css +++ /dev/null @@ -1,22 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face { - font-family: 'Font Awesome 5 Brands'; - font-display: block; - font-weight: 400; - src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); } - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-display: block; - font-weight: 900; - src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); } - -@font-face { - font-family: 'Font Awesome 5 Free'; - font-display: block; - font-weight: 400; - src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); } diff --git a/files/fontawesome/css/v5-font-face.min.css b/files/fontawesome/css/v5-font-face.min.css deleted file mode 100644 index ada52ac4ac..0000000000 --- a/files/fontawesome/css/v5-font-face.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2024 Fonticons, Inc. - */ -@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")} \ No newline at end of file diff --git a/files/fontawesome/webfonts/fa-brands-400.ttf b/files/fontawesome/webfonts/fa-brands-400.ttf deleted file mode 100644 index 0f82a83605..0000000000 Binary files a/files/fontawesome/webfonts/fa-brands-400.ttf and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-brands-400.woff2 b/files/fontawesome/webfonts/fa-brands-400.woff2 deleted file mode 100644 index 3c5cf97ec3..0000000000 Binary files a/files/fontawesome/webfonts/fa-brands-400.woff2 and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-regular-400.ttf b/files/fontawesome/webfonts/fa-regular-400.ttf deleted file mode 100644 index 9ee1919dc2..0000000000 Binary files a/files/fontawesome/webfonts/fa-regular-400.ttf and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-regular-400.woff2 b/files/fontawesome/webfonts/fa-regular-400.woff2 deleted file mode 100644 index 57d9179654..0000000000 Binary files a/files/fontawesome/webfonts/fa-regular-400.woff2 and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-solid-900.ttf b/files/fontawesome/webfonts/fa-solid-900.ttf deleted file mode 100644 index 1c10972ece..0000000000 Binary files a/files/fontawesome/webfonts/fa-solid-900.ttf and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-solid-900.woff2 b/files/fontawesome/webfonts/fa-solid-900.woff2 deleted file mode 100644 index 16721020f0..0000000000 Binary files a/files/fontawesome/webfonts/fa-solid-900.woff2 and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-v4compatibility.ttf b/files/fontawesome/webfonts/fa-v4compatibility.ttf deleted file mode 100644 index 3bcb67ffcc..0000000000 Binary files a/files/fontawesome/webfonts/fa-v4compatibility.ttf and /dev/null differ diff --git a/files/fontawesome/webfonts/fa-v4compatibility.woff2 b/files/fontawesome/webfonts/fa-v4compatibility.woff2 deleted file mode 100644 index fbafb22222..0000000000 Binary files a/files/fontawesome/webfonts/fa-v4compatibility.woff2 and /dev/null differ diff --git a/files/icons/android-icon-144x144.png b/files/icons/android-icon-144x144.png deleted file mode 100644 index 26cb738a91..0000000000 Binary files a/files/icons/android-icon-144x144.png and /dev/null differ diff --git a/files/icons/android-icon-192x192.png b/files/icons/android-icon-192x192.png deleted file mode 100644 index 8ac6884b75..0000000000 Binary files a/files/icons/android-icon-192x192.png and /dev/null differ diff --git a/files/icons/android-icon-36x36.png b/files/icons/android-icon-36x36.png deleted file mode 100644 index 57cc9ac203..0000000000 Binary files a/files/icons/android-icon-36x36.png and /dev/null differ diff --git a/files/icons/android-icon-72x72.png b/files/icons/android-icon-72x72.png deleted file mode 100644 index 334a3c3b1b..0000000000 Binary files a/files/icons/android-icon-72x72.png and /dev/null differ diff --git a/files/icons/android-icon-96x96.png b/files/icons/android-icon-96x96.png deleted file mode 100644 index 859402c71e..0000000000 Binary files a/files/icons/android-icon-96x96.png and /dev/null differ diff --git a/files/icons/apple-icon-114x114.png b/files/icons/apple-icon-114x114.png deleted file mode 100644 index 60cfe3cf0f..0000000000 Binary files a/files/icons/apple-icon-114x114.png and /dev/null differ diff --git a/files/icons/apple-icon-120x120.png b/files/icons/apple-icon-120x120.png deleted file mode 100644 index 48d9f54d64..0000000000 Binary files a/files/icons/apple-icon-120x120.png and /dev/null differ diff --git a/files/icons/apple-icon-144x144.png b/files/icons/apple-icon-144x144.png deleted file mode 100644 index 26cb738a91..0000000000 Binary files a/files/icons/apple-icon-144x144.png and /dev/null differ diff --git a/files/icons/apple-icon-152x152.png b/files/icons/apple-icon-152x152.png deleted file mode 100644 index 25c77b5923..0000000000 Binary files a/files/icons/apple-icon-152x152.png and /dev/null differ diff --git a/files/icons/apple-icon-180x180.png b/files/icons/apple-icon-180x180.png deleted file mode 100644 index 7218d97dec..0000000000 Binary files a/files/icons/apple-icon-180x180.png and /dev/null differ diff --git a/files/icons/apple-icon-57x57.png b/files/icons/apple-icon-57x57.png deleted file mode 100644 index ec55d35ff1..0000000000 Binary files a/files/icons/apple-icon-57x57.png and /dev/null differ diff --git a/files/icons/apple-icon-60x60.png b/files/icons/apple-icon-60x60.png deleted file mode 100644 index 06824f143a..0000000000 Binary files a/files/icons/apple-icon-60x60.png and /dev/null differ diff --git a/files/icons/apple-icon-72x72.png b/files/icons/apple-icon-72x72.png deleted file mode 100644 index 334a3c3b1b..0000000000 Binary files a/files/icons/apple-icon-72x72.png and /dev/null differ diff --git a/files/icons/apple-icon-76x76.png b/files/icons/apple-icon-76x76.png deleted file mode 100644 index 7486c08dab..0000000000 Binary files a/files/icons/apple-icon-76x76.png and /dev/null differ diff --git a/files/icons/apple-icon-precomposed.png b/files/icons/apple-icon-precomposed.png deleted file mode 100644 index 70e7d98866..0000000000 Binary files a/files/icons/apple-icon-precomposed.png and /dev/null differ diff --git a/files/icons/apple-icon.png b/files/icons/apple-icon.png deleted file mode 100644 index 70e7d98866..0000000000 Binary files a/files/icons/apple-icon.png and /dev/null differ diff --git a/files/icons/browserconfig.xml b/files/icons/browserconfig.xml deleted file mode 100644 index 4826e1357a..0000000000 --- a/files/icons/browserconfig.xml +++ /dev/null @@ -1,2 +0,0 @@ - -#ffffff diff --git a/files/icons/favicon-16x16.png b/files/icons/favicon-16x16.png deleted file mode 100644 index 2add553412..0000000000 Binary files a/files/icons/favicon-16x16.png and /dev/null differ diff --git a/files/icons/favicon-32x32.png b/files/icons/favicon-32x32.png deleted file mode 100644 index b612abb3b4..0000000000 Binary files a/files/icons/favicon-32x32.png and /dev/null differ diff --git a/files/icons/favicon-96x96.png b/files/icons/favicon-96x96.png deleted file mode 100644 index b95a49ab61..0000000000 Binary files a/files/icons/favicon-96x96.png and /dev/null differ diff --git a/files/icons/favicon.ico b/files/icons/favicon.ico deleted file mode 100644 index 382cd513f4..0000000000 Binary files a/files/icons/favicon.ico and /dev/null differ diff --git a/files/icons/manifest.json b/files/icons/manifest.json deleted file mode 100644 index 6f5533a0ac..0000000000 --- a/files/icons/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "name": "App", - "icons": [ - { - "src": "\/icons\/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "\/icons\/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "\/icons\/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "\/icons\/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "\/icons\/android-icon-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - }, - { - "src": "\/icons\/android-icon-192x192.png", - "sizes": "192x192", - "type": "image\/png", - "density": "4.0" - } - ] -} diff --git a/files/icons/ms-icon-144x144.png b/files/icons/ms-icon-144x144.png deleted file mode 100644 index 9bb321c2b7..0000000000 Binary files a/files/icons/ms-icon-144x144.png and /dev/null differ diff --git a/files/icons/ms-icon-150x150.png b/files/icons/ms-icon-150x150.png deleted file mode 100644 index 5be6957685..0000000000 Binary files a/files/icons/ms-icon-150x150.png and /dev/null differ diff --git a/files/icons/ms-icon-310x310.png b/files/icons/ms-icon-310x310.png deleted file mode 100644 index af7fbfda63..0000000000 Binary files a/files/icons/ms-icon-310x310.png and /dev/null differ diff --git a/files/icons/ms-icon-70x70.png b/files/icons/ms-icon-70x70.png deleted file mode 100644 index cd1bcb76a5..0000000000 Binary files a/files/icons/ms-icon-70x70.png and /dev/null differ diff --git a/files/logo-1000.png b/files/logo-1000.png deleted file mode 100644 index a5260a20fa..0000000000 Binary files a/files/logo-1000.png and /dev/null differ diff --git a/files/logo-250.png b/files/logo-250.png deleted file mode 100644 index 5e487212e6..0000000000 Binary files a/files/logo-250.png and /dev/null differ diff --git a/files/logo.png b/files/logo.png deleted file mode 100644 index eec3659f5b..0000000000 Binary files a/files/logo.png and /dev/null differ diff --git a/files/mesh-blue.png b/files/mesh-blue.png deleted file mode 100644 index 0485f9b46f..0000000000 Binary files a/files/mesh-blue.png and /dev/null differ diff --git a/files/mesh-green.png b/files/mesh-green.png deleted file mode 100644 index 36ddd573f8..0000000000 Binary files a/files/mesh-green.png and /dev/null differ diff --git a/files/mesh-orange.png b/files/mesh-orange.png deleted file mode 100644 index 16ead6bd62..0000000000 Binary files a/files/mesh-orange.png and /dev/null differ diff --git a/files/mesh-purple.png b/files/mesh-purple.png deleted file mode 100644 index 5b1320b131..0000000000 Binary files a/files/mesh-purple.png and /dev/null differ diff --git a/files/pdfs/poster-a0-bleed.pdf b/files/pdfs/poster-a0-bleed.pdf deleted file mode 100644 index 4f05bfdd3d..0000000000 Binary files a/files/pdfs/poster-a0-bleed.pdf and /dev/null differ diff --git a/files/pdfs/poster-a0.pdf b/files/pdfs/poster-a0.pdf deleted file mode 100644 index 8f96c01ebb..0000000000 Binary files a/files/pdfs/poster-a0.pdf and /dev/null differ diff --git a/files/pdfs/poster-a1-bleed.pdf b/files/pdfs/poster-a1-bleed.pdf deleted file mode 100644 index 5adcf1c507..0000000000 Binary files a/files/pdfs/poster-a1-bleed.pdf and /dev/null differ diff --git a/files/pdfs/poster-a1.pdf b/files/pdfs/poster-a1.pdf deleted file mode 100644 index 1f79bef6fc..0000000000 Binary files a/files/pdfs/poster-a1.pdf and /dev/null differ diff --git a/files/pdfs/poster-a4-bleed.pdf b/files/pdfs/poster-a4-bleed.pdf deleted file mode 100644 index 0fd583606c..0000000000 Binary files a/files/pdfs/poster-a4-bleed.pdf and /dev/null differ diff --git a/files/pdfs/poster-a4.pdf b/files/pdfs/poster-a4.pdf deleted file mode 100644 index e02f201689..0000000000 Binary files a/files/pdfs/poster-a4.pdf and /dev/null differ diff --git a/files/sty.css b/files/sty.css deleted file mode 100644 index cca3272cd3..0000000000 --- a/files/sty.css +++ /dev/null @@ -1,118 +0,0 @@ -/***************************** -colour scheme: - orange: #FF8800 - blue: #44AAFF - green: #55FF00 - purple: #DD2299 -*****************************/ - -@media (min-width:500px){ - #sideplots {display:block} -} -@media (max-width:500px){ - #sideplots {display:none} -} - -body {padding:0px;margin:0px; margin-bottom:100px} - -.head {background-image:url("/mesh-blue.png")} -.footer {background-image:url("/mesh-blue.png")} -.head, .body, .footer {width:100%;} - -.footer {position:fixed;bottom:0;font-size:14px;font-family:monospace; - text-align:center} -.footer, -a, a:link, a:active, a:visited - {color:#44AAFF} -.footer a:hover, -a:hover {color:#FF8800} - -a.nou, a.nou:link, a.nou:active, a.nou:visited, a.nou:hover {text-decoration:none} - -.content {max-width:740px;margin:auto;padding:35px 10px;background-color:rgba(255,255,255,0.9)} -.footer .content {padding:10px} -.footer .content a {margin-right:10px;margin-left:10px} - -.title {text-align:center;font-size:35px} -.tagline {text-align:center;font-size:25px;color:#44AAFF} -.title .first {color:#FF8800} -.title .second {color:#DD2299} - -.head, .footer {font-family: 'Varela Round', sans-serif;} - -h2 {margin-top:50px} -h1, h2, h3, h4, h5, h6 {font-family: 'Varela Round', sans-serif;font-weight:normal;color:#44AAFF} -h1 a, h2 a, h3 a, h4 a, h5 a, h6 a {text-decoration:none} -body, p {font-family:sans-serif} -p {text-align:justify} - -.head a {text-decoration:none} - -.egdetail {display:none} -.egdetail.current {display:block; border:2px solid #000000; overflow-x:scroll;padding-bottom:10px; - overflow-y:clip} - -a.eglink {margin-right:10px;display:inline-block;padding:5px;border:2px solid #AAAAAA;color:#AAAAAA; - border-bottom:none;border-radius:10px 10px 0px 0px;text-decoration:none;text-align:center} -a.eglink.current {border:2px solid #000000;color:#000000; border-bottom:none} -a.eglink.current:hover, -a.eglink.current {color:#000000} -a.eglink:hover {color:#FF8800} - -.citations li {font-size:90%} - -.dofnum {font-family: 'Varela Round', sans-serif} -.dofnum.largen {font-size:9px} - -li {margin-bottom:10px;margin-top:10px} - -.basisf {border-bottom:2px dashed #AAAAAA} -.basisf:last-of-type {border-bottom:none} - -a.refid, a.refid:visited, a.refid:link, a.refid:active, a.refid:hover {color:#000000} -a.refid:target {font-weight:bold; color:#FF8800} - -table.bordered, table.bordered tr, table.bordered td - {border:1px solid #AAAAAA;border-collapse:collapse} -table.bordered td {padding:2px 6px;text-align:center} -table.bordered thead {font-weight:bold;font-size:80%} - -table.bordered.align-left td {padding:2px 6px;text-align:left} -table.bordered.align-right td {padding:2px 6px;text-align:right} - -table.element-info {width:100%} -table.element-info, table.element-info tr, table.element-info td, table.element-info tr td - {border-collapse:collapsed} -table.element-info tr td {border-bottom:2px dashed #AAAAAA} -table.element-info tr:last-of-type td {border-bottom:none} -table.element-info td {padding:8px 0px} -table.element-info tr td:first-of-type {padding-right:10px;font-variant:all-small-caps; width:1px} - -table.filters {width:100%} -table.filters, table.filters tr, table.filters td, table.filters tr td - {border-collapse:collapsed} -table.filters tr td {border-bottom:2px dashed #AAAAAA} -table.filters tr:last-of-type td {border-bottom:none} -table.filters td {padding:8px 0px} -table.filters tr td:first-of-type {padding-right:10px;font-variant:all-small-caps} -table.filters tr td:last-of-type {font-size:80%} - -a#show-flink, a#hide-flink, -a#show_pset_link, a#hide_pset_link, -a.show_eg_link, a.hide_eg_link {font-size:80%;padding-top:10px;padding-bottom:10px} - -p.pcode {margin-left:50px;margin-right:50px;font-family:monospace;white-space:nowrap;overflow:scroll;max-width:50vw} - -table.families tr td {text-align:center; border-top:2px solid #000000; font-size:small; padding:5px} -table.families tr:first-of-type td {border-top:none; font-size:unset;} -table.families {border-collapse:collapse;} -table.families tr td:nth-of-type(1) {border-right: 2px dashed #000000;} - -img.person {float:right;width:200px;margin-left:20px;border-radius: 50%;margin-top:30px} - -.social {display:inline-block; margin:0px 10px} - -#authorcite {border: 2px solid #FF8800;border-radius:10px;padding:10px;margin:10px} -.authors {font-size:80%;margin-bottom:-5px} - -.verification-total {padding:10px 20px; font-family: 'Varela Round', sans-serif;font-weight:normal;text-align:center;width:fit-content;color:white;border-radius:15px;text-shadow: 1px 1px 2px black} diff --git a/img/mesh-bary0.img b/img/mesh-bary0.img deleted file mode 100644 index 437e78193b..0000000000 --- a/img/mesh-bary0.img +++ /dev/null @@ -1,23 +0,0 @@ -DESC: A mesh of triangles -[black] (40, 0) -- (120, 0) -[black] (40, 0) -- (80, 68) -[black] (120, 0) -- (80, 68) -[black] (120, 0) -- (220, 0) -[black] (120, 0) -- (160, 68) -[black] (220, 0) -- (160, 68) -[black] (40, 0) -- (0, 68) -[black] (0, 68) -- (80, 68) -[black] (80, 68) -- (160, 68) -[black] (220, 0) -- (240, 110) -[black] (160, 68) -- (240, 110) -[black] (0, 68) -- (40, 136) -[black] (80, 68) -- (40, 136) -[black] (80, 68) -- (120, 136) -[black] (160, 68) -- (120, 136) -[black] (40, 136) -- (120, 136) -[black] (240, 110) -- (120, 136) -[black] (40, 136) -- (80, 204) -[black] (120, 136) -- (80, 204) -[black] (240, 110) -- (190, 204) -[black] (120, 136) -- (190, 204) -[black] (80, 204) -- (190, 204) diff --git a/img/mesh-bary1.img b/img/mesh-bary1.img deleted file mode 100644 index 6e8a030738..0000000000 --- a/img/mesh-bary1.img +++ /dev/null @@ -1,59 +0,0 @@ -DESC: A mesh of triangles with each vertex connected to the midpoint of the opposite edge -[blue] (40, 0) -- (100.0, 34.0) -[blue] (120, 0) -- (60.0, 34.0) -[blue] (80, 68) -- (80.0, 0.0) -[blue] (120, 0) -- (190.0, 34.0) -[blue] (220, 0) -- (140.0, 34.0) -[blue] (160, 68) -- (170.0, 0.0) -[blue] (40, 0) -- (40.0, 68.0) -[blue] (0, 68) -- (60.0, 34.0) -[blue] (80, 68) -- (20.0, 34.0) -[blue] (120, 0) -- (120.0, 68.0) -[blue] (80, 68) -- (140.0, 34.0) -[blue] (160, 68) -- (100.0, 34.0) -[blue] (220, 0) -- (200.0, 89.0) -[blue] (160, 68) -- (230.0, 55.0) -[blue] (240, 110) -- (190.0, 34.0) -[blue] (0, 68) -- (60.0, 102.0) -[blue] (80, 68) -- (20.0, 102.0) -[blue] (40, 136) -- (40.0, 68.0) -[blue] (80, 68) -- (140.0, 102.0) -[blue] (160, 68) -- (100.0, 102.0) -[blue] (120, 136) -- (120.0, 68.0) -[blue] (80, 68) -- (80.0, 136.0) -[blue] (40, 136) -- (100.0, 102.0) -[blue] (120, 136) -- (60.0, 102.0) -[blue] (160, 68) -- (180.0, 123.0) -[blue] (240, 110) -- (140.0, 102.0) -[blue] (120, 136) -- (200.0, 89.0) -[blue] (40, 136) -- (100.0, 170.0) -[blue] (120, 136) -- (60.0, 170.0) -[blue] (80, 204) -- (80.0, 136.0) -[blue] (240, 110) -- (155.0, 170.0) -[blue] (120, 136) -- (215.0, 157.0) -[blue] (190, 204) -- (180.0, 123.0) -[blue] (120, 136) -- (135.0, 204.0) -[blue] (80, 204) -- (155.0, 170.0) -[blue] (190, 204) -- (100.0, 170.0) -[black] (40, 0) -- (120, 0) -[black] (40, 0) -- (80, 68) -[black] (120, 0) -- (80, 68) -[black] (120, 0) -- (220, 0) -[black] (120, 0) -- (160, 68) -[black] (220, 0) -- (160, 68) -[black] (40, 0) -- (0, 68) -[black] (0, 68) -- (80, 68) -[black] (80, 68) -- (160, 68) -[black] (220, 0) -- (240, 110) -[black] (160, 68) -- (240, 110) -[black] (0, 68) -- (40, 136) -[black] (80, 68) -- (40, 136) -[black] (80, 68) -- (120, 136) -[black] (160, 68) -- (120, 136) -[black] (40, 136) -- (120, 136) -[black] (240, 110) -- (120, 136) -[black] (40, 136) -- (80, 204) -[black] (120, 136) -- (80, 204) -[black] (240, 110) -- (190, 204) -[black] (120, 136) -- (190, 204) -[black] (80, 204) -- (190, 204) diff --git a/img/mesh-bary2.img b/img/mesh-bary2.img deleted file mode 100644 index 99b88b0795..0000000000 --- a/img/mesh-bary2.img +++ /dev/null @@ -1,95 +0,0 @@ -DESC: The dual mesh, with extra lines shown -[blue] (40, 0) -- (80.0, 22.666666666666668) -[blue] (120, 0) -- (80.0, 22.666666666666668) -[blue] (80, 68) -- (80.0, 22.666666666666668) -[blue] (120, 0) -- (166.66666666666666, 22.666666666666668) -[blue] (220, 0) -- (166.66666666666666, 22.666666666666668) -[blue] (160, 68) -- (166.66666666666666, 22.666666666666668) -[blue] (40, 0) -- (40.0, 45.333333333333336) -[blue] (0, 68) -- (40.0, 45.333333333333336) -[blue] (80, 68) -- (40.0, 45.333333333333336) -[blue] (120, 0) -- (120.0, 45.333333333333336) -[blue] (80, 68) -- (120.0, 45.333333333333336) -[blue] (160, 68) -- (120.0, 45.333333333333336) -[blue] (220, 0) -- (206.66666666666666, 59.333333333333336) -[blue] (160, 68) -- (206.66666666666666, 59.333333333333336) -[blue] (240, 110) -- (206.66666666666666, 59.333333333333336) -[blue] (0, 68) -- (40.0, 90.66666666666667) -[blue] (80, 68) -- (40.0, 90.66666666666667) -[blue] (40, 136) -- (40.0, 90.66666666666667) -[blue] (80, 68) -- (120.0, 90.66666666666667) -[blue] (160, 68) -- (120.0, 90.66666666666667) -[blue] (120, 136) -- (120.0, 90.66666666666667) -[blue] (80, 68) -- (80.0, 113.33333333333333) -[blue] (40, 136) -- (80.0, 113.33333333333333) -[blue] (120, 136) -- (80.0, 113.33333333333333) -[blue] (160, 68) -- (173.33333333333334, 104.66666666666667) -[blue] (240, 110) -- (173.33333333333334, 104.66666666666667) -[blue] (120, 136) -- (173.33333333333334, 104.66666666666667) -[blue] (40, 136) -- (80.0, 158.66666666666666) -[blue] (120, 136) -- (80.0, 158.66666666666666) -[blue] (80, 204) -- (80.0, 158.66666666666666) -[blue] (240, 110) -- (183.33333333333334, 150.0) -[blue] (120, 136) -- (183.33333333333334, 150.0) -[blue] (190, 204) -- (183.33333333333334, 150.0) -[blue] (120, 136) -- (130.0, 181.33333333333334) -[blue] (80, 204) -- (130.0, 181.33333333333334) -[blue] (190, 204) -- (130.0, 181.33333333333334) -[black] (40, 0) -- (120, 0) -[blue] (40, 0) -- (80, 68) -[blue] (120, 0) -- (80, 68) -[black] (120, 0) -- (220, 0) -[blue] (120, 0) -- (160, 68) -[blue] (220, 0) -- (160, 68) -[black] (40, 0) -- (0, 68) -[blue] (0, 68) -- (80, 68) -[blue] (80, 68) -- (160, 68) -[black] (220, 0) -- (240, 110) -[blue] (160, 68) -- (240, 110) -[black] (0, 68) -- (40, 136) -[blue] (80, 68) -- (40, 136) -[blue] (80, 68) -- (120, 136) -[blue] (160, 68) -- (120, 136) -[blue] (40, 136) -- (120, 136) -[blue] (240, 110) -- (120, 136) -[black] (40, 136) -- (80, 204) -[blue] (120, 136) -- (80, 204) -[black] (240, 110) -- (190, 204) -[blue] (120, 136) -- (190, 204) -[black] (80, 204) -- (190, 204) -[black] (80.0, 22.666666666666668) -- (100.0, 34.0) -[black] (80.0, 22.666666666666668) -- (60.0, 34.0) -[black] (80.0, 22.666666666666668) -- (80.0, 0.0) -[black] (166.66666666666666, 22.666666666666668) -- (190.0, 34.0) -[black] (166.66666666666666, 22.666666666666668) -- (140.0, 34.0) -[black] (166.66666666666666, 22.666666666666668) -- (170.0, 0.0) -[black] (40.0, 45.333333333333336) -- (40.0, 68.0) -[black] (40.0, 45.333333333333336) -- (60.0, 34.0) -[black] (40.0, 45.333333333333336) -- (20.0, 34.0) -[black] (120.0, 45.333333333333336) -- (120.0, 68.0) -[black] (120.0, 45.333333333333336) -- (140.0, 34.0) -[black] (120.0, 45.333333333333336) -- (100.0, 34.0) -[black] (206.66666666666666, 59.333333333333336) -- (200.0, 89.0) -[black] (206.66666666666666, 59.333333333333336) -- (230.0, 55.0) -[black] (206.66666666666666, 59.333333333333336) -- (190.0, 34.0) -[black] (40.0, 90.66666666666667) -- (60.0, 102.0) -[black] (40.0, 90.66666666666667) -- (20.0, 102.0) -[black] (40.0, 90.66666666666667) -- (40.0, 68.0) -[black] (120.0, 90.66666666666667) -- (140.0, 102.0) -[black] (120.0, 90.66666666666667) -- (100.0, 102.0) -[black] (120.0, 90.66666666666667) -- (120.0, 68.0) -[black] (80.0, 113.33333333333333) -- (80.0, 136.0) -[black] (80.0, 113.33333333333333) -- (100.0, 102.0) -[black] (80.0, 113.33333333333333) -- (60.0, 102.0) -[black] (173.33333333333334, 104.66666666666667) -- (180.0, 123.0) -[black] (173.33333333333334, 104.66666666666667) -- (140.0, 102.0) -[black] (173.33333333333334, 104.66666666666667) -- (200.0, 89.0) -[black] (80.0, 158.66666666666666) -- (100.0, 170.0) -[black] (80.0, 158.66666666666666) -- (60.0, 170.0) -[black] (80.0, 158.66666666666666) -- (80.0, 136.0) -[black] (183.33333333333334, 150.0) -- (155.0, 170.0) -[black] (183.33333333333334, 150.0) -- (215.0, 157.0) -[black] (183.33333333333334, 150.0) -- (180.0, 123.0) -[black] (130.0, 181.33333333333334) -- (135.0, 204.0) -[black] (130.0, 181.33333333333334) -- (155.0, 170.0) -[black] (130.0, 181.33333333333334) -- (100.0, 170.0) diff --git a/img/mesh-bary3.img b/img/mesh-bary3.img deleted file mode 100644 index 2d38bb0c72..0000000000 --- a/img/mesh-bary3.img +++ /dev/null @@ -1,45 +0,0 @@ -DESC: The dual mesh -[black] (40, 0) -- (120, 0) -[black] (120, 0) -- (220, 0) -[black] (40, 0) -- (0, 68) -[black] (220, 0) -- (240, 110) -[black] (0, 68) -- (40, 136) -[black] (40, 136) -- (80, 204) -[black] (240, 110) -- (190, 204) -[black] (80, 204) -- (190, 204) -[black] (80.0, 22.666666666666668) -- (100.0, 34.0) -[black] (80.0, 22.666666666666668) -- (60.0, 34.0) -[black] (80.0, 22.666666666666668) -- (80.0, 0.0) -[black] (166.66666666666666, 22.666666666666668) -- (190.0, 34.0) -[black] (166.66666666666666, 22.666666666666668) -- (140.0, 34.0) -[black] (166.66666666666666, 22.666666666666668) -- (170.0, 0.0) -[black] (40.0, 45.333333333333336) -- (40.0, 68.0) -[black] (40.0, 45.333333333333336) -- (60.0, 34.0) -[black] (40.0, 45.333333333333336) -- (20.0, 34.0) -[black] (120.0, 45.333333333333336) -- (120.0, 68.0) -[black] (120.0, 45.333333333333336) -- (140.0, 34.0) -[black] (120.0, 45.333333333333336) -- (100.0, 34.0) -[black] (206.66666666666666, 59.333333333333336) -- (200.0, 89.0) -[black] (206.66666666666666, 59.333333333333336) -- (230.0, 55.0) -[black] (206.66666666666666, 59.333333333333336) -- (190.0, 34.0) -[black] (40.0, 90.66666666666667) -- (60.0, 102.0) -[black] (40.0, 90.66666666666667) -- (20.0, 102.0) -[black] (40.0, 90.66666666666667) -- (40.0, 68.0) -[black] (120.0, 90.66666666666667) -- (140.0, 102.0) -[black] (120.0, 90.66666666666667) -- (100.0, 102.0) -[black] (120.0, 90.66666666666667) -- (120.0, 68.0) -[black] (80.0, 113.33333333333333) -- (80.0, 136.0) -[black] (80.0, 113.33333333333333) -- (100.0, 102.0) -[black] (80.0, 113.33333333333333) -- (60.0, 102.0) -[black] (173.33333333333334, 104.66666666666667) -- (180.0, 123.0) -[black] (173.33333333333334, 104.66666666666667) -- (140.0, 102.0) -[black] (173.33333333333334, 104.66666666666667) -- (200.0, 89.0) -[black] (80.0, 158.66666666666666) -- (100.0, 170.0) -[black] (80.0, 158.66666666666666) -- (60.0, 170.0) -[black] (80.0, 158.66666666666666) -- (80.0, 136.0) -[black] (183.33333333333334, 150.0) -- (155.0, 170.0) -[black] (183.33333333333334, 150.0) -- (215.0, 157.0) -[black] (183.33333333333334, 150.0) -- (180.0, 123.0) -[black] (130.0, 181.33333333333334) -- (135.0, 204.0) -[black] (130.0, 181.33333333333334) -- (155.0, 170.0) -[black] (130.0, 181.33333333333334) -- (100.0, 170.0) diff --git a/install_implementations.py b/install_implementations.py deleted file mode 100644 index 09d96cc64f..0000000000 --- a/install_implementations.py +++ /dev/null @@ -1,21 +0,0 @@ -"""Install all supported implementations.""" - -import argparse -import os - -from defelement import implementations - -parser = argparse.ArgumentParser(description="Install implementations") -parser.add_argument("--install-type", default="all", help="Type of installation.") -args = parser.parse_args() - -if args.install_type not in ["all", "verification"]: - raise RuntimeError(f"Unknown install type: {args.install_type}") - -for i in implementations.implementations.values(): - if args.install_type == "all" or (args.install_type == "verification" and i.verification): - lang = i.languages[0] if len(i.languages) == 1 else i.install_language - assert lang is not None - cmd = i.install(lang) - assert cmd is not None - assert os.system(cmd) == 0 diff --git a/pages/404.md b/pages/404.md deleted file mode 100644 index fcd8210557..0000000000 --- a/pages/404.md +++ /dev/null @@ -1,14 +0,0 @@ -# 404 Error - -Page not found. - -Maybe you can find what you were looking for if you: -
      -
    • [view the full alphabetical list of elements](index::all)
    • -
    • [view the elements by category](index::categories)
    • -
    • [view the elements by reference cell](index::references)
    • -
    • [view the elements that form complexes](index::families)
    • -
    • [view the elements by available implementations](index::implementations)
    • -
    • [view recently added/updated elements](index::recent)
    • -
    • [view a list of all pages on DefElement](/sitemap.html)
    • -
    diff --git a/pages/adding-an-implementation.md b/pages/adding-an-implementation.md deleted file mode 100644 index 3d0e283fc9..0000000000 --- a/pages/adding-an-implementation.md +++ /dev/null @@ -1,251 +0,0 @@ --- -authors: - - Scroggs, Matthew W. --- - -# Adding an implementation to DefElement - -This walkthrough will take you through all the steps involved in adding an implementation to -DefElement. - -Detailed documentation of the class methods and variables used in this walkthrough, as well as -other optional method, can be found in the file -[defelement/implementations/core.py](https://github.com/DefElement/DefElement/tree/main/defelement/implementations/core.py). - -## simplefem -As an example, this walkthrough will look at adding the -[simplefem](https://github.com/DefElement/simplefem) library to DefElement. -simplefem has been created to serve as an illustration library for this walkthrough, and should not be considered as a fully fledged library. -It only features Lagrange elements on triangles and can evaluate their basis functions. -For example, the following -snippet will create a Lagrange element on a triangle with 10 basis functions and evaluate its basis -function with index 5 at the point (0.3, 0.1): - -```python -import simplefem -import numpy as np - -e = simplefem.lagrange_element(10) -value = e.evaluate(5, np.array([0.3, 0.1])) -``` - -## Adding simplefem snippets to element pages -To add simplefem to DefElement, a file in the folder -[defelement/implementations](https://github.com/DefElement/DefElement/tree/main/defelement/implementations) -must be created. In this case, we called the file -[simplefem.py](https://github.com/DefElement/DefElement/tree/main/defelement/implementations/simplefem.py). -In this file, we begin by importing functionality from the file -[core.py](https://github.com/DefElement/DefElement/tree/main/defelement/implementations/core.py): - -{{snippet::defelement/implementations/simplefem.py::intro}} - -In order to add information about a finite element library to DefElement, we must implement four class methods -and set the values of four variables in this class. - -### `format` -The first method to implement is `format`. -The formatting string and parameters set in DefElement's .def files will be passed into this method. -For simplefem, this method simply returns the format string included in the .def file: - -{{snippet::defelement/implementations/simplefem.py::format}} - -In the file -[elements/lagrange.def](https://github.com/DefElement/DefElement/tree/main/elements/lagrange.def) -the following lines are included in the `implementations` section: - -``` -implementations: - ... - simplefem: - equispaced: - triangle: lagrange_element DEGREEMAP=(k+1)*(k+2)//2 -``` - -Therefore, the `format` class method will be called for an equispaced Lagrange element on a triangle, -with `string="lagrange_element"` and `params={}` (note that `DEGREEMAP` uses the syntax for a -parameter but is not included in `param` due to being a special parameter: we will return to -`DEGREEMAP` in the next section). - -The value returned by `format` will be displayed on the element's page. In the case, the -class method returns the string `lagrange_element` (which is the function in simplefem used to create -the element). - -### `example_import` and `single_example` -To generate example code that will be displayed on an element's page, DefElement will use the -class methods `example_import` and `single_example`. The class method `example_import` returns the -import statements to include at the start of the example code: this method takes -the programming language as its only input. -The class method `single_example` -returns Python code that will create the element: the inputs to this method are -the string included in the .def file (`name`); -the name of the reference cell for this example (`reference`); -the degree for this example (`degree`); -the parameters included in the .def file (`params`); -and the programming language that a snippet should be generated in (`language`). -The additional inputs `element` and `example` are the DefElement `Element` object and the raw example -information: these may be needed in some more complex cases. - -For simplefem, these class methods are defined as follows: - -{{snippet::defelement/implementations/simplefem.py::example}} - -The funtion `example_import` gives code to import simplefem. The inputs to class method `single_example` -will be `name="lagrange_element"`, `reference="triangle"`, and `params={}`. The degree used in -DefElement (in this case, the [polynomial subdegree](finite-elements.md#The+degree+of+a+finite+element) 1, 2, or 3) will be substituted into the `DEGREEMAP` -special parameter as `k` before this method is called (so the values 3, 6, and 10 will be passed in). -In this way, DefElement's notion of degree can be automatically converted to the number of points -input that simplefem uses. - -### `install` -The class method `install` can be implemented. It takes the programming language as an input -and returns the bash commands that can be used to install the implementation. -For simplefem, this is implemented as follows: - -{{snippet::defelement/implementations/simplefem.py::install}} - -### `version` -The final class method that must be implemented is `version`, which should return the version -number of the implementation library. For simplefem, this is implemented as follows: - -{{snippet::defelement/implementations/simplefem.py::version}} - -When an implementation can be installed from PyPI, the decorator `pypi_name` can be used. -This decorator will automatically implement the methods `version` and `install`. -For the Basix library, for example, `pypi_name` is used as -follows: - -{{snippet::defelement/implementations/basix.py::pypi_name}} - -### Variables -Finally, five variables need to be defined: - -* `id` gives the id used to identify this implementation (eg in URLs). This should be all lowercase - and not contain any special characters. -* `name` gives the name of the implementation as it will appear in text. -* `url` gives the URL of the git repository of the inplementation. -* `install` gives the pip command to install the implementation. Note that this can be omitted - if the `pypi_name` decorator is used. -* `languages` gives a list of programming languages that this implementation can generate snippets - for. - -Additionallly, the following variables may be needed for some implementations: - -* When an implementation supports more than one languages (ie when `len(languages) > 1`), - the variable `install_language` can be used to set which language should be passed into - the method `install` to get commands to install the implementation on CI runners. - -For simplefem, these variables are set to the following values. In general, it is preferable for -the install to be done from PyPI rather than via git, but as simplefem is merely an example library -and has no official release, installing via git is used in this case. - -{{snippet::defelement/implementations/simplefem.py::variables}} - -### Appearance on element page -We have now added everything that we need for an implementation to be included on DefElement. -As simplefem is an example library, it is by default hidden from the -[Lagrange element page](element::lagrange). If it were included, its section on the page would look -like this: - - - - - - -
    simplefemlagrange_element
    ↓ Show simplefem examples ↓ This implementation is correct for all the examples below that it supports.
    Note: This implementation uses an alternative value of degree for this element
    -
    - -## Verification -As well as giving information about implementations and code snippets for creating elements, -DefElement is able to [verify](/verification) that the basis functions of elements provided by different -implementations span the same polynomial spaces. If you want your implementation to be verified, you -will need to additionally implement the class method `verify` and set the variable `verification` to -`True`. - -The method `verify` takes -the string included in the .def file (`name`); -the name of the reference cell for this example (`reference`); -the degree for this example (`degree`); and -the parameters included in the .def file (`params`). -The additional inputs `element` and `example` are the DefElement `Element` object and the raw example -in case these are needed. The method should return a list of DOFs associated with each entity of each -dimension (as detailed below) and a function that maps a set of points on the DefElement reference -cell to a table of values: this table will be a three-dimensional Numpy array with the value -`table[i][j][k]` giving the `j`th component of the `k`th basis function evalutated at the `i`th -point. - -### `verify` for simplefem - -We now look in detail at the implementation of this function for simplefem. We begin with the -`def` statement defining the method: - -{{snippet::defelement/implementations/simplefem.py::verify1}} - -The method begins by importing simplefem and numpy: it is important that these are imported inside -the method so that import errors can be caught when running verification. - -{{snippet::defelement/implementations/simplefem.py::verify2}} - -The method then uses `getattr` to get the relevant element creation function and creates the element -(`e`). As only one element is implemented in simplefem, `name` will always be equal to -`"lagrange_element"`, but this function has been written with a more general library in mind. - -{{snippet::defelement/implementations/simplefem.py::verify3}} - -We next make lists of which degrees of freedom (DOFs) are associated with each sub-entity: the -variable `entity_dofs` that is created is a list of lists of lists where -`entity_dofs[i][j]` is a list of DOFs associated with the `j`th sub-entity of dimension `i`. -This variable will be one of the two value returned by this function. -The numbering of DOFs in simplefem is not the same as in DefElement's examples, so -we do this by looping over the points used to define each basis function and checking -if they're at a vertex or on an edge. Luckily, the ordering of points on each edge and inside -the triangle matches the [ordering used by DefElement](/reference_numbering.html#Triangle), so -these lists do not need to be permuted once created. - -{{snippet::defelement/implementations/simplefem.py::verify4}} - -Next, we define a function `tabulate` that takes a set of points as an inputs and returns the values -of all of the basis functions of the element at every point. The points input to this function -are points on the [reference cell as used by DefElement](/reference_numbering.html#Triangle) and so -points and function values may need to be mapped if the implementation uses an alternative reference -cell. - -DefElement's reference cell has vertices at (0,0), (1,0) and (0,1), while simplefem's reference cell -has vertices at (-1,0), (1,0) and (1,0), so we define `mapped_points` to be the points in simplefem's -reference cell that correspond to the points that are input. - -We then loop through each point and each basis function and use `e.evaluate` to evaluate the value -of the basis function at the point. - -{{snippet::defelement/implementations/simplefem.py::verify5}} - -Finally, we return `entity_dofs` and the function `tabulate` and set the class variable -`verification` to `True`: -{{snippet::defelement/implementations/simplefem.py::verify6}} - -{{snippet::defelement/implementations/simplefem.py::verificationvariable}} - -### The verification page - -As it is an example library, simplefem is hidden from the main verification index pages, -but can be viewed at [defelement.org/verification/simplefem.html](/verification/simplefem.html). - diff --git a/pages/barycentric-dual-grid.md b/pages/barycentric-dual-grid.md deleted file mode 100644 index 63059c1ce3..0000000000 --- a/pages/barycentric-dual-grid.md +++ /dev/null @@ -1,26 +0,0 @@ --- -authors: - - Scroggs, Matthew W. --- - -# Barycentric dual grids - -Some elements are defined on a [barycentric dual grid](reference::dual polygon). -This grid is defined by taking a mesh of triangles: - -{{img::mesh-bary0}} - -Lines are then added connecting every vertex of each triangle to the midpoint of the opposite -edge: - -{{img::mesh-bary1}} - -The cells in the dual grid are then defined as the union of all the triangles adjacent to -one of the vertices in the original mesh: - -{{img::mesh-bary2}} - -{{img::mesh-bary3}} - -In DefElement, regular polygons centred at the origin are used as reference cells of the -dual grid. diff --git a/pages/branding.md b/pages/branding.md deleted file mode 100644 index 8e77cbc4b6..0000000000 --- a/pages/branding.md +++ /dev/null @@ -1,34 +0,0 @@ -# Branding - -## Name -The name of this encyclopedia is DefElement. It should be written with a capital D and capital E, and with no space between Def and Element. - -## DefElement logo -
    -The DefElement logo was designed by Matthew Scroggs, and uses letters from the [Varela Round](https://fonts.google.com/specimen/Varela+Round/about) font -that was designed by Joe Prince. -The logo can be reused under the same license as the other content on DefElement -([Creative Commons Attribution 4.0 International (CC BY 4.0) license](https://creativecommons.org/licenses/by/4.0/)). -More information can be found on the [citing & reuse page](citing.md). - -* [DefElement logo 250×250px](/logo-250.png) -* [DefElement logo 1000×1000px](/logo-1000.png) -* [DefElement logo 2000×2000px](/logo.png) - -## Colours -The following colours are used on DefElement: - -*
    #FF8800 (DefElement orange) -*
    #44AAFF (DefElement blue) -*
    #55FF00 (DefElement green) -*
    #DD2299 (DefElement pink) -*
    #FFFFFF (white) -*
    #AAAAAA (grey) -*
    #000000 (black) - -The background of the top and bottom panels uses these colours: - -*
    #5FB1FF (DefElement blue #2) -*
    #84BEFF (DefElement blue #3) -*
    #B1D2FF (DefElement blue #4) -*
    #DFEBFF (DefElement blue #5) diff --git a/pages/ciarlet.md b/pages/ciarlet.md deleted file mode 100644 index 32ea1ac182..0000000000 --- a/pages/ciarlet.md +++ /dev/null @@ -1,3 +0,0 @@ --- -redirect: finite-elements.md --- diff --git a/pages/citing.md b/pages/citing.md deleted file mode 100644 index 4eda7e279d..0000000000 --- a/pages/citing.md +++ /dev/null @@ -1,96 +0,0 @@ -# Reusing & citing - -## Reusing content from DefElement -The text, images, and other content on this website (excluding Font Awesome, which is released under [its own license](https://github.com/DefElement/DefElement/blob/main/files/fontawesome/LICENSE.txt)) -may be reused under the terms of a -[Creative Commons Attribution 4.0 International (CC BY 4.0) license](https://creativecommons.org/licenses/by/4.0/): this means -that you can reuse any of the content as long as you attribute DefElement. -For reuse on a website, you could attribute us by including a link to DefElement; -for reuse in print, you could attribute us by including "DefElement" somewhere near the image or information; -for reuse in a paper, you could cite DefElement. - -The DefElement logo can be found on the [branding page](branding.md). - -## Citing DefElement - -The code used to generate this website is available on [Github](https://github.com/DefElement/DefElement) -under an [MIT license](https://github.com/DefElement/DefElement/blob/main/LICENSE). - -On each of the element definition pages, you can find citations for the paper(s) that introduced -that element. These papers should be cited when using a given element. If you wish to cite this -website, you can use the following BibTeX: - -``` -@misc{defelement, - AUTHOR = {{{list contributors|bibtex}}}, - TITLE = {{DefElement}: an encyclopedia of finite element definitions}, - YEAR = {{2020--{{date:Y}}}}, - HOWPUBLISHED = {\url{https://defelement.org}}, - NOTE = {[Online; accessed {{date:D-M-Y}}]} -} -``` - -This will create a reference along the lines of: - -
      -
    • {{list contributors|citation}}. DefElement: an encyclopedia of finite element definitions, 2020–{{date:Y}}, https://defelement.org [Online; accessed: {{date:D-M-Y}}].
    • -
    - -### DefElement paper - -You may also wish to cite the [DefElement paper](https://dx.doi.org/10.1007/s44207-026-00011-0), which is currently available as a preprint on arΧiv. -To cite this, you can use the following BibTeX: - -``` -@article{2026-defelement, - AUTHOR = {Scroggs, Matthew W. - and Brubeck, Pablo D. - and Dean, Joseph P. - and Dokken, J{\o}rgen S. - and Marsden, India}, - TITLE = {{DefElement:} an encyclopedia of finite element definitions}, - YEAR = {2026}, - JOURNAL = {Computational Science and Engineering}, - VOLUME = {3}, - NUMBER = {2}, - PAGES = {{1--31}}, - DOI = {10.1007/s44207-026-00011-0} -} -``` - -This will create a reference along the lines of: - -
      -
    • M. W. Scroggs, P. D. Brubeck, J. P. Dean, J. S. Dokken, I. Marsden. DefElement: an encyclopedia of finite element definitions, 2026, Computational Science and Engineering 3(2), 1–31, https://doi.org/10.1007/s44207-026-00011-0.
    • -
    - -## DefElement poster -The [DefElement poster](https://doi.org/10.6084/m9.figshare.23294939.v1) was first presented at [FEniCS 2023](https://fenicsproject.org/fenics-2023/). - -If you'd like a copy of the poster, you can download -[the A0 poster](/pdfs/poster-a0.pdf), -[the A0 poster (with bleed for printing)](/pdfs/poster-a0-bleed.pdf), -[the A1 poster](/pdfs/poster-a1.pdf), -[the A1 poster (with bleed for printing)](/pdfs/poster-a1-bleed.pdf), -[the A4 poster](/pdfs/poster-a4.pdf), or -[the A4 poster (with bleed for printing)](/pdfs/poster-a4-bleed.pdf). -These are all available under the same [Creative Commons Attribution 4.0 International (CC BY 4.0) license](https://creativecommons.org/licenses/by/4.0/) -as the rest of DefElement. - -If you wich to cite the poster, you can use the following BibTeX: - -``` -@misc{defelement-poster, - AUTHOR = {Scroggs, Matthew W.}, - TITLE = {{DefElement}: an encyclopedia of finite element definitions}, - YEAR = {2023}, - HOWPUBLISHED = {Poster presented at FEniCS 2023, Cagliari, Italy}, - DOI = {10.6084/m9.figshare.23294939.v1}, -} -``` - -This will create a reference along the lines of: - - diff --git a/pages/code-of-conduct.md b/pages/code-of-conduct.md deleted file mode 100644 index 75e3273bda..0000000000 --- a/pages/code-of-conduct.md +++ /dev/null @@ -1 +0,0 @@ -{{CODE_OF_CONDUCT.md}} diff --git a/pages/contributing.md b/pages/contributing.md deleted file mode 100644 index 8f6fed0ad4..0000000000 --- a/pages/contributing.md +++ /dev/null @@ -1 +0,0 @@ -{{CONTRIBUTING.md}} diff --git a/pages/contributors.md b/pages/contributors.md deleted file mode 100644 index 7be8c73cb6..0000000000 --- a/pages/contributors.md +++ /dev/null @@ -1,5 +0,0 @@ -# DefElement contributors - -Details of the contributions made by everyone can be found [on Github](https://github.com/DefElement/DefElement/graphs/contributors). - -{{list contributors}} diff --git a/pages/de-rham.md b/pages/de-rham.md deleted file mode 100644 index 1cd874362c..0000000000 --- a/pages/de-rham.md +++ /dev/null @@ -1,58 +0,0 @@ --- -authors: - - Scroggs, Matthew W. - - Nobre, Nuno --- - -# De Rham element families -The following relationship is the de Rham complex in 3D: -$$ -H^1 -\xrightarrow{\nabla} -\textbf{H}(\text{curl}) -\xrightarrow{\nabla\times} -\textbf{H}(\text{div}) -\xrightarrow{\nabla\cdot} -L^2 -$$ -We say this sequence is exact since the range (or image) of each of the -differential operators coincides with the null space (or kernel) of the next -operator in the sequence. We also note the last map is a surjection. - -A set of four finite elements \(\mathcal{V}_0\) to \(\mathcal{V}_3\) forms -a discrete de Rham complex if the following commutative diagram holds, -where \(I_0\) to \(I_3\) are interpolations into \(\mathcal{V}_0\) to \(\mathcal{V}_3\). -(The commutative diagram holds if following different arrow combinations to the same destination will give the same result.) -$$ -\begin{array}{ccccccc} -H^1 -&\xrightarrow{\nabla} -&\textbf{H}(\text{curl}) -&\xrightarrow{\nabla\times} -&\textbf{H}(\text{div}) -&\xrightarrow{\nabla\cdot} -&L^2\\ -\hphantom{\small I_0}\big\downarrow {\small I_0}&& -\hphantom{\small I_1}\big\downarrow {\small I_1}&& -\hphantom{\small I_2}\big\downarrow {\small I_2}&& -\hphantom{\small I_3}\big\downarrow {\small I_3}\\ -\mathcal{V}_0 -&\xrightarrow{\nabla} -&\mathcal{V}_1 -&\xrightarrow{\nabla\times} -&\mathcal{V}_2 -&\xrightarrow{\nabla\cdot} -&\mathcal{V}_3 -\end{array} -$$ -Sequences of finite element spaces forming discrete de Rham complexes are, in -general, not exact. However, it is certainly still the case that the range of -each of the differential operators is contained in (but is not necessarily -coincident with) the null space of the next operator in the sequence. - -You can view families of elements that form discrete de Rham complexes on the [families page](index::families). -On DefElement, two naming conventions for elements in a de Rham complex are used. -The first of these is the exterior calculus convention: this is the notation used in the -Periodic table of the finite elements -. -The second is the Cockburn–Fu convention: this gives the names used for element families in Cockburn and Fu's 2017 paper. diff --git a/pages/finite-elements.md b/pages/finite-elements.md deleted file mode 100644 index 76036fd1a6..0000000000 --- a/pages/finite-elements.md +++ /dev/null @@ -1,283 +0,0 @@ --- -authors: - - Scroggs, Matthew W. --- - -# How to define a finite element -This page describes how finite elements are defined in the DefElement database. -Much of the information on this page in written up in more detail in the DefElement paper {{citation::defelement_paper}}. - -## Reference cells -The reference cell on which an element is defined is arbitrary, and there are multiple different standard cells that are used. In DefElement, we use the following reference cells, -with sub-entities numbered as shown on the [reference numbering page](reference_numbering.md). - -* The reference interval is \(\left\{x\,\middle|\,0\leqslant x\leqslant 1\right\}\). -* The reference triangle is \(\left\{(x,y)\,\middle|\,0\leqslant x,\,0\leqslant y,\,x+y\leqslant1\right\}\). -* The reference quadrilateral is \(\left\{(x,y)\,\middle|\,0\leqslant x\leqslant1,\,0\leqslant y\leqslant1\right\}\). -* The reference tetrahedron is \(\left\{(x,y,z)\,\middle|\,0\leqslant x,\,0\leqslant y,\,0\leqslant z,\,x+y+z\leqslant1\right\}\). -* The reference hexahedron is \(\left\{(x,y,z)\,\middle|\,0\leqslant x\leqslant1,\,0\leqslant y\leqslant1,\,0\leqslant z\leqslant1\right\}\). -* The reference prism is \(\left\{(x,y,z)\,\middle|\,0\leqslant x,\,0\leqslant y,\,x+y\leqslant1,\,0\leqslant z\leqslant1\right\}\). -* The reference pyramid is \(\left\{(x,y,z)\,\middle|\,0\leqslant x,\,0\leqslant y,\,0\leqslant z\leqslant1,\,x+z\leqslant1,\,y+z\leqslant1\right\}\). - -## Cell sub-entities -Throughout this website, the sub-entities of a cell \({{symbols.reference}}\subset\mathbb{R}^d\) will be referred to as described here. - -The topological dimension \(d\) is the dimension of the reference cell itself. -(When using the finite element method, the topological dimensions may differ from the -geometric dimension \(d_g\): for example, when meshing a 2D manifold in 3D space, the -topological and geometric dimensions are 2 and 3 (respectively).) - -The sub-entities of a cell of dimension 0, 1, 2, and 3 are called -vertices, edges, faces, and volumes (respectively). -The codimension of an entity is given by subtracting the dimension of the entity from the -topological dimension \(d\) of the cell. Entities of codimension 1, 2, and 3 are -called facets, ridges and peaks (respectively). -For \(k>3\), we do not introduce specific names for \(k\)-dimensional and \(k\)-codimensional sub-entities. - -The names defined here are summarised for cells of topological dimension 0 to 4 below. - -
    - - - - - - - - - - -
    Topological dimensionEntities by dimension
    01234
    0 (a vertex)the cell----
    1 (an interval)points / facetsthe cell---
    2 (a polygon)points / ridgesedges / facetsthe cell--
    3 (a polyhedron)points / peaksedges / ridgesfaces / facetsthe cell-
    4pointsedges / peaksfaces / ridgesvolumes / facetsthe cell
    - -

    - - - - - - - - - - - -
    Topological dimensionEntities by codimension
    01234
    0 (a vertex)the cell----
    1 (an interval)the cellpoints / facets---
    2 (a polygon)the celledges / facetspoints / ridges--
    3 (a polyhedron)the cellfaces / facetsedges / ridgespoints / peaks-
    4the cellvolumes / facetsfaces / ridgesedges / peakspoints
    -
    - -## Finite elements -In the most general terms, a finite element on a cell \({{symbols.cell}}\) is defined as a triple \(({{symbols.cell}},{{symbols.polyset}},{{symbols.dual_basis}})\), -where - -* \({{symbols.cell}}\subset\mathbb{R}^{d_g}\) a cell in a mesh; -* \({{symbols.polyset}}\) is a finite dimensional space on \({{symbols.cell}}\) of dimension \(n\), usually a space of polynomials; -* \({{symbols.dual_basis}}=\{{{symbols.functional}}_0,...,{{symbols.functional}}_{n-1}\}\) is a basis of the dual space \({{symbols.polyset}}^*=\{f:{{symbols.polyset}}\to\mathbb{R}|f\text{ is linear}\}\). Each functional \({{symbols.functional}}_i\) is associated with a sub-entity of \({{symbols.cell}}\). - -The basis functions \(\{{{symbols.basis_function}}_0,...,{{symbols.basis_function}}_{n-1}\}\) -of the finite element space are defined by - -\[{{symbols.functional}}_i({{symbols.basis_function}}_j) = \begin{cases}1&i=j\\0&i\not=j\end{cases}\] - -Note that on pyramid cells, a space of rationomials (rational polynomials) is typically used for \({{symbols.polyset}}\). For all other cells, a space of polynomials is typically used. - -The majority of the elements included in DefElement are defined as reference-mapped elements. Reference-mapped elements are defined on -a reference cell then mapped to physical cells using a push forward map. On a reference cell, a reference-mapped element is defined by a -triple \(({{symbols.reference}},{{symbols.polyset}},{{symbols.dual_basis}})\), where - -* \({{symbols.reference}}\subset\mathbb{R}^d\) is the reference cell, usually a polygon or polyhedron; -* \({{symbols.polyset}}\) is a finite dimensional space on \({{symbols.reference}}\) of dimension \(n\), usually a space of polynomials; -* \({{symbols.dual_basis}}=\{{{symbols.functional}}_0,...,{{symbols.functional}}_{n-1}\}\) is a basis of the dual space \({{symbols.polyset}}^*=\{f:{{symbols.polyset}}\to\mathbb{R}|f\text{ is linear}\}\). Each functional \({{symbols.functional}}_i\) is associated with a sub-entity of the reference cell \({{symbols.reference}}\). - -The correct continuity is enforced by ensuring that the same global degree-of-freedom is associated with corresponding functionals on the shared sub-entities of neighbouring cells. - -Reference-mapped finite elements are often referred to as Ciarlet elements, do to their definition first appearing and -a set of lecture notes -and a later book -by Philippe Ciarlet. - -### Example: Order 1 Lagrange space on a triangle -An order 1 [Lagrange space](element::lagrange) on a triangle is defined by: - -* \({{symbols.reference}}\) is a triangle with vertices at \((0,0)\), \((1,0)\) and \((0,1)\); -* \({{symbols.polyset}}=\operatorname{span}\{1, x, y\}\); -* \({{symbols.dual_basis}}=\{{{symbols.functional}}_0,{{symbols.functional}}_1,{{symbols.functional}}_2\}\). - -The functionals \({{symbols.functional}}_0\) to \({{symbols.functional}}_2\) are defined as -point evaluations at the three vertices of the triangle: - -\[{{symbols.functional}}_0:v\mapsto v(0,0)\] -\[{{symbols.functional}}_1:v\mapsto v(1,0)\] -\[{{symbols.functional}}_2:v\mapsto v(0,1)\] - -It follows from these definitions that the basis functions of the finite element spaces are -linear functions that are equal 1 to at one of the vertices, and equal to 0 at the other two. -These are: - -\[{{symbols.basis_function}}_0(x,y)=1-x-y\] -\[{{symbols.basis_function}}_1(x,y)=x\] -\[{{symbols.basis_function}}_2(x,y)=y\] - -{{plot::triangle,Lagrange,1}} - -## Integral moments -It is common to use integral moment functionals when defining finite elements. Given a mesh -entity \(e\) and a finite element space \((e,{{symbols.polyset}}_e,{{symbols.dual_basis}}_e)\) defined on \(e\), -the integral moment functionals \({{symbols.functional}}_1,...,{{symbols.functional}}_{n_e}\) are defined by -\[{{symbols.functional}}_i:v\mapsto \int_e v{{symbols.basis_function}}_i,\] -where \({{symbols.basis_function}}_1,...,{{symbols.basis_function}}_{n_e}\) are the basis functions of the finite -element space on \(e\). - -For vector-valued spaces, integral moment functional can be defined using a vector-valued space -on \(e\) and taking the dot product inside the integral, -\[{{symbols.functional}}_i:\boldsymbol{v}\mapsto \int_e \boldsymbol{v}\cdot{{symbols.vector_basis_function}}_i.\] -Alternatively, an integral moment can -be taken with a scalar-valued space by taking the dot product with a fixed vector \(\boldsymbol{a}\), -\[{{symbols.functional}}_i:\boldsymbol{v}\mapsto \int_e \boldsymbol{v}\cdot\boldsymbol{a}\,{{symbols.basis_function}}_i.\] -Typically, \(\boldsymbol{a}\) will be tangent to an edge, normal to a facet, or a unit vector in one of -the coordinate directions. - -### Example: Order 1 Nédélec (second kind) space on a triangle -The functionals that define an order 1 [Nédélec (second kind) space](element::nedelec2) -on a triangle -are tangential integral moments with order 1 Lagrange spaces on the edges of the triangle. -For example, the two functionals on the edge \(e_0\) of the triangle between \((0,0)\) and \((1,0)\) are -\[{{symbols.functional}}_0:\boldsymbol{v}\to\int_{e_0}\boldsymbol{v}\cdot\left(\begin{array}{c}0\\1\end{array}\right)(1-s_0),\] -\[{{symbols.functional}}_1:\boldsymbol{v}\to\int_{e_0}\boldsymbol{v}\cdot\left(\begin{array}{c}0\\1\end{array}\right)s_0,\] -where \(s_0\) varies from 0 (at \((0,0)\)) to 1 (at \((1,0)\)) along \(e_0\). - -The basis functions of this space are: -{{plot::triangle,N2curl,1}} - -## Mapping finite elements -In order to maintain desired properties when mapping finite elements from a reference -cell to an actual mesh, an appropriate mapping must be defined. - - -For elements with a mixture of functional types, a more complex approach is required. -{{citation::kirby_mapping}} - -Let \({{symbols.geometry_map}}\) be a transformation that maps the reference cell to a cell in the mesh, -and let \(\boldsymbol{x}\) be a point in the cell. - -The Jacobian, \({{symbols.jacobian}}\), of the transformation \({{symbols.geometry_map}}\) is: - -* \(\displaystyle\frac{\mathrm{d}F}{\mathrm{d}x}\) for 1D reference cells (with 1D physical cells), -* \(\displaystyle\left( - \begin{array}{cc} - \frac{\partial F_1}{\partial x}&\frac{\partial F_1}{\partial y}\\ - \frac{\partial F_2}{\partial x}&\frac{\partial F_2}{\partial y} - \end{array} - \right)\) for 2D reference cells (with 2D physical cells), -* \(\displaystyle\left( - \begin{array}{ccc} - \frac{\partial F_1}{\partial x}&\frac{\partial F_1}{\partial y}&\frac{\partial F_1}{\partial z}\\ - \frac{\partial F_2}{\partial x}&\frac{\partial F_2}{\partial y}&\frac{\partial F_2}{\partial z}\\ - \frac{\partial F_3}{\partial x}&\frac{\partial F_3}{\partial y}&\frac{\partial F_3}{\partial z} - \end{array} - \right)\) for 3D reference cells (with 3D physical cells). - -If the dimensions of the reference and physical cells are not equal (eg for a surface mesh of 2D cells embedded in 3D) -then \({{symbols.jacobian}}\) will be a rectangular matrix. In this case then in the definitions below, -the determinant \(\det({{symbols.jacobian}})\) should be replaced by \(\sqrt{\det({{symbols.jacobian}}^T{{symbols.jacobian}})}\) -and the inverse matrix \({{symbols.jacobian}}^{-1}\) should be replaced by the Moore–Penrose pseudoinverse matrix -\({{symbols.jacobian}}^\dagger=\left({{symbols.jacobian}}^T{{symbols.jacobian}}\right)^{-1}{{symbols.jacobian}}^T\) that satisfies \({{symbols.jacobian}}^\dagger{{symbols.jacobian}} = \mathbf{I}\). - -### Scalar-valued basis functions -The identity mapping—used to map scalar basis functions, \({{symbols.basis_function}}\)—is defined by -\[\left({{symbols.mapping}}^\text{id}{{symbols.basis_function}}\right)(\boldsymbol{x}) -:={{symbols.basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x})).\] -The term \({{symbols.geometry_map}}^{-1}(\boldsymbol{x})\) is the point on the reference cell corresponding to the point \(\boldsymbol{x}\), so this mapping -maps a value of the function on the reference to the same value at the corresponding point. - -The L2 Piola mapping—used to map scalar discontinuous elements, \({{symbols.basis_function}}\)—is defined by -\[\left({{symbols.mapping}}^\text{L2}{{symbols.basis_function}}\right)(\boldsymbol{x}) -:=\frac1{\det {{symbols.jacobian}}}{{symbols.basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x})).\] - -### Vector-valued basis functions -For vector-valued basis functions, \({{symbols.vector_basis_function}}\), the -covariant Piola (\({{symbols.mapping}}^\text{curl}\)) and -contravariant Piola (\({{symbols.mapping}}^\text{div}\)) mappings are defined: -\[\left({{symbols.mapping}}^\text{curl}{{symbols.vector_basis_function}}\right)(\boldsymbol{x}) -:={{symbols.jacobian}}^{-T}{{symbols.vector_basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x}))\] -\[\left({{symbols.mapping}}^\text{div}{{symbols.vector_basis_function}}\right)(\boldsymbol{x}) -:=\frac1{\det {{symbols.jacobian}}}{{symbols.jacobian}}{{symbols.vector_basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x}))\] -The covariant Piola mapping preserves the tangential component of basis functions on edges and facets, -and are typically used to map H(curl) elements. -The contravariant Piola mapping preserves the normal component of basis functions on facets, -and are typically used to map H(div) elements. - -### Matrix-valued basis functions -For matrix-valued basis functions, \({{symbols.matrix_basis_function}}\), the -double covariant Piola (\({{symbols.mapping}}^\text{curl curl}\)), -double contravariant Piola (\({{symbols.mapping}}^\text{div div}\)) and -covariant-contravariant Piola (\({{symbols.mapping}}^\text{curl div}\)) -mappings are defined: -\[\left({{symbols.mapping}}^\text{curl curl}{{symbols.matrix_basis_function}}\right)(\boldsymbol{x}) -:={{symbols.jacobian}}^{-T}{{symbols.matrix_basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x})){{symbols.jacobian}}^{-1}\] -\[\left({{symbols.mapping}}^\text{div div}{{symbols.matrix_basis_function}}\right)(\boldsymbol{x}) -:=\frac1{\left(\det {{symbols.jacobian}}\right)^2}{{symbols.jacobian}}{{symbols.matrix_basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x})){{symbols.jacobian}}^T\] -\[\left({{symbols.mapping}}^\text{curl div}{{symbols.matrix_basis_function}}\right)(\boldsymbol{x}) -:=\frac1{\left(\det {{symbols.jacobian}}\right)}{{symbols.jacobian}}^{-T}{{symbols.matrix_basis_function}}({{symbols.geometry_map}}^{-1}(\boldsymbol{x})){{symbols.jacobian}}^T\] - -## Variants of finite elements -For many elements, there are a number of different choices that could be made for the functionals -in \({{symbols.dual_basis}}\) that define the element that give rise to an element with the same -key properties. For example, when defining a [Lagrange element](element::lagrange) on a triangle, there are many possible -choices for where exactly to locate the point evaluation functionals. -We refer to a pair of elements as variants of each other if: - -* They are defined on the same reference cell \({{symbols.reference}}\); -* They are defined using the same space \({{symbols.polyset}}\); -* The set of functionals in \({{symbols.dual_basis}}\) associated with each sub-entity of the - cell for the two elements are equivalent. - -Commonly used variants of elements are shown on each element's page. - -## The degree of a finite element -There are a few different ways to describe the degree of a finite element. -These are defined by: - -* The polynomial subdegree is the degree of the highest degree complete polynomial space that is a subspace of this element's polynomial space. -* The polynomial superdegree is the degree of the lowest degree complete polynomial space that is a superspace of this element's polynomial space. -* The Lagrange subdegree is the degree of the highest degree natural space that is a subspace of this element's polynomial space. -* The Lagrange superdegree is the degree of the lowest degree natural space that is a superspace of this element's polynomial space. - -The natural polynomial (or rationomial for pyramids) spaces of degree \(k\) on an interval, triangle, quadrilateral, -tetrahedron, hexahedron, triangular prism and square-based pyramid are defined by - -\[\mathbb{P}^{\text{interval}}_k=\operatorname{span}\left\{x^{p_0}\,\middle|\,p_0\in\mathbb{N},\,p_0\leqslant k\right\},\] -\[\mathbb{P}^{\text{triangle}}_k=\operatorname{span}\left\{x^{p_0}y^{p_1}\,\middle|\,p_0,p_1\in\mathbb{N}_0,\,p_0+p_1\leqslant k\right\},\] -\[\mathbb{P}^{\text{quadrilateral}}_k=\operatorname{span}\left\{x^{p_0}y^{p_1}\,\middle|\,p_0,p_1\in\mathbb{N}_0,\,p_0\leqslant k,\,p_1\leqslant k\right\},\] -\[\mathbb{P}^{\text{tetrahedron}}_k=\operatorname{span}\left\{x^{p_0}y^{p_1}z^{p_2}\,\middle|\,p_0,p_1,p_2\in\mathbb{N}_0,\,p_0+p_1+p_2\leqslant k\right\},\] -\[\mathbb{P}^{\text{hexahedron}}_k=\operatorname{span}\left\{x^{p_0}y^{p_1}z^{p_2}\,\middle|\,p_0,p_1,p_2\in\mathbb{N}_0,\,p_0\leqslant k,\,p_1\leqslant k,\,p_2\leqslant k\right\},\] -\[\mathbb{P}^{\text{prism}}_k=\operatorname{span}\left\{x^{p_0}y^{p_1}z^{p_2}\,\middle|\,p_0,p_1,p_2\in\mathbb{N}_0,\,p_0+p_1\leqslant k,\,p_2\leqslant k\right\},\] -\[\mathbb{P}^{\text{pyramid}}_k=\operatorname{span}\left\{\frac{x^{p_0}y^{p_1}z^{p_2}}{(1-z)^{p_0+p_1}}\,\middle|\,p_0,p_1,p_2\in\mathbb{N}_0,\,p_0\leqslant k,\,p_1\leqslant k,\,p_2\leqslant k\right\}.\] - -For non-pyramid cell types, these coincide with the polynomial space of a [Lagrange element](element::lagrange), hence the names Lagrange subdegree and Lagrange superdegree - -On each element's page, the values of these is shown, as well as information about which one is used as the canonical degree of that element. -In general, the polynomial subdegree is used to index every element whenever possible; the numbering on DefElement therefore differs from that used -in some implementations (most notably FEniCS, where the Lagrange superdegree is used to index the majority of elements). - -## Notation -Throughout this website, the notation given here in this section is used. - - - - - - - - - - - - - - - - - - - - -
    \({{symbols.reference}}\)A reference cell
    \({{symbols.polyset}}\)A finite dimensional space
    \({{symbols.dual_basis}}\)A dual basis
    \({{symbols.functional}}_i\)A functional in the dual basis
    \({{symbols.basis_function}}_i\)A scalar basis function
    \({{symbols.vector_basis_function}}_i\)A vector basis function
    \({{symbols.matrix_basis_function}}_i\)A matrix basis function
    \({{symbols.jacobian}}\)Jacobian
    \({{symbols.geometry_map}}\)A map from a reference to a cell in a mesh
    \({{symbols.mapping}}\)A mapping
    \({{symbols.entity(0)}}_i\)The \(i\)th vertex
    \({{symbols.entity(1)}}_i\)The \(i\)th edge
    \({{symbols.entity(2)}}_i\)The \(i\)th face
    \({{symbols.entity(3)}}_i\)The \(i\)th volume
    \(k\)Degree of a finite element
    \(d\)Topological dimension
    \(d_g\)Geometric dimension
    \(r\)Exterior derivative order
    diff --git a/pages/index.md b/pages/index.md deleted file mode 100644 index 14e690631b..0000000000 --- a/pages/index.md +++ /dev/null @@ -1,82 +0,0 @@ -
    -
    {{plot::triangle,Raviart-Thomas,0::1}}
    -
    A basis function of a degree 0 [Raviart–Thomas space](element::raviart-thomas) on a triangle
    -
    {{plot::quadrilateral,Q,2::3}}
    -
    A basis function of a degree 2 [Lagrange space](element::lagrange) on a quadrilateral
    -
    {{plot::tetrahedron,N1curl,0::4}}
    -
    A basis function of a degree 0 [Nédélec (first kind) space](element::nedelec1) on a tetrahedron
    -
    {{plot::hexahedron,Scurl,1::13}}
    -
    A basis function of a degree 1 [serendipity H(curl) space](element::scurl) on a hexahedron
    -
    - -Welcome to DefElement: an encyclopedia of finite element definitions. - -This website contains a collection of definitions of finite elements, -including commonly used elements such as -[Lagrange](element::lagrange), -[Raviart–Thomas](element::raviart-thomas), -[Nédélec (first kind)](element::nedelec1), -and -[Nédélec (second kind)](element::nedelec2) -elements, -and more exotic elements such as -[serendipity](element::serendipity), -[Hermite](element::hermite), -[P1-iso-P2](element::p1-iso-p2), -and -[Regge](element::regge) -elements. -DefElement currently contains the definition of {{number-of-elements}} elements. - -You can: - -* [view the full alphabetical list of elements](index::all) -* [view the elements by category](index::categories) -* [view the elements by reference cell](index::references) -* [view the elements that form complexes](index::families) -* [view the elements by available implementations](index::implementations) -* [view recently added/updated elements](index::recent) -* [view a list of all pages on DefElement](/sitemap.html) - -## The finite element method -The finite element method is a numerical method that involves discretising a problem using a finite -dimensional function space. These function spaces are commonly defined using a finite element -on a reference cell to derive basis functions for the space. This website contains a collection -of finite elements, and examples of the basis functions they define. - -Following the Ciarlet definition of a finite element, the elements on this website -are defined using a reference cell, a polynomial space, and a set of functionals. Each element's -page describes how these are defined for that element, and gives examples of these and the basis -functions they lead to for a selection of low degree spaces. - -You can read a detailed description of how the finite element definitions can be understood -on the [how to understand a finite element page](finite-elements.md). - -## Implementations of finite elements -There are a large number of libraries that implement finite elements. On each element's page, -code snippets are provided that can create the element in a selection of these libraries. - -For many libraries, DefElement performs verification to check that the implementation of -each element in the library matches the element's definition. The results of the most -recent verification run can be found on the [verification page](/verification). - -## Contributing to DefElement -If you find an error or inaccuracy in a DefElement entry, please open -[an issue on Github](https://github.com/DefElement/DefElement/issues). -You can also open an issue to suggest a new element that should be added to the database. - -Alternatively, you could fork the [DefElement Github repo](https://github.com/DefElement/DefElement), -make the changes yourself, and open a pull request. You can find more information about adding -an element to DefElement on the [contributing page](contributing.md). - -The functional information and examples on the element pages are generated using -[Symfem](https://github.com/mscroggs/symfem), a symbolic finite element definition library. -Before adding an element to DefElement, it should first be implemented in Symfem. - -A list of everyone who has contributed to DefElement can be found on the [contributors page](contributors.md). - -## Licensing and reuse -All the information and images on DefElement are licensed under a -[Creative Commons Attribution 4.0 International (CC BY 4.0) license](https://creativecommons.org/licenses/by/4.0/): this means -that you can reuse them as long as you attribute DefElement. -Full details of the licenses and attributions can be found on the [citing page](citing.md). diff --git a/pages/reference_numbering.md b/pages/reference_numbering.md deleted file mode 100644 index bcd915ce8c..0000000000 --- a/pages/reference_numbering.md +++ /dev/null @@ -1,20 +0,0 @@ --- -title: Reference cell numbering --- -This page illustrates the entity numbering used for each reference cell. In general, the following conventions are used when numbering cells on DefElement. - -### Convention 1: vertex numbering - -If \(a=(a_0,...,a_{d-1})\) and \(b=(a_0,...,b_{d-1})\) are two vertices of a reference cell then the index of vertex -\(a\) is less than the index of vertex \(b\) if and only if \((a_{d-1},...,a_0)<(b_{d-1},...,b_0)\) (where the meaning of \(<\) is as in Python for tuples). - -Note that dual cells are treated as a special case, with the vertices numbered in an anticlockwise order. - -### Convention 2: sub-entity numbering - -Let \(a\) and \(b\) be two sub-entities of a reference cell, and let \(v_a\) and \(v_b\) be sets containing the vertices of \(a\) and \(b\). -The index of sub-entity \(a\) is less that the index of sub-entity \(b\) if and only if -\(v_a < v_b\) (where again the meaning of \(<\) is as in Python for tuples). - - -{{REFERENCE_CELL_NUMBERING}} diff --git a/pages/style-guide.md b/pages/style-guide.md deleted file mode 100644 index ef04dd6832..0000000000 --- a/pages/style-guide.md +++ /dev/null @@ -1,35 +0,0 @@ -# Style guide -All the content on DefElement aims to conform to this style guide. This keeps it clear and consistent. - -We use standard British spelling in the content on DefElement. - -In general, we follow the [Chalkdust style guide](https://chalkdustmagazine.com/style-guide/) -(which follows the [Guardian style guide](https://www.theguardian.com/guardian-observer-style-guide-a) -with some additional guidance, mostly related to the style of equations). The remainder of this -page lists style guidance not covered in the Chalkdust style guide. - -### DefElement -This website is called DefElement, with a capital D and capital E, with no space between Def and Element. -More detail on referring the site itself can be found on the [branding page](branding.md). - -### Notation -The notation used on DefElement can be found [in this list](finite-elements.md#Notation). - -### Reference cell -The cell \({{symbols.reference}}\) on which an element is defined should always be referred to as the reference -cell and never the reference element to avoid confusion with the finite element. - -### References -References to papers, books, etc should follow the following style guidance: - -* Author names should include the full first name, middle initial(s) followed by full stop(s), then - surname. In .def files, they are written as Surname, First Name Initials (eg - "Scroggs, Matthew W.") -* Paper titles should use sentence case (like this) -* Journal and Book Names Should Use Title Case (Like This) - -### Sobolev spaces -When written in text, the spaces H(div) and H(curl) should be written as text, and not in math-mode. - -### Sub-entities -Hypenated, not subentities. diff --git a/people/bot.png b/people/bot.png deleted file mode 100644 index 1f7f6aaf60..0000000000 Binary files a/people/bot.png and /dev/null differ diff --git a/people/brubeck.jpeg b/people/brubeck.jpeg deleted file mode 100644 index 9dc31f54f8..0000000000 Binary files a/people/brubeck.jpeg and /dev/null differ diff --git a/people/dean.png b/people/dean.png deleted file mode 100644 index 27b33d203f..0000000000 Binary files a/people/dean.png and /dev/null differ diff --git a/people/dokken.jpg b/people/dokken.jpg deleted file mode 100644 index a9f88ed270..0000000000 Binary files a/people/dokken.jpg and /dev/null differ diff --git a/people/m-scroggs.jpg b/people/m-scroggs.jpg deleted file mode 100755 index 6b6c86e518..0000000000 Binary files a/people/m-scroggs.jpg and /dev/null differ diff --git a/people/marsden.jpeg b/people/marsden.jpeg deleted file mode 100644 index 0776a687da..0000000000 Binary files a/people/marsden.jpeg and /dev/null differ diff --git a/people/nobre.jpeg b/people/nobre.jpeg deleted file mode 100644 index 0c2a4ea564..0000000000 Binary files a/people/nobre.jpeg and /dev/null differ diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 1f7f0a9881..0000000000 --- a/pyproject.toml +++ /dev/null @@ -1,42 +0,0 @@ -[build-system] -build-backend = "flit_core.buildapi" -requires = ["flit_core >=3.8.0,<4"] - -[project] -name = "defelement" -description = "an encyclopedia of finite element definitions" -version = "2026.07" -readme = "README.md" -requires-python = ">=3.11,<3.15" -license = "MIT" -authors = [ - { name = "Matthew Scroggs", email = "defelement@mscroggs.co.uk" }, - { name = "other contributors to DefElement" } -] -dependencies = [ - "cairosvg==2.9", - "symfem[optional]==2025.12.0", - "numpy==2.5", - "sympy==1.14.0", - "PyGithub==2.9", - "pytz==2026.3", - "pyyaml==6.0.3", - "website-build-tools==0.1.14" -] -packages = ["defelement", "defelement.implementations"] - -[project.optional-dependencies] -style = ["ruff", "mypy", "pydocstyle"] - -[tool.ruff] -line-length = 100 -indent-width = 4 - -[tool.ruff.lint.per-file-ignores] -"__init__.py" = ["F401"] - -[tool.ruff.lint.pydocstyle] -convention = "google" - -[tool.mypy] -ignore_missing_imports = true diff --git a/templates/intro.html b/templates/intro.html deleted file mode 100644 index 43bb47c96a..0000000000 --- a/templates/intro.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - -{{pagetitle | }}DefElement - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - -
    an encyclopedia of finite element definitions
    -
    -
    -
    -
    diff --git a/templates/outro.html b/templates/outro.html deleted file mode 100644 index 5e0e47e68c..0000000000 --- a/templates/outro.html +++ /dev/null @@ -1,12 +0,0 @@ -
    -
    - - - - diff --git a/test/test_continuity.py b/test/test_continuity.py deleted file mode 100644 index acf2240e9e..0000000000 --- a/test/test_continuity.py +++ /dev/null @@ -1,55 +0,0 @@ -import os - -import pytest -import yaml - -element_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../elements") - -inputs = [] -for i in os.listdir(element_path): - if i.endswith(".def"): - with open(os.path.join(element_path, i)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - inputs += [(i, c) for c in data["reference-cells"]] - - -@pytest.mark.parametrize("file, cellname", inputs) -def test_sequence(file, cellname): - with open(os.path.join(element_path, file)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - if "mapping" not in data: - pytest.skip() - if "sobolev" not in data: - pytest.skip() - - m = data["mapping"] - c = data["sobolev"] - if isinstance(c, dict): - c = list(c.values()) - else: - c = [c] - - if m == "identity": - for i in c: - assert i in ["L2", "H1", "H2", "H3"] - elif m == "L2 Piola": - for i in c: - assert i in ["L2"] - elif m == "covariant Piola": - for i in c: - assert i == "H(curl)" - elif m == "contravariant Piola": - for i in c: - assert i in ["H(div)", "H1(div)", "H1"] - elif m == "double covariant Piola": - for i in c: - assert i == "H(curl curl)" - elif m == "double contravariant Piola": - for i in c: - assert i == "H(div div)" - elif m == "covariant-contravariant Piola": - for i in c: - assert i == "H(curl div)" - else: - pytest.skip(f"Non-standard mapping: {m}") diff --git a/test/test_element_files.py b/test/test_element_files.py deleted file mode 100644 index 6ac1f00af8..0000000000 --- a/test/test_element_files.py +++ /dev/null @@ -1,62 +0,0 @@ -import os - -import pytest -import yaml - -dir_path = os.path.dirname(os.path.realpath(__file__)) -element_path = os.path.join(dir_path, "../elements") - - -def parse_contributing_page(): - with open(os.path.join(dir_path, "../CONTRIBUTING.md")) as f: - table = f.read().split("", 1)[1].split("")[0] - if "" in table: - table = table.split("")[1] - table = table.strip() - - docs = {"req": [], "opt": [], "all": []} - for line in table.split("\n"): - name = line.split("`")[1].replace("‑", "-") - docs["all"].append(name) - if "{{tick}}" in line: - docs["req"].append(name) - else: - docs["opt"].append(name) - - return docs - - -def test_parse(): - docs = parse_contributing_page() - assert len(docs["req"]) == len(set(docs["req"])) - assert len(docs["opt"]) == len(set(docs["opt"])) - assert len(docs["all"]) == len(set(docs["all"])) - assert set(docs["all"]) == set(docs["req"] + docs["opt"]) - - -@pytest.mark.parametrize("e", [e for e in os.listdir(element_path) if e.endswith(".def")]) -def test_element_page(e): - with open(os.path.join(element_path, e)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - docs = parse_contributing_page() - - for key in data: - assert key in docs["all"] - - for key in docs["req"]: - assert key in data - - -@pytest.mark.parametrize("e", [e for e in os.listdir(element_path) if e.endswith(".def")]) -def test_symfem_no_degreemap(e): - def no_degreemap(impl): - if isinstance(impl, dict): - return all(no_degreemap(i) for i in impl.values()) - return "DEGREEMAP" not in impl - - with open(os.path.join(element_path, e)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - if "implementations" in data and "symfem" in data["implementations"]: - assert no_degreemap(data["implementations"]["symfem"]) diff --git a/test/test_implementations.py b/test/test_implementations.py deleted file mode 100644 index a1c05e6ddf..0000000000 --- a/test/test_implementations.py +++ /dev/null @@ -1,10 +0,0 @@ -import pytest - -from defelement.implementations import implementations -from defelement.languages import languages - - -@pytest.mark.parametrize("i", implementations) -def test_languages(i): - for lang in implementations[i].languages: - assert lang in languages diff --git a/test/test_pages.py b/test/test_pages.py deleted file mode 100644 index 631abda682..0000000000 --- a/test/test_pages.py +++ /dev/null @@ -1,16 +0,0 @@ -import os - -import pytest - -dir_path = os.path.dirname(os.path.realpath(__file__)) -pages_path = os.path.join(dir_path, "../pages") - -md_files = [p for p in os.listdir(pages_path) if p.endswith(".md")] - - -@pytest.mark.parametrize("p", md_files) -def test_brackets(p): - with open(os.path.join(pages_path, p)) as f: - page = f.read() - - assert page.count("(") == page.count(")") diff --git a/test/test_polynomial_sets.py b/test/test_polynomial_sets.py deleted file mode 100644 index c04f67ec53..0000000000 --- a/test/test_polynomial_sets.py +++ /dev/null @@ -1,44 +0,0 @@ -import hashlib -import os -import re -from random import random - -import pytest -import yaml - -element_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../elements") - -inputs = [] -for i in os.listdir(element_path): - if i.endswith(".def"): - with open(os.path.join(element_path, i)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - inputs += [(i, c) for c in data["reference-cells"]] - - -@pytest.mark.parametrize("file, cellname", inputs) -def test_latex(file, cellname): - with open(os.path.join(element_path, file)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - if "polynomial set" not in data: - return - - for j in data["polynomial set"].values(): - for k in j.split("&&"): - k = k.strip() - if k.startswith(""): - k = re.sub(r"\@def\@([^\@]+)\@([^\@]+)\@", "", k) - k = re.sub(r"\@defmath\@([^\@]+)\@([^\@]+)\@", "", k) - filename = "_temp_" + hashlib.sha224(f"{random()}".encode()).hexdigest() - with open(f"{filename}.tex", "w") as f: - f.write("\\documentclass{article}\n\n") - f.write("\\usepackage{amsmath}\n") - f.write("\\usepackage{amssymb}\n") - f.write("\\usepackage{amsfonts}\n") - f.write("\n\\begin{document}\n") - f.write("\\[\n" + k[4:-1] + "\n\\]") - f.write("\\end{document}") - if os.system(f"pdflatex -halt-on-error {filename}.tex > /dev/null") != 0: - assert os.system(f"pdflatex -halt-on-error {filename}.tex") == 0 - os.system(f"rm {filename}.*") diff --git a/test/test_sequences.py b/test/test_sequences.py deleted file mode 100644 index 1ff860ba15..0000000000 --- a/test/test_sequences.py +++ /dev/null @@ -1,243 +0,0 @@ -import os -import re -import signal -import urllib -import urllib.request -import warnings - -import pytest -import symfem -import sympy -import yaml - -oeis_cache: dict[str, str] = {} - - -class TimeOutTheTest(BaseException): - pass - - -def handler(signum, frame): - raise TimeOutTheTest() - - -def latex_to_pyth(formula): - formula = re.sub(r"([0-9])\(", r"\1*(", str(formula)) - formula = re.sub(r"([0-9])k", r"\1*k", str(formula)) - formula = formula.replace(")(", ")*(") - formula = formula.replace("k(", "k*(") - formula = formula.replace("^", "**") - formula = formula.replace("/", "//") - return formula - - -def check_formula(formula, seq): - if isinstance(formula, list): - parts = [] - for i, fpart in enumerate(formula): - k, j = next(iter(fpart.items())) - if "=" in k: - ns = [int(a) for a in k.split("=")[1].split(",")] - elif ">=" in k: - ns = [a for a in seq if a >= int(k.split(">=")[1])] - elif ">" in k: - ns = [a for a in seq if a > int(k.split(">")[1])] - parts.append((j, ns)) - for k, s in seq.items(): - for i, j in parts: - if k in j: - assert s == eval(latex_to_pyth(i).replace("k", str(k))) - break - else: - warnings.warn(f"k={k} is not included in this sequence") - else: - for k, s in seq.items(): - assert s == eval(latex_to_pyth(formula).replace("k", str(k))) - - -def is_satisfied(condition, n): - if condition.startswith("k>="): - return n >= int(condition[3:]) - if condition.startswith("k<="): - return n <= int(condition[3:]) - if condition.startswith("k>"): - return n > int(condition[2:]) - if condition.startswith("k<"): - return n < int(condition[2:]) - raise ValueError - - -def check_oeis(oeis, seq): - if " [" in oeis: - oeis, condition = oeis.split(" [") - condition = condition.split("]")[0] - seq = {i: j for i, j in seq.items() if is_satisfied(condition, i)} - seq = {i: j for i, j in seq.items() if j > 0} - if oeis not in oeis_cache: - try: - with urllib.request.urlopen( - urllib.request.Request( - f"http://oeis.org/{oeis}/list", - headers={"User-Agent": "DefElement test runner"}, - ) - ) as f: - oeis_cache[oeis] = "".join( - [ - i.strip() - for i in f.read() - .decode("utf-8") - .split("
    [")[1]
    -                        .split("]
    ")[0] - .split("\n") - ] - ) - except urllib.error.HTTPError: - pytest.xfail("Error reading from OEIS") - assert ",".join([str(i) for i in seq.values()]) in oeis_cache[oeis] - - -def parse_degree(degree, cellname): - if isinstance(degree, dict): - return parse_degree(degree[cellname], cellname) - if isinstance(degree, str): - return int(sympy.S(degree).subs("d", symfem.create_reference(cellname).tdim)) - - return degree - - -element_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../elements") - -inputs = [] -for i in os.listdir(element_path): - if i.endswith(".def"): - with open(os.path.join(element_path, i)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - inputs += [(i, c) for c in data["reference-cells"]] - - -@pytest.mark.parametrize("file, cellname", inputs) -def test_sequence(file, cellname): - if cellname == "dual polygon": - pytest.skip() - with open(os.path.join(element_path, file)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - if "implementations" not in data or "symfem" not in data["implementations"]: - pytest.skip() - if "ndofs" not in data: - pytest.skip() - - if isinstance(data["implementations"]["symfem"], dict): - if cellname not in data["implementations"]["symfem"]: - pytest.skip() - symfem_name = data["implementations"]["symfem"][cellname] - else: - symfem_name = data["implementations"]["symfem"] - - seq = {} - if "min-degree" in data: - mink = parse_degree(data["min-degree"], cellname) - else: - mink = 0 - maxk = 10 - if "max-degree" in data: - maxk = min(maxk, parse_degree(data["max-degree"], cellname)) - - for k in range(mink, maxk + 1): - try: - signal.signal(signal.SIGALRM, handler) - signal.alarm(25) - if "variant=" in symfem_name: - elementname, variant = symfem_name.split(" variant=") - term = symfem.create_element(cellname, elementname, k, variant=variant).space_dim - else: - term = symfem.create_element(cellname, symfem_name, k).space_dim - seq[k] = term - except NotImplementedError: - pass - except ValueError: - pass - except TimeOutTheTest: - break - - signal.alarm(0) - - if cellname in data["ndofs"]: - if "formula" in data["ndofs"][cellname]: - check_formula(data["ndofs"][cellname]["formula"], seq) - if "oeis" in data["ndofs"][cellname]: - check_oeis(data["ndofs"][cellname]["oeis"], seq) - - -@pytest.mark.parametrize("file, cellname", inputs) -def test_entity_sequences(file, cellname): - if cellname == "dual polygon": - pytest.skip() - with open(os.path.join(element_path, file)) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - - if "implementations" not in data or "symfem" not in data["implementations"]: - pytest.skip() - if "entity-ndofs" not in data: - pytest.skip() - - if isinstance(data["implementations"]["symfem"], dict): - if cellname not in data["implementations"]["symfem"]: - pytest.skip() - symfem_name = data["implementations"]["symfem"][cellname] - else: - symfem_name = data["implementations"]["symfem"] - - seq = { - "vertices": {}, - "edges": {}, - "faces": {}, - "volumes": {}, - "cell": {}, - "facets": {}, - "ridges": {}, - "peaks": {}, - } - if "min-degree" in data: - mink = parse_degree(data["min-degree"], cellname) - else: - mink = 0 - maxk = 10 - if "max-degree" in data: - maxk = min(maxk, parse_degree(data["max-degree"], cellname)) - - for k in range(mink, maxk + 1): - try: - signal.signal(signal.SIGALRM, handler) - signal.alarm(25) - if "variant=" in symfem_name: - elementname, variant = symfem_name.split(" variant=") - e = symfem.create_element(cellname, elementname, k, variant=variant) - else: - e = symfem.create_element(cellname, symfem_name, k) - for d, e_name in zip( - range(e.reference.tdim), ["vertices", "edges", "faces", "volumes"] - ): - seq[e_name][k] = len(e.entity_dofs(d, 0)) - for co_d, e_name in zip(range(e.reference.tdim), ["cell", "facets", "ridges", "peaks"]): - seq[e_name][k] = len(e.entity_dofs(e.reference.tdim - co_d, 0)) - except NotImplementedError: - pass - except TimeOutTheTest: - break - - signal.alarm(0) - - def run_entity_test(data): - if isinstance(data, list): - for i in data: - run_entity_test(i) - else: - for entity in data: - if "formula" in data[entity]: - check_formula(data[entity]["formula"], seq[entity]) - if "oeis" in data[entity]: - check_oeis(data[entity]["oeis"], seq[entity]) - - if "entity-ndofs" in data: - run_entity_test(data["entity-ndofs"]) diff --git a/test/test_snippets.py b/test/test_snippets.py deleted file mode 100644 index 05bf0edb9a..0000000000 --- a/test/test_snippets.py +++ /dev/null @@ -1,41 +0,0 @@ -import os - -import pytest - -from defelement.element import Categoriser -from defelement.implementations import examples, implementations - -dir = os.path.dirname(os.path.realpath(__file__)) -c = Categoriser() -c.load_categories(os.path.join(dir, "../data/categories")) -c.load_references(os.path.join(dir, "../data/references")) -c.load_folder(os.path.join(dir, "../elements")) - -elements = [e.name for e in c.elements] - - -@pytest.mark.parametrize("element", elements) -@pytest.mark.parametrize("library", examples.keys()) -def test_snippets(element, library): - e = c.get_element(element) - - if not e.implemented(library): - pytest.skip() - if "python" not in implementations[library].languages: - pytest.skip() - - if library.startswith("*(") and library.endswith(")"): - _input_code, output_code = library[2:-1].split(" -> ") - if e.implemented(output_code): - pytest.skip() - try: - code = e.make_implementation_examples(library, "python") - except (NotImplementedError, KeyError): - pytest.skip() - else: - code = e.make_implementation_examples(library, "python") - lines = code.split("\n") - for i, j in enumerate(lines): - print(j) - - exec(code) # noqa: S102 diff --git a/test/test_verification.py b/test/test_verification.py deleted file mode 100644 index c194208ccd..0000000000 --- a/test/test_verification.py +++ /dev/null @@ -1,120 +0,0 @@ -import os - -import yaml - -from defelement.element import Element -from defelement.implementations import parse_example, verifications -from defelement.verification import verify - -dir_path = os.path.dirname(os.path.realpath(__file__)) -element_path = os.path.join(dir_path, "../elements") - - -def test_self(): - with open(os.path.join(element_path, "lagrange.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e = Element(data, "lagrange") - - eg = next(i for i in e.examples if "triangle" in i) - reference, defelement_degree, variant, _kwargs = parse_example(eg) - symfem_name, symfem_degree, symfem_params = e.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - - info = verifications["symfem"](symfem_name, reference, symfem_degree, symfem_params, e, eg) - assert verify("triangle", info, info)[0] - - -def test_variant(): - with open(os.path.join(element_path, "lagrange.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e = Element(data, "lagrange") - - eg0, eg1 = [i for i in e.examples if "quadrilateral,1" in i][:2] - - reference0, defelement_degree0, variant0, _kwargs0 = parse_example(eg0) - symfem_name0, symfem_degree0, symfem_params0 = e.get_implementation_string( - "symfem", - reference0, - defelement_degree0, - variant0, - ) - - reference1, defelement_degree1, variant1, _kwargs1 = parse_example(eg1) - symfem_name1, symfem_degree1, symfem_params1 = e.get_implementation_string( - "symfem", - reference1, - defelement_degree1, - variant1, - ) - - info0 = verifications["symfem"]( - symfem_name0, reference0, symfem_degree0, symfem_params0, e, eg0 - ) - info1 = verifications["symfem"]( - symfem_name1, reference1, symfem_degree1, symfem_params1, e, eg1 - ) - - assert verify("quadrilateral", info0, info1)[0] - - -def test_hermite_vs_lagrange(): - with open(os.path.join(element_path, "lagrange.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e = Element(data, "lagrange") - eg = next(i for i in e.examples if "triangle,3" in i) - reference, defelement_degree, variant, _kwargs = parse_example(eg) - symfem_name, symfem_degree, symfem_params = e.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - info0 = verifications["symfem"](symfem_name, reference, symfem_degree, symfem_params, e, eg) - - with open(os.path.join(element_path, "hermite.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e = Element(data, "hermite") - eg = next(i for i in e.examples if "triangle,3" in i) - reference, defelement_degree, variant, _kwargs = parse_example(eg) - symfem_name, symfem_degree, symfem_params = e.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - info1 = verifications["symfem"](symfem_name, reference, symfem_degree, symfem_params, e, eg) - - assert not verify("triangle", info0, info1)[0] - - -def test_verify_bdm_vs_n2(): - with open(os.path.join(element_path, "brezzi-douglas-marini.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e0 = Element(data, "brezzi-douglas-marini") - with open(os.path.join(element_path, "nedelec2.def")) as f: - data = yaml.load(f, Loader=yaml.FullLoader) - e1 = Element(data, "nedelec2") - - eg = next(i for i in e0.examples if i in e1.examples and "triangle" in i) - - reference, defelement_degree, variant, _kwargs = parse_example(eg) - symfem_name0, symfem_degree0, symfem_params0 = e0.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - symfem_name1, symfem_degree1, symfem_params1 = e1.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - - info0 = verifications["symfem"](symfem_name0, reference, symfem_degree0, symfem_params0, e0, eg) - info1 = verifications["symfem"](symfem_name1, reference, symfem_degree1, symfem_params1, e1, eg) - assert not verify("triangle", info0, info1)[0] diff --git a/verification-history.json b/verification-history.json new file mode 100644 index 0000000000..6d043234f5 --- /dev/null +++ b/verification-history.json @@ -0,0 +1 @@ +{"basix": [{"date": "2025-05-09", "pass": 107, "total": 107}, {"date": "2025-05-16", "pass": 109, "total": 109}, {"date": "2025-06-01", "pass": 113, "total": 113}, {"date": "2025-06-16", "pass": 113, "total": 113}, {"date": "2025-07-01", "pass": 124, "total": 124}, {"date": "2025-07-16", "pass": 124, "total": 124}, {"date": "2025-08-01", "pass": 124, "total": 124}, {"date": "2025-08-16", "pass": 124, "total": 124}, {"date": "2025-09-01", "pass": 124, "total": 124}, {"date": "2025-09-16", "pass": 124, "total": 124}, {"date": "2025-10-01", "pass": 124, "total": 124}, {"date": "2025-10-16", "pass": 124, "total": 124}, {"date": "2025-11-01", "pass": 124, "total": 124}, {"date": "2025-11-16", "pass": 124, "total": 124}, {"date": "2025-11-24", "pass": 124, "total": 124}, {"date": "2025-12-01", "pass": 124, "total": 124}, {"date": "2025-12-22", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-01-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-02-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-03-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-04-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-05-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-06-01", "pass": 116, "version": "0.10.0", "total": 116}, {"date": "2026-07-01", "pass": 116, "version": "0.11.0", "total": 116}], "basix.ufl": [{"date": "2025-05-09", "pass": 117, "total": 117}, {"date": "2025-05-16", "pass": 117, "total": 117}, {"date": "2025-06-01", "pass": 123, "total": 123}, {"date": "2025-06-16", "pass": 123, "total": 123}, {"date": "2025-07-01", "pass": 134, "total": 134}, {"date": "2025-07-16", "pass": 134, "total": 134}, {"date": "2025-08-01", "pass": 134, "total": 134}, {"date": "2025-08-16", "pass": 134, "total": 134}, {"date": "2025-09-01", "pass": 134, "total": 134}, {"date": "2025-09-16", "pass": 134, "total": 134}, {"date": "2025-10-01", "pass": 134, "total": 134}, {"date": "2025-10-16", "pass": 134, "total": 134}, {"date": "2025-11-01", "pass": 134, "total": 134}, {"date": "2025-11-16", "pass": 134, "total": 134}, {"date": "2025-11-24", "pass": 208, "total": 210}, {"date": "2025-12-01", "pass": 208, "total": 210}, {"date": "2025-12-22", "pass": 200, "version": "0.10.0", "total": 202}, {"date": "2026-01-01", "pass": 200, "version": "0.10.0", "total": 202}, {"date": "2026-02-01", "pass": 200, "version": "0.10.0", "total": 202}, {"date": "2026-03-01", "pass": 200, "version": "0.10.0", "total": 202}, {"date": "2026-04-01", "pass": 200, "version": "0.10.0", "total": 202}, {"date": "2026-05-01", "pass": 202, "version": "0.10.0", "total": 202}, {"date": "2026-06-01", "pass": 202, "version": "0.10.0", "total": 202}, {"date": "2026-07-01", "pass": 202, "version": "0.11.0", "total": 202}], "ndelement": [{"date": "2025-05-09", "pass": 40, "total": 40}, {"date": "2025-05-16", "pass": 40, "total": 40}, {"date": "2025-06-01", "pass": 40, "total": 40}, {"date": "2025-06-16", "pass": 40, "total": 40}, {"date": "2025-07-01", "pass": 70, "total": 70}, {"date": "2025-07-16", "pass": 70, "total": 70}, {"date": "2025-08-01", "pass": 70, "total": 70}, {"date": "2025-08-16", "pass": 70, "total": 70}, {"date": "2025-09-01", "pass": 70, "total": 70}, {"date": "2025-09-16", "pass": 70, "total": 70}, {"date": "2025-10-01", "pass": 70, "total": 70}, {"date": "2025-10-16", "pass": 70, "total": 70}, {"date": "2025-11-01", "pass": 70, "total": 70}, {"date": "2025-11-16", "pass": 70, "total": 70}, {"date": "2025-11-24", "pass": 70, "total": 70}, {"date": "2025-12-01", "pass": 70, "total": 70}, {"date": "2025-12-22", "pass": 40, "version": "0.3.0", "total": 40}, {"date": "2026-01-01", "pass": 40, "version": "0.3.0", "total": 40}, {"date": "2026-02-01", "pass": 40, "version": "0.3.0", "total": 40}, {"date": "2026-03-01", "pass": 40, "version": "0.3.0", "total": 40}, {"date": "2026-04-01", "pass": 40, "version": "0.3.0", "total": 40}, {"date": "2026-05-01", "pass": 40, "version": "0.4.0", "total": 40}, {"date": "2026-06-01", "pass": 40, "version": "0.4.0", "total": 40}, {"date": "2026-07-01", "pass": 40, "version": "0.4.0", "total": 40}], "fiat": [{"date": "2025-05-09", "pass": 98, "total": 107}, {"date": "2025-05-16", "pass": 100, "total": 109}, {"date": "2025-06-01", "pass": 102, "total": 111}, {"date": "2025-06-16", "pass": 102, "total": 111}, {"date": "2025-07-01", "pass": 122, "total": 131}, {"date": "2025-07-16", "pass": 122, "total": 131}, {"date": "2025-08-01", "pass": 122, "total": 131}, {"date": "2025-08-16", "pass": 122, "total": 131}, {"date": "2025-09-01", "pass": 122, "total": 131}, {"date": "2025-09-16", "pass": 122, "total": 131}, {"date": "2025-10-01", "pass": 122, "total": 131}, {"date": "2025-10-16", "pass": 122, "total": 131}, {"date": "2025-11-01", "pass": 122, "total": 131}, {"date": "2025-11-16", "pass": 122, "total": 131}, {"date": "2025-11-24", "pass": 122, "total": 131}, {"date": "2025-12-01", "pass": 122, "total": 131}, {"date": "2025-12-22", "pass": 103, "version": "2025.10.1", "total": 112}, {"date": "2026-01-01", "pass": 103, "version": "2025.10.1", "total": 112}, {"date": "2026-02-01", "pass": 103, "version": "2025.10.1", "total": 112}, {"date": "2026-03-01", "pass": 103, "version": "2025.10.1", "total": 112}, {"date": "2026-04-01", "pass": 103, "version": "2025.10.1", "total": 112}, {"date": "2026-05-01", "pass": 103, "version": "2026.4.0", "total": 112}, {"date": "2026-06-01", "pass": 103, "version": "2026.4.0", "total": 112}, {"date": "2026-07-01", "pass": 103, "version": "2026.4.0", "total": 112}], "simplefem": [{"date": "2025-12-22", "pass": 3, "version": "1.2.0", "total": 3}, {"date": "2026-01-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-02-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-03-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-04-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-05-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-06-01", "pass": 3, "version": "1.2.1", "total": 3}, {"date": "2026-07-01", "pass": 3, "version": "1.2.1", "total": 3}]} \ No newline at end of file diff --git a/verification.json b/verification.json new file mode 100644 index 0000000000..644dc7640c --- /dev/null +++ b/verification.json @@ -0,0 +1 @@ +{"metadata": {"date": "2026-07-01", "simplefem": {"version": "1.2.1"}, "fiat": {"version": "2026.4.0"}, "ndelement": {"version": "0.4.0"}, "basix": {"version": "0.11.0"}, "basix.ufl": {"version": "0.11.0"}}, "verification": {"alfeld-sorokina": {"fiat": {"pass": ["triangle,2"], "fail": [], "not implemented": []}}, "argyris": {"fiat": {"pass": ["triangle,5"], "fail": [], "not implemented": []}}, "arnold-winther": {"basix.ufl": {"pass": ["triangle,2", "triangle,3"], "fail": [], "not implemented": []}, "fiat": {"pass": [], "fail": ["triangle,2"], "not implemented": ["triangle,3"]}}, "bell": {"fiat": {"pass": ["triangle,4"], "fail": [], "not implemented": []}}, "bernardi-raugel": {"fiat": {"pass": ["triangle,1", "tetrahedron,1"], "fail": ["tetrahedron,2"], "not implemented": []}}, "bernstein": {"basix.ufl": {"pass": ["interval,1", "interval,2", "interval,3", "triangle,1", "triangle,2", "triangle,3"], "fail": [], "not implemented": []}, "fiat": {"pass": ["interval,1", "interval,2", "interval,3", "triangle,1", "triangle,2", "triangle,3"], "fail": [], "not implemented": []}}, "brezzi-douglas-duran-fortin": {"basix.ufl": {"pass": ["hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "brezzi-douglas-fortin-marini": {"basix.ufl": {"pass": ["triangle,0", "triangle,1", "quadrilateral,0", "quadrilateral,1", "tetrahedron,0", "tetrahedron,1", "hexahedron,0", "hexahedron,1"], "fail": [], "not implemented": []}, "fiat": {"pass": [], "fail": [], "not implemented": ["triangle,0", "triangle,1", "quadrilateral,0", "quadrilateral,1", "tetrahedron,0", "tetrahedron,1", "hexahedron,0", "hexahedron,1"]}}, "brezzi-douglas-marini": {"basix": {"pass": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange", "triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange", "triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange"]}}, "bubble": {"basix": {"pass": ["interval,2", "interval,3", "triangle,3", "triangle,4"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["interval,2", "interval,3", "triangle,3", "triangle,4"], "fail": [], "not implemented": []}, "fiat": {"pass": ["interval,2", "interval,3", "triangle,3", "triangle,4"], "fail": [], "not implemented": []}}, "bubble-enriched-lagrange": {"basix.ufl": {"pass": ["triangle,1", "triangle,2"], "fail": [], "not implemented": []}}, "conforming-crouzeix-raviart": {"basix.ufl": {"pass": ["triangle,1", "triangle,2", "triangle,3", "triangle,4", "triangle,5"], "fail": [], "not implemented": []}}, "crouzeix-falk": {"basix.ufl": {"pass": ["triangle,3"], "fail": [], "not implemented": []}}, "crouzeix-raviart": {"basix": {"pass": ["triangle,1", "tetrahedron,1", "quadrilateral,1", "hexahedron,1"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,1", "tetrahedron,1", "quadrilateral,1", "hexahedron,1"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1", "tetrahedron,1"], "fail": [], "not implemented": ["quadrilateral,1", "hexahedron,1"]}}, "discontinuous-lagrange": {"ndelement": {"pass": ["interval,0,equispaced", "interval,1,equispaced", "interval,2,equispaced", "triangle,0,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "quadrilateral,0,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "tetrahedron,0,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,0,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced"], "fail": [], "not implemented": ["prism,0,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,0,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced"]}, "basix": {"pass": ["interval,0,equispaced", "interval,1,equispaced", "interval,2,equispaced", "triangle,0,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "quadrilateral,0,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "tetrahedron,0,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,0,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,0,equispaced", "prism,1,equispaced", "prism,2,equispaced"], "fail": [], "not implemented": ["pyramid,0,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced"]}, "basix.ufl": {"pass": ["interval,0,equispaced", "interval,1,equispaced", "interval,2,equispaced", "triangle,0,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "quadrilateral,0,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "tetrahedron,0,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,0,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,0,equispaced", "prism,1,equispaced", "prism,2,equispaced"], "fail": [], "not implemented": ["pyramid,0,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced"]}, "fiat": {"pass": ["interval,0,equispaced", "interval,1,equispaced", "interval,2,equispaced", "triangle,0,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "tetrahedron,0,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced"], "fail": [], "not implemented": ["quadrilateral,0,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "hexahedron,0,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,0,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,0,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced"]}}, "dpc": {"basix": {"pass": ["quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": ["interval,1", "interval,2", "interval,3"]}, "basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": ["interval,1", "interval,2", "interval,3"]}, "fiat": {"pass": ["interval,1", "interval,2", "interval,3", "quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": []}}, "gauss-legendre": {"basix.ufl": {"pass": ["interval,1", "interval,2", "quadrilateral,1", "quadrilateral,2"], "fail": [], "not implemented": []}}, "gopalakrishnan-lederer-schoberl": {"fiat": {"pass": [], "fail": ["triangle,0", "triangle,1", "triangle,2", "tetrahedron,0", "tetrahedron,1"], "not implemented": []}}, "guzman-neilan": {"fiat": {"pass": ["triangle,1", "tetrahedron,1", "tetrahedron,2"], "fail": [], "not implemented": []}}, "guzman-neilan2": {"fiat": {"pass": ["triangle,1"], "fail": ["tetrahedron,1", "tetrahedron,2"], "not implemented": []}}, "hellan-herrmann-johnson": {"basix": {"pass": ["triangle,0", "triangle,1", "triangle,2", "tetrahedron,0", "tetrahedron,1", "tetrahedron,2"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,0", "triangle,1", "triangle,2", "tetrahedron,0", "tetrahedron,1", "tetrahedron,2"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,0", "triangle,1", "triangle,2", "tetrahedron,0", "tetrahedron,1", "tetrahedron,2"], "fail": [], "not implemented": []}}, "hermite": {"basix": {"pass": ["interval,3", "triangle,3", "tetrahedron,3"], "fail": [], "not implemented": []}, "fiat": {"pass": ["interval,3", "triangle,3", "tetrahedron,3"], "fail": [], "not implemented": []}}, "hsieh-clough-tocher": {"fiat": {"pass": ["triangle,3"], "fail": [], "not implemented": []}}, "huang-zhang": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2"], "fail": [], "not implemented": []}}, "kong-mulder-veldhuizen": {"basix.ufl": {"pass": ["triangle,1", "triangle,2", "tetrahedron,1"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1", "triangle,2", "tetrahedron,1"], "fail": [], "not implemented": []}}, "lagrange": {"ndelement": {"pass": ["interval,1,equispaced", "interval,2,equispaced", "interval,3,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "triangle,3,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "quadrilateral,3,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced"], "fail": [], "not implemented": ["prism,1,equispaced", "prism,2,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced", "interval,1,gll", "interval,2,gll", "interval,3,gll", "interval,4,gll", "quadrilateral,1,gll", "quadrilateral,2,gll", "interval,1,lobatto", "interval,2,lobatto", "interval,3,lobatto", "quadrilateral,1,lobatto", "quadrilateral,2,lobatto", "quadrilateral,3,lobatto", "hexahedron,1,lobatto", "hexahedron,2,lobatto"]}, "basix": {"pass": ["interval,1,equispaced", "interval,2,equispaced", "interval,3,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "triangle,3,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "quadrilateral,3,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced", "interval,1,gll", "interval,2,gll", "interval,3,gll", "interval,4,gll", "quadrilateral,1,gll", "quadrilateral,2,gll"], "fail": [], "not implemented": ["interval,1,lobatto", "interval,2,lobatto", "interval,3,lobatto", "quadrilateral,1,lobatto", "quadrilateral,2,lobatto", "quadrilateral,3,lobatto", "hexahedron,1,lobatto", "hexahedron,2,lobatto"]}, "basix.ufl": {"pass": ["interval,1,equispaced", "interval,2,equispaced", "interval,3,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "triangle,3,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "quadrilateral,3,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced", "interval,1,gll", "interval,2,gll", "interval,3,gll", "interval,4,gll", "quadrilateral,1,gll", "quadrilateral,2,gll"], "fail": [], "not implemented": ["interval,1,lobatto", "interval,2,lobatto", "interval,3,lobatto", "quadrilateral,1,lobatto", "quadrilateral,2,lobatto", "quadrilateral,3,lobatto", "hexahedron,1,lobatto", "hexahedron,2,lobatto"]}, "simplefem": {"pass": ["triangle,1,equispaced", "triangle,2,equispaced", "triangle,3,equispaced"], "fail": [], "not implemented": ["interval,1,equispaced", "interval,2,equispaced", "interval,3,equispaced", "quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "quadrilateral,3,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced", "interval,1,gll", "interval,2,gll", "interval,3,gll", "interval,4,gll", "quadrilateral,1,gll", "quadrilateral,2,gll", "interval,1,lobatto", "interval,2,lobatto", "interval,3,lobatto", "quadrilateral,1,lobatto", "quadrilateral,2,lobatto", "quadrilateral,3,lobatto", "hexahedron,1,lobatto", "hexahedron,2,lobatto"]}, "fiat": {"pass": ["interval,1,equispaced", "interval,2,equispaced", "interval,3,equispaced", "triangle,1,equispaced", "triangle,2,equispaced", "triangle,3,equispaced", "tetrahedron,1,equispaced", "tetrahedron,2,equispaced"], "fail": [], "not implemented": ["quadrilateral,1,equispaced", "quadrilateral,2,equispaced", "quadrilateral,3,equispaced", "hexahedron,1,equispaced", "hexahedron,2,equispaced", "prism,1,equispaced", "prism,2,equispaced", "pyramid,1,equispaced", "pyramid,2,equispaced", "interval,1,gll", "interval,2,gll", "interval,3,gll", "interval,4,gll", "quadrilateral,1,gll", "quadrilateral,2,gll", "interval,1,lobatto", "interval,2,lobatto", "interval,3,lobatto", "quadrilateral,1,lobatto", "quadrilateral,2,lobatto", "quadrilateral,3,lobatto", "hexahedron,1,lobatto", "hexahedron,2,lobatto"]}}, "mardal-tai-winther": {"basix.ufl": {"pass": ["triangle,1", "tetrahedron,1"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1"], "fail": [], "not implemented": ["tetrahedron,1"]}}, "morley": {"fiat": {"pass": ["triangle,2"], "fail": [], "not implemented": []}}, "nedelec1": {"ndelement": {"pass": ["triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre"], "fail": [], "not implemented": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "prism,0,lagrange", "prism,1,lagrange"]}, "basix": {"pass": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre"], "fail": [], "not implemented": ["prism,0,lagrange", "prism,1,lagrange"]}, "basix.ufl": {"pass": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre"], "fail": [], "not implemented": ["prism,0,lagrange", "prism,1,lagrange"]}, "fiat": {"pass": ["triangle,0,legendre", "triangle,1,legendre"], "fail": [], "not implemented": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "prism,0,lagrange", "prism,1,lagrange", "quadrilateral,0,legendre", "quadrilateral,1,legendre"]}}, "nedelec2": {"basix": {"pass": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange", "triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange", "triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1,legendre", "triangle,2,legendre", "tetrahedron,1,legendre", "tetrahedron,2,legendre"], "fail": [], "not implemented": ["triangle,1,lagrange", "triangle,2,lagrange", "tetrahedron,1,lagrange", "tetrahedron,2,lagrange"]}}, "nonconforming-arnold-winther": {"basix.ufl": {"pass": ["triangle,1"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1"], "fail": [], "not implemented": []}}, "p1-iso-p2": {"basix": {"pass": ["interval,1", "triangle,1", "quadrilateral,1"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["interval,1", "triangle,1", "quadrilateral,1"], "fail": [], "not implemented": []}, "fiat": {"pass": ["interval,1", "triangle,1"], "fail": [], "not implemented": ["quadrilateral,1"]}}, "radau": {"basix.ufl": {"pass": ["interval,1", "interval,2", "quadrilateral,1", "quadrilateral,2"], "fail": [], "not implemented": []}}, "raviart-thomas": {"ndelement": {"pass": ["triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre", "tetrahedron,0,legendre", "tetrahedron,1,legendre", "hexahedron,0,legendre", "hexahedron,1,legendre"], "fail": [], "not implemented": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange"]}, "basix": {"pass": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre", "tetrahedron,0,legendre", "tetrahedron,1,legendre", "hexahedron,0,legendre", "hexahedron,1,legendre"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "triangle,0,legendre", "triangle,1,legendre", "quadrilateral,0,legendre", "quadrilateral,1,legendre", "tetrahedron,0,legendre", "tetrahedron,1,legendre", "hexahedron,0,legendre", "hexahedron,1,legendre"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,0,legendre", "triangle,1,legendre", "tetrahedron,0,legendre", "tetrahedron,1,legendre"], "fail": [], "not implemented": ["triangle,0,lagrange", "triangle,1,lagrange", "quadrilateral,0,lagrange", "quadrilateral,1,lagrange", "tetrahedron,0,lagrange", "tetrahedron,1,lagrange", "hexahedron,0,lagrange", "hexahedron,1,lagrange", "quadrilateral,0,legendre", "quadrilateral,1,legendre", "hexahedron,0,legendre", "hexahedron,1,legendre"]}}, "reduced-hsieh-clough-tocher": {"fiat": {"pass": ["triangle,3"], "fail": [], "not implemented": []}}, "regge": {"basix": {"pass": ["triangle,1", "triangle,2"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["triangle,1", "triangle,2"], "fail": [], "not implemented": []}, "fiat": {"pass": ["triangle,1", "triangle,2"], "fail": [], "not implemented": []}}, "serendipity": {"basix": {"pass": ["interval,1", "interval,2", "interval,3", "quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": []}, "basix.ufl": {"pass": ["interval,1", "interval,2", "interval,3", "quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": []}, "fiat": {"pass": ["interval,1", "interval,2", "interval,3", "quadrilateral,1", "quadrilateral,2", "quadrilateral,3"], "fail": [], "not implemented": []}}, "scurl": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "sdiv": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "taylor": {"fiat": {"pass": ["interval,1", "interval,2", "interval,3", "triangle,1", "triangle,2", "triangle,3"], "fail": [], "not implemented": []}}, "tnt": {"basix.ufl": {"pass": ["quadrilateral,2", "quadrilateral,3", "quadrilateral,4", "hexahedron,2"], "fail": [], "not implemented": []}}, "tnt-curl": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "quadrilateral,3", "hexahedron,1"], "fail": [], "not implemented": []}}, "tnt-div": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "quadrilateral,3", "hexahedron,1"], "fail": [], "not implemented": []}}, "trimmed-serendipity-curl": {"basix.ufl": {"pass": ["quadrilateral,0", "quadrilateral,1", "quadrilateral,2", "hexahedron,0", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}, "fiat": {"pass": ["quadrilateral,0", "quadrilateral,1", "quadrilateral,2", "hexahedron,0", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "trimmed-serendipity-div": {"basix.ufl": {"pass": ["quadrilateral,0", "quadrilateral,1", "quadrilateral,2", "hexahedron,0", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}, "fiat": {"pass": ["quadrilateral,0", "quadrilateral,1", "quadrilateral,2", "hexahedron,0", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "vector-bubble-enriched-lagrange": {"basix.ufl": {"pass": ["triangle,1", "triangle,2"], "fail": [], "not implemented": []}}, "vector-dpc": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "quadrilateral,3", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}, "vector-lagrange": {"basix.ufl": {"pass": ["triangle,1", "triangle,2", "tetrahedron,1", "tetrahedron,2"], "fail": [], "not implemented": []}}, "vector-q": {"basix.ufl": {"pass": ["quadrilateral,1", "quadrilateral,2", "hexahedron,1", "hexahedron,2"], "fail": [], "not implemented": []}}}} \ No newline at end of file diff --git a/verify.py b/verify.py deleted file mode 100644 index a380254038..0000000000 --- a/verify.py +++ /dev/null @@ -1,255 +0,0 @@ -"""Perform verification checks.""" - -import argparse -import json -import os -import typing -from datetime import datetime, timedelta, timezone - -from defelement import settings -from defelement.element import Categoriser, Element -from defelement.implementations import parse_example, verifications, versions -from defelement.verification import verify - - -def verify_example( - element: tuple[Element, str, list[str]], -) -> dict[str, dict[str, dict[str, list[str]]]]: - """Verify example. - - Args: - element: The element, example and list of implementations - - Returns: - Results of verification - """ - e, eg, implementations = element - - green = "\033[32m" - red = "\033[31m" - blue = "\033[34m" - default = "\033[0m" - - results: dict[str, dict[str, dict[str, list[str]]]] = {} - - if e.filename not in results: - results[e.filename] = {} - cell = eg.split(",")[0] - - reference, defelement_degree, variant, kwargs = parse_example(eg) - assert len(kwargs) == 0 - symfem_name, symfem_degree, symfem_params = e.get_implementation_string( - "symfem", - reference, - defelement_degree, - variant, - ) - assert symfem_degree is not None - sym_info = verifications["symfem"](symfem_name, reference, symfem_degree, symfem_params, e, eg) - for i in implementations: - # Implementations generated from other implementations (eg Basix code generated by Symfem) - if i.startswith("*(") and i.endswith(")"): - input_code, output_code = i[2:-1].split(" -> ") - if e.implemented(output_code) or not e.implemented(input_code): - continue - # Standard implementations - else: - input_code = i - output_code = i - - if output_code not in results[e.filename]: - results[e.filename][output_code] = { - "pass": [], - "fail": [], - "not implemented": [], - } - - # Do the verification - try: - impl_name, impl_degree, impl_params = e.get_implementation_string( - input_code, - reference, - defelement_degree, - variant, - ) - assert impl_degree is not None - vinfo = verifications[i](impl_name, reference, impl_degree, impl_params, e, eg) - v, info = verify(cell, vinfo, sym_info) - if v: - results[e.filename][output_code]["pass"].append(eg) - print(f"{e.filename} {i} {eg} {green}\u2713{default}") - else: - results[e.filename][output_code]["fail"].append(eg) - print(f"{e.filename} {i} {eg} {red}\u2715{default}") - if print_reasons: - print(f" {info}") - except ImportError: - if skip_missing: - print(f"{output_code} not installed") - else: - raise - except NotImplementedError: - results[e.filename][output_code]["not implemented"].append(eg) - print(f"{e.filename} {i} {eg} {blue}\u2013{default}") - except (KeyboardInterrupt, RuntimeError): - raise - except BaseException as err: # noqa: BLE001 - results[e.filename][output_code]["fail"].append(eg) - print(f"{e.filename} {i} {eg} {red}\u2715{default}") - if print_reasons: - print(f" {type(err).__name__}: {err}") - - return results - - -if __name__ == "__main__": - start_all = datetime.now(tz=timezone(timedelta())) - - parser = argparse.ArgumentParser(description="Verify elements") - parser.add_argument( - "destination", - metavar="destination", - nargs="?", - default=None, - help="Name of output json file.", - ) - parser.add_argument("--test", metavar="test", default=None, help="Verify fewer elements.") - parser.add_argument( - "--processes", - metavar="processes", - default=None, - help="The number of processes to run the verification on.", - ) - parser.add_argument( - "--fail-on-missing-libraries", - action="store_true", - help="Fail if library is not installed.", - ) - parser.add_argument( - "--print-reasons", action="store_true", help="Show reasons for failed verification" - ) - parser.add_argument( - "--assert-passing", - action="store_true", - help="Assert that verification passes for all elements", - ) - parser.add_argument( - "--impl", metavar="impl", default=None, help="libraries to run verification for" - ) - - args = parser.parse_args() - if args.destination is not None: - settings.set_verification_json(args.destination) - if args.processes is not None: - settings.set_processes(int(args.processes)) - if args.test is None: - test_elements = None - elif args.test == "auto": - test_elements = [ - "buffa-christiansen", - "direct-serendipity", - "dual", - "hellan-herrmann-johnson", - "hsieh-clough-tocher", - "lagrange", - "nedelec1", - "raviart-thomas", - "regge", - "serendipity", - "taylor-hood", - "vector-bubble-enriched-Lagrange", - "enriched-galerkin", - "bernardi-raugel", - ] - else: - test_elements = args.test.split(",") - if args.impl is None: - test_implementations = None - else: - test_implementations = args.impl.split(",") - skip_missing = not args.fail_on_missing_libraries - print_reasons = args.print_reasons - assert_passing = args.assert_passing - - categoriser = Categoriser() - categoriser.load_references(os.path.join(settings.data_path, "references")) - categoriser.load_families(os.path.join(settings.data_path, "families")) - - # Load elements from .def files - categoriser.load_folder(settings.element_path) - - elements_to_verify = [] - for e in categoriser.elements: - if test_elements is None or e.filename in test_elements: - for eg in e.examples: - implementations = [ - i - for i in verifications - if i != "symfem" - and e.implemented(i) - and (test_implementations is None or i in test_implementations) - ] - if len(implementations) > 0: - elements_to_verify.append((e, eg, implementations)) - - if settings.processes == 1: - results = [verify_example(e) for e in elements_to_verify] - else: - import multiprocessing - - multiprocessing.set_start_method("fork") - - with multiprocessing.Pool(settings.processes) as p: - results = p.map(verify_example, elements_to_verify) - - data: dict[str, dict[str, dict[str, list[str]]]] = {} - for r in results: - for i0, j0 in r.items(): - if i0 not in data: - data[i0] = {} - for i1, j1 in j0.items(): - if i1 not in data[i0]: - data[i0][i1] = {} - for i2, j2 in j1.items(): - if i2 not in data[i0][i1]: - data[i0][i1][i2] = [] - data[i0][i1][i2] += j2 - - now = datetime.now(tz=timezone(timedelta())).strftime("%Y-%m-%d") - metadata: dict[str, typing.Any] = {"date": now} - - try: - with open(settings.verification_history_json) as f: - history = json.load(f) - except FileNotFoundError: - history = {} - - for impl in {j for i in data.values() for j in i}: - metadata[impl] = {"version": versions[impl]()} - if impl not in history: - history[impl] = [] - history[impl].append( - { - "date": now, - "pass": sum(len(i[impl]["pass"]) for i in data.values() if impl in i), - "version": versions[impl](), - "total": sum( - len(i[impl]["pass"]) + len(i[impl]["fail"]) for i in data.values() if impl in i - ), - } - ) - - with open(settings.verification_json, "w") as f: - json.dump( - { - "metadata": metadata, - "verification": data, - }, - f, - ) - with open(settings.verification_history_json, "w") as f: - json.dump(history, f) - - if assert_passing: - for d in data.values(): - assert len(d[impl]["fail"]) == 0