diff --git a/.cppcheck_suppressions b/.cppcheck_suppressions index f16f161dde..10f75f8f24 100644 --- a/.cppcheck_suppressions +++ b/.cppcheck_suppressions @@ -34,4 +34,3 @@ duplicateCondition:./ nullPointer:./ missingInclude:./ uninitvar:./ - diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index ff60109abd..66e5c53199 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -31,7 +31,7 @@ If applicable, add screenshots to help explain your problem. - NEST-Version: [e.g. nest-2.18, or git hash] - Installation: [e.g. conda packet, apt, with/out MPI, ...] (in case you compiled the source code manually, provide the - "Installation Summary" that you see at the end of the + "Installation Summary" that you see at the end of the cmake step) **Additional context** diff --git a/.github/styles/nest-styles/Ampersands.yml b/.github/styles/nest-styles/Ampersands.yml index 0d0d7c6157..7fed8b4164 100644 --- a/.github/styles/nest-styles/Ampersands.yml +++ b/.github/styles/nest-styles/Ampersands.yml @@ -5,4 +5,3 @@ level: warning nonword: true tokens: - '\w+\s&\s\w+' - diff --git a/.github/styles/nest-styles/Annotations.yml b/.github/styles/nest-styles/Annotations.yml index babf75d24b..70e98c60b1 100644 --- a/.github/styles/nest-styles/Annotations.yml +++ b/.github/styles/nest-styles/Annotations.yml @@ -8,4 +8,3 @@ tokens: - FIXME - TODO - NOTE - diff --git a/.github/styles/nest-styles/Capitalization.yml b/.github/styles/nest-styles/Capitalization.yml index a7bb2f6a26..f54498fc22 100644 --- a/.github/styles/nest-styles/Capitalization.yml +++ b/.github/styles/nest-styles/Capitalization.yml @@ -4,4 +4,3 @@ message: "'%s' should be in sentence case" level: warning scope: heading match: $sentence - diff --git a/.github/styles/nest-styles/CommasPerSentence.yml b/.github/styles/nest-styles/CommasPerSentence.yml index 1e631577e5..1867e0e947 100644 --- a/.github/styles/nest-styles/CommasPerSentence.yml +++ b/.github/styles/nest-styles/CommasPerSentence.yml @@ -4,4 +4,3 @@ extends: occurrence scope: sentence max: 3 token: ',' - diff --git a/.github/styles/nest-styles/ComplexWords.yml b/.github/styles/nest-styles/ComplexWords.yml index dabdeb3627..b73c82c771 100644 --- a/.github/styles/nest-styles/ComplexWords.yml +++ b/.github/styles/nest-styles/ComplexWords.yml @@ -118,4 +118,3 @@ swap: transmit: "'send'" utilization: "'use'" utilize: "'use'" - diff --git a/.github/styles/nest-styles/ListCapitalize.yml b/.github/styles/nest-styles/ListCapitalize.yml index f99f6c9180..5bd1ad7af6 100644 --- a/.github/styles/nest-styles/ListCapitalize.yml +++ b/.github/styles/nest-styles/ListCapitalize.yml @@ -6,4 +6,3 @@ scope: list nonword: true tokens: - '^[a-z].+' - diff --git a/.github/styles/nest-styles/Negative.yml b/.github/styles/nest-styles/Negative.yml index f726a6081e..652c47ad29 100644 --- a/.github/styles/nest-styles/Negative.yml +++ b/.github/styles/nest-styles/Negative.yml @@ -9,4 +9,3 @@ tokens: - don't - doesn't - hasn't - diff --git a/.github/styles/nest-styles/NotEasy.yml b/.github/styles/nest-styles/NotEasy.yml index c757617331..17303139de 100644 --- a/.github/styles/nest-styles/NotEasy.yml +++ b/.github/styles/nest-styles/NotEasy.yml @@ -8,4 +8,3 @@ tokens: - just - easily - simply - diff --git a/.github/styles/nest-styles/ParagraphLength.yml b/.github/styles/nest-styles/ParagraphLength.yml index 84cc73e1ea..c7fb0c8dcc 100644 --- a/.github/styles/nest-styles/ParagraphLength.yml +++ b/.github/styles/nest-styles/ParagraphLength.yml @@ -5,4 +5,3 @@ scope: paragraph.rst level: suggestion max: 150 token: \b(\w+)\b - diff --git a/.github/styles/nest-styles/PassiveVoice.yml b/.github/styles/nest-styles/PassiveVoice.yml index 6bda38f3e3..31cf5c5235 100644 --- a/.github/styles/nest-styles/PassiveVoice.yml +++ b/.github/styles/nest-styles/PassiveVoice.yml @@ -182,4 +182,3 @@ tokens: - woven - written - wrung - diff --git a/.github/styles/nest-styles/Pronouns.yml b/.github/styles/nest-styles/Pronouns.yml index 9517c00138..f1d5f30c33 100644 --- a/.github/styles/nest-styles/Pronouns.yml +++ b/.github/styles/nest-styles/Pronouns.yml @@ -13,4 +13,3 @@ tokens: - hers - himself - herself - diff --git a/.github/styles/nest-styles/SentenceLength.yml b/.github/styles/nest-styles/SentenceLength.yml index 4fdc5c28f8..00246b1123 100644 --- a/.github/styles/nest-styles/SentenceLength.yml +++ b/.github/styles/nest-styles/SentenceLength.yml @@ -5,4 +5,3 @@ scope: sentence level: suggestion max: 25 token: \b(\w+)\b - diff --git a/.github/styles/nest-styles/Slash.yml b/.github/styles/nest-styles/Slash.yml index 599be09f6e..9d718c06a5 100644 --- a/.github/styles/nest-styles/Slash.yml +++ b/.github/styles/nest-styles/Slash.yml @@ -5,4 +5,3 @@ ignorecase: true level: error tokens: - '\w+/\w+' - diff --git a/.github/styles/nest-styles/Spelling.yml b/.github/styles/nest-styles/Spelling.yml index f41481a53c..9d4ed3885c 100644 --- a/.github/styles/nest-styles/Spelling.yml +++ b/.github/styles/nest-styles/Spelling.yml @@ -4,4 +4,3 @@ message: "Did you really mean '%s'?" level: error ignore: - vocab.txt - diff --git a/.github/styles/nest-styles/Units.yml b/.github/styles/nest-styles/Units.yml index 20cde82901..1acafd636b 100644 --- a/.github/styles/nest-styles/Units.yml +++ b/.github/styles/nest-styles/Units.yml @@ -4,4 +4,3 @@ message: "Add a space between a numeral and a unit of measure." level: error tokens: - '\d+(?:MB|Gbit|GB|kbps|KB|kb)' - diff --git a/.github/styles/nest-styles/Wordiness.yml b/.github/styles/nest-styles/Wordiness.yml index c8af6cad5c..477656a005 100644 --- a/.github/styles/nest-styles/Wordiness.yml +++ b/.github/styles/nest-styles/Wordiness.yml @@ -118,4 +118,3 @@ swap: with regard to: regarding with respect to: about or on with the exception of: except for - diff --git a/.github/workflows/build_dispatch.yml b/.github/workflows/build_dispatch.yml index 902b6824b6..5e69910b15 100644 --- a/.github/workflows/build_dispatch.yml +++ b/.github/workflows/build_dispatch.yml @@ -10,13 +10,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: Trigger nest/nest-extension-module CI - uses: peter-evans/repository-dispatch@ff45666b9427631e3450c54a1bcbee4d9ff4d7c0 # v3.0.0 + uses: peter-evans/repository-dispatch@5fc4efd1a4797ddb68ffd0714a238564e4cc0e6f # v4.0.0 with: token: ${{ secrets.NEST_EXTENSION_MODULE_TRIGGER_TOKEN }} repository: 'nest/nest-extension-module' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index bbc1f886a1..a70794670f 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,17 +41,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: Checkout repository - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/init@5fe9434cd24fe243e33e7f3305f8a5b519b70280 # v4.31.1 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -61,7 +61,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/autobuild@5fe9434cd24fe243e33e7f3305f8a5b519b70280 # v4.31.1 # ℹ️ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -74,6 +74,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/analyze@5fe9434cd24fe243e33e7f3305f8a5b519b70280 # v4.31.1 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 5d57517496..9b8e9a3bac 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,12 +17,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: 'Checkout Repository' - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 - name: 'Dependency Review' - uses: actions/dependency-review-action@3b139cfc5fae8b618d3eae3675e383bb1769c019 # v4.5.0 + uses: actions/dependency-review-action@40c09b7dc99638e5ddb0bfd91c1673effc064d8a # v4.8.1 diff --git a/.github/workflows/ebrains-push.yml b/.github/workflows/ebrains-push.yml index fa91c63cd7..71026d00d1 100644 --- a/.github/workflows/ebrains-push.yml +++ b/.github/workflows/ebrains-push.yml @@ -10,7 +10,7 @@ jobs: if: ${{ github.repository_owner == 'nest' }} steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true diff --git a/.github/workflows/hifis-push.yml b/.github/workflows/hifis-push.yml index 050ca0cf2d..baf190bae9 100644 --- a/.github/workflows/hifis-push.yml +++ b/.github/workflows/hifis-push.yml @@ -10,7 +10,7 @@ jobs: if: ${{ github.repository_owner == 'nest' }} steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true diff --git a/.github/workflows/jsc-push.yml b/.github/workflows/jsc-push.yml index e105fd5314..31a4a761cf 100644 --- a/.github/workflows/jsc-push.yml +++ b/.github/workflows/jsc-push.yml @@ -10,7 +10,7 @@ jobs: if: ${{ github.repository_owner == 'nest' }} steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true diff --git a/.github/workflows/nestbuildmatrix.yml b/.github/workflows/nestbuildmatrix.yml index 240c30c743..9ffe218701 100644 --- a/.github/workflows/nestbuildmatrix.yml +++ b/.github/workflows/nestbuildmatrix.yml @@ -14,13 +14,13 @@ jobs: CLANG_FORMAT_FILE: ".clang-format" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 @@ -33,17 +33,74 @@ jobs: files=$(find . \( -iname "*.h" -o -iname "*.c" -o -iname "*.cc" -o -iname "*.cpp" \) -not -path "./thirdparty/*") diff -u <(cat ${files}) <(clang-format ${files}) + shellcheck: + runs-on: "ubuntu-22.04" + steps: + - name: "Checkout repository content" + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + fetch-depth: 0 + + - name: "Install Linux system dependencies" + run: | + sudo apt-get update + sudo apt-get install shellcheck + + - name: "Run shellcheck..." + run: | + shellcheck --version + find . -iname "*.sh" -o -iname "*.sh.in" | xargs shellcheck + + pre-commit-hooks: + runs-on: "ubuntu-22.04" + steps: + - name: "Checkout repository content" + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + fetch-depth: 0 + + - name: "Set up Python 3.x" + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 + with: + python-version: 3.9 + + - name: "Install dependencies" + run: | + pip install pre-commit + + - name: "Run pre-commit checks..." + run: | + pre-commit run --all-files + + no-crlf: + # While pre-commit-hook mixed-line-endings could check for this, it would + # be incompatible with "git smudge", as users may decide to use any + # formatting in their editor consistently. + # https://github.com/pre-commit/pre-commit-hooks?tab=readme-ov-file#mixed-line-ending + # + # This check makes sure the files in the repository are always consistent + # in their line endings, i.e. new line, and not carriage return+line feed. + runs-on: "ubuntu-22.04" + steps: + - name: "Checkout repository content" + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 + with: + fetch-depth: 0 + + - name: "Check all files for broken line endings…" + run: '! find . -not -type d -exec file "{}" ";" | grep CRLF' + cppcheck: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 @@ -60,18 +117,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -87,18 +144,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -119,18 +176,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -146,18 +203,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -169,13 +226,13 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 @@ -187,13 +244,13 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 @@ -214,18 +271,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -241,18 +298,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -291,7 +348,7 @@ jobs: # name: "build-${{ matrix.os }}-${{ matrix.cpp_compiler }}-${{ matrix.use }}" # - name: "Set up Python 3.x" - # uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + # uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 # with: # python-version: "3.10" @@ -313,12 +370,12 @@ jobs: # needs: [build_macos] # steps: # - name: "Checkout repository content" - # uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + # uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 # with: # fetch-depth: 0 # - name: "Set up Python 3.x" - # uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + # uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 # with: # python-version: "3.10" @@ -334,18 +391,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -361,7 +418,7 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 @@ -374,18 +431,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Run black..." - uses: psf/black@8a737e727ac5ab2f1d4cf5876720ed276dc8dc4b # 25.1.0 + uses: psf/black@af0ba72a73598c76189d6dd1b21d8532255d5942 # 25.9.0 with: jupyter: true @@ -393,18 +450,18 @@ jobs: runs-on: "ubuntu-22.04" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" @@ -422,18 +479,18 @@ jobs: needs: [pydocstyle, rstcheck, vale] steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: # Using 3.8 because Read the docs does not work with higher versions. # See also: https://github.com/nest/nest-simulator/pull/2744 @@ -454,7 +511,7 @@ jobs: make docs |& tee sphinx-output.log - name: Upload artifacts - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: "sphinx-rtd output" path: | @@ -468,18 +525,18 @@ jobs: needs: [pydocstyle, rstcheck, vale] steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: Install Conda - uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3.1.1 + uses: conda-incubator/setup-miniconda@835234971496cad1653abb28a638a281cf32541f # v3.2.0 with: auto-update-conda: true python-version: "3.10" @@ -500,7 +557,7 @@ jobs: make html |& tee sphinx-output.log - name: Upload artifacts - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: path: | build/sphinx-output.log @@ -509,7 +566,7 @@ jobs: build_linux: if: ${{ !contains(github.event.head_commit.message, 'ci skip') }} runs-on: ${{ matrix.os }} - needs: [clang-format, mypy, copyright_headers, unused_names, forbidden_types, pylint, isort, black, flake8] + needs: [clang-format, mypy, copyright_headers, unused_names, forbidden_types, pylint, isort, black, flake8, shellcheck, pre-commit-hooks, cppcheck, no-crlf] env: CXX_FLAGS: "-pedantic -Wextra -Woverloaded-virtual -Wno-unknown-pragmas" NEST_VPATH: "build" @@ -522,32 +579,33 @@ jobs: cpp_compiler: ["gcc"] # available use flags (all default to "OFF"): - # openmp, mpi, python, gsl, ltdl, boost, sionlib, libneurosim, optimize, warning, userdoc, music + # openmp, mpi, python, gsl, ltdl, boost, sionlib, libneurosim, optimize, warning, userdoc, music, readline use: + - "optimize, warning" - "boost, optimize, warning" - "openmp, python, gsl, ltdl, boost, optimize, warning" - "mpi, python, gsl, ltdl, boost, optimize, warning" - - "openmp, mpi, python, gsl, ltdl, boost, hdf5, sionlib, libneurosim, optimize, warning, music" + - "openmp, mpi, python, gsl, ltdl, boost, hdf5, sionlib, libneurosim, optimize, warning, music, detailed-timers, threaded-timers, mpi-sync-timer" steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: "3.10" - name: "Restore apt cache" - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 env: cache-name: "apt-cache" with: @@ -562,33 +620,48 @@ jobs: - name: "Install Linux system dependencies" run: | - sudo apt-get update # https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-README.md - sudo apt-get install ccache - sudo apt-get install libltdl-dev libreadline6-dev libncurses5-dev libgsl0-dev python3-all-dev jq libpcre3 libpcre3-dev - sudo apt-get install tcl8.6 tcl8.6-dev tk8.6-dev - # Install MPI dependencies regardless of whether we compile NEST with or without MPI, so the installation of MPI4Py works - sudo apt-get install openmpi-bin libopenmpi-dev - sudo apt-get install libboost-filesystem-dev libboost-regex-dev libboost-wave-dev libboost-python-dev libboost-program-options-dev libboost-test-dev - sudo apt-get install pkg-config + sudo apt-get update + sudo apt-get install \ + ccache \ + python3-all-dev \ + jq \ + libpcre3 libpcre3-dev \ + pkg-config + # not sure why these would be required: + # sudo apt-get install tcl8.6 tcl8.6-dev tk8.6-dev sudo ldconfig + - name: "Install Readline dependencies" + if: "${{ contains(matrix.use, 'readline') }}" + run: "sudo apt-get install libreadline6-dev libncurses5-dev" + + - name: "Install LTDL dependencies" + if: "${{ contains(matrix.use, 'ltdl') }}" + run: "sudo apt-get install libltdl-dev" + + - name: "Install Boost dependencies" + if: "${{ contains(matrix.use, 'boost') }}" + run: "sudo apt-get install libboost-filesystem-dev libboost-regex-dev libboost-wave-dev libboost-python-dev libboost-program-options-dev libboost-test-dev" + + - name: "Install OpenMPI development dependencies" + if: "${{ contains(matrix.use, 'mpi') }}" + run: "sudo apt-get install openmpi-bin libopenmpi-dev" + - name: "Install GSL system dependencies" if: "${{ contains(matrix.use, 'gsl') }}" - run: | - sudo apt-get install libgsl0-dev + run: "sudo apt-get install libgsl0-dev" - name: "Install HDF5 system dependencies" if: "${{ contains(matrix.use, 'hdf5') }}" - run: | - sudo apt-get install libhdf5-dev + run: "sudo apt-get install libhdf5-dev" - name: "Restore ccache" # Using CCache to re-use compiled objects from prior runs that have the same # source (hashed), compiler (mtime+size) and compile flags. env: cache-name: "ccache" - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | $HOME/.ccache @@ -604,7 +677,7 @@ jobs: - name: "Restore pip cache" env: cache-name: "pip-cache" - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | /opt/hostedtoolcache/Python/**/site-packages/* @@ -617,13 +690,24 @@ jobs: - name: "Install Python dependencies" run: | python -m pip install --upgrade pip setuptools + python -m pip install --force-reinstall --upgrade cython # this finds a broken preinstall if not explicitly forced python -c "import setuptools; print('package location:', setuptools.__file__)" - python -m pip install --force-reinstall --upgrade scipy 'junitparser>=2' numpy pytest pytest-timeout pytest-xdist cython matplotlib terminaltables pandoc pandas - # Install mpi4py regardless of whether we compile NEST with or without MPI, so regressiontests/issue-1703.py will run in both cases - python -m pip install --force-reinstall --upgrade mpi4py + pip list + + - name: "Install Python test dependencies" + # These could go to a separate venv… + run: | + python -m pip install 'junitparser>=2' pytest pytest-timeout pytest-xdist terminaltables + python -m pip install numpy scipy pandas matplotlib test \! -e "=2" # assert junitparser is correctly quoted and '>' is not interpreted as shell redirect python -c "import pytest; print('package location:', pytest.__file__)" - pip list + + - name: "Install Python doc dependencies" + run: "python -m pip install pandoc" + + - name: "Install Python mpi dependencies" + if: "${{ contains(matrix.use, 'mpi') }}" + run: "python -m pip install --force-reinstall --upgrade mpi4py" - name: "Install h5py" if: "${{ contains(matrix.use, 'hdf5') }}" @@ -649,12 +733,32 @@ jobs: PYLIB_DIR="$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))" | sed 's/include/lib/')" ./build_support/install_csa-libneurosim.sh $PYLIB_DIR + - name: "Uninstall Boost development libraries" + if: "${{ ! contains(matrix.use, 'boost') }}" + run: | + apt list --installed 'libboost*' + sudo apt-get remove --autoremove 'libboost*-dev' + + - name: "List available packages" + if: "${{ ! contains(matrix.use, 'boost') }}" + run: | + gcc --version + python --version + echo "INSTALLED PYTHON PACKAGES:" + pip list + echo "INSTALLED BOOST PACKAGES:" + dpkg -l 'libboost*' | grep "^ii" || true + echo "INSTALLED BOOST HEADERS:" + dpkg -l 'libboost*-dev' | grep "^ii" || true + echo "LIST HAS TO BE ZERO" + test -z "$(dpkg -l 'libboost*-dev' | grep "^ii")" + - name: "Configure NEST build" env: CMAKE_C_COMPILER_LAUNCHER: ccache CMAKE_CXX_COMPILER_LAUNCHER: ccache run: | - mkdir -p "$NEST_VPATH/reports" "$NEST_RESULT" + mkdir -pv "$NEST_VPATH/reports" "$NEST_RESULT" if [ "$xNEST_BUILD_COMPILER" = "CLANG" ]; then export CC=clang-11 @@ -679,6 +783,9 @@ jobs: -Dwith-sionlib=${{ contains(matrix.use, 'sionlib') && '$HOME/.cache/sionlib.install' || 'OFF' }} \ -Dwith-libneurosim=${{ contains(matrix.use, 'libneurosim') && '$HOME/.cache/libneurosim.install' || 'OFF' }} \ -Dwith-music=${{ contains(matrix.use, 'music') && '$HOME/.cache/music.install' || 'OFF' }} \ + -Dwith-threaded-timers=${{ contains(matrix.use, 'threaded-timers') && 'ON' || 'OFF' }} \ + -Dwith-detailed-timers=${{ contains(matrix.use, 'detailed-timers') && 'ON' || 'OFF' }} \ + -Dwith-mpi-sync-timer=${{ contains(matrix.use, 'mpi-sync-timer') && 'ON' || 'OFF' }} \ .. - name: "Add GCC problem matcher" @@ -703,7 +810,7 @@ jobs: - name: "Initialize Matplotlibrc" run: | # initialize matplotlib backend - mkdir -p $HOME/.matplotlib + mkdir -pv $HOME/.matplotlib echo "backend : svg" > $HOME/.matplotlib/matplotlibrc - name: "Run NEST testsuite" @@ -716,7 +823,7 @@ jobs: make VERBOSE=1 installcheck - name: "Upload install and test results" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: always() with: name: "build-logs-${{ matrix.os }}-${{ matrix.cpp_compiler }}-${{ matrix.use }}" @@ -727,7 +834,7 @@ jobs: build_macos: if: ${{ !contains(github.event.head_commit.message, 'ci skip') }} runs-on: ${{ matrix.os }} - needs: [clang-format, mypy, copyright_headers, unused_names, forbidden_types, pylint, isort, black, flake8] + needs: [clang-format, mypy, copyright_headers, unused_names, forbidden_types, pylint, isort, black, flake8, shellcheck, pre-commit-hooks, cppcheck, no-crlf] env: CXX_FLAGS: "-pedantic -Wextra -Woverloaded-virtual -Wno-unknown-pragmas" NEST_VPATH: "build" @@ -746,18 +853,18 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - name: "Checkout repository content" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: fetch-depth: 0 - name: "Set up Python 3.x" - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 + uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0 with: python-version: 3.12 @@ -768,7 +875,7 @@ jobs: - name: "Restore pip cache" env: cache-name: "pip-cache" - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 with: path: | /opt/hostedtoolcache/Python/**/site-packages/* @@ -789,7 +896,7 @@ jobs: - name: "Configure NEST build" run: | - mkdir -p "$NEST_VPATH/reports" "$NEST_RESULT" + mkdir -pv "$NEST_VPATH/reports" "$NEST_RESULT" cd "$NEST_VPATH" cmake \ @@ -832,7 +939,7 @@ jobs: - name: "Initialize Matplotlibrc" run: | # initialize matplotlib backend - mkdir -p $HOME/.matplotlib + mkdir -pv $HOME/.matplotlib echo "backend : svg" > $HOME/.matplotlib/matplotlibrc - name: "Run NEST testsuite" @@ -843,7 +950,7 @@ jobs: make VERBOSE=1 installcheck - name: "Upload install and test results" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 if: ${{ always() }} with: name: "${{ matrix.NEST_BUILD_TYPE }}-build-logs-${{ matrix.os }}-${{ matrix.cpp_compiler }}" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 0146f78e98..d2ea879f5d 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -31,17 +31,17 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit - name: "Checkout code" - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 with: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3 with: results_file: results.sarif results_format: sarif @@ -63,7 +63,7 @@ jobs: # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF # format to the repository Actions tab. - name: "Upload artifact" - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 with: name: SARIF file path: results.sarif @@ -71,6 +71,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@1b549b9259bda1cb5ddde3b41741a82a2d15a841 # v3.28.13 + uses: github/codeql-action/upload-sarif@5fe9434cd24fe243e33e7f3305f8a5b519b70280 # v4.31.1 with: sarif_file: results.sarif diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3a86b90393..6e0f3ed573 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -17,12 +17,12 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 + uses: step-security/harden-runner@f4a75cfd619ee5ce8d5b864b0d183aff3c69b55a # v2.13.1 with: egress-policy: audit disable-telemetry: true - - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 + - uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'Issue automatically marked stale!' diff --git a/.gitignore b/.gitignore index c0009a7b70..f783dd5ffd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ __pycache__/ +.venv/ build/ conda/ _build/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 29c2aa3e74..f0b9728371 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,35 +1,52 @@ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 - hooks: - - id: end-of-file-fixer - - id: trailing-whitespace - - id: check-yaml - - - repo: https://github.com/gitleaks/gitleaks - rev: v8.16.3 - hooks: - - id: gitleaks - - - repo: https://github.com/pycqa/isort - rev: 5.12.0 - hooks: - - id: isort - args: ["--profile", "black", "--thirdparty", "nest"] - - - repo: https://github.com/psf/black - rev: 23.7.0 - hooks: - - id: black - language_version: python3 - - - repo: https://github.com/koalaman/shellcheck-precommit - rev: v0.9.0 - hooks: - - id: shellcheck - - - repo: https://github.com/pre-commit/mirrors-clang-format - rev: v17.0.4 - hooks: - - id: clang-format - types_or: [c++] +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v5.0.0 + hooks: + - id: end-of-file-fixer + - id: trailing-whitespace + - id: check-yaml + - id: forbid-submodules + - id: mixed-line-ending + - id: fix-byte-order-marker + + - repo: https://github.com/gitleaks/gitleaks + rev: v8.16.3 + hooks: + - id: gitleaks + + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + args: ["--profile", "black", "--thirdparty", "nest"] + + - repo: https://github.com/psf/black + rev: 23.7.0 + hooks: + - id: black + language_version: python3 + + - repo: https://github.com/shellcheck-py/shellcheck-py + rev: v0.10.0.1 + hooks: + - id: shellcheck + # explicitly add input files that are not "*.sh" + args: [ + # + # note that these differ from arguments in .github/workflows/nestbuildmatrix.yml + # IF YOU READ THIS: recheck for consistency with `find . -iname "*.sh" -o -iname "*.sh.in"` + "bin/nest_vars.sh.in", # testsuite/do_tests.sh:112 requires this for `. "${PREFIX}/bin/nest_vars.sh"` + "testsuite/run_test.sh", + "testsuite/do_tests.sh", + "testsuite/junit_xml.sh", + "examples/run_examples.sh", + "examples/list_examples.sh", + ] + + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v17.0.4 + hooks: + - id: clang-format + types_or: [c++] + +exclude: 'build/.*|thirdparty/.*' diff --git a/.readthedocs.yml b/.readthedocs.yml index 744628c8e7..e1d8828eb2 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -5,6 +5,7 @@ build: tools: python: "3.10" apt_packages: + - graphviz - default-jre-headless jobs: pre_install: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8bc4be46d6..f7f5a4465b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ The NEST Simulator is a scientific tool and as such it is never finished and con Visit the [contributing to NEST docs](https://nest-simulator.readthedocs.io/en/latest/developer_space/index.html) for details -on +on * development workflow * reporing bugs and issues @@ -15,4 +15,3 @@ on * code review policies and much more! - diff --git a/SECURITY.md b/SECURITY.md index ba0cfbe6a6..0e0abaf1d8 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -36,4 +36,3 @@ severity and further handling via [Security Advisories](https://github.com/nest/nest-simulator/security/advisories) or as normal [Issue](https://github.com/nest/nest-simulator/issues) in non-critical cases. - diff --git a/VERSION b/VERSION index 6e0bc89667..d6c4c8f3fc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.8.0-post0.dev0 +3.9.0-post0.dev0 diff --git a/bin/nest-config.in b/bin/nest-config.in index a54ae03521..ed7311eb65 100755 --- a/bin/nest-config.in +++ b/bin/nest-config.in @@ -29,31 +29,32 @@ Known values for OPTION are: EOF - exit $1 + exit "${1}" } if test $# -eq 0; then usage 1 fi -cflags=false -libs=false - while test $# -gt 0; do case "$1" in - -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) optarg= ;; + -*=*) + optarg="$(echo "$1" | sed 's/[-_a-zA-Z0-9]*=//')" + ;; + *) + optarg= + ;; esac case "$1" in --prefix=*) - prefix=$optarg + prefix="${optarg}" ;; --prefix) - echo $prefix + echo "${prefix}" ;; --exec-prefix) - echo $exec_prefix + echo "${exec_prefix}" ;; --version) echo "@NEST_VERSION@" @@ -68,7 +69,7 @@ while test $# -gt 0; do echo "@ALL_CXXFLAGS@" ;; --libs) - echo "-L$prefix/@CMAKE_INSTALL_LIBDIR@/nest @MODULE_LINK_LIBS@" + echo "-L${prefix}/@CMAKE_INSTALL_LIBDIR@/nest @MODULE_LINK_LIBS@" ;; --compiler) echo "@CMAKE_CXX_COMPILER@" @@ -99,8 +100,7 @@ while test $# -gt 0; do echo "@CMAKE_INSTALL_LIBDIR@" ;; *) - usage - exit 1 + usage 1 ;; esac shift diff --git a/bin/nest-server b/bin/nest-server index 65203ee139..13fd69387c 100755 --- a/bin/nest-server +++ b/bin/nest-server @@ -39,14 +39,15 @@ pid() { pgrep -f "gunicorn nest.server.app --bind ${HOST}:${PORT}" } +declare -a GUNICORN_OPTS set-gunicorn_opts() { # Set opts for gunicorn. - GUNICORN_OPTS="--bind ${HOST}:${PORT}" - GUNICORN_OPTS="${GUNICORN_OPTS} --log-file ${LOGFILE}" - [[ "${DAEMON}" -eq 1 ]] && GUNICORN_OPTS="${GUNICORN_OPTS} --daemon" - [[ "${STDOUT}" -eq 0 ]] && GUNICORN_OPTS="${GUNICORN_OPTS} --capture-output" - [[ "${TIMEOUT}" -ne 30 ]] && GUNICORN_OPTS="${GUNICORN_OPTS} --timeout ${TIMEOUT}" - [[ "${WORKERS}" -gt 1 ]] && GUNICORN_OPTS="${GUNICORN_OPTS} --workers ${WORKERS}" + GUNICORN_OPTS+=( "--bind" "${HOST}:${PORT}" ) + [[ "${DAEMON}" -eq 1 ]] && GUNICORN_OPTS+=( "--daemon" ) + [[ "${STDOUT}" -eq 0 ]] && GUNICORN_OPTS+=( "--capture-output" ) + [[ "${TIMEOUT}" -ne 30 ]] && GUNICORN_OPTS+=( "--timeout" "${TIMEOUT}" ) + [[ "${WORKERS}" -gt 1 ]] && GUNICORN_OPTS+=( "--workers" "${WORKERS}" ) + GUNICORN_OPTS+=( "--log-file" "${LOGFILE}" ) } start() { @@ -61,8 +62,7 @@ start() { fi set-gunicorn_opts - # shellcheck disable=SC2086 - exec gunicorn nest.server:app ${GUNICORN_OPTS} + exec gunicorn nest.server:app "${GUNICORN_OPTS[@]}" fi } @@ -87,14 +87,14 @@ stop() { CMD=$1; shift while getopts "dh:op:t:w:" opt; do - case $opt in + case "$opt" in d) DAEMON=1 ;; h) HOST=$OPTARG ;; o) STDOUT=1 ;; p) PORT=$OPTARG ;; t) TIMEOUT=$OPTARG ;; w) WORKERS=$OPTARG ;; - *) echo "Invalid option" + *) usage ;; esac done diff --git a/build_support/check_forbidden_types.sh b/build_support/check_forbidden_types.sh index 11fb2375a4..b7f22fbdb7 100755 --- a/build_support/check_forbidden_types.sh +++ b/build_support/check_forbidden_types.sh @@ -20,15 +20,20 @@ # along with NEST. If not, see . # This script scans for forbidden types and fails if any are used. +set -euo pipefail forbidden_types="double_t" used_forbidden_types="" +NEST_SOURCE="${NEST_SOURCE:-.}" for t in $forbidden_types; do - scan_result=`grep $t -r -o --include=*.{h,cc,cpp} $NEST_SOURCE | sed 's/:/: /'` + scan_result="$(grep "$t" -rHn -o --include=*.{h,cc,cpp} "$NEST_SOURCE" || true)" if [ -n "$scan_result" ]; then - used_forbidden_types=$used_forbidden_types$'\n'$scan_result + used_forbidden_types="$used_forbidden_types$'\n'$scan_result" fi done -echo "$used_forbidden_types" +test -z "$used_forbidden_types" || { # return success if no forbidden types where used or print the corresponding list and error out + echo "$used_forbidden_types" + exit 1 +} diff --git a/build_support/format_all_c_c++_files.sh b/build_support/format_all_c_c++_files.sh index b50f356672..a7ebd6087d 100755 --- a/build_support/format_all_c_c++_files.sh +++ b/build_support/format_all_c_c++_files.sh @@ -10,9 +10,10 @@ # # By default the script starts at the current working directory ($PWD), but # supply a different starting directory as the first argument to the command. +set -euo pipefail -CLANG_FORMAT=${CLANG_FORMAT:-clang-format} -CLANG_FORMAT_FILE=${CLANG_FORMAT_FILE:-.clang-format} +CLANG_FORMAT="${CLANG_FORMAT:-clang-format}" +CLANG_FORMAT_FILE="${CLANG_FORMAT_FILE:-.clang-format}" # Drop files that should not be checked FILES_TO_IGNORE="pynestkernel.cpp" @@ -20,7 +21,7 @@ DIRS_TO_IGNORE="thirdparty" # Recursively process all C/C++ files in all sub-directories. function process_dir { - dir=$1 + dir="$1" echo "Process directory: $dir" if [[ " $DIRS_TO_IGNORE " =~ .*[[:space:]]${dir##*/}[[:space:]].* ]]; then @@ -28,10 +29,10 @@ function process_dir { return fi - for f in $dir/*; do - if [[ -d $f ]]; then + find "$dir" -maxdepth 1 -printf "%f\n" | while read -r f; do + if [[ -d "$f" ]]; then # Recursively process sub-directories. - process_dir $f + process_dir "$f" else ignore_file=0 @@ -42,7 +43,7 @@ function process_dir { fi done - if [ $ignore_file == 1 ] ; then + if [ "$ignore_file" == 1 ] ; then continue fi @@ -50,7 +51,7 @@ function process_dir { *.cpp | *.cc | *.c | *.h | *.hpp ) # Format C/C++ files. echo " - Format C/C++ file: $f" - $CLANG_FORMAT -i $f + "$CLANG_FORMAT" -i "$f" ;; * ) # Ignore all other files. @@ -61,22 +62,22 @@ function process_dir { function help_output { echo "The $CLANG_FORMAT_FILE requires clang-format version 13 or later." - echo "Use like: [CLANG_FORMAT=] ./build_support/`basename $0` [start folder, defaults to '$PWD']" + echo "Use like: [CLANG_FORMAT=] ./build_support/$(basename "$0") [start folder, defaults to '$PWD']" exit 0 } -if [[ ! -f $CLANG_FORMAT_FILE ]]; then - echo "Cannot find $CLANG_FORMAT_FILE file. Please start '`basename $0`' from the NEST base source directory." +if [[ ! -f "$CLANG_FORMAT_FILE" ]]; then + echo "Cannot find $CLANG_FORMAT_FILE file. Please start '$(basename "$0")' from the NEST base source directory." help_output fi if [[ $# -eq 0 ]]; then # Start with current directory. - startdir=$PWD + startdir="$PWD" elif [[ $# -eq 1 ]]; then if [[ -d $1 ]]; then # Start with given directory. - startdir=$1 + startdir="$1" else # Not a directory. help_output @@ -87,4 +88,4 @@ else fi # Start formatting the $startdir and all subdirectories -process_dir $startdir +process_dir "$startdir" diff --git a/build_support/install_csa-libneurosim.sh b/build_support/install_csa-libneurosim.sh index a86a625928..27dc48c7ca 100755 --- a/build_support/install_csa-libneurosim.sh +++ b/build_support/install_csa-libneurosim.sh @@ -1,22 +1,28 @@ -#!/bin/bash +#!/bin/bash +set -euo pipefail + +NEUROSIM_INSTALL_PATH="${1:-${HOME}/.cache/libneurosim.install}" +CSA_INSTALL_PATH="${1:-${HOME}/.cache/csa.install}" +PYLIB_DIR="$(python3 -c "import sysconfig; print(sysconfig.get_path('include'))" | sed 's/include/lib/')" || true # was "$1" before + # Install libneurosim -git clone https://github.com/INCF/libneurosim.git libneurosim.src +git clone "https://github.com/INCF/libneurosim.git" libneurosim.src pushd libneurosim.src ./autogen.sh -./configure --prefix=$HOME/.cache/libneurosim.install --with-mpi --with-python=3 -make +./configure --prefix="${NEUROSIM_INSTALL_PATH}" --with-mpi --with-python=3 +make -j"$(nproc)" make install -popd +popd || exit $? rm -rf libneurosim.src # Install csa -git clone https://github.com/INCF/csa.git csa.src +git clone "https://github.com/INCF/csa.git" csa.src pushd csa.src sed -i 's/lpyneurosim/lpy3neurosim/g' configure.ac sed -i 's/print __version__/print\(__version__\)/g' Makefile.am ./autogen.sh -LDFLAGS=-L$1 ./configure --with-libneurosim=$HOME/.cache/libneurosim.install --prefix=$HOME/.cache/csa.install +LDFLAGS="${PYLIB_DIR:+-L${PYLIB_DIR}}" ./configure --with-libneurosim="${NEUROSIM_INSTALL_PATH}" --prefix="${CSA_INSTALL_PATH}" make make install -popd +popd || exit $? rm -rf csa.src diff --git a/build_support/install_music.sh b/build_support/install_music.sh index b790d98a1d..5fe2d1c0a7 100755 --- a/build_support/install_music.sh +++ b/build_support/install_music.sh @@ -1,11 +1,13 @@ #!/bin/bash +set -euo pipefail +MUSIC_INSTALL_PATH="${1:-${HOME}/.cache/music.install}" # Install current MUSIC version. -git clone https://github.com/INCF/MUSIC.git music.src +git clone "https://github.com/INCF/MUSIC.git" music.src pushd music.src ./autogen.sh -./configure --prefix=$HOME/.cache/music.install -make +./configure --prefix="${MUSIC_INSTALL_PATH}" +make -j"$(nproc)" make install -popd +popd || exit $? rm -rf music.src diff --git a/build_support/install_sionlib.sh b/build_support/install_sionlib.sh index d99c6eab61..79e1ab5882 100755 --- a/build_support/install_sionlib.sh +++ b/build_support/install_sionlib.sh @@ -1,15 +1,17 @@ #!/bin/bash +set -euo pipefail SIONLIBVERSION="1.7.4" +SIONLIB_INSTALL_PATH="${1:-${HOME}/.cache/sionlib.install}" # Install SIONlib -wget --content-disposition http://apps.fz-juelich.de/jsc/sionlib/download.php?version=${SIONLIBVERSION} -tar xfz sionlib-${SIONLIBVERSION}.tar.gz +wget --content-disposition "http://apps.fz-juelich.de/jsc/sionlib/download.php?version=${SIONLIBVERSION}" +tar xfz "sionlib-${SIONLIBVERSION}.tar.gz" mv sionlib sionlib.src pushd sionlib.src -./configure --prefix=$HOME/.cache/sionlib.install --mpi=openmpi --enable-python=3 --disable-fortran --disable-parutils --disable-mic +./configure --prefix="${SIONLIB_INSTALL_PATH}" --mpi=openmpi --enable-python=3 --disable-fortran --disable-parutils --disable-mic cd build-linux-gomp-openmpi -make +make -j"$(nproc)" make install -popd -rm -rf sionlib-${SIONLIBVERSION}.tar.gz sionlib.src +popd || exit $? +rm -rf "sionlib-${SIONLIBVERSION}.tar.gz" sionlib.src diff --git a/build_support/version_info.sh b/build_support/version_info.sh index 864fd48e77..374e35e744 100644 --- a/build_support/version_info.sh +++ b/build_support/version_info.sh @@ -23,27 +23,26 @@ # cmake/NestVersionInfo.cmake # If we can't run git at all, set everything to "unknown" -if ! command -v git > /dev/null 2>&1; then - echo unknown\;unknown\;unknown +if ! command -v git >/dev/null 2>&1; then + echo "unknown;unknown;unknown" exit 0 fi -HASH=$(git rev-parse HEAD) +HASH="$(git rev-parse HEAD)" # Might fail if not on a branch, or no remote tracking branch is set -BRANCH_REMOTE=$(git rev-parse --abbrev-ref --symbolic-full-name @{u} 2>&1) -if [ $? -eq 0 ]; then - REMOTE=$(echo ${BRANCH_REMOTE} | cut -d\/ -f1) +if BRANCH_REMOTE="$(git rev-parse --abbrev-ref --symbolic-full-name '@{u}' || exit $?)"; then + REMOTE="$(echo "${BRANCH_REMOTE}" | cut -d/ -f1)" else REMOTE="unknown" fi # Might fail if we are not on a branch (i.e. in 'detached HEAD' mode) -BRANCH=$(git rev-parse --abbrev-ref HEAD) -if [ ! $? -eq 0 ] || [ ${BRANCH} = "HEAD" ]; then + +if ! BRANCH="$(git rev-parse --abbrev-ref HEAD)" || [ "${BRANCH}" = "HEAD" ]; then BRANCH="unknown" fi # Printing with semicolons as separators, as this will be interpreted as # a list by cmake -echo ${HASH}\;${BRANCH}\;${REMOTE} +echo "${HASH};${BRANCH};${REMOTE}" diff --git a/cmake/CheckFiles/AlphaCXXBug.cxx b/cmake/CheckFiles/AlphaCXXBug.cxx index c354b2a5a5..79b3a5d4dc 100644 --- a/cmake/CheckFiles/AlphaCXXBug.cxx +++ b/cmake/CheckFiles/AlphaCXXBug.cxx @@ -2,7 +2,8 @@ int e( E2BIG ); -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { return 0; } diff --git a/cmake/CheckFiles/CMathMacros.cxx b/cmake/CheckFiles/CMathMacros.cxx index 88dc23d8bd..8fe448674b 100644 --- a/cmake/CheckFiles/CMathMacros.cxx +++ b/cmake/CheckFiles/CMathMacros.cxx @@ -5,7 +5,8 @@ double e( M_E ); double pi( M_PI ); -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { return 0; } diff --git a/cmake/CheckFiles/ICE.cxx b/cmake/CheckFiles/ICE.cxx index f45e35bb40..373557e455 100644 --- a/cmake/CheckFiles/ICE.cxx +++ b/cmake/CheckFiles/ICE.cxx @@ -1,37 +1,47 @@ -class RandomDev +class RandomDev { public: - virtual double operator()(void) =0; - virtual double operator()(double x) =0; + virtual double operator()( void ) = 0; + virtual double operator()( double x ) = 0; }; -class GenericRandomDevFactory +class GenericRandomDevFactory { public: - virtual RandomDev* create() const =0; + virtual RandomDev* create() const = 0; }; -template -class RandomDevFactory: public GenericRandomDevFactory -{ +template < typename DevType > +class RandomDevFactory : public GenericRandomDevFactory +{ public: - RandomDev* create() const + RandomDev* + create() const { return new DevType(); - } + } }; -template -class Wrapper: public T +template < typename T > +class Wrapper : public T { -public: +public: using RandomDev::operator(); - double operator()(void) { return 0.0; } - double operator()(double x) { return x; } + double + operator()( void ) + { + return 0.0; + } + double + operator()( double x ) + { + return x; + } }; -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { - RandomDevFactory > r; + RandomDevFactory< Wrapper< RandomDev > > r; return 0; } diff --git a/cmake/CheckFiles/SigUsrIgnored.cxx b/cmake/CheckFiles/SigUsrIgnored.cxx index d65675cdd1..1cc43ce832 100644 --- a/cmake/CheckFiles/SigUsrIgnored.cxx +++ b/cmake/CheckFiles/SigUsrIgnored.cxx @@ -1,6 +1,7 @@ -#include +#include -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { int e( SIGUSR1 ); return 0; diff --git a/cmake/CheckFiles/StaticTemplateDeclaration.cxx b/cmake/CheckFiles/StaticTemplateDeclaration.cxx index d0ca695c4d..1f2e9a9dc0 100644 --- a/cmake/CheckFiles/StaticTemplateDeclaration.cxx +++ b/cmake/CheckFiles/StaticTemplateDeclaration.cxx @@ -1,22 +1,27 @@ -class A +class A { int c; + public: - A(int a) - :c(a) - {} + A( int a ) + : c( a ) + { + } }; -template -class B +template < typename T, typename L > +class B { - protected: +protected: static A f; }; -template<> A B::f; -template<> A B::f(9); +template <> +A B< int, double >::f; +template <> +A B< int, double >::f( 9 ); -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { /* code */ return 0; diff --git a/cmake/CheckFiles/VectorCapacity.cxx b/cmake/CheckFiles/VectorCapacity.cxx index ef85534bc0..f616a53700 100644 --- a/cmake/CheckFiles/VectorCapacity.cxx +++ b/cmake/CheckFiles/VectorCapacity.cxx @@ -1,6 +1,7 @@ #include -int main(void) +int +main( void ) { std::vector< int > v; v.push_back( 7 ); diff --git a/cmake/CheckFiles/VectorCapacityDoubling.cxx b/cmake/CheckFiles/VectorCapacityDoubling.cxx index 67ddf81789..610034475d 100644 --- a/cmake/CheckFiles/VectorCapacityDoubling.cxx +++ b/cmake/CheckFiles/VectorCapacityDoubling.cxx @@ -1,25 +1,28 @@ #include -int main( void ) +int +main( void ) { std::vector< int > v; long l; int i; v.push_back( 7 ); l = v.capacity(); - for( i = 0; i<4; i++) + for ( i = 0; i < 4; i++ ) { - while (1) - { - v.push_back(7); - if (v.capacity()!=l) - { - if (v.capacity()/2 != l) - return 1; - l = v.capacity(); - break; - } - } - } + while ( 1 ) + { + v.push_back( 7 ); + if ( v.capacity() != l ) + { + if ( v.capacity() / 2 != l ) + { + return 1; + } + l = v.capacity(); + break; + } + } + } return 0; } diff --git a/cmake/CheckFiles/check_return_val.sh b/cmake/CheckFiles/check_return_val.sh index e643675581..c94ddb3510 100755 --- a/cmake/CheckFiles/check_return_val.sh +++ b/cmake/CheckFiles/check_return_val.sh @@ -1,4 +1,7 @@ #!/usr/bin/env sh -x=`$1` +# We're only interested in the return value of the script, so x is dummy only. +# SC2034 (warning): x appears unused. Verify use (or export if used externally). +# shellcheck disable=SC2034 +x="$("$1")" exit $? diff --git a/cmake/CheckFiles/std_isnan.cxx b/cmake/CheckFiles/std_isnan.cxx index b6920f7e51..d662b04c01 100644 --- a/cmake/CheckFiles/std_isnan.cxx +++ b/cmake/CheckFiles/std_isnan.cxx @@ -1,7 +1,8 @@ #include -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { - std::isnan(0.0f/0.0f); + std::isnan( 0.0f / 0.0f ); return 0; } diff --git a/cmake/CheckFiles/std_nan.cxx b/cmake/CheckFiles/std_nan.cxx index 6ff9bf0001..6fe91be80d 100644 --- a/cmake/CheckFiles/std_nan.cxx +++ b/cmake/CheckFiles/std_nan.cxx @@ -1,7 +1,8 @@ #include -int main(int argc, char const *argv[]) +int +main( int argc, char const* argv[] ) { - double x = nan(0); + double x = nan( 0 ); return 0; } diff --git a/cmake/ColorMessages.cmake b/cmake/ColorMessages.cmake index 9173cf788e..aee15eb810 100644 --- a/cmake/ColorMessages.cmake +++ b/cmake/ColorMessages.cmake @@ -38,7 +38,7 @@ set(BoldMagenta "${Esc}[1;35m") set(BoldYellow "${Esc}[1;33m") set(BoldWhite "${Esc}[1;37m") -function(print) +function(print) set(option HAS_COLOR) set(singleValued COLOR MODE TEXT) cmake_parse_arguments(MSG "${option}" "${singleValued}" "" ${ARGN}) @@ -48,11 +48,11 @@ function(print) elseif ("${MSG_MODE}" STREQUAL "WARNING") message(WARNING "${MSG_COLOR} ${MSG_TEXT}${Reset}") else() - message(STATUS "${MSG_COLOR}${MSG_TEXT} ${Reset}") + message(STATUS "${MSG_COLOR}${MSG_TEXT} ${Reset}") endif() else() - message(STATUS "${MSG_TEXT}") - endif() + message(STATUS "${MSG_TEXT}") + endif() endfunction() diff --git a/cmake/FindGSL.cmake b/cmake/FindGSL.cmake index 2c2344e1d8..59addcbe8d 100644 --- a/cmake/FindGSL.cmake +++ b/cmake/FindGSL.cmake @@ -57,23 +57,23 @@ # Copyright 2000-2016 Kitware, Inc. # Copyright 2000-2011 Insight Software Consortium # All rights reserved. -# +# # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: -# +# # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. -# +# # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. -# +# # * Neither the names of Kitware, Inc., the Insight Software Consortium, # nor the names of their contributors may be used to endorse or promote # products derived from this software without specific prior written # permission. -# +# # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR @@ -85,30 +85,30 @@ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# +# # ------------------------------------------------------------------------------ -# +# # The above copyright and license notice applies to distributions of # CMake in source and binary form. Some source files contain additional # notices of original copyright by their contributors; see each source # for details. Third-party software packages supplied with CMake under # compatible licenses provide their own copyright notices documented in # corresponding subdirectories. -# +# # ------------------------------------------------------------------------------ -# +# # CMake was initially developed by Kitware with the following sponsorship: -# +# # * National Library of Medicine at the National Institutes of Health # as part of the Insight Segmentation and Registration Toolkit (ITK). -# +# # * US National Labs (Los Alamos, Livermore, Sandia) ASC Parallel # Visualization Initiative. -# +# # * National Alliance for Medical Image Computing (NAMIC) is funded by the # National Institutes of Health through the NIH Roadmap for Medical Research, # Grant U54 EB005149. -# +# # * Kitware, Inc. #============================================================================= diff --git a/cmake/FindPandoc.cmake b/cmake/FindPandoc.cmake index dcb302723b..4ee65bab91 100644 --- a/cmake/FindPandoc.cmake +++ b/cmake/FindPandoc.cmake @@ -1,24 +1,24 @@ -# cmake/FindPandoc.cmake -# -# This file is part of NEST. -# -# Copyright (C) 2004 The NEST Initiative -# -# NEST is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. -# -# NEST is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with NEST. If not, see . - -include(FindPackageHandleStandardArgs) -find_program(PANDOC_EXECUTABLE pandoc) -mark_as_advanced(PANDOC_EXECUTABLE) - -find_package_handle_standard_args(Pandoc DEFAULT_MSG PANDOC_EXECUTABLE) \ No newline at end of file +# cmake/FindPandoc.cmake +# +# This file is part of NEST. +# +# Copyright (C) 2004 The NEST Initiative +# +# NEST is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# NEST is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with NEST. If not, see . + +include(FindPackageHandleStandardArgs) +find_program(PANDOC_EXECUTABLE pandoc) +mark_as_advanced(PANDOC_EXECUTABLE) + +find_package_handle_standard_args(Pandoc DEFAULT_MSG PANDOC_EXECUTABLE) diff --git a/cmake/FindSphinx.cmake b/cmake/FindSphinx.cmake index b294f4ae87..ea8aedfa41 100644 --- a/cmake/FindSphinx.cmake +++ b/cmake/FindSphinx.cmake @@ -1,31 +1,31 @@ -# Based on information found on https://www.vortech.nl/en/integrating-sphinx-in-cmake - -include(FindPackageHandleStandardArgs) -find_package(Python3 COMPONENTS Interpreter REQUIRED) -if( Python_FOUND ) - get_filename_component(_PYTHON_DIR "${Python_EXECUTABLE}" DIRECTORY) - set( - _PYTHON_PATHS - "${_PYTHON_DIR}" - "${_PYTHON_DIR}/bin" - "${_PYTHON_DIR}/Scripts" - ) -endif() - -function(check_sphinx validator_result_var item) - execute_process(COMMAND "${item}" "--version" ERROR_VARIABLE _err) - if(_err) - set(${validator_result_var} FALSE PARENT_SCOPE) - endif() -endfunction() - -find_program( - SPHINX_EXECUTABLE - NAMES sphinx-build sphinx-build.exe - HINTS ${_PYTHON_PATHS} - VALIDATOR check_sphinx - ) - -mark_as_advanced(SPHINX_EXECUTABLE) - -find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE) +# Based on information found on https://www.vortech.nl/en/integrating-sphinx-in-cmake + +include(FindPackageHandleStandardArgs) +find_package(Python3 COMPONENTS Interpreter REQUIRED) +if( Python_FOUND ) + get_filename_component(_PYTHON_DIR "${Python_EXECUTABLE}" DIRECTORY) + set( + _PYTHON_PATHS + "${_PYTHON_DIR}" + "${_PYTHON_DIR}/bin" + "${_PYTHON_DIR}/Scripts" + ) +endif() + +function(check_sphinx validator_result_var item) + execute_process(COMMAND "${item}" "--version" ERROR_VARIABLE _err) + if(_err) + set(${validator_result_var} FALSE PARENT_SCOPE) + endif() +endfunction() + +find_program( + SPHINX_EXECUTABLE + NAMES sphinx-build sphinx-build.exe + HINTS ${_PYTHON_PATHS} + VALIDATOR check_sphinx + ) + +mark_as_advanced(SPHINX_EXECUTABLE) + +find_package_handle_standard_args(Sphinx DEFAULT_MSG SPHINX_EXECUTABLE) diff --git a/cmake/GetTriple.cmake b/cmake/GetTriple.cmake index 686ea2e79a..344f038d92 100644 --- a/cmake/GetTriple.cmake +++ b/cmake/GetTriple.cmake @@ -24,7 +24,7 @@ function( get_host_triple out out_arch out_vendor out_os ) # Get the architecture. set( arch "${CMAKE_HOST_SYSTEM_PROCESSOR}" ) - # i686 is an enhanced version of x86 + # i686 is an enhanced version of x86 if ( arch STREQUAL "x86" ) set( arch "i686" ) endif () @@ -58,7 +58,7 @@ endfunction () function( get_target_triple out out_arch out_vendor out_os ) # Get the architecture. set( arch "${CMAKE_SYSTEM_PROCESSOR}" ) - # i686 is an enhanced version of x86 + # i686 is an enhanced version of x86 if ( arch STREQUAL "x86" ) set( arch "i686" ) endif () diff --git a/doc/htmldoc/.gitignore b/doc/htmldoc/.gitignore index df2d4597b8..930bfcce26 100644 --- a/doc/htmldoc/.gitignore +++ b/doc/htmldoc/.gitignore @@ -1,8 +1,8 @@ -# The auto_examples are generated by sphinx-gallery during each doc build. It preprocesses -# the `/pynest/examples` folder into RST files that are then picked up by the rest of the -# Sphinx build. -auto_examples/ -# Some images are copied over from the source into the doc static. -static/examples -# json data is produced at build time by Sphinx -static/data/filter_model.json +# The auto_examples are generated by sphinx-gallery during each doc build. It preprocesses +# the `/pynest/examples` folder into RST files that are then picked up by the rest of the +# Sphinx build. +auto_examples/ +# Some images are copied over from the source into the doc static. +static/examples +# json data is produced at build time by Sphinx +static/data/filter_model.json diff --git a/doc/htmldoc/404.rst b/doc/htmldoc/404.rst index 29f6c7b647..dd9fe8c1f5 100644 --- a/doc/htmldoc/404.rst +++ b/doc/htmldoc/404.rst @@ -7,5 +7,3 @@ Sorry, it looks like the page you were looking for doesn't exist in this version or has moved. Try the search bar or the navigation sidebar. - - diff --git a/doc/htmldoc/benchmark_results.rst b/doc/htmldoc/benchmark_results.rst index 46954b0ead..cb2ec3caec 100644 --- a/doc/htmldoc/benchmark_results.rst +++ b/doc/htmldoc/benchmark_results.rst @@ -5,8 +5,11 @@ NEST performance benchmarks NEST performance is continuously monitored and improved across various network sizes. -Here we show benchmarking results for NEST version 3.8 on Jureca-DC [1]_. +Here we show benchmarking results for NEST version 3.9 on Jureca-DC [1]_. The benchmarking framework and the structure of the graphs is described in [2]_. +For details on `State Propagation` (i.e., `Simulation Run`), see the guides :ref:`built_in_timers` and :ref:`run_simulations` + +The results from previous benchmarks can be found :ref:`here `. Strong scaling experiment of the Microcircuit model [3]_ --------------------------------------------------------- @@ -45,11 +48,11 @@ Strong scaling experiment of the Multi-area-model [5]_ :columns: 10 Dynamical regime: Ground state - + .. image:: /static/img/mam_ground-state_benchmark.png Dynamical regime: Metastable state - + .. image:: /static/img/mam_metastable-state_benchmark.png @@ -96,9 +99,11 @@ Weak scaling experiment of the HPC benchmark model [6]_ .. seealso:: + * Guide to :ref:`Built-in timers ` and :ref:`run_simulations`. + Example networks: - * :doc:`/auto_examples/Potjans_2014/index` + * :doc:`Microcircuit Model ` * `Multi-area model `_ * :doc:`/auto_examples/hpc_benchmark` diff --git a/doc/htmldoc/colorize.rst b/doc/htmldoc/colorize.rst index 34c342eb58..233d529ec3 100644 --- a/doc/htmldoc/colorize.rst +++ b/doc/htmldoc/colorize.rst @@ -22,4 +22,3 @@ .. Based on: (c) Lilian Besson, 2011-2016, https://bitbucket.org/lbesson/web-sphinx/ - diff --git a/doc/htmldoc/conf.py b/doc/htmldoc/conf.py index e4d309a098..bef7625b7e 100644 --- a/doc/htmldoc/conf.py +++ b/doc/htmldoc/conf.py @@ -22,6 +22,8 @@ import json import os + +# import shutil import subprocess import sys from pathlib import Path @@ -44,6 +46,7 @@ extensions = [ "sphinx_gallery.gen_gallery", "list_examples", + "sphinx.ext.graphviz", "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.autosummary", @@ -101,7 +104,8 @@ # |version| and |release|, also used in various other places throughout the # built documents. # - +graphviz_output_format = "svg" +graphviz_dot = "dot" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # @@ -208,6 +212,7 @@ "desktop": ("https://nest-desktop.readthedocs.io/en/latest/", None), "gpu": ("https://nest-gpu.readthedocs.io/en/latest/", None), "neat": ("https://nest-neat.readthedocs.io/en/latest/", None), + "pd14": ("https://microcircuit-pd14-model.readthedocs.io/en/latest", None), "neuromorph": ("https://electronicvisions.github.io/hbp-sp9-guidebook/", None), "arbor": ("https://docs.arbor-sim.org/en/latest/", None), "tvb": ("https://docs.thevirtualbrain.org/", None), diff --git a/doc/htmldoc/developer_space/sli_docs/index.rst b/doc/htmldoc/developer_space/sli_docs/index.rst index 7aec67abbf..653bf1536b 100644 --- a/doc/htmldoc/developer_space/sli_docs/index.rst +++ b/doc/htmldoc/developer_space/sli_docs/index.rst @@ -13,4 +13,3 @@ SLI documentation objects-and-data-types programming-in-sli using-files-and-keyboard-input - diff --git a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_example_state_machine_communication_with_Nest.uxf b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_example_state_machine_communication_with_Nest.uxf index ffb15bff03..059fb6afaa 100644 --- a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_example_state_machine_communication_with_Nest.uxf +++ b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_example_state_machine_communication_with_Nest.uxf @@ -75,7 +75,7 @@ 102 24 - Create file + Create file with port descriptions @@ -164,7 +164,7 @@ with port descriptions 102 24 - Read file with + Read file with Ids of spike detector @@ -638,7 +638,7 @@ of the devices 90 24 - Send the number + Send the number of spikes @@ -650,7 +650,7 @@ of spikes 90 24 - Send the times + Send the times of spikes @@ -662,7 +662,7 @@ of spikes 90 24 - Send the times + Send the times of spikes @@ -1079,7 +1079,7 @@ Yes 102 24 - Create file + Create file with port descriptions @@ -1157,7 +1157,7 @@ with port descriptions 102 24 - Read file with + Read file with Ids of spike detector @@ -1258,7 +1258,7 @@ and Release buffer 102 24 - Initialisation of + Initialisation of internal communication @@ -1281,7 +1281,7 @@ internal communication 102 24 - Initialisation of + Initialisation of internal communication diff --git a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_protocol_of_communication.uxf b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_protocol_of_communication.uxf index 4f7574e93d..32e1f14228 100644 --- a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_protocol_of_communication.uxf +++ b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_protocol_of_communication.uxf @@ -90,7 +90,7 @@ bg=orange 45 9 - Read File + Read File bg=yellow @@ -182,7 +182,7 @@ connection 45 9 - Read File + Read File bg=yellow @@ -473,7 +473,7 @@ true 321 186 - For each run + For each run -- bg=light_gray @@ -648,7 +648,7 @@ bg=yellow 42 12 - Delete Files + Delete Files of configuration bg=orange @@ -742,7 +742,7 @@ bg=yellow 42 12 - Delete Files + Delete Files of configuration bg=orange @@ -778,7 +778,7 @@ bg=orange 18 lt=<<- -true +true (1,CXX_BOOL,0,0) 10.0;20.0;380.0;20.0 @@ -792,7 +792,7 @@ true 18 lt=<<- -data +data (total shape,DOUBLE,Previous_source,id[0]) 380.0;20.0;10.0;20.0 @@ -887,7 +887,7 @@ layer=1 51 12 - create file with + create file with list of spike generators bg=orange @@ -901,7 +901,7 @@ bg=orange 51 12 - create file with + create file with list of spike detectors bg=orange @@ -914,7 +914,7 @@ bg=orange 51 21 - Wait input port file + Wait input port file bg=orange diff --git a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_state_Nest.uxf b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_state_Nest.uxf index 053f2a0285..0c980c75d3 100644 --- a/doc/htmldoc/developer_space/static/ulmet/MPI_backend_state_Nest.uxf +++ b/doc/htmldoc/developer_space/static/ulmet/MPI_backend_state_Nest.uxf @@ -53,7 +53,7 @@ 144 24 - Initialise connection + Initialise connection between neuron population @@ -264,7 +264,7 @@ valign=top -- Input backend : -pre_run : Ask update data for +pre_run : Ask update data for all the input devices post_run : Send the end of the run -. @@ -288,7 +288,7 @@ valign=top Nest Clean -- -1) Send end of simulation +1) Send end of simulation 2) Disconnect valign=top @@ -348,7 +348,7 @@ of mpi recording devices 144 24 - Wait for description of + Wait for description of MPI port files diff --git a/doc/htmldoc/developer_space/templates/pynest_api_template.py b/doc/htmldoc/developer_space/templates/pynest_api_template.py index e35fb67e05..7b4da5e0bc 100644 --- a/doc/htmldoc/developer_space/templates/pynest_api_template.py +++ b/doc/htmldoc/developer_space/templates/pynest_api_template.py @@ -19,7 +19,8 @@ # You should have received a copy of the GNU General Public License # along with NEST. If not, see . -"""[[ This template demonstrates how to create a docstring for the PyNEST API. +""" +[[ This template demonstrates how to create a docstring for the PyNEST API. If you have modified an API, please ensure you update the docstring! diff --git a/doc/htmldoc/developer_space/workflows/documentation_workflow/index.rst b/doc/htmldoc/developer_space/workflows/documentation_workflow/index.rst index 6aec7ba7df..460231f72a 100644 --- a/doc/htmldoc/developer_space/workflows/documentation_workflow/index.rst +++ b/doc/htmldoc/developer_space/workflows/documentation_workflow/index.rst @@ -10,4 +10,3 @@ Select the documentation workflow you would like to view: User-level documentation Developer documentation - diff --git a/doc/htmldoc/developer_space/workflows/documentation_workflow/user_documentation_workflow.rst b/doc/htmldoc/developer_space/workflows/documentation_workflow/user_documentation_workflow.rst index 37374f3f05..9a936709fd 100644 --- a/doc/htmldoc/developer_space/workflows/documentation_workflow/user_documentation_workflow.rst +++ b/doc/htmldoc/developer_space/workflows/documentation_workflow/user_documentation_workflow.rst @@ -199,6 +199,12 @@ you will need to build the documentation locally with Sphinx. sphinx-build . ../_build/html -b html +.. note:: + + The ``build`` folder should be created outside of the ``doc/htmldoc`` folder. + But the ``sphinx-build`` command should be run from the ``doc/htmldoc`` folder. + Deviating from this format may cause the build process to fail in unexpected ways. + #. Preview files. They are located in ``doc/_build/html`` diff --git a/doc/htmldoc/examples/.gitignore b/doc/htmldoc/examples/.gitignore index 99eed0a521..2dc7c0ca06 100644 --- a/doc/htmldoc/examples/.gitignore +++ b/doc/htmldoc/examples/.gitignore @@ -1,5 +1,5 @@ -# The example's README is copied over from the source directory. -README.rst -# The figures are copied over from the source directory as well. -*.png -*.svg +# The example's README is copied over from the source directory. +README.rst +# The figures are copied over from the source directory as well. +*.png +*.svg diff --git a/doc/htmldoc/examples/index.rst b/doc/htmldoc/examples/index.rst index cbd061272b..6d2356f7c2 100644 --- a/doc/htmldoc/examples/index.rst +++ b/doc/htmldoc/examples/index.rst @@ -4,6 +4,7 @@ PyNEST examples =============== .. grid:: 1 1 2 3 + :gutter: 1 .. grid-item-card:: Simple networks :img-top: ../static/img/pynest/mc_neuron.png @@ -76,12 +77,13 @@ PyNEST examples * :doc:`../auto_examples/brunel_alpha_evolution_strategies` - .. grid-item-card:: Cortical microcircuit (Potjans) - :img-top: ../auto_examples/Potjans_2014/potjans_2014_raster_plot.png - - * :doc:`../auto_examples/Potjans_2014/index` - + .. grid-item-card:: Large scale cortical network models + :img-top: ../static/img/network_model_sketch_mesocircuit.png + * :doc:`Cortical Microcircuit Model ` + * `The mesocircuit model `_: A layered cortical network with distance-dependent connectivity + * `The multi-area model `_: A network model of the visual cortex of the macaque monkey + * `The HuMAM model `_: Multi-Scale Spiking Network Model of Human Cerebral Cortex .. grid-item-card:: EI clustered network (Rostami et al) :img-top: ../auto_examples/EI_clustered_network/EI_clustered_network_schematic.png @@ -161,6 +163,7 @@ PyNEST examples * :doc:`../auto_examples/wang_decision_making` + .. grid:: 1 1 2 3 .. grid-item-card:: Gap junctions @@ -279,7 +282,6 @@ PyNEST examples ../auto_examples/spatial/index ../auto_examples/music_cont_out_proxy_example/index ../auto_examples/compartmental_model/index - ../auto_examples/Potjans_2014/index ../auto_examples/one_neuron ../auto_examples/one_neuron_with_noise ../auto_examples/twoneurons diff --git a/doc/htmldoc/get-started_index.rst b/doc/htmldoc/get-started_index.rst index af5fd66aa0..2ffbbc1a2b 100644 --- a/doc/htmldoc/get-started_index.rst +++ b/doc/htmldoc/get-started_index.rst @@ -118,9 +118,9 @@ Next steps: Create your own network model Discover how to build large and more complex network models with these examples: * :doc:`Brunel network `: A random balanced network - * :doc:`The microcircuit model <../auto_examples/Potjans_2014/index>`: A network model example based on Potjans and Diesman 2014 + * :doc:`The microcircuit model `: A network model example based on Potjans and Diesman 2014 * `The mesocircuit model `_: A layered cortical network with distance-dependent connectivity - * The `multi-area model `_: A network model of the visual cortex of the macaque monkey + * `The multi-area model `_: A network model of the visual cortex of the macaque monkey diff --git a/doc/htmldoc/hpc/benchmarking.rst b/doc/htmldoc/hpc/benchmarking.rst index 870baf86a9..282184d01f 100644 --- a/doc/htmldoc/hpc/benchmarking.rst +++ b/doc/htmldoc/hpc/benchmarking.rst @@ -33,18 +33,20 @@ For more details on the conceptual ideas behind beNNch, refer to Albers et al. ( The left graph shows the absolute wall-clock time measured with Python-level timers for both network construction and state propagation. Error bars indicate variability across three simulation repeats with different random seeds. The top right graph displays the real-time factor defined as wall-clock time normalized by the model time. - Built-in timers resolve four different phases of the state propagation: update, collocation, communication, and delivery. + :ref:`Built-in timers ` resolve four different phases of the state propagation: update, collocation, communication, and delivery. Pink error bars show the same variability of state propagation as the left graph. The lower right graph shows the relative contribution of these phases to the state-propagation time. .. seealso:: - For further details, see the accompanying `beNNch GitHub Page `_. - And for a detailed step-by-step walk though see `Walk through guide `_. + * For further details, see the accompanying `beNNch GitHub Page `_. - Example PyNEST script: :doc:`../auto_examples/hpc_benchmark` + * For a detailed step-by-step walk though see `Walk through guide `_. + * Example PyNEST script: :doc:`../auto_examples/hpc_benchmark` + + * Guide to :ref:`built_in_timers` and :ref:`running simulations `. References ---------- diff --git a/doc/htmldoc/hpc/index.rst b/doc/htmldoc/hpc/index.rst index 807d561f44..4f5dda54e9 100644 --- a/doc/htmldoc/hpc/index.rst +++ b/doc/htmldoc/hpc/index.rst @@ -8,4 +8,3 @@ High performance computing :glob: * - diff --git a/doc/htmldoc/hpc/mpi_processes.rst b/doc/htmldoc/hpc/mpi_processes.rst index adfd42773c..eadd2468f2 100644 --- a/doc/htmldoc/hpc/mpi_processes.rst +++ b/doc/htmldoc/hpc/mpi_processes.rst @@ -62,5 +62,3 @@ with eachother (e.g., virtual memory thrashing). Over-subscribing processes is typically used in development in testing and can help identify performance bottlenecks. But performance can be degraded in this scenario. - - diff --git a/doc/htmldoc/hpc/overview_hardware.rst b/doc/htmldoc/hpc/overview_hardware.rst index 18320944a0..9a23978832 100644 --- a/doc/htmldoc/hpc/overview_hardware.rst +++ b/doc/htmldoc/hpc/overview_hardware.rst @@ -42,5 +42,3 @@ Data and instructions are allocated through software. To efficiently run your large and complex simulation, you need to configure the optimal number of :ref:`threads ` and :ref:`processes ` for your simulation and the given hardware of the HPC system you are using. - - diff --git a/doc/htmldoc/hpc/parallel_computing.rst b/doc/htmldoc/hpc/parallel_computing.rst index 6d24b365cc..08f179a9d9 100644 --- a/doc/htmldoc/hpc/parallel_computing.rst +++ b/doc/htmldoc/hpc/parallel_computing.rst @@ -203,7 +203,7 @@ experimenting. ``local_num_threads`` or the ``total_num_virtual_procs`` :ref:`kernel attribute`. - + Multiprocessing --------------- diff --git a/doc/htmldoc/hpc/slurm_script.rst b/doc/htmldoc/hpc/slurm_script.rst index b80b724c2e..6e6f25c003 100644 --- a/doc/htmldoc/hpc/slurm_script.rst +++ b/doc/htmldoc/hpc/slurm_script.rst @@ -118,7 +118,7 @@ trying to increase the speed of the simulation. How many nodes do you need for your simulations? This depends on how much memory is available for each node. - For example: The :doc:`microcircuit model <../auto_examples/Potjans_2014/index>` requires around 16 GB of memory and the `multi-area-model `_ requires 1.4 TB. + For example: The :doc:`microcircuit model ` requires around 16 GB of memory and the `multi-area-model `_ requires 1.4 TB. If a node has 128 GB of memory then one node is more than sufficient for the microcircuit model but the multi-area model will need 12 nodes to run. diff --git a/doc/htmldoc/hpc/threading.rst b/doc/htmldoc/hpc/threading.rst index 8f057c6e7d..02870556ab 100644 --- a/doc/htmldoc/hpc/threading.rst +++ b/doc/htmldoc/hpc/threading.rst @@ -87,7 +87,7 @@ Table of OpenMP settings Using ```python``` on HPC systems might lead to inconsistencies in multi-threading libraries resulting in a degredation of performance. For instance, depending on the installation ```numpy``` uses the multi-threading library provided by the MKL. To resolve this one needs to set ```export MKL_THREADING_LAYER=GNU``` in order to pass the OpenMP settings correctly. - + .. seealso:: @@ -101,7 +101,3 @@ References .. [1] Kurth AC. Senk J. Terhorst D. Finnerty J. and Diesmann M (2022). Sub-realtime simulation of a neuronal network of natural density. Neuromorphic Computing and Engineering(2):021001. https://doi.org/10.1088/2634-4386/ac55fc - - - - diff --git a/doc/htmldoc/index.rst b/doc/htmldoc/index.rst index a0a227d31a..7eb1ababea 100644 --- a/doc/htmldoc/index.rst +++ b/doc/htmldoc/index.rst @@ -46,31 +46,29 @@ Welcome to the NEST Simulator documentation! :data-bs-ride: carousel .. figure:: static/img/network_model_sketch_mesocircuit.png + :target: networks/index.html - - Create spatially structured networks - + Create large network models .. figure:: static/img/astrocyte_interaction.png - + :target: auto_examples/astrocytes/index.html Inspect neuron and astrocyte interactions - .. figure:: static/img/hpc_benchmark_connectivity.svg - + :target: auto_examples/hpc_benchmark.html Test perfomance and benchmarks .. figure:: static/img/pong_sim.gif - + :target: auto_examples/pong/run_simulations.html Simulate a game of PONG with NEST - .. figure:: static/img/gapjunctions.png - + .. figure:: static/img/pynest/eprop_supervised_classification_infrastructure.png + :target: auto_examples/eprop_plasticity/index.html - Explore synapse types like gap junctions + Explore eligibility propagation plasticity .. grid-item:: diff --git a/doc/htmldoc/installation/docker_windows.rst b/doc/htmldoc/installation/docker_windows.rst new file mode 100644 index 0000000000..e8e283838e --- /dev/null +++ b/doc/htmldoc/installation/docker_windows.rst @@ -0,0 +1,61 @@ +.. _windows_docker: + +Install NEST on Windows with Docker +=================================== + + +The NEST simulator does not officially support Windows, but there are several workarounds to make NEST work on this platform, +including using Linux subsystems or Docker, the latter shown here. + +This is a tried and tested solution with minimal preparation; +the setup will take approximately 20 minutes and requires a system restart. + +1. Download `Docker Desktop `_ for your Windows system and follow the instructions to install + it. + + You will have to create a user account and restart your system after installation. + +2. Open Docker Desktop and in the search bar at the top type "NEST Simulator". You will find the most recent NEST build. + + Select it and click "pull". + (This will show up as nest/nest-simulator with a drop-down menu that should automatically show the most recent, stable build.) + +3. You will have to run NEST Simulator with an internal server so you can use it with Python. + + Open a Windows console (type "cmd" in the search bar and press enter), and copy and paste this command into the console: + + ``docker run -it -p 8888:8888 --name nest-jupyter nest/nest-simulator:3.8 /bin/bash`` + + (This is the command for version 3.8; change the version ID if neccessary) + + Press enter and wait until the process is completed. You now have NEST running with an internal server. + Keep the console open for the next step. + + +4. NEST includes Jupyter for easy Python programming. To access this service, enter this command in the console: + + ``jupyter notebook --ip=0.0.0.0 --no-browser --allow-root"`` and press enter + + You will receive a longer response that includes a line similar to this: + :: + + (...)Or copy and paste one of these URLs: + http://127.0.0.1:8888/?token=abc123...456 + + Copy the URL and paste it to your browser. + + This should open Jupyter with NEST Simulator enabled. + +5. After this initial setup, you can start NEST Simulator and jupyter-nest by + + - running docker, + - navigating to "containers" + - clicking run on both "nest/nest_simulator:3.8" and "nest-jupyter" + + .. note:: + + If the above steps to run NEST does not work, you can access it through the console + + Enter: "docker start nest-jupyter" press enter + Enter: "docker exec -it nest-jupyter bash" press enter, stay in this window and + Enter: "jupyter notebook --ip=0.0.0.0 --no-browser --allow-root" press enter diff --git a/doc/htmldoc/installation/lecturer.rst b/doc/htmldoc/installation/lecturer.rst index becafdd561..b8eb632299 100644 --- a/doc/htmldoc/installation/lecturer.rst +++ b/doc/htmldoc/installation/lecturer.rst @@ -47,9 +47,3 @@ They provide an image of many computational neuroscience tools including NEST! * :ref:`PyNEST tutorials ` * For creating and modifying models, see :doc:`NESTML tutorials ` - - - - - - diff --git a/doc/htmldoc/installation/livemedia.rst b/doc/htmldoc/installation/livemedia.rst index 5c71e496a1..842a1e571a 100644 --- a/doc/htmldoc/installation/livemedia.rst +++ b/doc/htmldoc/installation/livemedia.rst @@ -77,6 +77,3 @@ Notes * To install Guest Additions, select **Devices** > **Insert Guest Additions CD image...** (top left of the VirtualBox Window). Then, open a terminal (Ctrl+Alt+t), go to "/media/nest/VBOXADDITIONS.../" and run "sudo bash VboxLinuxAdditions.run". * To set the correct language layout for your keyboard (e.g., from "US" to "DE"), open a terminal and type: "sudo dpkg-reconfigure keyboard-configuration". After setting the correct keyboard map you have to reboot the system to activate the changes. - - - diff --git a/doc/htmldoc/models/.gitignore b/doc/htmldoc/models/.gitignore index 3a245cda74..2c1488785a 100644 --- a/doc/htmldoc/models/.gitignore +++ b/doc/htmldoc/models/.gitignore @@ -1,6 +1,6 @@ -# The UserDocExtractor preprocesses `/models/*.h` and `/nestkernel/*.h` files into -# .rst and .json files to be picked up during the Sphinx build. -*.rst -*.json -# Only these files should be tracked. -!index.rst +# The UserDocExtractor preprocesses `/models/*.h` and `/nestkernel/*.h` files into +# .rst and .json files to be picked up during the Sphinx build. +*.rst +*.json +# Only these files should be tracked. +!index.rst diff --git a/doc/htmldoc/models/index.rst b/doc/htmldoc/models/index.rst index 814f616189..1279f7765f 100644 --- a/doc/htmldoc/models/index.rst +++ b/doc/htmldoc/models/index.rst @@ -5,8 +5,34 @@ Model directory =============== +What type of model? +------------------- + NEST has over 100 models, choose an option for finding the one you need! + +.. grid:: + + .. grid-item-card:: + :columns: 4 + :link: network_models + :link-type: ref + + **Network models** + + + + .. grid-item-card:: + :columns: 4 + :link: model_selector + :link-type: ref + + **Neurons, synapses, and devices** + +:ref:`What's the difference? ` + + + .. _model_selector: Model selector @@ -110,11 +136,16 @@ The term `models` in the context of NEST (and the field of computational neurosc implementations of these conceptual entities. Most of the models in NEST are based on either peer-reviewed publications or text books like [1]_. This is what we mean for models in our model directory. + Note that **devices** are not models but are mechanisms to generate or read out + signals, like spikes. We list them together with neurons and synapses since they + are required to be able to produce and analyze neuron and synapse activity. 2. **Network models**. These models are created from individual neuron and synapse models using the different commands provided by the - :ref:`PyNEST API `. Examples for such network models - can be found :doc:`here `. + :ref:`PyNEST API `. Network models have a defined population + and connectivity, with initial conditions, along with specific neuron and synapse models. + We have :doc:`a variety of examples for network models ` and specifically, + :doc:`large scale networks examples `. .. seealso:: @@ -149,3 +180,8 @@ References {% for keys in model_dict %} {{ keys | replace(".html", "") }} {% endfor %} + +.. toctree:: + :hidden: + + ../networks/index diff --git a/doc/htmldoc/nest_behavior/built-in_timers.rst b/doc/htmldoc/nest_behavior/built-in_timers.rst index e9f6a914f7..aad17d010e 100644 --- a/doc/htmldoc/nest_behavior/built-in_timers.rst +++ b/doc/htmldoc/nest_behavior/built-in_timers.rst @@ -59,74 +59,115 @@ In the context of NEST performance monitoring, other useful kernel attributes ar Detailed timers --------------- -Detailed built-in timers can be activated (and again deactivated) prior to compilation through the CMake flag -``-Dwith-detailed-timers=ON``. They provide further insights into the time NEST spends in different phases of the -simulation cycle, but they can impact the runtime. Therefore, detailed timers are by default inactive. +Detailed built-in timers can be activated (and again deactivated) prior to compilation through the CMake flag: -If detailed timers are active, the following time measurements are available as kernel attributes: +``-Dwith-detailed-timers=ON``. -+-------------------------------------------+-----------------------------------+----------------------------------+ -| Name | Explanation | Part of | -+===========================================+===================================+==================================+ -| ``time_gather_target_data`` | Cumulative time for communicating | ``time_communicate_prepare`` | -| | connection information from | | -| | postsynaptic to presynaptic side | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_communicate_target_data`` | Cumulative time for core MPI | ``time_gather_target_data`` | -| | communication when gathering | | -| | target data | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_update`` | Time for neuron update | ``time_simulate`` | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_gather_spike_data`` | Time for complete spike exchange | ``time_simulate`` | -| | after update phase | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_collocate_spike_data`` | Time to collocate MPI send buffer | ``time_gather_spike_data`` | -| | from spike register | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_communicate_spike_data`` | Time for communicating spikes | ``time_gather_spike_data`` | -| | between compute nodes | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_deliver_spike_data`` | Time to deliver events from the | ``time_gather_spike_data`` | -| | MPI receive buffers to their | | -| | local synaptic targets (including | | -| | synaptic update, e.g. STDP | | -| | synapses) and to the spike ring | | -| | buffers of the corresponding | | -| | postsynaptic neurons | | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_omp_synchronization_construction`` | Synchronization time of threads | ``time_construction_create``, | -| | during network construction. | ``time_construction_connect``, | -| | | ``time_communicate_prepare`` | -+-------------------------------------------+-----------------------------------+----------------------------------+ -| ``time_omp_synchronization_simulation`` | Synchronization time of threads | ``time_simulate`` | -| | during simulation. | | -+-------------------------------------------+-----------------------------------+----------------------------------+ - -MPI synchronization timer -------------------------- -In order to measure synchronization time between multiple MPI processes, an additional timer can be activated on demand -via the ``-Dwith-mpi-sync-timer=ON`` CMake flag. This timer measures the time between the end of a process' update phase -(i.e., neuron state propagation) and start of collective communication of spikes between all MPI processes. This timer -adds an additional MPI barrier right before the start of communication, which might affect performance. - -+------------------------------+-----------------------------------------+ -| Name | Explanation | -+==============================+=========================================+ -| ``time_mpi_synchronization`` | Time spent waiting for other processes. | -+------------------------------+-----------------------------------------+ - -Multi-threaded timers ---------------------- -In previous NEST versions, only the master thread measured timers. Since NEST 3.9, timers which measure time spent exclusively in multi-threaded environments are recorded by each thread individually. - -The legacy timer behavior can be restored via the ``-Dwith-threaded-timers=OFF`` CMake flag. - -Wall-time vs. CPU-time -------------------------- -All timers in NEST measure the actual wall-time spent between starting and stopping the timer. In order to only measure -time spent on calculations, there is an additional variant for each of the timers above, suffixed with ``_cpu``. They -can be accessed in the exact same way. For example: -:: +They provide further insights into the time NEST spends in different phases of the +simulation cycle so they can be useful for :ref:`benchmarking performance `, but they can impact the runtime. +Therefore, detailed timers are by default inactive. + +.. grid:: + :gutter: 2 + + .. grid-item-card:: **Simulation run (state propagation) diagram** + :columns: 5 + :class-item: sd-text-center + + .. graphviz:: /simulation_run.dot + :name: Simulation run (State propagation) + :caption: Simplified sequence of operations in the simulation run, organized in a top-down manner with a focus on timers. + + Within the `simulate timer` section, parallel processes + (`OMP Parallel`) manage time-driven loops, handling tasks such as delivering spike data, and updating timers. + The `OMP Master` section is responsible for gathering and communicating + spike data, involving steps like collocating data and advancing the simulation time. `OMP + barriers` are used to ensure thread synchronization at key points (for more details please see `Jordan et al. 2018 + `_). + The timers are indicated in white or light grey. + + For source code see: `SimulationManager::update_ `_ + and `EventDeliveryManager::gather_spike_data `_ + + + + .. grid-item:: + :columns: 7 + + **Multi-threaded timers** + + In previous NEST versions, only the master thread measured timers (OMP_Master). + Since NEST 3.9, timers which measure time spent exclusively in multi-threaded environments (OMP_Parallel) + are recorded by each thread individually. + + The legacy timer behavior can be restored via the CMake flag: + + ``-Dwith-threaded-timers=OFF`` + + **Wall-time vs. CPU-time** + + All timers in NEST measure the actual wall-time spent between starting and stopping the timer. In order to only measure + time spent on calculations, there is an additional variant for each of the timers above, suffixed with ``_cpu``. They + can be accessed in the exact same way. For example: + :: + + nest.time_simulate_cpu + + **MPI synchronization timer** + + In order to measure synchronization time between multiple MPI processes, an additional timer can be activated on demand + via the CMake flag + + ``-Dwith-mpi-sync-timer=ON``. + + This timer measures the time between the end of a process' update phase + (i.e., neuron state propagation) and start of collective communication of spikes between all MPI processes. This timer + adds an additional MPI barrier right before the start of communication, which might affect performance. + + + .. seealso:: + + - For more information see the :ref:`run_simulations` guide + +Kernel attribrutes for detailed timers +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If detailed timers are active, the following time measurements are available as kernel attributes: - nest.time_simulate_cpu +.. list-table:: + :widths: 30 40 30 + :header-rows: 1 + + * - Name + - Explanation + - Part of + * - ``time_gather_target_data`` + - Cumulative time for communicating connection information from postsynaptic to presynaptic side + - ``time_communicate_prepare`` + * - ``time_communicate_target_data`` + - Cumulative time for core MPI communication when gathering target data + - ``time_gather_target_data`` + * - ``time_update`` + - Time for neuron update + - ``time_simulate`` + * - ``time_gather_spike_data`` + - Time for complete spike exchange after update phase + - ``time_simulate`` + * - ``time_collocate_spike_data`` + - Time to collocate MPI send buffer from spike register + - ``time_gather_spike_data`` + * - ``time_communicate_spike_data`` + - Time for communicating spikes between compute nodes + - ``time_gather_spike_data`` + * - ``time_deliver_spike_data`` + - Time to deliver events from the MPI receive buffers to their local synaptic targets (including synaptic update, e.g. STDP synapses) and to the spike ring buffers of the corresponding postsynaptic neurons + - ``time_gather_spike_data`` + * - ``time_mpi_synchronization`` + - Time spent waiting for other processes + - ``time_communicate_spike_data`` + * - ``time_omp_synchronization_construction`` + - Synchronization time of threads during network construction. + - ``time_construction_create``, ``time_construction_connect``, ``time_communicate_prepare`` + * - ``time_omp_synchronization_simulation`` + - Synchronization time of threads during simulation. + - ``time_simulate`` diff --git a/doc/htmldoc/nest_behavior/running_simulations.rst b/doc/htmldoc/nest_behavior/running_simulations.rst index 40fcb2c022..1324770f5c 100644 --- a/doc/htmldoc/nest_behavior/running_simulations.rst +++ b/doc/htmldoc/nest_behavior/running_simulations.rst @@ -328,3 +328,4 @@ threads or processes): ``{"print_time": False}`` to avoid the overhead of the print calls. In these cases, the real-time factor can be computed by measuring the wall-clock time manually and dividing by the set model time. + For details on timers in NEST see :ref:`built_in_timers`. diff --git a/doc/htmldoc/nest_sonata/nest_sonata_guide.rst b/doc/htmldoc/nest_sonata/nest_sonata_guide.rst index 40a718a6dc..44d57a9a8f 100644 --- a/doc/htmldoc/nest_sonata/nest_sonata_guide.rst +++ b/doc/htmldoc/nest_sonata/nest_sonata_guide.rst @@ -90,7 +90,7 @@ multiple node population HDF5 files. NEST assumes the following structure of the node HDF5 files: -:: +:: Filename ├─ nodes Group - required @@ -147,7 +147,7 @@ circumvented by assigning a single node its own node type id. Below is an example of a node type CSV file with the required headers for neuron nodes: +--------------+---------------+--------------------+-----------------+ -| node_type_id | model_type | model_template | dynamics_params | +| node_type_id | model_type | model_template | dynamics_params | +==============+===============+====================+=================+ | 1 | point_process | nest:iaf_psc_alpha | params_1.json | +--------------+---------------+--------------------+-----------------+ @@ -155,7 +155,7 @@ Below is an example of a node type CSV file with the required headers for neuron +--------------+---------------+--------------------+-----------------+ The only required CSV header for ``virtual`` nodes is ``model_type``. The ``spike_train_injector``\s spike-time arrays -are expected to be provided in HDF5 datasets with the configuration details specified in the JSON configuration file. +are expected to be provided in HDF5 datasets with the configuration details specified in the JSON configuration file. .. _sec:sonata_edges: @@ -168,7 +168,7 @@ CSV file that assigns properties to all edges with a given edge type id. NEST assumes the following structure of the edge HDF5 files: -:: +:: Filename ├─ edges Group - required @@ -213,7 +213,7 @@ NEST assumes the ``edge_id``\s are contiguous numeric keys starting from zero, t Below is an example of a edge type CSV file: +--------------+----------------+-------+-----------------+ -| edge_type_id | model_template | delay | dynamics_params | +| edge_type_id | model_template | delay | dynamics_params | +==============+================+=======+=================+ | 1 | static_synapse | 2.0 | params_1.json | +--------------+----------------+-------+-----------------+ diff --git a/doc/htmldoc/networks/index.rst b/doc/htmldoc/networks/index.rst new file mode 100644 index 0000000000..dd7a173904 --- /dev/null +++ b/doc/htmldoc/networks/index.rst @@ -0,0 +1,50 @@ +.. _network_models: + +Network Models +============== + +Here we have several examples of large-scale network models developed for NEST. + +You can see how to build other networks for various neuron, synapse and device types in our +:doc:`examples gallery `. + +We have a detailed guide on :ref:`spatially-structured networks ` as well. + + + +.. grid:: 1 2 3 4 + :gutter: 1 + + .. grid-item-card:: Brunel Network + :columns: 4 + :link: /auto_examples/brunel_alpha_nest + :link-type: doc + + A random balanced network + + .. grid-item-card:: Microcircuit Model + :columns: 4 + :link: https://microcircuit-pd14-model.readthedocs.io/en/latest/ + + A network model example based on Potjans and Diesman 2014 + + + .. grid-item-card:: Mesocircuit Model + :columns: 4 + :link: https://mesocircuit-model.readthedocs.io/en/latest/ + + A layered cortical network with distance-dependent connectivity + + + .. grid-item-card:: Multi-area Model + :columns: 4 + :link: https://inm-6.github.io/multi-area-model/ + + A network model of the visual cortex of the macaque monkey + + + .. grid-item-card:: HuMAM model + :columns: 4 + :link: https://github.com/INM-6/human-multi-area-model + + Multi-Scale Spiking Network Model of Human Cerebral Cortex diff --git a/doc/htmldoc/neurons/neuron_types.rst b/doc/htmldoc/neurons/neuron_types.rst index 57e335e17a..f485453b68 100644 --- a/doc/htmldoc/neurons/neuron_types.rst +++ b/doc/htmldoc/neurons/neuron_types.rst @@ -496,7 +496,7 @@ The following non-linearity types are available: * :doc:`/models/tanh_rate` * :doc:`/models/threshold_lin_rate` -Where is Non-linearity applied? +Where is Non-linearity applied? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/htmldoc/previous_benchmark_results.rst b/doc/htmldoc/previous_benchmark_results.rst new file mode 100644 index 0000000000..1a77dc0915 --- /dev/null +++ b/doc/htmldoc/previous_benchmark_results.rst @@ -0,0 +1,137 @@ +.. _previous_nest_benchmark_results: + +Previous NEST performance benchmarks +==================================== + +.. important:: + + NEST version 3.8 benchmarks of the Multi-area-model and HPC benchmark model have been updated due to errors in the analysis! Please see below for corrected versions. + +NEST performance is continuously monitored and improved across various network sizes. +Here we show benchmarking results for NEST version 3.8 on Jureca-DC [1]_. +The benchmarking framework and the structure of the graphs is described in [2]_. +For details on `State Propagation` (i.e., `Simulation Run`), see the guides :ref:`built_in_timers` and :ref:`run_simulations` + +Strong scaling experiment of the Microcircuit model [3]_ +--------------------------------------------------------- + +.. grid:: 1 1 1 1 + + .. grid-item:: + :columns: 10 + :class: sd-align-major-center + + .. image:: /static/img/mc_benchmark_NEST-v3.8.png + +.. grid:: 1 1 1 1 + + .. grid-item:: + :columns: 10 + :class: sd-align-minor-center + + + * The model has ~80 000 neurons and ~300 million synapses, minimal delay 0.1 ms + * 2 MPI processes per node, 64 threads per MPI process + * Increasing number of computing resources decrease simulation time + * Data averaged over 3 runs with different seeds, error bars indicate standard deviation + * The model runs faster than real time [4]_ + + + + +Strong scaling experiment of the Multi-area-model [5]_ +------------------------------------------------------- + +.. grid:: 1 1 1 1 + + .. grid-item:: + :class: sd-align-major-center + :columns: 10 + + Dynamical regime: Ground state + + .. image:: /static/img/mam_ground-state_benchmark_NEST-v3.8.png + + Dynamical regime: Metastable state + + .. image:: /static/img/mam_metastable-state_benchmark_NEST-v3.8.png + + +.. grid:: 1 1 1 1 + + .. grid-item:: + :columns: 10 + :class: sd-align-minor-center + + * The model has ~4.1 million neurons and ~24 billion synapses, minimal delay 0.1 ms + * It can be run in two different dynamical regimes: the ground state and the metastable state [5]_. + * 2 MPI processes per node, 64 threads per MPI process + * Steady decrease of run time with additional compute resources + * Data averaged over 3 runs with different seeds, error bars indicate standard deviation + + + + +Weak scaling experiment of the HPC benchmark model [6]_ +-------------------------------------------------------- + +.. grid:: 1 1 1 1 + + .. grid-item:: + :columns: 10 + :class: sd-align-major-center + + .. image:: /static/img/hpc_benchmark_NEST-v3.8.png + + +.. grid:: 1 1 1 1 + + .. grid-item:: + :columns: 10 + :class: sd-align-minor-center + + + * The size of network scales proportionally with the computational resources used + * Largest network size in this diagram: ~5.8 million neurons and ~65 billion synapses, minimal delay 1.5 ms + * 2 MPI processes per node, 64 threads per MPI process + * The figure shows that NEST can handle massive networks and simulate them efficiently + * Data averaged over 3 runs with different seeds, error bars indicate standard deviation + + +.. seealso:: + + * Guide to :ref:`Built-in timers ` and :ref:`run_simulations`. + + Example networks: + + * :doc:`Microcircuit Model ` + * `Multi-area model `_ + * :doc:`/auto_examples/hpc_benchmark` + +References +---------- + +.. [1] Juelich Supercomputing Centre. 2021. JURECA: Data Centric and Booster Modules implementing the Modular + Supercomputing Architecture at Jülich Supercomputing Centre. Journal of large-scale research facilities, + 7, A182. DOI: http://dx.doi.org/10.17815/jlsrf-7-182 + + +.. [2] Albers J, Pronold J, Kurth AC, Vennemo SB, Haghighi Mood K, Patronis A, Terhorst D, Jordan J, Kunkel S, + Tetzlaff T, Diesmann M and Senk J (2022). A Modular Workflow for Performance Benchmarking of Neuronal Network Simulations. + Frontiers in Neuroinformatics(16):837549. https://doi.org/10.3389/fninf.2022.837549 + +.. [3] Potjans TC. and Diesmann M. 2014. The cell-type specific cortical + microcircuit: relating structure and activity in a full-scale spiking + network model. Cerebral Cortex. 24(3):785–806. DOI: `10.1093/cercor/bhs358 `__. + +.. [4] Kurth AC, Senk J, Terhorst D, Finnerty J, Diesmann M. 2022. Sub-realtime simulation of a neuronal network of natural density. + Neuromorphic computing and engineering 2(2), 021001 + https://iopscience.iop.org/article/10.1088/2634-4386/ac55fc/meta + +.. [5] Schmidt M, Bakker R, Hilgetag CC, Diesmann M and van Albada SJ. 2018. Multi-scale + account of the network structure of macaque visual cortex. Brain Structure + and Function. 223: 1409 https://doi.org/10.1007/s00429-017-1554-4 + +.. [6] Jordan J, Ippen T, Helias M, Kitayama I, Sato M, Igarashi J, Diesmann M, Kunkel S. 2018. + Extremely scalable spiking neuronal network simulation code: From laptops to exacale computers. + Frontiers in Neuroinformatics. 12. https://www.frontiersin.org/journals/neuroinformatics/articles/10.3389/fninf.2018.00002 diff --git a/doc/htmldoc/ref_material/glossary.rst b/doc/htmldoc/ref_material/glossary.rst index 12ff3381aa..ea210be05f 100644 --- a/doc/htmldoc/ref_material/glossary.rst +++ b/doc/htmldoc/ref_material/glossary.rst @@ -67,7 +67,7 @@ Units of measure V_th Spike threshold in Millivolts (mV). - V_reset + V_reset Reset potential of the membrane in Millivolts (mV). V_min diff --git a/doc/htmldoc/ref_material/pynest_api/nest.NestModule.rst b/doc/htmldoc/ref_material/pynest_api/nest.NestModule.rst index f780fc7d4b..e94fcfb620 100644 --- a/doc/htmldoc/ref_material/pynest_api/nest.NestModule.rst +++ b/doc/htmldoc/ref_material/pynest_api/nest.NestModule.rst @@ -25,4 +25,3 @@ Here is a list of attributes that can be get and/or set on the ``nest`` module: .. autoclass:: nest.NestModule :members: :no-undoc-members: - diff --git a/doc/htmldoc/ref_material/pynest_api/nest.lib.hl_api_sonata.rst b/doc/htmldoc/ref_material/pynest_api/nest.lib.hl_api_sonata.rst index d515982cc2..af946b87de 100644 --- a/doc/htmldoc/ref_material/pynest_api/nest.lib.hl_api_sonata.rst +++ b/doc/htmldoc/ref_material/pynest_api/nest.lib.hl_api_sonata.rst @@ -3,7 +3,7 @@ Sonata module Build and simulate networks represented by the SONATA format -.. seealso:: +.. seealso:: See the :ref:`nest_sonata` guide for more details diff --git a/doc/htmldoc/ref_material/pynest_api/nest.math.hl_api_math.rst b/doc/htmldoc/ref_material/pynest_api/nest.math.hl_api_math.rst index f6dfd56164..38d4e366da 100644 --- a/doc/htmldoc/ref_material/pynest_api/nest.math.hl_api_math.rst +++ b/doc/htmldoc/ref_material/pynest_api/nest.math.hl_api_math.rst @@ -17,6 +17,3 @@ Syntax: :members: :undoc-members: :show-inheritance: - - - diff --git a/doc/htmldoc/ref_material/pynest_api/nest.server.hl_api_server.rst b/doc/htmldoc/ref_material/pynest_api/nest.server.hl_api_server.rst index 294d957c8d..ba10f900ca 100644 --- a/doc/htmldoc/ref_material/pynest_api/nest.server.hl_api_server.rst +++ b/doc/htmldoc/ref_material/pynest_api/nest.server.hl_api_server.rst @@ -5,6 +5,3 @@ Server module :members: :undoc-members: :show-inheritance: - - - diff --git a/doc/htmldoc/ref_material/pynest_api/nest.spatial.hl_api_spatial.rst b/doc/htmldoc/ref_material/pynest_api/nest.spatial.hl_api_spatial.rst index 60fb589e9b..97114100f9 100644 --- a/doc/htmldoc/ref_material/pynest_api/nest.spatial.hl_api_spatial.rst +++ b/doc/htmldoc/ref_material/pynest_api/nest.spatial.hl_api_spatial.rst @@ -18,4 +18,3 @@ Syntax: .. automodule:: nest.spatial :members: distance - diff --git a/doc/htmldoc/simulation_run.dot b/doc/htmldoc/simulation_run.dot new file mode 100644 index 0000000000..8ee7176a31 --- /dev/null +++ b/doc/htmldoc/simulation_run.dot @@ -0,0 +1,92 @@ + digraph G { + node [fontname="Helvetica,Arial,sans-serif", shape="box", fontcolor="white", style="filled", fillcolor="#0E6A93"] + rankdir="LR" + bgcolor="#ff6633" + label="Simulation Run" + labelloc="t" + fontcolor="white" + fontname="Helvetica,Arial,sans-serif" + + subgraph cluster_simulate_timer { + label="time_simulate" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + subgraph cluster_OMP_Parallel { + label="OMP Parallel" + style=filled + fillcolor="#0E6A93" fontcolor="white" fontname="Helvetica,Arial,sans-serif" + subgraph cluster_time_driven_loop { + label="Time driven loop" + style=filled + fillcolor="#072f42" + subgraph cluster_deliver_spike_data_timer { + label="time_deliver_spike_data" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + subgraph cluster_deliver_events { + label="Deliver events" + style=filled fontcolor="white" fontname="Helvetica,Arial,sans-serif" + fillcolor="#072f42" + "plasticity update" + } + } + subgraph cluster_update_timer { + label="time_update" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + "node update" + } + subgraph cluster_omp_synchronization_timer { + label="time_omp_synchronization_simulation" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + "OMP barrier" + } + subgraph cluster_omp_master { + label="OMP Master" + style=filled fontcolor="white" + fillcolor="#0E6A93" + "advance time" + + subgraph cluster_gather_spike_data_timer{ + label= "time_gather_spike_data" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + subgraph cluster_gather_spike_Data{ + label="Gather spike data" + style=filled fontcolor="white" fontname="Helvetica, Arial, sans-serif" + fillcolor="#072f42" + subgraph cluster_repeat_once { + label="Repeat once if spike buffer too small" + style=filled fontcolor="white" + fillcolor="#0E6A93" + + + subgraph cluster_collocate_spike_data_timer { + label="time_collocate_spike_data" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + "collocate spike data" + } + + subgraph cluster_communicate_spike_data_timer { + label= "time_communicate_spike_data" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="white" + "communicate spike data" + subgraph cluster_mpi_sync_timer { + label= "time_mpi_synchronization" + style=filled fontcolor="black" fontname="Courier New, Courier, monospace" + fillcolor="#f1f1f1" + "MPI barrier" + + } + } + } + } + } + } + } + } + } + } diff --git a/doc/htmldoc/static/css/bootstrap/bootstrap.min.css b/doc/htmldoc/static/css/bootstrap/bootstrap.min.css index 1472dec059..278436bcb9 100644 --- a/doc/htmldoc/static/css/bootstrap/bootstrap.min.css +++ b/doc/htmldoc/static/css/bootstrap/bootstrap.min.css @@ -4,4 +4,4 @@ * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) */:root{--bs-blue:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-white:#fff;--bs-gray:#6c757d;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:33,37,41;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#212529;--bs-body-bg:#fff}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#6c757d}.blockquote-footer::before{content:"— "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:#6c757d}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{width:100%;padding-right:var(--bs-gutter-x,.75rem);padding-left:var(--bs-gutter-x,.75rem);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.6666666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.6666666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.6666666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.6666666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.3333333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.6666666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-bg:transparent;--bs-table-accent-bg:transparent;--bs-table-striped-color:#212529;--bs-table-striped-bg:rgba(0, 0, 0, 0.05);--bs-table-active-color:#212529;--bs-table-active-bg:rgba(0, 0, 0, 0.1);--bs-table-hover-color:#212529;--bs-table-hover-bg:rgba(0, 0, 0, 0.075);width:100%;margin-bottom:1rem;color:#212529;vertical-align:top;border-color:#dee2e6}.table>:not(caption)>*>*{padding:.5rem .5rem;background-color:var(--bs-table-bg);border-bottom-width:1px;box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg)}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table>:not(:first-child){border-top:2px solid currentColor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:1px 0}.table-bordered>:not(caption)>*>*{border-width:0 1px}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-accent-bg:var(--bs-table-striped-bg);color:var(--bs-table-striped-color)}.table-active{--bs-table-accent-bg:var(--bs-table-active-bg);color:var(--bs-table-active-color)}.table-hover>tbody>tr:hover>*{--bs-table-accent-bg:var(--bs-table-hover-bg);color:var(--bs-table-hover-color)}.table-primary{--bs-table-bg:#cfe2ff;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000;color:#000;border-color:#bacbe6}.table-secondary{--bs-table-bg:#e2e3e5;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000;color:#000;border-color:#cbccce}.table-success{--bs-table-bg:#d1e7dd;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000;color:#000;border-color:#bcd0c7}.table-info{--bs-table-bg:#cff4fc;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000;color:#000;border-color:#badce3}.table-warning{--bs-table-bg:#fff3cd;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000;color:#000;border-color:#e6dbb9}.table-danger{--bs-table-bg:#f8d7da;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000;color:#000;border-color:#dfc2c4}.table-light{--bs-table-bg:#f8f9fa;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:#000;border-color:#dfe0e1}.table-dark{--bs-table-bg:#212529;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff;color:#fff;border-color:#373b3e}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:#6c757d}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:#212529;background-color:#fff;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-control::-webkit-date-and-time-value{height:1.5em}.form-control::-moz-placeholder{color:#6c757d;opacity:1}.form-control::placeholder{color:#6c757d;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#dde0e3}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:#212529;background-color:#e9ecef;pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:1px;border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:#dde0e3}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:#212529;background-color:transparent;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px)}.form-control-color{width:3rem;height:auto;padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{height:1.5em;border-radius:.25rem}.form-control-color::-webkit-color-swatch{height:1.5em;border-radius:.25rem}.form-select{display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;-moz-padding-start:calc(0.75rem - 3px);font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:#e9ecef}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:.2rem}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:.3rem}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-input{width:1em;height:1em;margin-top:.25em;vertical-align:top;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:contain;border:1px solid rgba(0,0,0,.25);-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#0d6efd;border-color:#0d6efd;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{width:2em;margin-left:-2.5em;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2386b7fe'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}.form-range{width:100%;height:1.5rem;padding:0;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background-color:#0d6efd;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;background-color:#0d6efd;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:#adb5bd}.form-range:disabled::-moz-range-thumb{background-color:#adb5bd}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-select{height:calc(3.5rem + 2px);line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;height:100%;padding:1rem .75rem;pointer-events:none;border:1px solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control{padding:1rem .75rem}.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:-webkit-autofill~label{opacity:.65;transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-select:focus{z-index:3}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:3}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:center;white-space:nowrap;background-color:#e9ecef;border:1px solid #ced4da;border-radius:.25rem}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#198754}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(25,135,84,.9);border-radius:.25rem}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:#198754;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#198754}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group .form-control.is-valid,.input-group .form-select.is-valid,.was-validated .input-group .form-control:valid,.was-validated .input-group .form-select:valid{z-index:1}.input-group .form-control.is-valid:focus,.input-group .form-select.is-valid:focus,.was-validated .input-group .form-control:valid:focus,.was-validated .input-group .form-select:valid:focus{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:rgba(220,53,69,.9);border-radius:.25rem}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:#dc3545;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{padding-right:4.125rem;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"),url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc3545}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group .form-control.is-invalid,.input-group .form-select.is-invalid,.was-validated .input-group .form-control:invalid,.was-validated .input-group .form-select:invalid{z-index:2}.input-group .form-control.is-invalid:focus,.input-group .form-select.is-invalid:focus,.was-validated .input-group .form-control:invalid:focus,.was-validated .input-group .form-select:invalid:focus{z-index:3}.btn{display:inline-block;font-weight:400;line-height:1.5;color:#212529;text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#212529}.btn-check:focus+.btn,.btn:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{pointer-events:none;opacity:.65}.btn-primary{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-primary:hover{color:#fff;background-color:#0b5ed7;border-color:#0a58ca}.btn-check:focus+.btn-primary,.btn-primary:focus{color:#fff;background-color:#0b5ed7;border-color:#0a58ca;box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-check:active+.btn-primary,.btn-check:checked+.btn-primary,.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#0a58ca;border-color:#0a53be}.btn-check:active+.btn-primary:focus,.btn-check:checked+.btn-primary:focus,.btn-primary.active:focus,.btn-primary:active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(49,132,253,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-secondary{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-secondary:hover{color:#fff;background-color:#5c636a;border-color:#565e64}.btn-check:focus+.btn-secondary,.btn-secondary:focus{color:#fff;background-color:#5c636a;border-color:#565e64;box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-check:active+.btn-secondary,.btn-check:checked+.btn-secondary,.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#565e64;border-color:#51585e}.btn-check:active+.btn-secondary:focus,.btn-check:checked+.btn-secondary:focus,.btn-secondary.active:focus,.btn-secondary:active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(130,138,145,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-success{color:#fff;background-color:#198754;border-color:#198754}.btn-success:hover{color:#fff;background-color:#157347;border-color:#146c43}.btn-check:focus+.btn-success,.btn-success:focus{color:#fff;background-color:#157347;border-color:#146c43;box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-check:active+.btn-success,.btn-check:checked+.btn-success,.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#146c43;border-color:#13653f}.btn-check:active+.btn-success:focus,.btn-check:checked+.btn-success:focus,.btn-success.active:focus,.btn-success:active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(60,153,110,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#198754;border-color:#198754}.btn-info{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-info:hover{color:#000;background-color:#31d2f2;border-color:#25cff2}.btn-check:focus+.btn-info,.btn-info:focus{color:#000;background-color:#31d2f2;border-color:#25cff2;box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-check:active+.btn-info,.btn-check:checked+.btn-info,.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{color:#000;background-color:#3dd5f3;border-color:#25cff2}.btn-check:active+.btn-info:focus,.btn-check:checked+.btn-info:focus,.btn-info.active:focus,.btn-info:active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(11,172,204,.5)}.btn-info.disabled,.btn-info:disabled{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-warning{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#000;background-color:#ffca2c;border-color:#ffc720}.btn-check:focus+.btn-warning,.btn-warning:focus{color:#000;background-color:#ffca2c;border-color:#ffc720;box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-check:active+.btn-warning,.btn-check:checked+.btn-warning,.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{color:#000;background-color:#ffcd39;border-color:#ffc720}.btn-check:active+.btn-warning:focus,.btn-check:checked+.btn-warning:focus,.btn-warning.active:focus,.btn-warning:active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(217,164,6,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#bb2d3b;border-color:#b02a37}.btn-check:focus+.btn-danger,.btn-danger:focus{color:#fff;background-color:#bb2d3b;border-color:#b02a37;box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-check:active+.btn-danger,.btn-check:checked+.btn-danger,.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#b02a37;border-color:#a52834}.btn-check:active+.btn-danger:focus,.btn-check:checked+.btn-danger:focus,.btn-danger.active:focus,.btn-danger:active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(225,83,97,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-light{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:focus+.btn-light,.btn-light:focus{color:#000;background-color:#f9fafb;border-color:#f9fafb;box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-check:active+.btn-light,.btn-check:checked+.btn-light,.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{color:#000;background-color:#f9fafb;border-color:#f9fafb}.btn-check:active+.btn-light:focus,.btn-check:checked+.btn-light:focus,.btn-light.active:focus,.btn-light:active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(211,212,213,.5)}.btn-light.disabled,.btn-light:disabled{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-dark{color:#fff;background-color:#212529;border-color:#212529}.btn-dark:hover{color:#fff;background-color:#1c1f23;border-color:#1a1e21}.btn-check:focus+.btn-dark,.btn-dark:focus{color:#fff;background-color:#1c1f23;border-color:#1a1e21;box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-check:active+.btn-dark,.btn-check:checked+.btn-dark,.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#1a1e21;border-color:#191c1f}.btn-check:active+.btn-dark:focus,.btn-check:checked+.btn-dark:focus,.btn-dark.active:focus,.btn-dark:active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .25rem rgba(66,70,73,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#212529;border-color:#212529}.btn-outline-primary{color:#0d6efd;border-color:#0d6efd}.btn-outline-primary:hover{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:focus+.btn-outline-primary,.btn-outline-primary:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-check:active+.btn-outline-primary,.btn-check:checked+.btn-outline-primary,.btn-outline-primary.active,.btn-outline-primary.dropdown-toggle.show,.btn-outline-primary:active{color:#fff;background-color:#0d6efd;border-color:#0d6efd}.btn-check:active+.btn-outline-primary:focus,.btn-check:checked+.btn-outline-primary:focus,.btn-outline-primary.active:focus,.btn-outline-primary.dropdown-toggle.show:focus,.btn-outline-primary:active:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#0d6efd;background-color:transparent}.btn-outline-secondary{color:#6c757d;border-color:#6c757d}.btn-outline-secondary:hover{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:focus+.btn-outline-secondary,.btn-outline-secondary:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-check:active+.btn-outline-secondary,.btn-check:checked+.btn-outline-secondary,.btn-outline-secondary.active,.btn-outline-secondary.dropdown-toggle.show,.btn-outline-secondary:active{color:#fff;background-color:#6c757d;border-color:#6c757d}.btn-check:active+.btn-outline-secondary:focus,.btn-check:checked+.btn-outline-secondary:focus,.btn-outline-secondary.active:focus,.btn-outline-secondary.dropdown-toggle.show:focus,.btn-outline-secondary:active:focus{box-shadow:0 0 0 .25rem rgba(108,117,125,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#6c757d;background-color:transparent}.btn-outline-success{color:#198754;border-color:#198754}.btn-outline-success:hover{color:#fff;background-color:#198754;border-color:#198754}.btn-check:focus+.btn-outline-success,.btn-outline-success:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-check:active+.btn-outline-success,.btn-check:checked+.btn-outline-success,.btn-outline-success.active,.btn-outline-success.dropdown-toggle.show,.btn-outline-success:active{color:#fff;background-color:#198754;border-color:#198754}.btn-check:active+.btn-outline-success:focus,.btn-check:checked+.btn-outline-success:focus,.btn-outline-success.active:focus,.btn-outline-success.dropdown-toggle.show:focus,.btn-outline-success:active:focus{box-shadow:0 0 0 .25rem rgba(25,135,84,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#198754;background-color:transparent}.btn-outline-info{color:#0dcaf0;border-color:#0dcaf0}.btn-outline-info:hover{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:focus+.btn-outline-info,.btn-outline-info:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-check:active+.btn-outline-info,.btn-check:checked+.btn-outline-info,.btn-outline-info.active,.btn-outline-info.dropdown-toggle.show,.btn-outline-info:active{color:#000;background-color:#0dcaf0;border-color:#0dcaf0}.btn-check:active+.btn-outline-info:focus,.btn-check:checked+.btn-outline-info:focus,.btn-outline-info.active:focus,.btn-outline-info.dropdown-toggle.show:focus,.btn-outline-info:active:focus{box-shadow:0 0 0 .25rem rgba(13,202,240,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#0dcaf0;background-color:transparent}.btn-outline-warning{color:#ffc107;border-color:#ffc107}.btn-outline-warning:hover{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:focus+.btn-outline-warning,.btn-outline-warning:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-check:active+.btn-outline-warning,.btn-check:checked+.btn-outline-warning,.btn-outline-warning.active,.btn-outline-warning.dropdown-toggle.show,.btn-outline-warning:active{color:#000;background-color:#ffc107;border-color:#ffc107}.btn-check:active+.btn-outline-warning:focus,.btn-check:checked+.btn-outline-warning:focus,.btn-outline-warning.active:focus,.btn-outline-warning.dropdown-toggle.show:focus,.btn-outline-warning:active:focus{box-shadow:0 0 0 .25rem rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-danger{color:#dc3545;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:focus+.btn-outline-danger,.btn-outline-danger:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-check:active+.btn-outline-danger,.btn-check:checked+.btn-outline-danger,.btn-outline-danger.active,.btn-outline-danger.dropdown-toggle.show,.btn-outline-danger:active{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-check:active+.btn-outline-danger:focus,.btn-check:checked+.btn-outline-danger:focus,.btn-outline-danger.active:focus,.btn-outline-danger.dropdown-toggle.show:focus,.btn-outline-danger:active:focus{box-shadow:0 0 0 .25rem rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-light{color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light:hover{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:focus+.btn-outline-light,.btn-outline-light:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-check:active+.btn-outline-light,.btn-check:checked+.btn-outline-light,.btn-outline-light.active,.btn-outline-light.dropdown-toggle.show,.btn-outline-light:active{color:#000;background-color:#f8f9fa;border-color:#f8f9fa}.btn-check:active+.btn-outline-light:focus,.btn-check:checked+.btn-outline-light:focus,.btn-outline-light.active:focus,.btn-outline-light.dropdown-toggle.show:focus,.btn-outline-light:active:focus{box-shadow:0 0 0 .25rem rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-dark{color:#212529;border-color:#212529}.btn-outline-dark:hover{color:#fff;background-color:#212529;border-color:#212529}.btn-check:focus+.btn-outline-dark,.btn-outline-dark:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-check:active+.btn-outline-dark,.btn-check:checked+.btn-outline-dark,.btn-outline-dark.active,.btn-outline-dark.dropdown-toggle.show,.btn-outline-dark:active{color:#fff;background-color:#212529;border-color:#212529}.btn-check:active+.btn-outline-dark:focus,.btn-check:checked+.btn-outline-dark:focus,.btn-outline-dark.active:focus,.btn-outline-dark.dropdown-toggle.show:focus,.btn-outline-dark:active:focus{box-shadow:0 0 0 .25rem rgba(33,37,41,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#212529;background-color:transparent}.btn-link{font-weight:400;color:#0d6efd;text-decoration:underline}.btn-link:hover{color:#0a58ca}.btn-link.disabled,.btn-link:disabled{color:#6c757d}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropend,.dropstart,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{position:absolute;z-index:1000;display:none;min-width:10rem;padding:.5rem 0;margin:0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:.125rem}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:.125rem}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:.125rem}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid rgba(0,0,0,.15)}.dropdown-item{display:block;width:100%;padding:.25rem 1rem;clear:both;font-weight:400;color:#212529;text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#1e2125;background-color:#e9ecef}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#0d6efd}.dropdown-item.disabled,.dropdown-item:disabled{color:#adb5bd;pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1rem;margin-bottom:0;font-size:.875rem;color:#6c757d;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1rem;color:#212529}.dropdown-menu-dark{color:#dee2e6;background-color:#343a40;border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item{color:#dee2e6}.dropdown-menu-dark .dropdown-item:focus,.dropdown-menu-dark .dropdown-item:hover{color:#fff;background-color:rgba(255,255,255,.15)}.dropdown-menu-dark .dropdown-item.active,.dropdown-menu-dark .dropdown-item:active{color:#fff;background-color:#0d6efd}.dropdown-menu-dark .dropdown-item.disabled,.dropdown-menu-dark .dropdown-item:disabled{color:#adb5bd}.dropdown-menu-dark .dropdown-divider{border-color:rgba(0,0,0,.15)}.dropdown-menu-dark .dropdown-item-text{color:#dee2e6}.dropdown-menu-dark .dropdown-header{color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem;color:#0d6efd;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:#0a58ca}.nav-link.disabled{color:#6c757d;pointer-events:none;cursor:default}.nav-tabs{border-bottom:1px solid #dee2e6}.nav-tabs .nav-link{margin-bottom:-1px;background:0 0;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #dee2e6;isolation:isolate}.nav-tabs .nav-link.disabled{color:#6c757d;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{background:0 0;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#0d6efd}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding-top:.5rem;padding-bottom:.5rem}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;text-decoration:none;white-space:nowrap}.navbar-nav{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:transparent;border:1px solid transparent;border-radius:.25rem;transition:box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 .25rem}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas-header{display:none}.navbar-expand-sm .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-sm .offcanvas-bottom,.navbar-expand-sm .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas-header{display:none}.navbar-expand-md .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-md .offcanvas-bottom,.navbar-expand-md .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas-header{display:none}.navbar-expand-lg .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-lg .offcanvas-bottom,.navbar-expand-lg .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas-header{display:none}.navbar-expand-xl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xl .offcanvas-bottom,.navbar-expand-xl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand-xxl .offcanvas-bottom,.navbar-expand-xxl .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas-header{display:none}.navbar-expand .offcanvas{position:inherit;bottom:0;z-index:1000;flex-grow:1;visibility:visible!important;background-color:transparent;border-right:0;border-left:0;transition:none;transform:none}.navbar-expand .offcanvas-bottom,.navbar-expand .offcanvas-top{height:auto;border-top:0;border-bottom:0}.navbar-expand .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.55)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.55);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.55)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.55)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.55);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.55)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:1rem 1rem}.card-title{margin-bottom:.5rem}.card-subtitle{margin-top:-.25rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:1rem}.card-header{padding:.5rem 1rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.5rem 1rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.5rem;margin-bottom:-.5rem;margin-left:-.5rem;border-bottom:0}.card-header-pills{margin-right:-.5rem;margin-left:-.5rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-group>.card{margin-bottom:.75rem}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:1rem 1.25rem;font-size:1rem;color:#212529;text-align:left;background-color:#fff;border:0;border-radius:0;overflow-anchor:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out,border-radius .15s ease}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:#0c63e4;background-color:#e7f1ff;box-shadow:inset 0 -1px 0 rgba(0,0,0,.125)}.accordion-button:not(.collapsed)::after{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%230c63e4'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");transform:rotate(-180deg)}.accordion-button::after{flex-shrink:0;width:1.25rem;height:1.25rem;margin-left:auto;content:"";background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-size:1.25rem;transition:transform .2s ease-in-out}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:#86b7fe;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.accordion-header{margin-bottom:0}.accordion-item{background-color:#fff;border:1px solid rgba(0,0,0,.125)}.accordion-item:first-of-type{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.accordion-item:first-of-type .accordion-button{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.accordion-body{padding:1rem 1.25rem}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button{border-radius:0}.breadcrumb{display:flex;flex-wrap:wrap;padding:0 0;margin-bottom:1rem;list-style:none}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:.5rem;color:#6c757d;content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:#6c757d}.pagination{display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;color:#0d6efd;text-decoration:none;background-color:#fff;border:1px solid #dee2e6;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:#0a58ca;background-color:#e9ecef;border-color:#dee2e6}.page-link:focus{z-index:3;color:#0a58ca;background-color:#e9ecef;outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25)}.page-item:not(:first-child) .page-link{margin-left:-1px}.page-item.active .page-link{z-index:3;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.page-item.disabled .page-link{color:#6c757d;pointer-events:none;background-color:#fff;border-color:#dee2e6}.page-link{padding:.375rem .75rem}.page-item:first-child .page-link{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{position:relative;padding:1rem 1rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{color:#084298;background-color:#cfe2ff;border-color:#b6d4fe}.alert-primary .alert-link{color:#06357a}.alert-secondary{color:#41464b;background-color:#e2e3e5;border-color:#d3d6d8}.alert-secondary .alert-link{color:#34383c}.alert-success{color:#0f5132;background-color:#d1e7dd;border-color:#badbcc}.alert-success .alert-link{color:#0c4128}.alert-info{color:#055160;background-color:#cff4fc;border-color:#b6effb}.alert-info .alert-link{color:#04414d}.alert-warning{color:#664d03;background-color:#fff3cd;border-color:#ffecb5}.alert-warning .alert-link{color:#523e02}.alert-danger{color:#842029;background-color:#f8d7da;border-color:#f5c2c7}.alert-danger .alert-link{color:#6a1a21}.alert-light{color:#636464;background-color:#fefefe;border-color:#fdfdfe}.alert-light .alert-link{color:#4f5050}.alert-dark{color:#141619;background-color:#d3d3d4;border-color:#bcbebf}.alert-dark .alert-link{color:#101214}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress{display:flex;height:1rem;overflow:hidden;font-size:.75rem;background-color:#e9ecef;border-radius:.25rem}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#0d6efd;transition:width .6s ease}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:1s linear infinite progress-bar-stripes;animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;animation:none}}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>li::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.5rem 1rem;color:#212529;text-decoration:none;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#6c757d;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#0d6efd;border-color:#0d6efd}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#084298;background-color:#cfe2ff}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{color:#084298;background-color:#bacbe6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#084298;border-color:#084298}.list-group-item-secondary{color:#41464b;background-color:#e2e3e5}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{color:#41464b;background-color:#cbccce}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#41464b;border-color:#41464b}.list-group-item-success{color:#0f5132;background-color:#d1e7dd}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{color:#0f5132;background-color:#bcd0c7}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#0f5132;border-color:#0f5132}.list-group-item-info{color:#055160;background-color:#cff4fc}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{color:#055160;background-color:#badce3}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#055160;border-color:#055160}.list-group-item-warning{color:#664d03;background-color:#fff3cd}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{color:#664d03;background-color:#e6dbb9}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#664d03;border-color:#664d03}.list-group-item-danger{color:#842029;background-color:#f8d7da}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{color:#842029;background-color:#dfc2c4}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#842029;border-color:#842029}.list-group-item-light{color:#636464;background-color:#fefefe}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{color:#636464;background-color:#e5e5e5}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#636464;border-color:#636464}.list-group-item-dark{color:#141619;background-color:#d3d3d4}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{color:#141619;background-color:#bebebf}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#141619;border-color:#141619}.btn-close{box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:#000;background:transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;border-radius:.25rem;opacity:.5}.btn-close:hover{color:#000;text-decoration:none;opacity:.75}.btn-close:focus{outline:0;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);opacity:1}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:.25}.btn-close-white{filter:invert(1) grayscale(100%) brightness(200%)}.toast{width:350px;max-width:100%;font-size:.875rem;pointer-events:auto;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .5rem 1rem rgba(0,0,0,.15);border-radius:.25rem}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:.75rem}.toast-header{display:flex;align-items:center;padding:.5rem .75rem;color:#6c757d;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-header .btn-close{margin-right:-.375rem;margin-left:.75rem}.toast-body{padding:.75rem;word-wrap:break-word}.modal{position:fixed;top:0;left:0;z-index:1055;display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;left:0;z-index:1050;width:100vw;height:100vh;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:1rem 1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .btn-close{padding:.5rem .5rem;margin:-.5rem -.5rem -.5rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:1 1 auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;flex-shrink:0;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.25rem}@media (min-width:576px){.modal-dialog{max-width:500px;margin:1.75rem auto}.modal-dialog-scrollable{height:calc(100% - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:1200px){.modal-xl{max-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}.modal-fullscreen .modal-footer{border-radius:0}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}.modal-fullscreen-sm-down .modal-footer{border-radius:0}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}.modal-fullscreen-md-down .modal-footer{border-radius:0}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}.modal-fullscreen-lg-down .modal-footer{border-radius:0}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}.modal-fullscreen-xl-down .modal-footer{border-radius:0}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}.modal-fullscreen-xxl-down .modal-footer{border-radius:0}}.tooltip{position:absolute;z-index:1080;display:block;margin:0;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .tooltip-arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:0}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-auto[data-popper-placement^=right],.bs-tooltip-end{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-auto[data-popper-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:0}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-auto[data-popper-placement^=left],.bs-tooltip-start{padding:0 .4rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1070;display:block;max-width:276px;font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .popover-arrow{position:absolute;display:block;width:1rem;height:.5rem}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-width:0 .5rem .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:1px;border-width:0 .5rem .5rem .5rem;border-bottom-color:#fff}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:1rem;margin-left:-.5rem;content:"";border-bottom:1px solid #f0f0f0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem 1rem;margin-bottom:0;font-size:1rem;background-color:#f0f0f0;border-bottom:1px solid rgba(0,0,0,.2);border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:1rem 1rem;color:#212529}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%;list-style:none}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}@-webkit-keyframes spinner-border{to{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;border:.25em solid currentColor;border-right-color:transparent;border-radius:50%;-webkit-animation:.75s linear infinite spinner-border;animation:.75s linear infinite spinner-border}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{display:inline-block;width:2rem;height:2rem;vertical-align:-.125em;background-color:currentColor;border-radius:50%;opacity:0;-webkit-animation:.75s linear infinite spinner-grow;animation:.75s linear infinite spinner-grow}.spinner-grow-sm{width:1rem;height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{-webkit-animation-duration:1.5s;animation-duration:1.5s}}.offcanvas{position:fixed;bottom:0;z-index:1045;display:flex;flex-direction:column;max-width:100%;visibility:hidden;background-color:#fff;background-clip:padding-box;outline:0;transition:transform .3s ease-in-out}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:1rem 1rem}.offcanvas-header .btn-close{padding:.5rem .5rem;margin-top:-.5rem;margin-right:-.5rem;margin-bottom:-.5rem}.offcanvas-title{margin-bottom:0;line-height:1.5}.offcanvas-body{flex-grow:1;padding:1rem 1rem;overflow-y:auto}.offcanvas-start{top:0;left:0;width:400px;border-right:1px solid rgba(0,0,0,.2);transform:translateX(-100%)}.offcanvas-end{top:0;right:0;width:400px;border-left:1px solid rgba(0,0,0,.2);transform:translateX(100%)}.offcanvas-top{top:0;right:0;left:0;height:30vh;max-height:100%;border-bottom:1px solid rgba(0,0,0,.2);transform:translateY(-100%)}.offcanvas-bottom{right:0;left:0;height:30vh;max-height:100%;border-top:1px solid rgba(0,0,0,.2);transform:translateY(100%)}.offcanvas.show{transform:none}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentColor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite}@-webkit-keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.link-primary{color:#0d6efd}.link-primary:focus,.link-primary:hover{color:#0a58ca}.link-secondary{color:#6c757d}.link-secondary:focus,.link-secondary:hover{color:#565e64}.link-success{color:#198754}.link-success:focus,.link-success:hover{color:#146c43}.link-info{color:#0dcaf0}.link-info:focus,.link-info:hover{color:#3dd5f3}.link-warning{color:#ffc107}.link-warning:focus,.link-warning:hover{color:#ffcd39}.link-danger{color:#dc3545}.link-danger:focus,.link-danger:hover{color:#b02a37}.link-light{color:#f8f9fa}.link-light:focus,.link-light:hover{color:#f9fafb}.link-dark{color:#212529}.link-dark:focus,.link-dark:hover{color:#1a1e21}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:1px;min-height:1em;background-color:currentColor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important}.border-top-0{border-top:0!important}.border-end{border-right:1px solid #dee2e6!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:1px solid #dee2e6!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:1px solid #dee2e6!important}.border-start-0{border-left:0!important}.border-primary{border-color:#0d6efd!important}.border-secondary{border-color:#6c757d!important}.border-success{border-color:#198754!important}.border-info{border-color:#0dcaf0!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#212529!important}.border-white{border-color:#fff!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-light{font-weight:300!important}.fw-lighter{font-weight:lighter!important}.fw-normal{font-weight:400!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:#6c757d!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.25rem!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.2rem!important}.rounded-2{border-radius:.25rem!important}.rounded-3{border-radius:.3rem!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-end{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-start{border-bottom-left-radius:.25rem!important;border-top-left-radius:.25rem!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/doc/htmldoc/static/css/hoverxtooltip.css b/doc/htmldoc/static/css/hoverxtooltip.css index 8df304c182..72d324f1be 100644 --- a/doc/htmldoc/static/css/hoverxtooltip.css +++ b/doc/htmldoc/static/css/hoverxtooltip.css @@ -1,7 +1,7 @@ .hoverxtool + .tooltip > .tooltip-inner { background-color: #FF6633; - color: #FFFFFF; - border: 1px solid #FDDCD1; + color: #FFFFFF; + border: 1px solid #FDDCD1; padding: 4px; font-size: 16px; width: auto; @@ -15,6 +15,6 @@ } .hoverxtool_highlighter { - border-bottom:2px dotted #FDDCD1; + border-bottom:2px dotted #FDDCD1; padding:0.03em 0.15em; -} \ No newline at end of file +} diff --git a/doc/htmldoc/static/css/pygments.css b/doc/htmldoc/static/css/pygments.css index 039281df87..941cca91b4 100644 --- a/doc/htmldoc/static/css/pygments.css +++ b/doc/htmldoc/static/css/pygments.css @@ -67,4 +67,3 @@ .highlight .vi { color: #003333 } /* Name.Variable.Instance */ .highlight .vm { color: #003333 } /* Name.Variable.Magic */ .highlight .il { color: #FF6600 } /* Literal.Number.Integer.Long */ - diff --git a/doc/htmldoc/static/img/EBRAINS.svg b/doc/htmldoc/static/img/EBRAINS.svg index 4609291e24..5c727e974e 100644 --- a/doc/htmldoc/static/img/EBRAINS.svg +++ b/doc/htmldoc/static/img/EBRAINS.svg @@ -1 +1 @@ - \ No newline at end of file + diff --git a/doc/htmldoc/static/img/arrow-up-circle.svg b/doc/htmldoc/static/img/arrow-up-circle.svg index 41263b0566..6af90e92d0 100644 --- a/doc/htmldoc/static/img/arrow-up-circle.svg +++ b/doc/htmldoc/static/img/arrow-up-circle.svg @@ -3,4 +3,4 @@ - \ No newline at end of file + diff --git a/doc/htmldoc/static/img/excalidraw_nestconcept_horiz.svg b/doc/htmldoc/static/img/excalidraw_nestconcept_horiz.svg index 630fb67fcf..2c236824fa 100644 --- a/doc/htmldoc/static/img/excalidraw_nestconcept_horiz.svg +++ b/doc/htmldoc/static/img/excalidraw_nestconcept_horiz.svg @@ -18,4 +18,4 @@ - Experimental ProtocolsNeuron ModelsNetwork ModelsSynapse ModelsRecording DevicesStimulation DevicesData AnalysisConnection Rules + Experimental ProtocolsNeuron ModelsNetwork ModelsSynapse ModelsRecording DevicesStimulation DevicesData AnalysisConnection Rules diff --git a/doc/htmldoc/static/img/hpc_benchmark.png b/doc/htmldoc/static/img/hpc_benchmark.png index eefebc424c..ad2e4914d7 100644 Binary files a/doc/htmldoc/static/img/hpc_benchmark.png and b/doc/htmldoc/static/img/hpc_benchmark.png differ diff --git a/doc/htmldoc/static/img/hpc_benchmark_NEST-v3.8.png b/doc/htmldoc/static/img/hpc_benchmark_NEST-v3.8.png new file mode 100644 index 0000000000..d266fd0538 Binary files /dev/null and b/doc/htmldoc/static/img/hpc_benchmark_NEST-v3.8.png differ diff --git a/doc/htmldoc/static/img/leaky-integrate-and-fire.svg b/doc/htmldoc/static/img/leaky-integrate-and-fire.svg index c162705b17..123e2d6aa3 100644 --- a/doc/htmldoc/static/img/leaky-integrate-and-fire.svg +++ b/doc/htmldoc/static/img/leaky-integrate-and-fire.svg @@ -58,4 +58,4 @@ - \ No newline at end of file + diff --git a/doc/htmldoc/static/img/mam_ground-state_benchmark.png b/doc/htmldoc/static/img/mam_ground-state_benchmark.png index d8d1f9b89b..bed655021d 100644 Binary files a/doc/htmldoc/static/img/mam_ground-state_benchmark.png and b/doc/htmldoc/static/img/mam_ground-state_benchmark.png differ diff --git a/doc/htmldoc/static/img/mam_ground-state_benchmark_NEST-v3.8.png b/doc/htmldoc/static/img/mam_ground-state_benchmark_NEST-v3.8.png new file mode 100644 index 0000000000..d8d1f9b89b Binary files /dev/null and b/doc/htmldoc/static/img/mam_ground-state_benchmark_NEST-v3.8.png differ diff --git a/doc/htmldoc/static/img/mam_metastable-state_benchmark.png b/doc/htmldoc/static/img/mam_metastable-state_benchmark.png index 00adf12306..a8de4afd2f 100644 Binary files a/doc/htmldoc/static/img/mam_metastable-state_benchmark.png and b/doc/htmldoc/static/img/mam_metastable-state_benchmark.png differ diff --git a/doc/htmldoc/static/img/mam_metastable-state_benchmark_NEST-v3.8.png b/doc/htmldoc/static/img/mam_metastable-state_benchmark_NEST-v3.8.png new file mode 100644 index 0000000000..00adf12306 Binary files /dev/null and b/doc/htmldoc/static/img/mam_metastable-state_benchmark_NEST-v3.8.png differ diff --git a/doc/htmldoc/static/img/mc_benchmark.png b/doc/htmldoc/static/img/mc_benchmark.png index 10ebb4ab18..c35bcc9bd8 100644 Binary files a/doc/htmldoc/static/img/mc_benchmark.png and b/doc/htmldoc/static/img/mc_benchmark.png differ diff --git a/doc/htmldoc/static/img/mc_benchmark_NEST-v3.8.png b/doc/htmldoc/static/img/mc_benchmark_NEST-v3.8.png new file mode 100644 index 0000000000..10ebb4ab18 Binary files /dev/null and b/doc/htmldoc/static/img/mc_benchmark_NEST-v3.8.png differ diff --git a/doc/htmldoc/static/img/nb-logo.svg b/doc/htmldoc/static/img/nb-logo.svg index 3f08a6d98b..c1a783f9a5 100644 --- a/doc/htmldoc/static/img/nb-logo.svg +++ b/doc/htmldoc/static/img/nb-logo.svg @@ -87,4 +87,4 @@ -